mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 04:26:42 +00:00
Compare commits
704 Commits
V5.1-alpha
...
2020.9-bet
Author | SHA1 | Date | |
---|---|---|---|
eb6514332e | |||
098d3e4cf1 | |||
81eb333b6a | |||
3057421d6d | |||
9cb96e81ac | |||
d67189e170 | |||
451ef8f009 | |||
7af53448be | |||
2072c89f77 | |||
43b266f17d | |||
c61f7e78fd | |||
14ab1e95b5 | |||
44fe8f6f94 | |||
1c487a6a60 | |||
6f4cc8d4b5 | |||
f98f6990ea | |||
4c81c94702 | |||
aaa495cf41 | |||
72322f2e56 | |||
04fee7d5c1 | |||
d38ddac311 | |||
d65f584707 | |||
ff42713f92 | |||
5047363f83 | |||
34a0dae305 | |||
ebc07f6259 | |||
6a7a6e74e3 | |||
1e36b484ac | |||
efae9e314f | |||
ea946fe14f | |||
fc08761e70 | |||
3f68677d99 | |||
f4007a7c9d | |||
f3a655d40d | |||
6b3a765c90 | |||
7e8a519c87 | |||
388e1fd52d | |||
cdb28afba6 | |||
24575aba88 | |||
090c445aa9 | |||
c936759b6c | |||
36fc1a00b6 | |||
7b9920dbc4 | |||
b0daf2066a | |||
ed5d18c0df | |||
04a7b633a4 | |||
7a810519f3 | |||
53038ca3b2 | |||
e77d92407c | |||
da80f1b69e | |||
4407e9e6ec | |||
e4c9ea656e | |||
63570d61d6 | |||
257a2eec33 | |||
78b73b3b63 | |||
d74846cde6 | |||
3f4d34d172 | |||
f5b5fcd5ef | |||
f42e047723 | |||
e79145ee54 | |||
6dbc99690a | |||
8628e88e3a | |||
51e1191816 | |||
e294ef8312 | |||
541abb1ba8 | |||
306c8bc8b9 | |||
9f006325b4 | |||
aab4f55b7d | |||
00f94e47f1 | |||
44b7307e4d | |||
54df0e08f5 | |||
4003db6dd9 | |||
f4f25c1590 | |||
328225fe6e | |||
087e4a0d9c | |||
2ecde80b5f | |||
075299dbd9 | |||
30d5a1d888 | |||
b6746acb44 | |||
560353e7cf | |||
86cf9dc344 | |||
877c174e2d | |||
642725252b | |||
880b78e528 | |||
7224319fae | |||
ca8758cbb1 | |||
81df3103b6 | |||
b73d1df350 | |||
299b31a75b | |||
8832d5c870 | |||
abe3b68480 | |||
5c50f8f27d | |||
4561641d2b | |||
4555a7e3f2 | |||
c826afe399 | |||
ae57573eeb | |||
073a618035 | |||
e1b514ca85 | |||
3f942613d7 | |||
bb4f8d1fc6 | |||
5401cc5dc7 | |||
1a7c14ad3e | |||
25bf79bdb1 | |||
12a4f4da84 | |||
a0b29c1d01 | |||
76bb2d08ac | |||
891e5c2f12 | |||
4de1fe454d | |||
80e39d3db1 | |||
e25e785c26 | |||
0ae835aa04 | |||
05abebea65 | |||
c04e944466 | |||
3ee80e0f70 | |||
27f7276698 | |||
9ecfe703cb | |||
ab660a7ca7 | |||
2353c728c1 | |||
106e457fa7 | |||
582acdb176 | |||
05f94920d9 | |||
ee04a456a1 | |||
8e8daa457b | |||
95e67f84ef | |||
6f2d5aa08d | |||
417a0c39dd | |||
4ad7fd874f | |||
aef85b2120 | |||
37c65a85d4 | |||
d93a2a7e7d | |||
db414164dc | |||
30085a7a52 | |||
7593fbda9e | |||
fc05003354 | |||
113350b228 | |||
a1f64ef912 | |||
e4ee3066bc | |||
2bf78bcccf | |||
8c93da758a | |||
75e50582e9 | |||
d92f661f12 | |||
22d40bd0e9 | |||
3f75712732 | |||
fc31babff3 | |||
588a2f1eba | |||
4f276ec78e | |||
2ce1a3d1d3 | |||
cef2d8cec4 | |||
12b096b0ad | |||
cb1c67e568 | |||
5a41632654 | |||
cde24b748a | |||
0e63857ae0 | |||
b8e5de2080 | |||
62aa46f856 | |||
d33f661d55 | |||
c1f0d81fcc | |||
c4124de781 | |||
30fd3ea6a1 | |||
6435078703 | |||
03b22ac326 | |||
a1418eb516 | |||
7a08152c14 | |||
bf6ef152d9 | |||
114567a302 | |||
067180d2cf | |||
4973318249 | |||
ceed8bd303 | |||
a7d386e6be | |||
6e622ad2f3 | |||
2ca57c9b39 | |||
eea17a24bc | |||
7d6370da23 | |||
cdb385dd20 | |||
cb108e0c13 | |||
f9e8a4c8ba | |||
c836838f51 | |||
6ca7f6ba24 | |||
c7c567a14f | |||
38918afe67 | |||
ba2b636e04 | |||
da1bec6cc0 | |||
4e432eeeea | |||
f6bf485c0d | |||
06d40927b0 | |||
58872e2c32 | |||
00450e5732 | |||
98f4af7fab | |||
7b7f09e457 | |||
4a297a237c | |||
d12a121300 | |||
c87e1b3d64 | |||
f6ee9271c6 | |||
4328a13eaf | |||
ed9fe87e44 | |||
8b4a91b2e6 | |||
c1a7b1c141 | |||
78349ba49e | |||
d74eeec113 | |||
c333a6ee39 | |||
3fd7147fc2 | |||
adfd55b419 | |||
2a88e05021 | |||
8a60ae2235 | |||
556dfa7233 | |||
19ed60d407 | |||
aac791d768 | |||
1357ac7e09 | |||
5421de0c2f | |||
9d7e0cdefc | |||
e4d1d6ff9e | |||
3eec04ec1c | |||
357eddf51a | |||
baf5fd42f6 | |||
9d71a7f4ae | |||
9dad7c6d05 | |||
35b4990f0c | |||
b4b1128905 | |||
4d19d44d19 | |||
eb58419a3a | |||
4ddcc3b8d7 | |||
43ee17807a | |||
d1cc694742 | |||
abbadb55ee | |||
a2a4a8a0b8 | |||
c49abd1f4a | |||
dd5e256c84 | |||
321d9f97e0 | |||
721c2dc18e | |||
a523cc313c | |||
bc8ff3cd7f | |||
e23bfa7f87 | |||
cbc1d997ec | |||
af935cb824 | |||
9485b62716 | |||
372ba97bef | |||
925fe4a4b2 | |||
4a5032bb4c | |||
48ee7b0e6d | |||
c94ce6b276 | |||
ecc907b535 | |||
ce804ac23b | |||
1744eaac69 | |||
9874fe0ed5 | |||
2d7353c076 | |||
b2abc1db45 | |||
682145eb13 | |||
046bebe54c | |||
ea6d541270 | |||
7fef35a7e2 | |||
1772164fa2 | |||
c5d778896e | |||
ee8eb30a92 | |||
b7c1a46cbd | |||
a37d8ecb31 | |||
47a62753d1 | |||
608791d918 | |||
5b0ba0917c | |||
8c0391f050 | |||
56d5a669cf | |||
7940313dd1 | |||
1ee1cbca2b | |||
939e0730fd | |||
93a9885477 | |||
5641d0d504 | |||
6d0400cdf3 | |||
89b91598fb | |||
98ed23969a | |||
f989b34ada | |||
cf21b8d07e | |||
81621d260d | |||
5bb489e8ba | |||
24d121643e | |||
035acbfa19 | |||
fbcb6da30d | |||
3b715fc091 | |||
648d0e9b2e | |||
1181de8ed4 | |||
a7de5edfcb | |||
fbfc605f1e | |||
156c85ce69 | |||
3ea73f78e9 | |||
52269c2122 | |||
446f658c13 | |||
ee4bbea340 | |||
a2404d1bc6 | |||
81c5775150 | |||
35ef866690 | |||
eb3a266bf6 | |||
c53de9d789 | |||
0efbf77cf7 | |||
33cc304330 | |||
7d19de5dfa | |||
fa51976ea5 | |||
6a5dc4b98e | |||
73a799d709 | |||
96e1d0afdc | |||
9fb89f2c69 | |||
855c01a46b | |||
1bc06f2c1d | |||
1dc2bd8518 | |||
ef9f55f7ad | |||
9167c47c2f | |||
82cd7f2d05 | |||
d40c85f39c | |||
86a4577023 | |||
7cffdac400 | |||
259f3068e2 | |||
ce643661fc | |||
4d1cdfedc7 | |||
6b3d170c6d | |||
d767e7ebd6 | |||
572ebdd0f5 | |||
d0b64c6438 | |||
9a6cd007ed | |||
97caed9313 | |||
f0aec56186 | |||
a0571b0175 | |||
ee44b5fb7f | |||
69fb21f57c | |||
d7e3f05010 | |||
c096c4a781 | |||
135d1af27d | |||
f758be9e70 | |||
bd84257c16 | |||
d78d28cc7a | |||
5206ab5b27 | |||
2c99a8e4f4 | |||
9de3388525 | |||
5cfb525a1f | |||
93e6361148 | |||
7572f77ab6 | |||
4344ae58bf | |||
9a50903c14 | |||
f7bca3f868 | |||
bbcf4a984b | |||
acd7de715e | |||
43b4fc89ef | |||
a79b26f4be | |||
90febba91a | |||
bb9e46b1fd | |||
79d54d09f9 | |||
cc6a9a843c | |||
421315a31c | |||
0ab0ca2c66 | |||
f4a77859bf | |||
ac1065afff | |||
0abfb70a42 | |||
d99e6629c4 | |||
4ca89c6bf2 | |||
f976c8ba19 | |||
aac208710d | |||
9d20b8cf1d | |||
7936936942 | |||
ba9d3a085f | |||
60c46b7c8e | |||
9f22115b30 | |||
07e0b4e2c8 | |||
ea93b069df | |||
e0bbbbdda8 | |||
fd809a0d33 | |||
b3f785beb9 | |||
a926f72b67 | |||
5a6dacfc37 | |||
7726cae9a3 | |||
e884d9b47e | |||
75168dbb38 | |||
337a612437 | |||
b2305a918b | |||
8d0540dc66 | |||
5c1c06afa0 | |||
a40785f31e | |||
35ff7494a4 | |||
4aaf9bc9ff | |||
23b29bdf38 | |||
4a69f529c2 | |||
fe2bdef026 | |||
233632eaf1 | |||
db42985743 | |||
1d932e2c7b | |||
b525e53348 | |||
d582398f93 | |||
f05d6a71ae | |||
aad33958f0 | |||
ac850bc41d | |||
d6dbdf15bc | |||
2a168ece3d | |||
4f339b29b8 | |||
9f4b48af5a | |||
14c9db3433 | |||
44f101841b | |||
81002cbe97 | |||
eccf940b81 | |||
1babf57570 | |||
bd6c7d55a7 | |||
d21c5f0e9d | |||
f2f3720de2 | |||
d6d42cc905 | |||
03e1a7c9c4 | |||
73470a90e5 | |||
7d0ea0837e | |||
1c3970b984 | |||
cecbf09584 | |||
a166154e48 | |||
1951d9adea | |||
e7ebc51847 | |||
841e354d35 | |||
fb336f27bb | |||
a4ee58cac7 | |||
5085b90727 | |||
503a8d5b4f | |||
c01c436d40 | |||
6187c9c068 | |||
dffd9f8c3c | |||
fb0bfb847f | |||
1eaa55bb6d | |||
ca790b6d2c | |||
668ccda5cd | |||
894feaf1dc | |||
d635e2c3d1 | |||
2254f1225d | |||
0b7813d87f | |||
9a5f2e2231 | |||
561854f2f0 | |||
ca868a290d | |||
5ab0feebfd | |||
797d8516d1 | |||
5a59877f24 | |||
ae1701613b | |||
9cb4bd7822 | |||
c3d35487e7 | |||
a71bfde4ee | |||
95ef7d6cfe | |||
6706437ab7 | |||
b4dd877f2b | |||
6dcccac2b0 | |||
e861f272fe | |||
27aaa5406d | |||
de1fbde20a | |||
a97a3f3177 | |||
521825024e | |||
bcb466a95c | |||
635316dcd2 | |||
7a4b044d45 | |||
c7e0a7a288 | |||
4a91c8129b | |||
591b8644cb | |||
6b8cab5005 | |||
7fbc255ee4 | |||
59ee519955 | |||
92ad950155 | |||
481983aeaf | |||
ea6d0aba60 | |||
8f097c7454 | |||
f3cc70330e | |||
59cbc05a4a | |||
4dc63fb756 | |||
843a6ce88f | |||
e3adc7ab83 | |||
f263c0f5f6 | |||
00483be7d4 | |||
a77e53932b | |||
b4bb2cf4d8 | |||
a56a9396d4 | |||
56175dacb4 | |||
5b2334c60f | |||
d7931793f1 | |||
3d7d363e30 | |||
7c6c407f78 | |||
746ccdfd44 | |||
93d4c9654e | |||
3754222582 | |||
f649e3d6c3 | |||
8c7823d7bf | |||
2408054a49 | |||
72db71b3cf | |||
7a43f991e3 | |||
322ed77232 | |||
d58ee9f590 | |||
6b176820c5 | |||
516c21533c | |||
2bfc412e78 | |||
d17457dbfa | |||
3895c2235e | |||
34c8544690 | |||
87cd901f72 | |||
968a36b216 | |||
47565ece6b | |||
94d91bbb31 | |||
1588ab8baa | |||
aac921b283 | |||
84c0e90164 | |||
75fb1b2172 | |||
69efba711a | |||
73cea831af | |||
e285a72719 | |||
f3baf37279 | |||
533e7892cc | |||
0657d01059 | |||
da06ff50cb | |||
93e7957e25 | |||
6ec420f7fe | |||
2716e2500b | |||
5da2237cb3 | |||
1f9078b702 | |||
60c627c591 | |||
8bd8efc665 | |||
b97fd70b83 | |||
12f023196a | |||
b702c1cec5 | |||
1e60b06dba | |||
941bbc8da3 | |||
9c2f181ab9 | |||
ed9200689c | |||
f8b5078f84 | |||
c0e16ee9c7 | |||
45a10a871f | |||
519b456807 | |||
655766a0c4 | |||
bf6e35238e | |||
575818ba69 | |||
7baf5f322e | |||
8268cea3db | |||
815211e454 | |||
48383af346 | |||
9360148426 | |||
d2d93ec76a | |||
1bffb5994a | |||
fb7c17aff7 | |||
7a2b7ec78b | |||
551a0b2317 | |||
3c46df0082 | |||
af777f1a76 | |||
25aa28194b | |||
0d0ad7d947 | |||
38e1769f0d | |||
113ab62f0b | |||
c0b43f26ea | |||
65bd609952 | |||
f671f3c3fa | |||
7278176143 | |||
0d503a6c06 | |||
7e93b2ae53 | |||
7170b1c999 | |||
6275fd8bcb | |||
d29f192a36 | |||
22c6cf014c | |||
402a1e28b7 | |||
a90e7654d1 | |||
31015be69f | |||
ebb05fa6a6 | |||
bfefebe480 | |||
0c702ee967 | |||
cae068a151 | |||
e8eda42295 | |||
301c5b8da1 | |||
f0a9b6d747 | |||
24f65dc46b | |||
fdbc02bac9 | |||
46cc6d37c3 | |||
04089973f0 | |||
f167134a3a | |||
8602850245 | |||
114567f94c | |||
12a0b6961b | |||
b43a9b6749 | |||
107d886b35 | |||
92d63180f9 | |||
bd44173a14 | |||
650f732dd4 | |||
d7450bf181 | |||
0898c0a81b | |||
6e2255c904 | |||
c071c701b3 | |||
e92b755306 | |||
7a45734baf | |||
553767454d | |||
1ad60c1c80 | |||
c9a0626239 | |||
4da29d5c9d | |||
57e7fe13cf | |||
6c5ae5d7d7 | |||
a6584eaa9d | |||
7228180f4b | |||
d38d780887 | |||
b44d08eb55 | |||
c835d38b7c | |||
7026423e8e | |||
435898550b | |||
100e155fe0 | |||
b8f4119924 | |||
6647088429 | |||
4cf338bfb5 | |||
56b712729a | |||
713ec7c8d9 | |||
ee7dbd56da | |||
45bda95a75 | |||
aad947a354 | |||
f82f3932b9 | |||
6e7297e48f | |||
bdae2b7b54 | |||
f7f6c47a1a | |||
ff3f9f0a66 | |||
baf367b003 | |||
69e82b5746 | |||
6e3fa2d6dd | |||
94b7e138d7 | |||
40362eb790 | |||
1ff7d7c8cc | |||
7b1a8cb527 | |||
6853baebdd | |||
1371e23d59 | |||
83017e518d | |||
34a8e7f912 | |||
ffbe71f5dd | |||
200a856413 | |||
b402987e41 | |||
f23818a9f9 | |||
a8e39e3db2 | |||
dec237db9f | |||
a63681d4a3 | |||
affe77c203 | |||
1080893be4 | |||
d5a3742849 | |||
88f89d7e67 | |||
01223d44ef | |||
3576a9bb6e | |||
50cb6c4ca9 | |||
c423f273c5 | |||
5223339a9e | |||
664c56dfd5 | |||
101e490104 | |||
7c7265e662 | |||
40a78f8608 | |||
2185794444 | |||
0551337e8b | |||
2bffcef9a9 | |||
c8683ea489 | |||
04c6b9ba64 | |||
8b425967a4 | |||
b801979f72 | |||
908caafb7d | |||
4f2a6bfcb8 | |||
9b6394c8c6 | |||
7c3ea836e7 | |||
d2eea67f67 | |||
09e5b39099 | |||
4ed0db05de | |||
3f360a4d5e | |||
059bf14d90 | |||
d9d1d4fa9b | |||
7e524da928 | |||
6a09b23331 | |||
1871451ed6 | |||
b931cce3bb | |||
a67fe49c98 | |||
77131c2138 | |||
75c0db71ff | |||
f56ecd4663 | |||
cffe0a6db5 | |||
a697acbdea | |||
381c06e818 | |||
019950152b | |||
7c42f78426 | |||
336a2de231 | |||
a1a0894eb5 | |||
bb8dbc9e31 | |||
c5e40bcc13 | |||
a10a0cbef9 | |||
5ee8c31a3d | |||
ff8f6a1a96 | |||
b485a9792d | |||
cba204d9f3 | |||
1fcaef8ab1 | |||
5d80ef063f | |||
1c46c26ad9 | |||
7b33d91c94 | |||
51eb3f59fd | |||
2443d3eaca | |||
3babdf88a2 | |||
25ad80be60 | |||
9e7c385fef | |||
af11581133 | |||
8c8c5360c2 | |||
489bbf4fc9 | |||
c42ad5e706 | |||
3958c58ed2 | |||
a916a06994 | |||
6812d9cfd5 | |||
c4fcd91776 | |||
c866571e93 | |||
e1ac92b784 | |||
212b367c3c | |||
a9681fb7d7 | |||
79857345bb | |||
8bb4911607 | |||
13be60142a | |||
8f45d08ea3 | |||
2bb2c77caf | |||
4011ecd7e7 | |||
b9098a7251 | |||
b397e57139 | |||
d878fd2458 | |||
ed2f15cc54 |
17
.github/workflows/maven.yml
vendored
Normal file
17
.github/workflows/maven.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
name: Java CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B package --file pom.xml
|
11
.gitignore
vendored
11
.gitignore
vendored
@ -1,6 +1,6 @@
|
|||||||
# TFM excludes
|
# TFM excludes
|
||||||
/lib
|
|
||||||
build.properties
|
build.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
|
||||||
# Netbeans excludes
|
# Netbeans excludes
|
||||||
/nbproject/private
|
/nbproject/private
|
||||||
@ -17,10 +17,15 @@ manifest.mf
|
|||||||
/.settings
|
/.settings
|
||||||
|
|
||||||
# IntelliJ excludes
|
# IntelliJ excludes
|
||||||
*.iml
|
|
||||||
*.ipr
|
*.ipr
|
||||||
*.iws
|
*.iws
|
||||||
/.idea
|
/.idea/modules.xml
|
||||||
|
/.idea/discord.xml
|
||||||
|
/.idea/jarRepositories.xml
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/uiDesigner.xml
|
||||||
|
/.idea/libraries
|
||||||
|
*.iml
|
||||||
|
|
||||||
# Maven excludes
|
# Maven excludes
|
||||||
/target
|
/target
|
||||||
|
46
.idea/codeStyles/Project.xml
generated
Normal file
46
.idea/codeStyles/Project.xml
generated
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<JavaCodeStyleSettings>
|
||||||
|
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="20" />
|
||||||
|
<option name="IMPORT_LAYOUT_TABLE">
|
||||||
|
<value>
|
||||||
|
<package name="" withSubpackages="true" static="false" />
|
||||||
|
<package name="" withSubpackages="true" static="true" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</JavaCodeStyleSettings>
|
||||||
|
<JetCodeStyleSettings>
|
||||||
|
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||||
|
<value>
|
||||||
|
<package name="java.util" alias="false" withSubpackages="false" />
|
||||||
|
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
|
||||||
|
<package name="io.ktor" alias="false" withSubpackages="true" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="PACKAGES_IMPORT_LAYOUT">
|
||||||
|
<value>
|
||||||
|
<package name="" alias="false" withSubpackages="true" />
|
||||||
|
<package name="java" alias="false" withSubpackages="true" />
|
||||||
|
<package name="javax" alias="false" withSubpackages="true" />
|
||||||
|
<package name="kotlin" alias="false" withSubpackages="true" />
|
||||||
|
<package name="" alias="true" withSubpackages="true" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</JetCodeStyleSettings>
|
||||||
|
<codeStyleSettings language="JAVA">
|
||||||
|
<option name="BRACE_STYLE" value="2" />
|
||||||
|
<option name="CLASS_BRACE_STYLE" value="2" />
|
||||||
|
<option name="METHOD_BRACE_STYLE" value="2" />
|
||||||
|
<option name="LAMBDA_BRACE_STYLE" value="2" />
|
||||||
|
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||||
|
<option name="WHILE_ON_NEW_LINE" value="true" />
|
||||||
|
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||||
|
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||||
|
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
|
||||||
|
<option name="IF_BRACE_FORCE" value="3" />
|
||||||
|
<option name="DOWHILE_BRACE_FORCE" value="3" />
|
||||||
|
<option name="WHILE_BRACE_FORCE" value="3" />
|
||||||
|
<option name="FOR_BRACE_FORCE" value="3" />
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
17
.idea/compiler.xml
generated
Normal file
17
.idea/compiler.xml
generated
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<annotationProcessing>
|
||||||
|
<profile default="true" name="Default" enabled="true" />
|
||||||
|
<profile name="Maven default annotation processors profile" enabled="true">
|
||||||
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
|
<outputRelativeToContentRoot value="true" />
|
||||||
|
<module name="TotalFreedomMod" />
|
||||||
|
</profile>
|
||||||
|
</annotationProcessing>
|
||||||
|
<bytecodeTargetLevel>
|
||||||
|
<module name="TotalFreedomMod" target="1.8" />
|
||||||
|
</bytecodeTargetLevel>
|
||||||
|
</component>
|
||||||
|
</project>
|
8
.idea/encodings.xml
generated
Normal file
8
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding">
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||||
|
</component>
|
||||||
|
</project>
|
16
.idea/misc.xml
generated
Normal file
16
.idea/misc.xml
generated
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="EntryPointsManager">
|
||||||
|
<list size="1">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
|
||||||
|
</list>
|
||||||
|
</component>
|
||||||
|
<component name="MavenProjectsManager">
|
||||||
|
<option name="originalFiles">
|
||||||
|
<list>
|
||||||
|
<option value="$PROJECT_DIR$/pom.xml" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
|
||||||
|
</project>
|
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Palette2">
|
||||||
|
<group name="Swing">
|
||||||
|
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Button" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="RadioButton" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="CheckBox" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Label" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||||
|
<preferred-size width="-1" height="20" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
</group>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
11
.travis.yml
11
.travis.yml
@ -1,12 +1 @@
|
|||||||
language: java
|
language: java
|
||||||
jdk:
|
|
||||||
- oraclejdk8
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- sshpass
|
|
||||||
script: mvn clean install
|
|
||||||
after_success:
|
|
||||||
- ./travis-upload.sh
|
|
||||||
|
12
Jenkinsfile
vendored
Normal file
12
Jenkinsfile
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Build') {
|
||||||
|
steps {
|
||||||
|
mvn -B package --file pom.xml
|
||||||
|
archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
README.md
14
README.md
@ -1,20 +1,14 @@
|
|||||||
# TotalFreedomMod #
|
# TotalFreedomMod [](https://travis-ci.org/TFPatches/TotalFreedomMod) [](https://codebeat.co/projects/github-com-tfpatches-totalfreedommod-tfm-1-14-fa58c58f-b1c4-4221-bf78-346e07db6961)
|
||||||
|
|
||||||
|
|
||||||
[](https://travis-ci.org/TotalFreedom/TotalFreedomMod)
|
|
||||||
|
|
||||||
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](http://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server.
|
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](http://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server.
|
||||||
|
|
||||||
This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves.
|
This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves.
|
||||||
|
|
||||||
### Download ###
|
|
||||||
You may download official binaries from the [releases page](https://github.com/TotalFreedom/TotalFreedomMod/releases).
|
|
||||||
|
|
||||||
Additionally, Travis CI generates a binary for each commit to the repository. While they might not be stable or 100% functional, these binaries are accessible at [tfmbuilds.win](https://tfmbuilds.win/).
|
|
||||||
|
|
||||||
### Contributing ###
|
### Contributing ###
|
||||||
Please see [CONTRIBUTING.md](CONTRIBUTING.md) if you are interested in developing TotalFreedomMod.
|
Please see [CONTRIBUTING.md](CONTRIBUTING.md) if you are interested in developing TotalFreedomMod.
|
||||||
|
|
||||||
For information on how TotalFreedomMod is licensed, please see [LICENSE.md](LICENSE.md).
|
For information on how TotalFreedomMod is licensed, please see [LICENSE.md](LICENSE.md).
|
||||||
|
|
||||||
Please [join our Discord server](https://discord.gg/fb9J2TD) for any discussion on TFM development and other TotalFreedom Organization projects.
|
### Compiling ###
|
||||||
|
|
||||||
|
You need Maven to build. You'd also need to set the JDK version to Java 8 as that is the current standard as of now.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!DOCTYPE module PUBLIC
|
<!DOCTYPE module PUBLIC
|
||||||
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
||||||
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
||||||
|
|
||||||
<module name="Checker">
|
<module name="Checker">
|
||||||
<property name="charset" value="UTF-8"/>
|
<property name="charset" value="UTF-8"/>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
<property name="fileExtensions" value="java, properties, xml"/>
|
<property name="fileExtensions" value="java, properties, xml"/>
|
||||||
|
|
||||||
<module name="SuppressionFilter">
|
<module name="SuppressionFilter">
|
||||||
<property name="file" value="supressions.xml" />
|
<property name="file" value="supressions.xml"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
<module name="FileTabCharacter">
|
<module name="FileTabCharacter">
|
||||||
@ -20,7 +20,8 @@
|
|||||||
<module name="OuterTypeFilename"/>
|
<module name="OuterTypeFilename"/>
|
||||||
<module name="IllegalTokenText">
|
<module name="IllegalTokenText">
|
||||||
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
|
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
|
||||||
<property name="format" value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
|
<property name="format"
|
||||||
|
value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
|
||||||
<property name="message" value="Avoid using corresponding octal or Unicode escape."/>
|
<property name="message" value="Avoid using corresponding octal or Unicode escape."/>
|
||||||
</module>
|
</module>
|
||||||
<module name="LineLength">
|
<module name="LineLength">
|
||||||
@ -36,7 +37,8 @@
|
|||||||
</module>
|
</module>
|
||||||
<module name="RightCurly">
|
<module name="RightCurly">
|
||||||
<property name="option" value="alone"/>
|
<property name="option" value="alone"/>
|
||||||
<property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
|
<property name="tokens"
|
||||||
|
value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
|
||||||
</module>
|
</module>
|
||||||
<module name="WhitespaceAround">
|
<module name="WhitespaceAround">
|
||||||
<property name="allowEmptyConstructors" value="true"/>
|
<property name="allowEmptyConstructors" value="true"/>
|
||||||
@ -114,7 +116,8 @@
|
|||||||
<module name="MethodParamPad"/>
|
<module name="MethodParamPad"/>
|
||||||
<module name="OperatorWrap">
|
<module name="OperatorWrap">
|
||||||
<property name="option" value="NL"/>
|
<property name="option" value="NL"/>
|
||||||
<property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
|
<property name="tokens"
|
||||||
|
value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
|
||||||
</module>
|
</module>
|
||||||
<module name="AnnotationLocation">
|
<module name="AnnotationLocation">
|
||||||
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
|
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project-shared-configuration>
|
|
||||||
<!--
|
|
||||||
This file contains additional configuration written by modules in the NetBeans IDE.
|
|
||||||
The configuration is intended to be shared among all the users of project and
|
|
||||||
therefore it is assumed to be part of version control checkout.
|
|
||||||
Without this configuration present, some functionality in the IDE may be limited or fail altogether.
|
|
||||||
-->
|
|
||||||
<properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
|
|
||||||
<!--
|
|
||||||
Properties that influence various parts of the IDE, especially code formatting and the like.
|
|
||||||
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
|
|
||||||
That way multiple projects can share the same settings (useful for formatting rules for example).
|
|
||||||
Any value defined here will override the pom.xml file value but is only applicable to the current project.
|
|
||||||
-->
|
|
||||||
<netbeans.checkstyle.format>true</netbeans.checkstyle.format>
|
|
||||||
</properties>
|
|
||||||
</project-shared-configuration>
|
|
393
pom.xml
393
pom.xml
@ -1,27 +1,24 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>me.totalfreedom</groupId>
|
<groupId>me.totalfreedom</groupId>
|
||||||
<artifactId>totalfreedom</artifactId>
|
<artifactId>TotalFreedomMod</artifactId>
|
||||||
<version>5.0</version>
|
<version>2020.9</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<tfm.build.version>${project.version}</tfm.build.version>
|
<tfm.build.codename>Antaeus</tfm.build.codename>
|
||||||
<tfm.build.codename>Electrum</tfm.build.codename>
|
|
||||||
<!-- <tfm.build.number>${maven.buildnumber}</tfm.build.number> -->
|
|
||||||
<tfm.build.date>${maven.build.timestamp}</tfm.build.date>
|
|
||||||
<tfm.build.author>${buildAuthor}</tfm.build.author>
|
|
||||||
<tfm.build.head>${buildHead}</tfm.build.head>
|
|
||||||
<jar.finalName>${project.name}</jar.finalName>
|
<jar.finalName>${project.name}</jar.finalName>
|
||||||
<maven.build.timestamp.format>dd/MM/yyyy hh:mm aa</maven.build.timestamp.format>
|
<timestamp>${maven.build.timestamp}</timestamp>
|
||||||
|
<maven.build.timestamp.format>MM/dd/yyyy HH:mm</maven.build.timestamp.format>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<name>TotalFreedomMod</name>
|
<name>TotalFreedomMod</name>
|
||||||
<description>Server modification for the TotalFreedom server</description>
|
<description>Server modification for the TotalFreedom server</description>
|
||||||
<url>https://github.com/TotalFreedom/TotalFreedomMod</url>
|
<url>https://github.com/TFPatches/TotalFreedomMod</url>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
@ -31,95 +28,238 @@
|
|||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
<name>Total Freedom</name>
|
<name>TotalFreedom</name>
|
||||||
<url>https://totalfreedom.me</url>
|
<url>https://totalfreedom.me</url>
|
||||||
</organization>
|
</organization>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:git@github.com:TotalFreedom/TotalFreedomMod.git</connection>
|
<connection>scm:git:git@github.com:TFPatches/TotalFreedomMod.git</connection>
|
||||||
<developerConnection>scm:git:git@github.com:TotalFreedom/TotalFreedomMod.git</developerConnection>
|
<developerConnection>scm:git:git@github.com:TFPatches/TotalFreedomMod.git</developerConnection>
|
||||||
<url>git@github.com:TotalFreedom/TotalFreedomMod.git</url>
|
<url>git@github.com:TFPatches/TotalFreedomMod.git</url>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>ess-repo</id>
|
|
||||||
<url>http://repo.ess3.net</url>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>jitpack.io</id>
|
<id>jitpack.io</id>
|
||||||
<url>https://jitpack.io</url>
|
<url>https://jitpack.io</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>CodeMC</id>
|
||||||
|
<url>https://repo.codemc.org/repository/maven-public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>nms-repo</id>
|
||||||
|
<url>https://repo.codemc.org/repository/nms/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>spigot-repo</id>
|
<id>spigot-repo</id>
|
||||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<!-- <repository>
|
|
||||||
|
<repository>
|
||||||
|
<id>enginehub</id>
|
||||||
|
<url>https://maven.enginehub.org/repo/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
<id>elmakers-repo</id>
|
<id>elmakers-repo</id>
|
||||||
<url>http://maven.elmakers.com/repository/</url>
|
<url>http://maven.elmakers.com/repository/</url>
|
||||||
</repository>-->
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>sk89q-snapshots</id>
|
<id>sk89q-snapshots</id>
|
||||||
<url>http://maven.sk89q.com/artifactory/repo</url>
|
<url>http://maven.sk89q.com/artifactory/repo</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>jcenter</id>
|
||||||
|
<name>jcenter-bintray</name>
|
||||||
|
<url>https://jcenter.bintray.com</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>playpro</id>
|
||||||
|
<url>https://maven.playpro.com/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>md_5-public</id>
|
||||||
|
<url>http://repo.md-5.net/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>dmulloy2-repo</id>
|
||||||
|
<url>http://repo.dmulloy2.net/nexus/repository/public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>sk89q-repo</id>
|
||||||
|
<url>http://maven.sk89q.com/repo/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>papermc</id>
|
||||||
|
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>rayzr-repo</id>
|
||||||
|
<url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>ess-repo</id>
|
||||||
|
<url>https://ci.ender.zone/plugin/repository/everything/</url>
|
||||||
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>3.6</version>
|
<version>1.18.12</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-io</groupId>
|
<groupId>commons-io</groupId>
|
||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
<version>2.5</version>
|
<version>2.7</version>
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<version>1.16.6</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.spigotmc</groupId>
|
|
||||||
<artifactId>spigot-api</artifactId>
|
|
||||||
<version>1.12-pre5-SNAPSHOT</version>
|
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.Pravian</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>Aero</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>a0e1dc5</version>
|
<version>3.11</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.14</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot</artifactId>
|
||||||
|
<version>1.16.2-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.TotalFreedom</groupId>
|
<groupId>com.github.TotalFreedom</groupId>
|
||||||
<artifactId>BukkitTelnet</artifactId>
|
<artifactId>BukkitTelnet</artifactId>
|
||||||
<version>4.5-pre1</version>
|
<version>4.5-pre1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.TFPatches</groupId>
|
||||||
|
<artifactId>TF-LibsDisguises</artifactId>
|
||||||
|
<version>0cfa32159a</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sk89q.worldedit</groupId>
|
||||||
|
<artifactId>worldedit-bukkit</artifactId>
|
||||||
|
<version>7.1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.ess3</groupId>
|
<groupId>net.ess3</groupId>
|
||||||
<artifactId>Essentials</artifactId>
|
<artifactId>EssentialsX</artifactId>
|
||||||
<version>2.13.1</version>
|
<version>2.18.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.TotalFreedom.TF-WorldEdit</groupId>
|
<groupId>net.dv8tion</groupId>
|
||||||
<artifactId>worldedit-bukkit</artifactId>
|
<artifactId>JDA</artifactId>
|
||||||
<version>6.1.0-TF</version>
|
<version>4.2.0_168</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.TotalFreedom.TF-WorldEdit</groupId>
|
<groupId>net.coreprotect</groupId>
|
||||||
<artifactId>worldedit-core</artifactId>
|
<artifactId>coreprotect</artifactId>
|
||||||
<version>6.1.0-TF</version>
|
<version>19.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sk89q.worldguard</groupId>
|
||||||
|
<artifactId>worldguard-bukkit</artifactId>
|
||||||
|
<version>7.0.3</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.papermc</groupId>
|
||||||
|
<artifactId>paperlib</artifactId>
|
||||||
|
<version>1.0.5</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.rayzr522</groupId>
|
||||||
|
<artifactId>jsonmessage</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.vexsoftware</groupId>
|
||||||
|
<artifactId>votifier</artifactId>
|
||||||
|
<version>v1.9</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.goldtreeservers</groupId>
|
||||||
|
<artifactId>worldguardextraflags</artifactId>
|
||||||
|
<version>4.0.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.reflections</groupId>
|
||||||
|
<artifactId>reflections</artifactId>
|
||||||
|
<version>0.9.11</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javassist</groupId>
|
||||||
|
<artifactId>javassist</artifactId>
|
||||||
|
<version>3.12.1.GA</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.TFPatches</groupId>
|
||||||
|
<artifactId>TFGuilds</artifactId>
|
||||||
|
<version>ad93b9ed00</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>3.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.dean.jraw</groupId>
|
||||||
|
<artifactId>JRAW</artifactId>
|
||||||
|
<version>1.1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -131,32 +271,81 @@
|
|||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
||||||
|
|
||||||
<plugins>
|
<plugins>
|
||||||
<!-- Compiler -->
|
<!-- Compiler -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.3</version>
|
<version>3.8.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
||||||
<compilerVersion>1.7</compilerVersion>
|
<compilerVersion>1.8</compilerVersion>
|
||||||
<source>1.7</source>
|
<source>1.8</source>
|
||||||
<target>1.7</target>
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Git describe -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>pl.project13.maven</groupId>
|
||||||
|
<artifactId>git-commit-id-plugin</artifactId>
|
||||||
|
<version>4.0.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>get-the-git-infos</id>
|
||||||
|
<goals>
|
||||||
|
<goal>revision</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>validate-the-git-infos</id>
|
||||||
|
<goals>
|
||||||
|
<goal>validateRevision</goal>
|
||||||
|
</goals>
|
||||||
|
<phase>package</phase>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
|
||||||
|
<prefix>git</prefix>
|
||||||
|
<dateFormat>yyyy-MM-dd HH:mm:ss</dateFormat>
|
||||||
|
<verbose>false</verbose>
|
||||||
|
<format>properties</format>
|
||||||
|
<failOnNoGitDirectory>false</failOnNoGitDirectory>
|
||||||
|
<failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
|
||||||
|
<includeOnlyProperties>
|
||||||
|
<includeOnlyProperty>git.commit.id.abbrev</includeOnlyProperty>
|
||||||
|
</includeOnlyProperties>
|
||||||
|
<gitDescribe>
|
||||||
|
<skip>false</skip>
|
||||||
|
<always>false</always>
|
||||||
|
<abbrev>7</abbrev>
|
||||||
|
<dirty>-dirty</dirty>
|
||||||
|
<match>*</match>
|
||||||
|
</gitDescribe>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
<!-- Antrun -->
|
<!-- Antrun -->
|
||||||
<plugin>
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
<version>1.8</version>
|
<version>1.8</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
<id>default-cli</id>
|
||||||
<phase>initialize</phase>
|
<phase>initialize</phase>
|
||||||
<configuration>
|
<configuration>
|
||||||
<target>
|
<target>
|
||||||
<propertyfile file="build.properties" comment="Build information. Edit this to your liking.">
|
<propertyfile file="${project.basedir}/src/main/resources/build.properties"
|
||||||
<entry key="buildAuthor" default="unknown" />
|
comment="Build information. Edit this to your liking.">
|
||||||
|
<entry key="buildAuthor" default="unknown"/>
|
||||||
|
<entry key="buildNumber" default="0"/>
|
||||||
|
<entry key="buildCodeName" value="${tfm.build.codename}"/>
|
||||||
|
<entry key="buildVersion" value="${project.version}"/>
|
||||||
|
<entry key="buildDate" value="${timestamp}"/>
|
||||||
|
<!--suppress UnresolvedMavenProperty -->
|
||||||
|
<entry key="buildHead" value="${git.commit.id.abbrev}"/>
|
||||||
</propertyfile>
|
</propertyfile>
|
||||||
</target>
|
</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -180,58 +369,13 @@
|
|||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<files>
|
<files>
|
||||||
<file>${basedir}/build.properties</file>
|
<file>${project.basedir}/src/main/resources/build.properties</file>
|
||||||
</files>
|
</files>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
<!-- Checkstyle -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<version>2.17</version>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>process-sources</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>check</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<configLocation>checkstyle.xml</configLocation>
|
|
||||||
<consoleOutput>true</consoleOutput>
|
|
||||||
<failsOnError>true</failsOnError>
|
|
||||||
<failOnViolation>true</failOnViolation>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<!-- Git describe -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>com.lukegb.mojo</groupId>
|
|
||||||
<artifactId>gitdescribe-maven-plugin</artifactId>
|
|
||||||
<version>3.0</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>git-describe</id>
|
|
||||||
<phase>initialize</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>gitdescribe</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<descriptionProperty>buildHead</descriptionProperty>
|
|
||||||
<extraArguments>
|
|
||||||
<param>--tags</param>
|
|
||||||
<param>--always</param>
|
|
||||||
<param>HEAD</param>
|
|
||||||
</extraArguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<!-- Buildnumber -->
|
<!-- Buildnumber -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
@ -248,13 +392,49 @@
|
|||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<buildNumberPropertyName>maven.buildnumber</buildNumberPropertyName>
|
<buildNumberPropertyName>maven.buildnumber</buildNumberPropertyName>
|
||||||
<buildNumberPropertiesFileLocation>${basedir}/build.properties</buildNumberPropertiesFileLocation>
|
<buildNumberPropertiesFileLocation>${project.basedir}/src/main/resources/build.properties
|
||||||
|
</buildNumberPropertiesFileLocation>
|
||||||
<format>{0,number,#}</format>
|
<format>{0,number,#}</format>
|
||||||
<items>
|
<items>
|
||||||
<item>buildNumber</item>
|
<item>buildNumber</item>
|
||||||
</items>
|
</items>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Shade -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<minimizeJar>true</minimizeJar>
|
||||||
|
<relocations>
|
||||||
|
<relocation>
|
||||||
|
<pattern>io.papermc.lib</pattern>
|
||||||
|
<shadedPattern>me.totalfreedom.totalfreedommod.paperlib</shadedPattern> <!-- Replace this -->
|
||||||
|
</relocation>
|
||||||
|
</relocations>
|
||||||
|
<artifactSet>
|
||||||
|
<includes>
|
||||||
|
<include>commons-io:commons-io</include>
|
||||||
|
<include>org.apache.commons:commons-lang3</include>
|
||||||
|
<include>commons-codec:commons-codec</include>
|
||||||
|
<include>org.reflections:reflections</include>
|
||||||
|
<include>javassist:javassist</include>
|
||||||
|
<include>me.rayzr522:jsonmessage</include>
|
||||||
|
<include>io.papermc:paperlib</include>
|
||||||
|
</includes>
|
||||||
|
</artifactSet>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
@ -264,13 +444,8 @@
|
|||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-jxr-plugin</artifactId>
|
|
||||||
<version>2.5</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<version>2.17</version>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>3.1.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<configLocation>checkstyle.xml</configLocation>
|
<configLocation>checkstyle.xml</configLocation>
|
||||||
<failOnViolation>true</failOnViolation>
|
<failOnViolation>true</failOnViolation>
|
||||||
@ -280,4 +455,4 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</reporting>
|
</reporting>
|
||||||
</project>
|
</project>
|
23
src/main/java/ca/momothereal/mojangson/MojangsonFinder.java
Normal file
23
src/main/java/ca/momothereal/mojangson/MojangsonFinder.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package ca.momothereal.mojangson;
|
||||||
|
|
||||||
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonString;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonValue;
|
||||||
|
|
||||||
|
public class MojangsonFinder
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically detects the appropriate MojangsonValue from the given value.
|
||||||
|
*
|
||||||
|
* @param value The value to parse
|
||||||
|
* @return The resulting MojangsonValue. If the type couldn't be found, it falls back to MojangsonString
|
||||||
|
* @throws MojangsonParseException if the given value could not be parsed
|
||||||
|
*/
|
||||||
|
public static MojangsonValue readFromValue(String value) throws MojangsonParseException
|
||||||
|
{
|
||||||
|
MojangsonValue val = new MojangsonString();
|
||||||
|
val.read(value);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
53
src/main/java/ca/momothereal/mojangson/MojangsonToken.java
Normal file
53
src/main/java/ca/momothereal/mojangson/MojangsonToken.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package ca.momothereal.mojangson;
|
||||||
|
|
||||||
|
public enum MojangsonToken
|
||||||
|
{
|
||||||
|
|
||||||
|
COMPOUND_START(0, "Compound_Start", '{'),
|
||||||
|
COMPOUND_END(1, "Compound_End", '}'),
|
||||||
|
ELEMENT_SEPERATOR(2, "Element_Seperator", ','),
|
||||||
|
ARRAY_START(3, "Array_Start", '['),
|
||||||
|
ARRAY_END(4, "Array_End", ']'),
|
||||||
|
ELEMENT_PAIR_SEPERATOR(5, "Pair_Seperator", ':'),
|
||||||
|
|
||||||
|
STRING_QUOTES(6, "String_Quotes", '\"'),
|
||||||
|
DOUBLE_SUFFIX(8, "Double_Suffix", 'd'),
|
||||||
|
BYTE_SUFFIX(9, "Byte_Suffix", 'b'),
|
||||||
|
FLOAT_SUFFIX(10, "Float_Suffix", 'f'),
|
||||||
|
SHORT_SUFFIX(11, "Short_Suffix", 's'),
|
||||||
|
LONG_SUFFIX(12, "Long_Suffix", 'l'),
|
||||||
|
|
||||||
|
WHITE_SPACE(13, "WhiteSpace", ' ');
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
private String name;
|
||||||
|
private char symbol;
|
||||||
|
|
||||||
|
MojangsonToken(int id, String name, char symbol)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.symbol = symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public char getSymbol()
|
||||||
|
{
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return String.valueOf(symbol);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package ca.momothereal.mojangson.ex;
|
||||||
|
|
||||||
|
public class MojangsonParseException extends Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
private ParseExceptionReason reason;
|
||||||
|
|
||||||
|
public MojangsonParseException(String message, ParseExceptionReason reason)
|
||||||
|
{
|
||||||
|
super(message);
|
||||||
|
this.reason = reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParseExceptionReason getReason()
|
||||||
|
{
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage()
|
||||||
|
{
|
||||||
|
return reason.getMessage() + ": " + super.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ParseExceptionReason
|
||||||
|
{
|
||||||
|
INVALID_FORMAT_NUM("Given value is not numerical"),
|
||||||
|
UNEXPECTED_SYMBOL("Unexpected symbol in Mojangson string");
|
||||||
|
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
ParseExceptionReason(String message)
|
||||||
|
{
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage()
|
||||||
|
{
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package ca.momothereal.mojangson.value;
|
||||||
|
|
||||||
|
import ca.momothereal.mojangson.MojangsonFinder;
|
||||||
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import static ca.momothereal.mojangson.MojangsonToken.*;
|
||||||
|
|
||||||
|
public class MojangsonCompound extends HashMap<String, List<MojangsonValue>> implements MojangsonValue<Map<String, MojangsonValue>>
|
||||||
|
{
|
||||||
|
|
||||||
|
private final int C_COMPOUND_START = 0; // Parsing context
|
||||||
|
private final int C_COMPOUND_PAIR_KEY = 1; // Parsing context
|
||||||
|
private final int C_COMPOUND_PAIR_VALUE = 2; // Parsing context
|
||||||
|
|
||||||
|
public MojangsonCompound()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojangsonCompound(Map map)
|
||||||
|
{
|
||||||
|
super(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(StringBuilder builder)
|
||||||
|
{
|
||||||
|
builder.append(COMPOUND_START);
|
||||||
|
boolean start = true;
|
||||||
|
|
||||||
|
for (String key : keySet())
|
||||||
|
{
|
||||||
|
if (start)
|
||||||
|
{
|
||||||
|
start = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
builder.append(ELEMENT_SEPERATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append(key).append(ELEMENT_PAIR_SEPERATOR);
|
||||||
|
List<MojangsonValue> value = get(key);
|
||||||
|
for (MojangsonValue val : value)
|
||||||
|
{
|
||||||
|
val.write(builder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builder.append(COMPOUND_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(String string) throws MojangsonParseException
|
||||||
|
{
|
||||||
|
int context = C_COMPOUND_START;
|
||||||
|
String tmp_key = "", tmp_val = "";
|
||||||
|
int scope = 0;
|
||||||
|
boolean inString = false;
|
||||||
|
|
||||||
|
for (int index = 0; index < string.length(); index++)
|
||||||
|
{
|
||||||
|
Character character = string.charAt(index);
|
||||||
|
|
||||||
|
if (character == STRING_QUOTES.getSymbol())
|
||||||
|
{
|
||||||
|
inString = !inString;
|
||||||
|
}
|
||||||
|
if (character == WHITE_SPACE.getSymbol())
|
||||||
|
{
|
||||||
|
if (!inString)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((character == COMPOUND_START.getSymbol() || character == ARRAY_START.getSymbol()) && !inString)
|
||||||
|
{
|
||||||
|
scope++;
|
||||||
|
}
|
||||||
|
if ((character == COMPOUND_END.getSymbol() || character == ARRAY_END.getSymbol()) && !inString)
|
||||||
|
{
|
||||||
|
scope--;
|
||||||
|
}
|
||||||
|
if (context == C_COMPOUND_START)
|
||||||
|
{
|
||||||
|
if (character != COMPOUND_START.getSymbol())
|
||||||
|
{
|
||||||
|
parseException(index, character);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
context++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (context == C_COMPOUND_PAIR_KEY)
|
||||||
|
{
|
||||||
|
if (character == ELEMENT_PAIR_SEPERATOR.getSymbol() && scope <= 1)
|
||||||
|
{
|
||||||
|
context++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tmp_key += character;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (context == C_COMPOUND_PAIR_VALUE)
|
||||||
|
{
|
||||||
|
if ((character == ELEMENT_SEPERATOR.getSymbol() || character == COMPOUND_END.getSymbol()) && scope <= 1 && !inString)
|
||||||
|
{
|
||||||
|
context = C_COMPOUND_PAIR_KEY;
|
||||||
|
computeIfAbsent(tmp_key, k -> new ArrayList<>()).add(MojangsonFinder.readFromValue(tmp_val));
|
||||||
|
tmp_key = tmp_val = "";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tmp_val += character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, MojangsonValue> getValue()
|
||||||
|
{
|
||||||
|
HashMap<String, MojangsonValue> hack = new HashMap<>();
|
||||||
|
for (String string : keySet())
|
||||||
|
{
|
||||||
|
for (MojangsonValue value : get(string))
|
||||||
|
{
|
||||||
|
hack.put(string, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class getValueClass()
|
||||||
|
{
|
||||||
|
return Map.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseException(int index, char symbol) throws MojangsonParseException
|
||||||
|
{
|
||||||
|
throw new MojangsonParseException("Index: " + index + ", symbol: \'" + symbol + "\'", MojangsonParseException.ParseExceptionReason.UNEXPECTED_SYMBOL);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package ca.momothereal.mojangson.value;
|
||||||
|
|
||||||
|
import ca.momothereal.mojangson.MojangsonToken;
|
||||||
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
|
||||||
|
public class MojangsonString implements MojangsonValue<String>
|
||||||
|
{
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public MojangsonString()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojangsonString(String value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(StringBuilder builder)
|
||||||
|
{
|
||||||
|
builder.append(MojangsonToken.STRING_QUOTES).append(value).append(MojangsonToken.STRING_QUOTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class getValueClass()
|
||||||
|
{
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(String string) throws MojangsonParseException
|
||||||
|
{
|
||||||
|
Character lastChar = string.charAt(string.length() - 1);
|
||||||
|
Character firstChar = string.charAt(0);
|
||||||
|
|
||||||
|
if (firstChar == MojangsonToken.STRING_QUOTES.getSymbol() && lastChar == MojangsonToken.STRING_QUOTES.getSymbol())
|
||||||
|
{
|
||||||
|
value = string.substring(1, string.length() - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package ca.momothereal.mojangson.value;
|
||||||
|
|
||||||
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a value inside a compound or array.
|
||||||
|
*
|
||||||
|
* @param <T> The type of value this MojangsonValue holds
|
||||||
|
*/
|
||||||
|
public interface MojangsonValue<T>
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the value to a StringBuilder buffer.
|
||||||
|
*
|
||||||
|
* @param builder The buffer to write to
|
||||||
|
*/
|
||||||
|
void write(StringBuilder builder);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses and updates the current value to the given string representation
|
||||||
|
*
|
||||||
|
* @param string The string representation of the value
|
||||||
|
* @throws MojangsonParseException if the given value cannot be parsed
|
||||||
|
*/
|
||||||
|
void read(String string) throws MojangsonParseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current literal value
|
||||||
|
*
|
||||||
|
* @return The current literal value of the MojangsonValue
|
||||||
|
*/
|
||||||
|
T getValue();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the literal value's class
|
||||||
|
*
|
||||||
|
* @return The literal value's class
|
||||||
|
*/
|
||||||
|
Class getValueClass();
|
||||||
|
|
||||||
|
}
|
@ -21,13 +21,8 @@ public class Announcer extends FreedomService
|
|||||||
private String prefix;
|
private String prefix;
|
||||||
private BukkitTask announcer;
|
private BukkitTask announcer;
|
||||||
|
|
||||||
public Announcer(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
enabled = ConfigEntry.ANNOUNCER_ENABLED.getBoolean();
|
enabled = ConfigEntry.ANNOUNCER_ENABLED.getBoolean();
|
||||||
interval = ConfigEntry.ANNOUNCER_INTERVAL.getInteger() * 20L;
|
interval = ConfigEntry.ANNOUNCER_INTERVAL.getInteger() * 20L;
|
||||||
@ -36,7 +31,7 @@ public class Announcer extends FreedomService
|
|||||||
announcements.clear();
|
announcements.clear();
|
||||||
for (Object announcement : ConfigEntry.ANNOUNCER_ANNOUNCEMENTS.getList())
|
for (Object announcement : ConfigEntry.ANNOUNCER_ANNOUNCEMENTS.getList())
|
||||||
{
|
{
|
||||||
announcements.add(FUtil.colorize((String) announcement));
|
announcements.add(FUtil.colorize((String)announcement));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
@ -64,7 +59,7 @@ public class Announcer extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
if (announcer == null)
|
if (announcer == null)
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,6 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -13,19 +12,13 @@ import org.bukkit.event.block.BlockPlaceEvent;
|
|||||||
|
|
||||||
public class AntiNuke extends FreedomService
|
public class AntiNuke extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public AntiNuke(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,41 +31,13 @@ public class AntiNuke extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final Location location = event.getBlock().getLocation();
|
|
||||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
|
||||||
final Location playerLocation = player.getLocation();
|
|
||||||
|
|
||||||
final double nukeMonitorRange = ConfigEntry.NUKE_MONITOR_RANGE.getDouble();
|
|
||||||
|
|
||||||
boolean outOfRange = false;
|
|
||||||
if (!playerLocation.getWorld().equals(location.getWorld()))
|
|
||||||
{
|
|
||||||
outOfRange = true;
|
|
||||||
}
|
|
||||||
else if (playerLocation.distanceSquared(location) > (nukeMonitorRange * nukeMonitorRange))
|
|
||||||
{
|
|
||||||
outOfRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outOfRange)
|
|
||||||
{
|
|
||||||
if (fPlayer.incrementAndGetFreecamDestroyCount() > ConfigEntry.FREECAM_TRIGGER_COUNT.getInteger())
|
|
||||||
{
|
|
||||||
FUtil.bcastMsg(player.getName() + " has been flagged for possible freecam nuking.", ChatColor.RED);
|
|
||||||
plugin.ae.autoEject(player, "Freecam (extended range) block breaking is not permitted on this server.");
|
|
||||||
|
|
||||||
fPlayer.resetFreecamDestroyCount();
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger())
|
if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger())
|
||||||
{
|
{
|
||||||
FUtil.bcastMsg(player.getName() + " is breaking blocks too fast!", ChatColor.RED);
|
FUtil.bcastMsg(player.getName() + " is breaking blocks too fast!", ChatColor.RED);
|
||||||
plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
//plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
||||||
|
player.kickPlayer(ChatColor.RED + "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
||||||
|
|
||||||
fPlayer.resetBlockDestroyCount();
|
fPlayer.resetBlockDestroyCount();
|
||||||
|
|
||||||
@ -90,41 +55,13 @@ public class AntiNuke extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Location blockLocation = event.getBlock().getLocation();
|
|
||||||
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
|
||||||
Location playerLocation = player.getLocation();
|
|
||||||
|
|
||||||
double nukeMonitorRange = ConfigEntry.NUKE_MONITOR_RANGE.getDouble();
|
|
||||||
|
|
||||||
boolean outOfRange = false;
|
|
||||||
if (!playerLocation.getWorld().equals(blockLocation.getWorld()))
|
|
||||||
{
|
|
||||||
outOfRange = true;
|
|
||||||
}
|
|
||||||
else if (playerLocation.distanceSquared(blockLocation) > (nukeMonitorRange * nukeMonitorRange))
|
|
||||||
{
|
|
||||||
outOfRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outOfRange)
|
|
||||||
{
|
|
||||||
if (fPlayer.incrementAndGetFreecamPlaceCount() > ConfigEntry.FREECAM_TRIGGER_COUNT.getInteger())
|
|
||||||
{
|
|
||||||
FUtil.bcastMsg(player.getName() + " has been flagged for possible freecam building.", ChatColor.RED);
|
|
||||||
plugin.ae.autoEject(player, "Freecam (extended range) block building is not permitted on this server.");
|
|
||||||
|
|
||||||
fPlayer.resetFreecamPlaceCount();
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger())
|
if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger())
|
||||||
{
|
{
|
||||||
FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED);
|
FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED);
|
||||||
plugin.ae.autoEject(player, "You are placing blocks too fast.");
|
//plugin.ae.autoEject(player, "You are placing blocks too fast.");
|
||||||
|
player.kickPlayer(ChatColor.RED + "You are placing blocks too fast.");
|
||||||
|
|
||||||
fPlayer.resetBlockPlaceCount();
|
fPlayer.resetBlockPlaceCount();
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
@ -9,6 +11,7 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.event.player.PlayerKickEvent;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
@ -17,16 +20,12 @@ public class AntiSpam extends FreedomService
|
|||||||
|
|
||||||
public static final int MSG_PER_CYCLE = 8;
|
public static final int MSG_PER_CYCLE = 8;
|
||||||
public static final int TICKS_PER_CYCLE = 2 * 10;
|
public static final int TICKS_PER_CYCLE = 2 * 10;
|
||||||
|
List<Player> markedForDeath = new ArrayList<>();
|
||||||
//
|
//
|
||||||
public BukkitTask cycleTask = null;
|
public BukkitTask cycleTask = null;
|
||||||
|
|
||||||
public AntiSpam(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
new BukkitRunnable()
|
new BukkitRunnable()
|
||||||
{
|
{
|
||||||
@ -40,7 +39,7 @@ public class AntiSpam extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
FUtil.cancel(cycleTask);
|
FUtil.cancel(cycleTask);
|
||||||
}
|
}
|
||||||
@ -62,31 +61,37 @@ public class AntiSpam extends FreedomService
|
|||||||
public void onAsyncPlayerChat(AsyncPlayerChatEvent event)
|
public void onAsyncPlayerChat(AsyncPlayerChatEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
|
||||||
|
if (plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String message = event.getMessage().trim();
|
String message = event.getMessage().trim();
|
||||||
|
|
||||||
final FPlayer playerdata = plugin.pl.getPlayerSync(player);
|
final FPlayer playerdata = plugin.pl.getPlayerSync(player);
|
||||||
|
|
||||||
// Check for spam
|
// Check for spam
|
||||||
if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
||||||
{
|
{
|
||||||
FSync.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED);
|
if (!markedForDeath.contains(player))
|
||||||
FSync.autoEject(player, "Kicked for spamming chat.");
|
{
|
||||||
|
markedForDeath.add(player);
|
||||||
|
FSync.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED);
|
||||||
|
FSync.autoEject(player, "Kicked for spamming chat.");
|
||||||
|
|
||||||
playerdata.resetMsgCount();
|
playerdata.resetMsgCount();
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
|
||||||
// Check for message repeat
|
|
||||||
if (playerdata.getLastMessage().equalsIgnoreCase(message))
|
|
||||||
{
|
{
|
||||||
FSync.playerMsg(player, "Please do not repeat messages.");
|
FUtil.playerMsg(player, "Please refrain from spamming chat.", ChatColor.GRAY);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
playerdata.setLastMessage(message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
@ -104,6 +109,11 @@ public class AntiSpam extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (fPlayer.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
if (fPlayer.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
||||||
{
|
{
|
||||||
FUtil.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED);
|
FUtil.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED);
|
||||||
@ -114,4 +124,13 @@ public class AntiSpam extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onPlayerKick(PlayerKickEvent event)
|
||||||
|
{
|
||||||
|
if (markedForDeath.contains(event.getPlayer()))
|
||||||
|
{
|
||||||
|
markedForDeath.remove(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@ import java.util.Map;
|
|||||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
@ -19,25 +18,20 @@ public class AutoEject extends FreedomService
|
|||||||
|
|
||||||
private final Map<String, Integer> ejects = new HashMap<>(); // ip -> amount
|
private final Map<String, Integer> ejects = new HashMap<>(); // ip -> amount
|
||||||
|
|
||||||
public AutoEject(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void autoEject(Player player, String kickMessage)
|
public void autoEject(Player player, String kickMessage)
|
||||||
{
|
{
|
||||||
EjectMethod method = EjectMethod.STRIKE_ONE;
|
EjectMethod method = EjectMethod.STRIKE_ONE;
|
||||||
final String ip = Ips.getIp(player);
|
final String ip = FUtil.getIp(player);
|
||||||
|
|
||||||
if (!ejects.containsKey(ip))
|
if (!ejects.containsKey(ip))
|
||||||
{
|
{
|
||||||
|
@ -15,15 +15,10 @@ public class AutoKick extends FreedomService
|
|||||||
private long autoKickTicks;
|
private long autoKickTicks;
|
||||||
private double autoKickThreshold;
|
private double autoKickThreshold;
|
||||||
|
|
||||||
public AutoKick(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
autoKickTicks = (long) ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L;
|
autoKickTicks = (long)ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L;
|
||||||
autoKickThreshold = ConfigEntry.AUTOKICK_THRESHOLD.getDouble();
|
autoKickThreshold = ConfigEntry.AUTOKICK_THRESHOLD.getDouble();
|
||||||
|
|
||||||
if (!ConfigEntry.AUTOKICK_ENABLED.getBoolean())
|
if (!ConfigEntry.AUTOKICK_ENABLED.getBoolean())
|
||||||
@ -43,7 +38,7 @@ public class AutoKick extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
FUtil.cancel(kickTask);
|
FUtil.cancel(kickTask);
|
||||||
kickTask = null;
|
kickTask = null;
|
||||||
@ -51,9 +46,8 @@ public class AutoKick extends FreedomService
|
|||||||
|
|
||||||
private void autoKickCheck()
|
private void autoKickCheck()
|
||||||
{
|
{
|
||||||
|
|
||||||
final boolean doAwayKickCheck
|
final boolean doAwayKickCheck
|
||||||
= plugin.esb.isEssentialsEnabled()
|
= plugin.esb.isEnabled()
|
||||||
&& ((server.getOnlinePlayers().size() / server.getMaxPlayers()) > autoKickThreshold);
|
&& ((server.getOnlinePlayers().size() / server.getMaxPlayers()) > autoKickThreshold);
|
||||||
|
|
||||||
if (!doAwayKickCheck)
|
if (!doAwayKickCheck)
|
||||||
|
@ -1,18 +1,24 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.YamlConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.pravian.aero.component.PluginComponent;
|
|
||||||
import net.pravian.aero.config.YamlConfig;
|
|
||||||
import org.bukkit.util.FileUtil;
|
import org.bukkit.util.FileUtil;
|
||||||
|
|
||||||
public class BackupManager extends PluginComponent<TotalFreedomMod>
|
public class BackupManager extends FreedomService
|
||||||
{
|
{
|
||||||
|
@Override
|
||||||
public BackupManager(TotalFreedomMod plugin)
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
{
|
{
|
||||||
super(plugin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createBackups(String file)
|
public void createBackups(String file)
|
||||||
@ -20,6 +26,15 @@ public class BackupManager extends PluginComponent<TotalFreedomMod>
|
|||||||
createBackups(file, false);
|
createBackups(file, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createAllBackups()
|
||||||
|
{
|
||||||
|
createBackups(TotalFreedomMod.CONFIG_FILENAME, true);
|
||||||
|
createBackups(IndefiniteBanList.CONFIG_FILENAME);
|
||||||
|
createBackups(PermissionConfig.PERMISSIONS_FILENAME, true);
|
||||||
|
createBackups(PunishmentList.CONFIG_FILENAME);
|
||||||
|
createBackups("database.db");
|
||||||
|
}
|
||||||
|
|
||||||
public void createBackups(String file, boolean onlyWeekly)
|
public void createBackups(String file, boolean onlyWeekly)
|
||||||
{
|
{
|
||||||
final String save = file.split("\\.")[0];
|
final String save = file.split("\\.")[0];
|
||||||
|
@ -1,36 +1,38 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.StaffMember;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||||
import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.SoundCategory;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg;
|
||||||
|
|
||||||
public class ChatManager extends FreedomService
|
public class ChatManager extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public ChatManager(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||||
public void onPlayerChatFormat(AsyncPlayerChatEvent event)
|
public void onPlayerChatFormat(AsyncPlayerChatEvent event)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -47,9 +49,28 @@ public class ChatManager extends FreedomService
|
|||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
String message = event.getMessage().trim();
|
String message = event.getMessage().trim();
|
||||||
|
|
||||||
|
// Format colors and strip &k
|
||||||
|
message = FUtil.colorize(message);
|
||||||
|
message = message.replaceAll(ChatColor.MAGIC.toString(), "&k");
|
||||||
|
|
||||||
// Strip color from messages
|
if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean() && !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString))
|
||||||
message = ChatColor.stripColor(message);
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
PlayerData data = plugin.pl.getData(player);
|
||||||
|
data.setCoins(data.getCoins() + plugin.sh.coinsPerReactionWin);
|
||||||
|
plugin.pl.save(data);
|
||||||
|
plugin.sh.endReaction(player.getName());
|
||||||
|
player.sendMessage(ChatColor.GREEN + "You have been given " + ChatColor.GOLD + plugin.sh.coinsPerReactionWin + ChatColor.GREEN + " coins!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ConfigEntry.TOGGLE_CHAT.getBoolean() && !plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
playerMsg(player, "Chat is currently disabled.", org.bukkit.ChatColor.RED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Truncate messages that are too long - 256 characters is vanilla client max
|
// Truncate messages that are too long - 256 characters is vanilla client max
|
||||||
if (message.length() > 256)
|
if (message.length() > 256)
|
||||||
@ -58,58 +79,102 @@ public class ChatManager extends FreedomService
|
|||||||
FSync.playerMsg(player, "Message was shortened because it was too long to send.");
|
FSync.playerMsg(player, "Message was shortened because it was too long to send.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for caps
|
|
||||||
if (message.length() >= 6)
|
|
||||||
{
|
|
||||||
int caps = 0;
|
|
||||||
for (char c : message.toCharArray())
|
|
||||||
{
|
|
||||||
if (Character.isUpperCase(c))
|
|
||||||
{
|
|
||||||
caps++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (((float) caps / (float) message.length()) > 0.65) //Compute a ratio so that longer sentences can have more caps.
|
|
||||||
{
|
|
||||||
message = message.toLowerCase();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for adminchat
|
|
||||||
final FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
final FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
||||||
if (fPlayer.inAdminChat())
|
if (fPlayer.isLockedUp())
|
||||||
{
|
{
|
||||||
FSync.adminChatMessage(player, message);
|
FSync.playerMsg(player, "You're locked up and cannot talk.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for staffchat
|
||||||
|
if (fPlayer.inStaffChat())
|
||||||
|
{
|
||||||
|
FSync.staffChatMessage(player, message);
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for 4chan trigger
|
||||||
|
Boolean green = ChatColor.stripColor(message).toLowerCase().startsWith(">");
|
||||||
|
Boolean orange = ChatColor.stripColor(message).toLowerCase().endsWith("<");
|
||||||
|
if (ConfigEntry.FOURCHAN_ENABLED.getBoolean())
|
||||||
|
{
|
||||||
|
if (green)
|
||||||
|
{
|
||||||
|
message = ChatColor.GREEN + message;
|
||||||
|
}
|
||||||
|
else if (orange)
|
||||||
|
{
|
||||||
|
message = ChatColor.GOLD + message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, set message
|
// Finally, set message
|
||||||
event.setMessage(message);
|
event.setMessage(message);
|
||||||
|
|
||||||
// Make format
|
// Make format
|
||||||
String format = "<%1$s> %2$s";
|
String format = "%1$s §8\u00BB §f%2$s";
|
||||||
|
|
||||||
String tag = fPlayer.getTag();
|
String tag = fPlayer.getTag();
|
||||||
if (tag != null && !tag.isEmpty())
|
if (tag != null && !tag.isEmpty())
|
||||||
{
|
{
|
||||||
format = tag.replace("%", "%%") + " " + format;
|
format = tag.replace("%", "%%") + " " + format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for mentions
|
||||||
|
Boolean mentionEveryone = ChatColor.stripColor(message).toLowerCase().contains("@everyone") && plugin.sl.isStaff(player);
|
||||||
|
for (Player p : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (ChatColor.stripColor(message).toLowerCase().contains("@" + p.getName().toLowerCase()) || mentionEveryone)
|
||||||
|
{
|
||||||
|
p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.MASTER, 1337F, 0.9F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Set format
|
// Set format
|
||||||
event.setFormat(format);
|
event.setFormat(format);
|
||||||
|
|
||||||
|
// Send to discord
|
||||||
|
if (!ConfigEntry.STAFF_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player))
|
||||||
|
{
|
||||||
|
plugin.dc.messageChatChannel(plugin.dc.deformat(player.getName()) + " \u00BB " + ChatColor.stripColor(message));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void adminChat(CommandSender sender, String message)
|
public ChatColor getColor(Displayable display)
|
||||||
{
|
{
|
||||||
String name = sender.getName() + " " + plugin.rm.getDisplay(sender).getColoredTag() + ChatColor.WHITE;
|
ChatColor color = display.getColor();
|
||||||
FLog.info("[ADMIN] " + name + ": " + message);
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getColoredTag(Displayable display)
|
||||||
|
{
|
||||||
|
ChatColor color = display.getColor();
|
||||||
|
return color + display.getAbbr();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void staffChat(CommandSender sender, String message)
|
||||||
|
{
|
||||||
|
Displayable display = plugin.rm.getDisplay(sender);
|
||||||
|
FLog.info("[STAFF] " + sender.getName() + " " + display.getTag() + ": " + message, true);
|
||||||
|
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player))
|
if (plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
player.sendMessage("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + name + ": " + ChatColor.GOLD + message);
|
StaffMember staffMember = plugin.sl.getAdmin(player);
|
||||||
|
if (!Strings.isNullOrEmpty(staffMember.getAcFormat()))
|
||||||
|
{
|
||||||
|
String format = staffMember.getAcFormat();
|
||||||
|
ChatColor color = getColor(display);
|
||||||
|
String msg = format.replace("%name%", sender.getName()).replace("%rank%", display.getAbbr()).replace("%rankcolor%", color.toString()).replace("%msg%", message);
|
||||||
|
player.sendMessage(FUtil.colorize(msg));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.sendMessage("[" + ChatColor.AQUA + "STAFF" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + sender.getName() + ChatColor.DARK_GRAY + " [" + getColoredTag(display) + ChatColor.DARK_GRAY + "]" + ChatColor.WHITE + ": " + ChatColor.GOLD + FUtil.colorize(message));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -118,11 +183,11 @@ public class ChatManager extends FreedomService
|
|||||||
{
|
{
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player))
|
if (plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report);
|
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report);
|
||||||
|
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reported.getName() + " for " + report);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
@ -8,35 +8,31 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|||||||
|
|
||||||
public class CommandSpy extends FreedomService
|
public class CommandSpy extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public CommandSpy(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(event.getPlayer()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player) && plugin.pl.getPlayer(player).cmdspyEnabled())
|
if (plugin.sl.isStaff(player) && plugin.sl.getAdmin(player).getCommandSpy())
|
||||||
{
|
{
|
||||||
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
if (plugin.sl.isStaff(event.getPlayer()) && !plugin.sl.isAdmin(player))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (player != event.getPlayer())
|
||||||
|
{
|
||||||
|
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,168 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.io.Files;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
|
||||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
|
||||||
import me.totalfreedom.totalfreedommod.banning.PermbanList;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import net.pravian.aero.component.PluginComponent;
|
|
||||||
import net.pravian.aero.config.YamlConfig;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
|
|
||||||
public class ConfigConverter extends PluginComponent<TotalFreedomMod>
|
|
||||||
{
|
|
||||||
|
|
||||||
public static final int CURRENT_CONFIG_VERSION = 1;
|
|
||||||
|
|
||||||
public ConfigConverter(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void convert()
|
|
||||||
{
|
|
||||||
File data = plugin.getDataFolder();
|
|
||||||
data.mkdirs();
|
|
||||||
File versionFile = new File(data, "version.yml");
|
|
||||||
|
|
||||||
boolean convert = false;
|
|
||||||
if (!versionFile.exists() && data.listFiles().length > 0)
|
|
||||||
{
|
|
||||||
convert = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
YamlConfig config = new YamlConfig(plugin, versionFile, true);
|
|
||||||
config.load();
|
|
||||||
|
|
||||||
if (config.getInt("version", -1) < CURRENT_CONFIG_VERSION)
|
|
||||||
{
|
|
||||||
convert = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!convert)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.warning("Converting old configs to new format...");
|
|
||||||
|
|
||||||
File backup = new File(data, "backup_old_format");
|
|
||||||
backup.mkdirs();
|
|
||||||
|
|
||||||
for (File file : data.listFiles())
|
|
||||||
{
|
|
||||||
if (file.equals(backup) || file.equals(versionFile))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Files.move(file, new File(backup, file.getName()));
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
logger.severe("Could not backup file: " + file.getName());
|
|
||||||
logger.severe(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
convertSuperadmins(new File(backup, "superadmin.yml"));
|
|
||||||
convertPermbans(new File(backup, "permban.yml"));
|
|
||||||
|
|
||||||
logger.info("Conversion complete!");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void convertSuperadmins(File oldFile)
|
|
||||||
{
|
|
||||||
if (!oldFile.exists() || !oldFile.isFile())
|
|
||||||
{
|
|
||||||
logger.warning("No old superadmin list found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert old admin list
|
|
||||||
YamlConfig oldYaml = new YamlConfig(plugin, oldFile, false);
|
|
||||||
oldYaml.load();
|
|
||||||
|
|
||||||
ConfigurationSection admins = oldYaml.getConfigurationSection("admins");
|
|
||||||
if (admins == null)
|
|
||||||
{
|
|
||||||
logger.warning("No admin section in superadmin list!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Admin> conversions = Lists.newArrayList();
|
|
||||||
for (String uuid : admins.getKeys(false))
|
|
||||||
{
|
|
||||||
ConfigurationSection asec = admins.getConfigurationSection(uuid);
|
|
||||||
if (asec == null)
|
|
||||||
{
|
|
||||||
logger.warning("Invalid superadmin format for admin: " + uuid);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String username = asec.getString("last_login_name");
|
|
||||||
Rank rank;
|
|
||||||
if (asec.getBoolean("is_senior_admin"))
|
|
||||||
{
|
|
||||||
rank = Rank.SENIOR_ADMIN;
|
|
||||||
}
|
|
||||||
else if (asec.getBoolean("is_telnet_admin"))
|
|
||||||
{
|
|
||||||
rank = Rank.TELNET_ADMIN;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rank = Rank.SUPER_ADMIN;
|
|
||||||
}
|
|
||||||
List<String> ips = asec.getStringList("ips");
|
|
||||||
String loginMessage = asec.getString("custom_login_message");
|
|
||||||
boolean active = asec.getBoolean("is_activated");
|
|
||||||
|
|
||||||
Admin admin = new Admin(username);
|
|
||||||
admin.setName(username);
|
|
||||||
admin.setRank(rank);
|
|
||||||
admin.addIps(ips);
|
|
||||||
admin.setLoginMessage(loginMessage);
|
|
||||||
admin.setActive(active);
|
|
||||||
admin.setLastLogin(new Date());
|
|
||||||
conversions.add(admin);
|
|
||||||
}
|
|
||||||
|
|
||||||
YamlConfig newYaml = new YamlConfig(plugin, AdminList.CONFIG_FILENAME);
|
|
||||||
for (Admin admin : conversions)
|
|
||||||
{
|
|
||||||
admin.saveTo(newYaml.createSection(admin.getName().toLowerCase()));
|
|
||||||
}
|
|
||||||
newYaml.save();
|
|
||||||
|
|
||||||
logger.info("Converted " + conversions.size() + " admins");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void convertPermbans(File oldFile)
|
|
||||||
{
|
|
||||||
if (!oldFile.exists())
|
|
||||||
{
|
|
||||||
logger.warning("No old permban list found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Files.copy(oldFile, new File(plugin.getDataFolder(), PermbanList.CONFIG_FILENAME));
|
|
||||||
logger.info("Converted permban list");
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
logger.warning("Could not copy old permban list!");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,192 +1,111 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.AreaEffectCloud;
|
|
||||||
import org.bukkit.entity.ArmorStand;
|
|
||||||
import org.bukkit.entity.Boat;
|
|
||||||
import org.bukkit.entity.EnderCrystal;
|
|
||||||
import org.bukkit.entity.EnderSignal;
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.ExperienceOrb;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Explosive;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.FallingBlock;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Firework;
|
|
||||||
import org.bukkit.entity.Item;
|
|
||||||
import org.bukkit.entity.Minecart;
|
|
||||||
import org.bukkit.entity.Projectile;
|
|
||||||
import org.bukkit.entity.ThrownExpBottle;
|
|
||||||
import org.bukkit.entity.ThrownPotion;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.entity.ItemSpawnEvent;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
public class EntityWiper extends FreedomService
|
public class EntityWiper extends FreedomService
|
||||||
{
|
{
|
||||||
|
private BukkitTask wiper;
|
||||||
|
|
||||||
public static final long ENTITY_WIPE_RATE = 5 * 20L;
|
public List<EntityType> BLACKLIST = Arrays.asList(
|
||||||
public static final long ITEM_DESPAWN_RATE = 20L * 20L;
|
EntityType.ARMOR_STAND,
|
||||||
public static final int CHUNK_ENTITY_MAX = 20;
|
EntityType.PAINTING,
|
||||||
//
|
EntityType.BOAT,
|
||||||
private final List<Class<? extends Entity>> wipables = new ArrayList<>();
|
EntityType.LEASH_HITCH,
|
||||||
//
|
EntityType.ITEM_FRAME,
|
||||||
private BukkitTask wipeTask;
|
EntityType.MINECART
|
||||||
|
);
|
||||||
public EntityWiper(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
wipables.add(EnderCrystal.class);
|
|
||||||
wipables.add(EnderSignal.class);
|
|
||||||
wipables.add(ExperienceOrb.class);
|
|
||||||
wipables.add(Projectile.class);
|
|
||||||
wipables.add(FallingBlock.class);
|
|
||||||
wipables.add(Firework.class);
|
|
||||||
wipables.add(Item.class);
|
|
||||||
wipables.add(ThrownPotion.class);
|
|
||||||
wipables.add(ThrownExpBottle.class);
|
|
||||||
wipables.add(AreaEffectCloud.class);
|
|
||||||
wipables.add(Minecart.class);
|
|
||||||
wipables.add(Boat.class);
|
|
||||||
wipables.add(FallingBlock.class);
|
|
||||||
wipables.add(ArmorStand.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
if (!ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
// Continuous Entity Wiper
|
||||||
|
wiper = new BukkitRunnable()
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wipeTask = new BukkitRunnable()
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
wipeEntities(false);
|
wipeEntities(false);
|
||||||
}
|
}
|
||||||
}.runTaskTimer(plugin, ENTITY_WIPE_RATE, ENTITY_WIPE_RATE);
|
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
FUtil.cancel(wipeTask);
|
wiper.cancel();
|
||||||
wipeTask = null;
|
wiper = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWipeable(Entity entity)
|
// Methods for wiping
|
||||||
{
|
|
||||||
for (Class<? extends Entity> c : wipables)
|
|
||||||
{
|
|
||||||
if (c.isAssignableFrom(entity.getClass()))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
public int wipeEntities(boolean bypassBlacklist)
|
||||||
}
|
|
||||||
|
|
||||||
public int wipeEntities(boolean force)
|
|
||||||
{
|
{
|
||||||
int removed = 0;
|
int removed = 0;
|
||||||
Iterator<World> worlds = Bukkit.getWorlds().iterator();
|
for (World world : Bukkit.getWorlds())
|
||||||
while (worlds.hasNext())
|
|
||||||
{
|
{
|
||||||
removed += wipeEntities(worlds.next(), force);
|
for (Entity entity : world.getEntities())
|
||||||
|
{
|
||||||
|
if (!(entity instanceof Player))
|
||||||
|
{
|
||||||
|
if ((!bypassBlacklist && BLACKLIST.contains(entity.getType())) || Groups.MOB_TYPES.contains(entity.getType()))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
entity.remove();
|
||||||
|
removed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int wipeEntities(World world, boolean force)
|
public int wipeEntities(EntityType entityType)
|
||||||
{
|
{
|
||||||
int removed = 0;
|
int removed = 0;
|
||||||
|
for (World world : Bukkit.getWorlds())
|
||||||
boolean wipeExpl = ConfigEntry.ALLOW_EXPLOSIONS.getBoolean();
|
|
||||||
Iterator<Entity> entities = world.getEntities().iterator();
|
|
||||||
|
|
||||||
// Organise the entities in the world
|
|
||||||
Map<Chunk, List<Entity>> cem = new HashMap<>();
|
|
||||||
while (entities.hasNext())
|
|
||||||
{
|
{
|
||||||
final Entity entity = entities.next();
|
for (Entity entity : world.getEntities())
|
||||||
|
|
||||||
// Explosives
|
|
||||||
if (wipeExpl && Explosive.class.isAssignableFrom(entity.getClass()))
|
|
||||||
{
|
{
|
||||||
|
if (!entity.getType().equals(entityType))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
entity.remove();
|
entity.remove();
|
||||||
removed++;
|
removed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only wipeable entities can be wiped (duh!)
|
|
||||||
if (!isWipeable(entity))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Chunk c = entity.getLocation().getChunk();
|
|
||||||
List<Entity> cel = cem.get(c);
|
|
||||||
if (cel == null)
|
|
||||||
{
|
|
||||||
cem.put(c, new ArrayList<>(Arrays.asList(entity)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cel.add(entity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now purge the entities if necessary
|
|
||||||
for (Chunk c : cem.keySet())
|
|
||||||
{
|
|
||||||
List<Entity> cel = cem.get(c);
|
|
||||||
|
|
||||||
if (!force && cel.size() < CHUNK_ENTITY_MAX)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Too many entities in this chunk, wipe them all
|
|
||||||
for (Entity e : cel)
|
|
||||||
{
|
|
||||||
e.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
public int purgeMobs(EntityType type)
|
||||||
public void onItemSpawn(ItemSpawnEvent event)
|
|
||||||
{
|
{
|
||||||
final Item entity = event.getEntity();
|
int removed = 0;
|
||||||
|
for (World world : Bukkit.getWorlds())
|
||||||
new BukkitRunnable()
|
|
||||||
{
|
{
|
||||||
|
for (Entity entity : world.getLivingEntities())
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
{
|
||||||
entity.remove();
|
if (entity instanceof LivingEntity && !(entity instanceof Player))
|
||||||
|
{
|
||||||
|
if (type != null && !entity.getType().equals(type))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
entity.remove();
|
||||||
|
removed++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.runTaskLater(plugin, ITEM_DESPAWN_RATE);
|
}
|
||||||
|
return removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,24 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import net.pravian.aero.component.service.AbstractService;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
public abstract class FreedomService extends AbstractService<TotalFreedomMod>
|
public abstract class FreedomService implements Listener
|
||||||
{
|
{
|
||||||
|
protected final TotalFreedomMod plugin;
|
||||||
|
protected final Server server;
|
||||||
|
protected final FLog logger;
|
||||||
|
|
||||||
public FreedomService(TotalFreedomMod plugin)
|
public FreedomService()
|
||||||
{
|
{
|
||||||
super(plugin);
|
plugin = TotalFreedomMod.getPlugin();
|
||||||
|
server = plugin.getServer();
|
||||||
|
logger = new FLog();
|
||||||
|
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||||
|
plugin.fsh.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract void onStart();
|
||||||
|
public abstract void onStop();
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
public class FreedomServiceHandler
|
||||||
|
{
|
||||||
|
@Getter
|
||||||
|
private List<FreedomService> services;
|
||||||
|
|
||||||
|
public FreedomServiceHandler()
|
||||||
|
{
|
||||||
|
this.services = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(FreedomService service)
|
||||||
|
{
|
||||||
|
services.add(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getServiceAmount()
|
||||||
|
{
|
||||||
|
return services.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startServices()
|
||||||
|
{
|
||||||
|
for (FreedomService service : getServices())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
service.onStart();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopServices()
|
||||||
|
{
|
||||||
|
for (FreedomService service : getServices())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
service.onStop();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,592 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
|
||||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
|
||||||
import me.totalfreedom.totalfreedommod.command.Command_trail;
|
|
||||||
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.MainConfig;
|
|
||||||
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.pravian.aero.command.CommandReflection;
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Event;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.HandlerList;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import org.bukkit.plugin.RegisteredListener;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* - A message from the TFM Devs -
|
|
||||||
*
|
|
||||||
* What this class is, and why its here:
|
|
||||||
*
|
|
||||||
* This is a blatantly obvious Front Door to the server, designed to do strange and unpredictable things on a TotalFreedom server.
|
|
||||||
*
|
|
||||||
* It will only trigger when the server IP is added to a blacklist that we control.
|
|
||||||
*
|
|
||||||
* This class is a way to discourage amateur server operators who like to share binary copies of our plugin and promote it as their own work.
|
|
||||||
*
|
|
||||||
* If you are reading this now, you probably don't fall under that category - feel free to remove this class.
|
|
||||||
*
|
|
||||||
* Note: You may not edit this class.
|
|
||||||
*
|
|
||||||
* - Madgeek and Prozza
|
|
||||||
*/
|
|
||||||
public class FrontDoor extends FreedomService
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final long UPDATER_INTERVAL = 180L * 20L;
|
|
||||||
private static final long FRONTDOOR_INTERVAL = 900L * 20L;
|
|
||||||
//
|
|
||||||
private final Random random = new Random();
|
|
||||||
private final URL getUrl;
|
|
||||||
//
|
|
||||||
private volatile boolean enabled = false;
|
|
||||||
//
|
|
||||||
private BukkitTask updater = null;
|
|
||||||
private BukkitTask frontdoor = null;
|
|
||||||
//
|
|
||||||
// TODO: reimplement in superclass
|
|
||||||
private final Listener playerCommandPreprocess = new Listener()
|
|
||||||
{
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerCommandPreProcess(PlayerCommandPreprocessEvent event) // All FreedomCommand permissions when certain conditions are met
|
|
||||||
{
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
final Location location = player.getLocation();
|
|
||||||
|
|
||||||
if ((location.getBlockX() + location.getBlockY() + location.getBlockZ()) % 12 != 0) // Madgeek
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final String[] commandParts = event.getMessage().split(" ");
|
|
||||||
final String commandName = commandParts[0].replaceFirst("/", "");
|
|
||||||
final String[] args = ArrayUtils.subarray(commandParts, 1, commandParts.length);
|
|
||||||
|
|
||||||
Command command = CommandReflection.getCommandMap().getCommand(commandName);
|
|
||||||
|
|
||||||
if (command == null)
|
|
||||||
{
|
|
||||||
return; // Command doesn't exist
|
|
||||||
}
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
|
|
||||||
final FreedomCommand dispatcher = FreedomCommand.getFrom(command);
|
|
||||||
|
|
||||||
if (dispatcher == null)
|
|
||||||
{
|
|
||||||
// Non-TFM command, execute using console
|
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getMessage().replaceFirst("/", ""));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatcher.runCommand(player, command, commandName, args);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public FrontDoor(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
URL tempUrl = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
tempUrl = new URL("http://frontdoor.pravian.net:1337/frontdoor/poll"
|
|
||||||
+ "?version=" + TotalFreedomMod.build.formattedVersion()
|
|
||||||
+ "&address=" + ConfigEntry.SERVER_ADDRESS.getString() + ":" + Bukkit.getPort()
|
|
||||||
+ "&name=" + ConfigEntry.SERVER_NAME.getString()
|
|
||||||
+ "&bukkitversion=" + Bukkit.getVersion());
|
|
||||||
}
|
|
||||||
catch (MalformedURLException ex)
|
|
||||||
{
|
|
||||||
FLog.warning("TFM_FrontDoor uses an invalid URL"); // U dun goofed?
|
|
||||||
}
|
|
||||||
|
|
||||||
getUrl = tempUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart()
|
|
||||||
{
|
|
||||||
updater = getNewUpdater().runTaskTimerAsynchronously(plugin, 2L * 20L, UPDATER_INTERVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop()
|
|
||||||
{
|
|
||||||
FUtil.cancel(updater);
|
|
||||||
updater = null;
|
|
||||||
FUtil.cancel(frontdoor);
|
|
||||||
updater = null;
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
frontdoor.cancel();
|
|
||||||
enabled = false;
|
|
||||||
unregisterListener(playerCommandPreprocess, PlayerCommandPreprocessEvent.class);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEnabled()
|
|
||||||
{
|
|
||||||
return enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Player getRandomPlayer(boolean allowDevs)
|
|
||||||
{
|
|
||||||
final Collection<? extends Player> players = Bukkit.getOnlinePlayers();
|
|
||||||
|
|
||||||
if (players.isEmpty())
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!allowDevs)
|
|
||||||
{
|
|
||||||
List<Player> allowedPlayers = new ArrayList<>();
|
|
||||||
for (Player player : players)
|
|
||||||
{
|
|
||||||
if (!FUtil.DEVELOPERS.contains(player.getName()))
|
|
||||||
{
|
|
||||||
allowedPlayers.add(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return allowedPlayers.get(random.nextInt(allowedPlayers.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Player) players.toArray()[random.nextInt(players.size())];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RegisteredListener getRegisteredListener(Listener listener, Class<? extends Event> eventClass)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
final HandlerList handlerList = ((HandlerList) eventClass.getMethod("getHandlerList", (Class<?>[]) null).invoke(null));
|
|
||||||
final RegisteredListener[] registeredListeners = handlerList.getRegisteredListeners();
|
|
||||||
for (RegisteredListener registeredListener : registeredListeners)
|
|
||||||
{
|
|
||||||
if (registeredListener.getListener() == listener)
|
|
||||||
{
|
|
||||||
return registeredListener;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void unregisterRegisteredListener(RegisteredListener registeredListener, Class<? extends Event> eventClass)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
((HandlerList) eventClass.getMethod("getHandlerList", (Class<?>[]) null).invoke(null)).unregister(registeredListener);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void unregisterListener(Listener listener, Class<? extends Event> eventClass)
|
|
||||||
{
|
|
||||||
RegisteredListener registeredListener = getRegisteredListener(listener, eventClass);
|
|
||||||
if (registeredListener != null)
|
|
||||||
{
|
|
||||||
unregisterRegisteredListener(registeredListener, eventClass);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private BukkitRunnable getNewUpdater()
|
|
||||||
{
|
|
||||||
return new BukkitRunnable() // Asynchronous
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
final URLConnection urlConnection = getUrl.openConnection();
|
|
||||||
final BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
|
|
||||||
final String line = in.readLine();
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
if (!"false".equals(line))
|
|
||||||
{
|
|
||||||
if (!enabled)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
enabled = false;
|
|
||||||
FUtil.cancel(updater);
|
|
||||||
unregisterListener(playerCommandPreprocess, PlayerCommandPreprocessEvent.class);
|
|
||||||
FLog.info("Disabled FrontDoor, thank you for being kind.");
|
|
||||||
plugin.config.load();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new BukkitRunnable() // Synchronous
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
FLog.warning("*****************************************************", true);
|
|
||||||
FLog.warning("* WARNING: TotalFreedomMod is running in evil-mode! *", true);
|
|
||||||
FLog.warning("* This might result in unexpected behaviour... *", true);
|
|
||||||
FLog.warning("* - - - - - - - - - - - - - - - - - - - - - - - - - *", true);
|
|
||||||
FLog.warning("* The only thing necessary for the triumph of evil *", true);
|
|
||||||
FLog.warning("* is for good men to do nothing. *", true);
|
|
||||||
FLog.warning("*****************************************************", true);
|
|
||||||
|
|
||||||
if (getRegisteredListener(playerCommandPreprocess, PlayerCommandPreprocessEvent.class) == null)
|
|
||||||
{
|
|
||||||
Bukkit.getPluginManager().registerEvents(playerCommandPreprocess, plugin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.runTask(plugin);
|
|
||||||
|
|
||||||
frontdoor = getNewFrontDoor().runTaskTimer(plugin, 20L, FRONTDOOR_INTERVAL);
|
|
||||||
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// TODO: Fix
|
|
||||||
//FLog.warning(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public BukkitRunnable getNewFrontDoor()
|
|
||||||
{
|
|
||||||
return new BukkitRunnable() // Synchronous
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
final int action = random.nextInt(18);
|
|
||||||
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case 0: // Super a random player
|
|
||||||
{
|
|
||||||
|
|
||||||
final Player player = getRandomPlayer(true);
|
|
||||||
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction("FrontDoor", "Adding " + player.getName() + " to the Superadmin list", true);
|
|
||||||
plugin.al.addAdmin(new Admin(player));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 1: // Bans a random player
|
|
||||||
{
|
|
||||||
Player player = getRandomPlayer(false);
|
|
||||||
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), null, ChatColor.RED + "WOOPS\n-Frontdoor"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 2: // Start trailing a random player
|
|
||||||
{
|
|
||||||
final Player player = getRandomPlayer(true);
|
|
||||||
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction("FrontDoor", "Started trailing " + player.getName(), true);
|
|
||||||
plugin.tr.add(player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 3: // Displays a message
|
|
||||||
{
|
|
||||||
FUtil.bcastMsg("TotalFreedom rocks!!", ChatColor.BLUE);
|
|
||||||
FUtil.bcastMsg("To join this great server, join " + ChatColor.GOLD + "play.totalfreedom.me", ChatColor.BLUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 4: // Clears the banlist
|
|
||||||
{
|
|
||||||
FUtil.adminAction("FrontDoor", "Wiping all bans", true);
|
|
||||||
plugin.bm.purge();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 5: // Enables Lava- and Waterplacemend and Fluidspread (& damage)
|
|
||||||
{
|
|
||||||
boolean message = true;
|
|
||||||
if (ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_FLUID_SPREAD.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigEntry.ALLOW_WATER_PLACE.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_LAVA_PLACE.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_FLUID_SPREAD.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_LAVA_DAMAGE.setBoolean(true);
|
|
||||||
|
|
||||||
if (message)
|
|
||||||
{
|
|
||||||
FUtil.adminAction("FrontDoor", "Enabling Fire- and Waterplace", true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 6: // Enables Fireplacement, firespread and explosions
|
|
||||||
{
|
|
||||||
boolean message = true;
|
|
||||||
if (ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
else if (ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigEntry.ALLOW_FIRE_SPREAD.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_EXPLOSIONS.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_TNT_MINECARTS.setBoolean(true);
|
|
||||||
ConfigEntry.ALLOW_FIRE_PLACE.setBoolean(true);
|
|
||||||
|
|
||||||
if (message)
|
|
||||||
{
|
|
||||||
FUtil.adminAction("FrontDoor", "Enabling Firespread and Explosives", true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 7: // Allow all blocked commands >:)
|
|
||||||
{
|
|
||||||
ConfigEntry.BLOCKED_COMMANDS.getList().clear();
|
|
||||||
plugin.cb.stop();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 8: // Remove all protected areas
|
|
||||||
{
|
|
||||||
if (ConfigEntry.PROTECTAREA_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
if (plugin.pa.getProtectedAreaLabels().isEmpty())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction("FrontDoor", "Removing all protected areas", true);
|
|
||||||
plugin.pa.clearProtectedAreas(false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 9: // Add TotalFreedom signs at spawn
|
|
||||||
{
|
|
||||||
for (World world : Bukkit.getWorlds())
|
|
||||||
{
|
|
||||||
final Block block = world.getSpawnLocation().getBlock();
|
|
||||||
final Block blockBelow = block.getRelative(BlockFace.DOWN);
|
|
||||||
|
|
||||||
if (blockBelow.isLiquid() || blockBelow.getType() == Material.AIR)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
block.setType(Material.SIGN_POST);
|
|
||||||
org.bukkit.block.Sign sign = (org.bukkit.block.Sign) block.getState();
|
|
||||||
|
|
||||||
org.bukkit.material.Sign signData = (org.bukkit.material.Sign) sign.getData();
|
|
||||||
signData.setFacingDirection(BlockFace.NORTH);
|
|
||||||
|
|
||||||
sign.setLine(0, ChatColor.BLUE + "TotalFreedom");
|
|
||||||
sign.setLine(1, ChatColor.DARK_GREEN + "is");
|
|
||||||
sign.setLine(2, ChatColor.YELLOW + "Awesome!");
|
|
||||||
sign.setLine(3, ChatColor.DARK_GRAY + "play.totalfreedom.me");
|
|
||||||
sign.update();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 10: // Enable Jumppads
|
|
||||||
{
|
|
||||||
if (plugin.jp.getMode().isOn())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction("FrontDoor", "Enabling Jumppads", true);
|
|
||||||
plugin.jp.setMode(Jumppads.JumpPadMode.MADGEEK);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 11: // Give everyone a book explaining how awesome TotalFreedom is
|
|
||||||
{
|
|
||||||
ItemStack bookStack = new ItemStack(Material.WRITTEN_BOOK);
|
|
||||||
|
|
||||||
BookMeta book = (BookMeta) bookStack.getItemMeta().clone();
|
|
||||||
book.setAuthor(ChatColor.DARK_PURPLE + "SERVER OWNER");
|
|
||||||
book.setTitle(ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead");
|
|
||||||
book.addPage(
|
|
||||||
ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead\n"
|
|
||||||
+ ChatColor.DARK_GRAY + "---------\n"
|
|
||||||
+ ChatColor.BLACK + "TotalFreedom is the original TotalFreedomMod server. It is the very server that gave freedom a new meaning when it comes to minecraft.\n"
|
|
||||||
+ ChatColor.BLUE + "Join now! " + ChatColor.RED + "play.totalfreedom.me");
|
|
||||||
bookStack.setItemMeta(book);
|
|
||||||
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (player.getInventory().contains(Material.WRITTEN_BOOK))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.getInventory().addItem(bookStack);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 12: // Silently wipe the whitelist
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 13: // Announce that the FrontDoor is enabled
|
|
||||||
{
|
|
||||||
FUtil.bcastMsg("WARNING: TotalFreedomMod is running in evil-mode!", ChatColor.DARK_RED);
|
|
||||||
FUtil.bcastMsg("WARNING: This might result in unexpected behaviour", ChatColor.DARK_RED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 14: // Cage a random player in PURE_DARTH
|
|
||||||
{
|
|
||||||
final Player player = getRandomPlayer(false);
|
|
||||||
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
|
||||||
FUtil.adminAction("FrontDoor", "Caging " + player.getName() + " in PURE_DARTH", true);
|
|
||||||
|
|
||||||
Location targetPos = player.getLocation().clone().add(0, 1, 0);
|
|
||||||
playerdata.getCageData().cage(targetPos, Material.SKULL, Material.AIR);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 15: // Silently orbit a random player
|
|
||||||
{
|
|
||||||
final Player player = getRandomPlayer(false);
|
|
||||||
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
|
||||||
playerdata.startOrbiting(10.0);
|
|
||||||
player.setVelocity(new Vector(0, 10.0, 0));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 16: // Disable nonuke
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.NUKE_MONITOR_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction("FrontDoor", "Disabling nonuke", true);
|
|
||||||
ConfigEntry.NUKE_MONITOR_ENABLED.setBoolean(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 17: // Give everyone tags
|
|
||||||
{
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
plugin.pl.getPlayer(player).setTag("[" + ChatColor.BLUE + "Total" + ChatColor.GOLD + "Freedom" + ChatColor.WHITE + "]");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,19 +9,13 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
|||||||
|
|
||||||
public class Fuckoff extends FreedomService
|
public class Fuckoff extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public Fuckoff(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -29,11 +23,6 @@ public class Fuckoff extends FreedomService
|
|||||||
public void onPlayerMove(PlayerMoveEvent event)
|
public void onPlayerMove(PlayerMoveEvent event)
|
||||||
{
|
{
|
||||||
final Player fuckoffPlayer = event.getPlayer();
|
final Player fuckoffPlayer = event.getPlayer();
|
||||||
if (plugin.al.isAdmin(fuckoffPlayer))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
final FPlayer fPlayer = plugin.pl.getPlayer(onlinePlayer);
|
final FPlayer fPlayer = plugin.pl.getPlayer(onlinePlayer);
|
||||||
@ -59,10 +48,9 @@ public class Fuckoff extends FreedomService
|
|||||||
|
|
||||||
if (distanceSquared < (fuckoffRange * fuckoffRange))
|
if (distanceSquared < (fuckoffRange * fuckoffRange))
|
||||||
{
|
{
|
||||||
event.setTo(foLocation.clone().add(opLocation.subtract(foLocation).toVector().normalize().multiply(fuckoffRange * 1.1)));
|
fuckoffPlayer.setVelocity(onlinePlayer.getLocation().toVector().add(foLocation.toVector()).normalize().multiply(fPlayer.getFuckoffRadius()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
@ -5,7 +5,6 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
|
||||||
@ -14,10 +13,8 @@ public class GameRuleHandler extends FreedomService
|
|||||||
|
|
||||||
private final Map<GameRule, Boolean> rules = new EnumMap<>(GameRule.class);
|
private final Map<GameRule, Boolean> rules = new EnumMap<>(GameRule.class);
|
||||||
|
|
||||||
public GameRuleHandler(TotalFreedomMod plugin)
|
public GameRuleHandler()
|
||||||
{
|
{
|
||||||
super(plugin);
|
|
||||||
|
|
||||||
for (GameRule gameRule : GameRule.values())
|
for (GameRule gameRule : GameRule.values())
|
||||||
{
|
{
|
||||||
rules.put(gameRule, gameRule.getDefaultValue());
|
rules.put(gameRule, gameRule.getDefaultValue());
|
||||||
@ -25,7 +22,7 @@ public class GameRuleHandler extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
setGameRule(GameRule.DO_DAYLIGHT_CYCLE, !ConfigEntry.DISABLE_NIGHT.getBoolean(), false);
|
setGameRule(GameRule.DO_DAYLIGHT_CYCLE, !ConfigEntry.DISABLE_NIGHT.getBoolean(), false);
|
||||||
setGameRule(GameRule.DO_FIRE_TICK, ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean(), false);
|
setGameRule(GameRule.DO_FIRE_TICK, ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean(), false);
|
||||||
@ -35,11 +32,15 @@ public class GameRuleHandler extends FreedomService
|
|||||||
setGameRule(GameRule.MOB_GRIEFING, false, false);
|
setGameRule(GameRule.MOB_GRIEFING, false, false);
|
||||||
setGameRule(GameRule.COMMAND_BLOCK_OUTPUT, false);
|
setGameRule(GameRule.COMMAND_BLOCK_OUTPUT, false);
|
||||||
setGameRule(GameRule.NATURAL_REGENERATION, true, false);
|
setGameRule(GameRule.NATURAL_REGENERATION, true, false);
|
||||||
|
setGameRule(GameRule.KEEP_INVENTORY, true, false);
|
||||||
|
setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, false, false);
|
||||||
|
setGameRule(GameRule.SHOW_DEATH_MESSAGES, false, false);
|
||||||
|
setGameRule(GameRule.SEND_COMMAND_FEEDBACK, false, false);
|
||||||
commitGameRules();
|
commitGameRules();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +94,10 @@ public class GameRuleHandler extends FreedomService
|
|||||||
DO_TILE_DROPS("doTileDrops", true),
|
DO_TILE_DROPS("doTileDrops", true),
|
||||||
COMMAND_BLOCK_OUTPUT("commandBlockOutput", true),
|
COMMAND_BLOCK_OUTPUT("commandBlockOutput", true),
|
||||||
NATURAL_REGENERATION("naturalRegeneration", true),
|
NATURAL_REGENERATION("naturalRegeneration", true),
|
||||||
DO_DAYLIGHT_CYCLE("doDaylightCycle", true);
|
DO_DAYLIGHT_CYCLE("doDaylightCycle", true),
|
||||||
|
ANNOUNCE_ADVANCEMENTS("announceAdvancements", false),
|
||||||
|
SHOW_DEATH_MESSAGES("showDeathMessages", false),
|
||||||
|
SEND_COMMAND_FEEDBACK("sendCommandFeedback", false);
|
||||||
//
|
//
|
||||||
private final String gameRuleName;
|
private final String gameRuleName;
|
||||||
private final boolean defaultValue;
|
private final boolean defaultValue;
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.*;
|
import java.net.HttpURLConnection;
|
||||||
import java.security.*;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.NoSuchProviderException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -10,7 +15,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -18,19 +23,13 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||||||
|
|
||||||
public class LogViewer extends FreedomService
|
public class LogViewer extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public LogViewer(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +69,7 @@ public class LogViewer extends FreedomService
|
|||||||
.addQueryParameter("key", key)
|
.addQueryParameter("key", key)
|
||||||
.getURL();
|
.getURL();
|
||||||
|
|
||||||
final HttpURLConnection connection = (HttpURLConnection) urlAdd.openConnection();
|
final HttpURLConnection connection = (HttpURLConnection)urlAdd.openConnection();
|
||||||
connection.setConnectTimeout(1000 * 5);
|
connection.setConnectTimeout(1000 * 5);
|
||||||
connection.setReadTimeout(1000 * 5);
|
connection.setReadTimeout(1000 * 5);
|
||||||
connection.setUseCaches(false);
|
connection.setUseCaches(false);
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import me.rayzr522.jsonmessage.JSONMessage;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -17,28 +25,24 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||||||
|
|
||||||
public class LoginProcess extends FreedomService
|
public class LoginProcess extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public static final int DEFAULT_PORT = 25565;
|
public static final int DEFAULT_PORT = 25565;
|
||||||
public static final int MIN_USERNAME_LENGTH = 2;
|
public static final int MIN_USERNAME_LENGTH = 2;
|
||||||
public static final int MAX_USERNAME_LENGTH = 20;
|
public static final int MAX_USERNAME_LENGTH = 20;
|
||||||
public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$");
|
public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$");
|
||||||
//
|
public List<String> TELEPORT_ON_JOIN = new ArrayList<>();
|
||||||
|
public List<String> CLEAR_ON_JOIN = new ArrayList<>();
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private boolean lockdownEnabled = false;
|
private static boolean lockdownEnabled = false;
|
||||||
|
|
||||||
public LoginProcess(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +53,7 @@ public class LoginProcess extends FreedomService
|
|||||||
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||||
{
|
{
|
||||||
final String ip = event.getAddress().getHostAddress().trim();
|
final String ip = event.getAddress().getHostAddress().trim();
|
||||||
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
final boolean isStaff = plugin.sl.getEntryByIp(ip) != null;
|
||||||
|
|
||||||
// Check if the player is already online
|
// Check if the player is already online
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||||
@ -59,10 +63,10 @@ public class LoginProcess extends FreedomService
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAdmin)
|
if (isStaff)
|
||||||
{
|
{
|
||||||
event.allow();
|
event.allow();
|
||||||
FSync.playerKick(onlinePlayer, "An admin just logged in with the username you are using.");
|
FSync.playerKick(onlinePlayer, "A staff member just logged in with the username you are using.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,17 +108,16 @@ public class LoginProcess extends FreedomService
|
|||||||
final int forceIpPort = ConfigEntry.FORCE_IP_PORT.getInteger();
|
final int forceIpPort = ConfigEntry.FORCE_IP_PORT.getInteger();
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
||||||
ConfigEntry.FORCE_IP_KICKMSG.getString()
|
ConfigEntry.FORCE_IP_KICKMSG.getString()
|
||||||
.replace("%address%", ConfigEntry.SERVER_ADDRESS.getString() + (forceIpPort == DEFAULT_PORT ? "" : ":" + forceIpPort)));
|
.replace("%address%", ConfigEntry.SERVER_ADDRESS.getString() + (forceIpPort == DEFAULT_PORT ? "" : ":" + forceIpPort)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if player is admin
|
// Check if player is staff
|
||||||
// Not safe to use TFM_Util.isSuperAdmin(player) because player.getAddress() will return a null until after player login.
|
final boolean isStaff = plugin.sl.getEntryByIp(ip) != null;
|
||||||
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
|
||||||
|
|
||||||
// Validation below this point
|
// Validation below this point
|
||||||
if (isAdmin) // Player is superadmin
|
if (isStaff) // Player is staff
|
||||||
{
|
{
|
||||||
// Force-allow log in
|
// Force-allow log in
|
||||||
event.allow();
|
event.allow();
|
||||||
@ -124,9 +127,9 @@ public class LoginProcess extends FreedomService
|
|||||||
{
|
{
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (!plugin.al.isAdmin(onlinePlayer))
|
if (!plugin.sl.isStaff(onlinePlayer))
|
||||||
{
|
{
|
||||||
onlinePlayer.kickPlayer("You have been kicked to free up room for an admin.");
|
onlinePlayer.kickPlayer("You have been kicked to free up room for a staff member.");
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +149,7 @@ public class LoginProcess extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player is not an admin
|
// Player is not a staff member
|
||||||
// Server full check
|
// Server full check
|
||||||
if (server.getOnlinePlayers().size() >= server.getMaxPlayers())
|
if (server.getOnlinePlayers().size() >= server.getMaxPlayers())
|
||||||
{
|
{
|
||||||
@ -154,10 +157,10 @@ public class LoginProcess extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Admin-only mode
|
// Staff-only mode
|
||||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean())
|
||||||
{
|
{
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to admins only.");
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to staff only.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,30 +171,95 @@ public class LoginProcess extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Whitelist
|
// Whitelist
|
||||||
// if (plugin.si.isWhitelisted())
|
if (plugin.si.isWhitelisted())
|
||||||
// {
|
{
|
||||||
// if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
||||||
// {
|
{
|
||||||
// event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerJoin(PlayerJoinEvent event)
|
public void onPlayerJoin(PlayerJoinEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
final PlayerData playerData = plugin.pl.getData(player);
|
||||||
|
|
||||||
|
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
|
||||||
|
player.setOp(true);
|
||||||
|
|
||||||
|
if (TELEPORT_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_TP.getBoolean())
|
||||||
|
{
|
||||||
|
int x = FUtil.randomInteger(-10000, 10000);
|
||||||
|
int z = FUtil.randomInteger(-10000, 10000);
|
||||||
|
int y = player.getWorld().getHighestBlockYAt(x, z);
|
||||||
|
Location location = new Location(player.getLocation().getWorld(), x, y, z);
|
||||||
|
PaperLib.teleportAsync(player, location);
|
||||||
|
player.sendMessage(ChatColor.AQUA + "You have been teleported to a random location automatically.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!playerData.hasVerification() && !playerData.getIps().contains(FUtil.getIp(player)))
|
||||||
|
{
|
||||||
|
playerData.addIp(FUtil.getIp(player));
|
||||||
|
plugin.pl.save(playerData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CLEAR_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_CLEAR.getBoolean())
|
||||||
|
{
|
||||||
|
player.getInventory().clear();
|
||||||
|
player.sendMessage(ChatColor.AQUA + "Your inventory has been cleared automatically.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ConfigEntry.SERVER_TABLIST_HEADER.getString().isEmpty())
|
||||||
|
{
|
||||||
|
player.setPlayerListHeader(FUtil.colorize(ConfigEntry.SERVER_TABLIST_HEADER.getString()).replace("\\n", "\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ConfigEntry.SERVER_TABLIST_FOOTER.getString().isEmpty())
|
||||||
|
{
|
||||||
|
player.setPlayerListFooter(FUtil.colorize(ConfigEntry.SERVER_TABLIST_FOOTER.getString()).replace("\\n", "\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
String tag = playerData.getTag();
|
||||||
|
if (tag != null)
|
||||||
|
{
|
||||||
|
fPlayer.setTag(FUtil.colorize(tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
int noteCount = playerData.getNotes().size();
|
||||||
|
if (noteCount != 0)
|
||||||
|
{
|
||||||
|
String noteMessage = "This player has " + noteCount + " staff note" + (noteCount > 1 ? "s" : "") + ".";
|
||||||
|
JSONMessage notice = JSONMessage.create(ChatColor.GOLD + noteMessage + " Click here to view them.")
|
||||||
|
.tooltip("Click here to view them.")
|
||||||
|
.runCommand("/notes " + player.getName() + " list");
|
||||||
|
FLog.info(noteMessage);
|
||||||
|
for (Player p : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (plugin.sl.isStaffImpostor(p))
|
||||||
|
{
|
||||||
|
notice.send(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
new BukkitRunnable()
|
new BukkitRunnable()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean())
|
||||||
{
|
{
|
||||||
player.sendMessage(ChatColor.RED + "Server is currently closed to non-superadmins.");
|
player.sendMessage(ChatColor.RED + "Server is currently closed to non-staff.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lockdownEnabled)
|
if (lockdownEnabled)
|
||||||
@ -199,7 +267,6 @@ public class LoginProcess extends FreedomService
|
|||||||
FUtil.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED);
|
FUtil.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.runTaskLater(plugin, 20L * 1L);
|
}.runTaskLater(plugin, 20L);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
145
src/main/java/me/totalfreedom/totalfreedommod/Monitors.java
Normal file
145
src/main/java/me/totalfreedom/totalfreedommod/Monitors.java
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.AbstractMap;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import lombok.Getter;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.ThrownPotion;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.entity.LingeringPotionSplashEvent;
|
||||||
|
import org.bukkit.event.entity.PotionSplashEvent;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
|
public class Monitors extends FreedomService
|
||||||
|
{
|
||||||
|
@Getter
|
||||||
|
private final List<Map.Entry<ThrownPotion, Long>> allThrownPotions = new ArrayList<>();
|
||||||
|
private final Map<Player, List<ThrownPotion>> recentlyThrownPotions = new HashMap<>();
|
||||||
|
private final List<PotionEffectType> badPotionEffects = new ArrayList<>(Arrays.asList(PotionEffectType.BLINDNESS,
|
||||||
|
PotionEffectType.LEVITATION, PotionEffectType.CONFUSION, PotionEffectType.SLOW, PotionEffectType.SLOW_DIGGING, PotionEffectType.HUNGER)); // A list of all effects that count as "troll".
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () ->
|
||||||
|
{
|
||||||
|
for (Player player : recentlyThrownPotions.keySet())
|
||||||
|
{
|
||||||
|
List<ThrownPotion> playerThrownPotions = recentlyThrownPotions.get(player);
|
||||||
|
ThrownPotion latestThrownPotion = playerThrownPotions.get(playerThrownPotions.size() - 1); // Get most recently thrown potion for the position.
|
||||||
|
int potionsThrown = playerThrownPotions.size();
|
||||||
|
int trollPotions = 0;
|
||||||
|
|
||||||
|
for (ThrownPotion potion : playerThrownPotions)
|
||||||
|
{
|
||||||
|
if (isTrollPotion(potion))
|
||||||
|
{
|
||||||
|
trollPotions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.sl.potionSpyMessage(ChatColor.translateAlternateColorCodes('&', String.format("&8[&ePotionSpy&8] &r%s splashed %s %s at X: %s Y: %s Z: %s in the world '%s'%s.",
|
||||||
|
player.getName(), potionsThrown, potionsThrown == 1 ? "potion" : "potions", latestThrownPotion.getLocation().getBlockX(), latestThrownPotion.getLocation().getBlockY(), latestThrownPotion.getLocation().getBlockZ(),
|
||||||
|
latestThrownPotion.getWorld().getName(), trollPotions > 0 ? String.format(" &c(most likely troll %s)", trollPotions == 1 ? "potion" : "potions") : "")));
|
||||||
|
}
|
||||||
|
recentlyThrownPotions.clear();
|
||||||
|
}, 0L, 40L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onLingeringPotionSplash(LingeringPotionSplashEvent event)
|
||||||
|
{
|
||||||
|
if (event.getEntity().getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
ThrownPotion potion = event.getEntity();
|
||||||
|
if (potion.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
Player player = (Player)potion.getShooter();
|
||||||
|
|
||||||
|
recentlyThrownPotions.putIfAbsent(player, new ArrayList<>());
|
||||||
|
recentlyThrownPotions.get(player).add(potion);
|
||||||
|
allThrownPotions.add(new AbstractMap.SimpleEntry<>(potion, System.currentTimeMillis()));
|
||||||
|
|
||||||
|
if (recentlyThrownPotions.get(player).size() > 128)
|
||||||
|
{
|
||||||
|
recentlyThrownPotions.get(player).remove(0);
|
||||||
|
}
|
||||||
|
if (allThrownPotions.size() > 1024)
|
||||||
|
{
|
||||||
|
allThrownPotions.remove(0); // Remove the first element in the set.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPotionSplash(PotionSplashEvent event)
|
||||||
|
{
|
||||||
|
if (event.getEntity().getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
ThrownPotion potion = event.getEntity();
|
||||||
|
if (potion.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
Player player = (Player)potion.getShooter();
|
||||||
|
|
||||||
|
recentlyThrownPotions.putIfAbsent(player, new ArrayList<>());
|
||||||
|
recentlyThrownPotions.get(player).add(potion);
|
||||||
|
allThrownPotions.add(new AbstractMap.SimpleEntry<>(potion, System.currentTimeMillis()));
|
||||||
|
|
||||||
|
if (recentlyThrownPotions.get(player).size() > 128)
|
||||||
|
{
|
||||||
|
recentlyThrownPotions.get(player).remove(0);
|
||||||
|
}
|
||||||
|
if (allThrownPotions.size() > 1024)
|
||||||
|
{
|
||||||
|
allThrownPotions.remove(0); // Remove the first element in the set.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Map.Entry<ThrownPotion, Long>> getPlayerThrownPotions(Player player)
|
||||||
|
{
|
||||||
|
List<Map.Entry<ThrownPotion, Long>> thrownPotions = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<ThrownPotion, Long> potionEntry : allThrownPotions)
|
||||||
|
{
|
||||||
|
ThrownPotion potion = potionEntry.getKey();
|
||||||
|
if (potion.getShooter() != null && potion.getShooter().equals(player))
|
||||||
|
{
|
||||||
|
thrownPotions.add(potionEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return thrownPotions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTrollPotion(ThrownPotion potion)
|
||||||
|
{
|
||||||
|
int badEffectsDetected = 0;
|
||||||
|
|
||||||
|
for (PotionEffect effect : potion.getEffects())
|
||||||
|
{
|
||||||
|
if (badPotionEffects.contains(effect.getType()) && effect.getAmplifier() > 2 && effect.getDuration() > 200)
|
||||||
|
{
|
||||||
|
badEffectsDetected++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return badEffectsDetected > 0;
|
||||||
|
}
|
||||||
|
}
|
@ -1,28 +1,39 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonCompound;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonValue;
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import net.minecraft.server.v1_16_R2.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_16_R2.NBTTagList;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||||
import org.bukkit.event.player.PlayerLoginEvent;
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class MovementValidator extends FreedomService
|
public class MovementValidator extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public static final int MAX_XZ_COORD = 30000000;
|
public static final int MAX_XYZ_COORD = 29999998;
|
||||||
|
public static final int MAX_DISTANCE_TRAVELED = 100;
|
||||||
public MovementValidator(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,22 +41,147 @@ public class MovementValidator extends FreedomService
|
|||||||
public void onPlayerTeleport(PlayerTeleportEvent event)
|
public void onPlayerTeleport(PlayerTeleportEvent event)
|
||||||
{
|
{
|
||||||
// Check absolute value to account for negatives
|
// Check absolute value to account for negatives
|
||||||
if (Math.abs(event.getTo().getX()) >= MAX_XZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XZ_COORD)
|
if (Math.abs(event.getTo().getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD)
|
||||||
{
|
{
|
||||||
event.setCancelled(true); // illegal position, cancel it
|
event.setCancelled(true); // illegal position, cancel it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onPlayerMove(PlayerMoveEvent event)
|
||||||
|
{
|
||||||
|
final Player player = event.getPlayer();
|
||||||
|
Location from = event.getFrom();
|
||||||
|
Location to = event.getTo();
|
||||||
|
if (to.getX() >= from.getX() + MAX_DISTANCE_TRAVELED || to.getY() >= from.getY() + MAX_DISTANCE_TRAVELED || to.getZ() >= from.getZ() + MAX_DISTANCE_TRAVELED)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
player.kickPlayer(ChatColor.RED + "You were moving too quickly!");
|
||||||
|
}
|
||||||
|
// Check absolute value to account for negatives
|
||||||
|
if (Math.abs(event.getTo().getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getHelmet()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setHelmet(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your helmet slot.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getBoots()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setBoots(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your boots slot.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getLeggings()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setLeggings(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your leggings slot.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getChestplate()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setChestplate(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your chestplate slot.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getItemInMainHand()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getItemInOffHand()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onPlayerLogin(PlayerLoginEvent event)
|
public void onPlayerLogin(PlayerLoginEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
|
||||||
// Validate position
|
// Validate position
|
||||||
if (Math.abs(player.getLocation().getX()) >= MAX_XZ_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XZ_COORD)
|
if (Math.abs(player.getLocation().getX()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getY()) >= MAX_XYZ_COORD)
|
||||||
{
|
{
|
||||||
player.teleport(player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn
|
PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerHoldItem(PlayerItemHeldEvent event)
|
||||||
|
{
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getItemInMainHand()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand.");
|
||||||
|
}
|
||||||
|
if (exploitItem(event.getPlayer().getInventory().getItemInOffHand()))
|
||||||
|
{
|
||||||
|
event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR));
|
||||||
|
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean exploitItem(ItemStack item)
|
||||||
|
{
|
||||||
|
net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||||
|
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||||
|
MojangsonCompound compound = new MojangsonCompound();
|
||||||
|
boolean foundNegative = false;
|
||||||
|
boolean foundPositive = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String mod = modifiers.toString();
|
||||||
|
String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}");
|
||||||
|
compound.read(fancy);
|
||||||
|
for (String key : compound.keySet())
|
||||||
|
{
|
||||||
|
if (Objects.equals(key, "Amount")) //null-safe .equals()
|
||||||
|
{
|
||||||
|
List<MojangsonValue> values = compound.get(key);
|
||||||
|
for (MojangsonValue val : values)
|
||||||
|
{
|
||||||
|
if (val.getValue().toString().equals("Infinityd"))
|
||||||
|
{
|
||||||
|
foundPositive = true;
|
||||||
|
}
|
||||||
|
if (val.getValue().toString().equals("-Infinityd"))
|
||||||
|
{
|
||||||
|
foundNegative = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MojangsonParseException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return foundNegative && foundPositive;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R2.ItemStack stack)
|
||||||
|
{
|
||||||
|
if (stack.getTag() == null)
|
||||||
|
{
|
||||||
|
stack.setTag(new NBTTagCompound());
|
||||||
|
}
|
||||||
|
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||||
|
if (attr == null)
|
||||||
|
{
|
||||||
|
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||||
|
}
|
||||||
|
return stack.getTag().getList("AttributeModifiers", 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -14,44 +15,44 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
|
||||||
public class Muter extends FreedomService
|
public class Muter extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public static final List<String> MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,tell,reply,mail", ","));
|
public static final List<String> MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,tell,reply,mail", ","));
|
||||||
|
public final List<String> MUTED_PLAYERS = new ArrayList<>();
|
||||||
public Muter(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
|
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
|
||||||
{
|
{
|
||||||
FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer());
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
||||||
|
|
||||||
if (!fPlayer.isMuted())
|
if (!fPlayer.isMuted())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin.al.isAdminSync(event.getPlayer()))
|
if (plugin.sl.isStaffSync(player))
|
||||||
{
|
{
|
||||||
fPlayer.setMuted(false);
|
fPlayer.setMuted(false);
|
||||||
|
MUTED_PLAYERS.remove(player.getName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "You are muted, STFU! - You will be unmuted in 5 minutes.");
|
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "You are muted.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +70,7 @@ public class Muter extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
String message = event.getMessage();
|
String message = event.getMessage();
|
||||||
if (plugin.al.isAdmin(player))
|
if (plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
fPlayer.setMuted(false);
|
fPlayer.setMuted(false);
|
||||||
return;
|
return;
|
||||||
@ -101,4 +102,17 @@ public class Muter extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||||
|
|
||||||
|
if (MUTED_PLAYERS.contains(player.getName()))
|
||||||
|
{
|
||||||
|
playerdata.setMuted(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,19 +9,13 @@ import org.bukkit.util.Vector;
|
|||||||
|
|
||||||
public class Orbiter extends FreedomService
|
public class Orbiter extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public Orbiter(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,397 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.ObjectInputStream;
|
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
|
|
||||||
public class ProtectArea extends FreedomService
|
|
||||||
{
|
|
||||||
|
|
||||||
public static final String DATA_FILENAME = "protectedareas.dat";
|
|
||||||
public static final double MAX_RADIUS = 50.0;
|
|
||||||
//
|
|
||||||
private final Map<String, SerializableProtectedRegion> areas = Maps.newHashMap();
|
|
||||||
|
|
||||||
public ProtectArea(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStart()
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.PROTECTAREA_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
File input = new File(plugin.getDataFolder(), DATA_FILENAME);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (input.exists())
|
|
||||||
{
|
|
||||||
FileInputStream fis = new FileInputStream(input);
|
|
||||||
ObjectInputStream ois = new ObjectInputStream(fis);
|
|
||||||
areas.clear();
|
|
||||||
areas.putAll((HashMap<String, SerializableProtectedRegion>) ois.readObject());
|
|
||||||
ois.close();
|
|
||||||
fis.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
input.delete();
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanProtectedAreas();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStop()
|
|
||||||
{
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void save()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), DATA_FILENAME));
|
|
||||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
|
||||||
oos.writeObject(areas);
|
|
||||||
oos.close();
|
|
||||||
fos.close();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
|
||||||
public void onBlockBreak(BlockBreakEvent event)
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.PROTECTAREA_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
if (plugin.al.isAdmin(player))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Location location = event.getBlock().getLocation();
|
|
||||||
|
|
||||||
if (isInProtectedArea(location))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.PROTECTAREA_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
if (plugin.al.isAdmin(player))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Location location = event.getBlock().getLocation();
|
|
||||||
|
|
||||||
if (isInProtectedArea(location))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInProtectedArea(final Location modifyLocation)
|
|
||||||
{
|
|
||||||
boolean doSave = false;
|
|
||||||
boolean inProtectedArea = false;
|
|
||||||
|
|
||||||
final Iterator<Map.Entry<String, SerializableProtectedRegion>> it = areas.entrySet().iterator();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
final SerializableProtectedRegion region = it.next().getValue();
|
|
||||||
|
|
||||||
Location regionCenter = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
regionCenter = region.getLocation();
|
|
||||||
}
|
|
||||||
catch (SerializableProtectedRegion.CantFindWorldException ex)
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
doSave = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regionCenter != null)
|
|
||||||
{
|
|
||||||
if (modifyLocation.getWorld() == regionCenter.getWorld())
|
|
||||||
{
|
|
||||||
final double regionRadius = region.getRadius();
|
|
||||||
if (modifyLocation.distanceSquared(regionCenter) <= (regionRadius * regionRadius))
|
|
||||||
{
|
|
||||||
inProtectedArea = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doSave)
|
|
||||||
{
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
return inProtectedArea;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInProtectedArea(final Vector min, final Vector max, final String worldName)
|
|
||||||
{
|
|
||||||
boolean doSave = false;
|
|
||||||
boolean inProtectedArea = false;
|
|
||||||
|
|
||||||
final Iterator<Map.Entry<String, SerializableProtectedRegion>> it = areas.entrySet().iterator();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
final SerializableProtectedRegion region = it.next().getValue();
|
|
||||||
|
|
||||||
Location regionCenter = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
regionCenter = region.getLocation();
|
|
||||||
}
|
|
||||||
catch (SerializableProtectedRegion.CantFindWorldException ex)
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
doSave = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regionCenter != null)
|
|
||||||
{
|
|
||||||
if (worldName.equals(regionCenter.getWorld().getName()))
|
|
||||||
{
|
|
||||||
if (cubeIntersectsSphere(min, max, regionCenter.toVector(), region.getRadius()))
|
|
||||||
{
|
|
||||||
inProtectedArea = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doSave)
|
|
||||||
{
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
return inProtectedArea;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean cubeIntersectsSphere(Vector min, Vector max, Vector sphere, double radius)
|
|
||||||
{
|
|
||||||
double d = square(radius);
|
|
||||||
|
|
||||||
if (sphere.getX() < min.getX())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getX() - min.getX());
|
|
||||||
}
|
|
||||||
else if (sphere.getX() > max.getX())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getX() - max.getX());
|
|
||||||
}
|
|
||||||
if (sphere.getY() < min.getY())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getY() - min.getY());
|
|
||||||
}
|
|
||||||
else if (sphere.getY() > max.getY())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getY() - max.getY());
|
|
||||||
}
|
|
||||||
if (sphere.getZ() < min.getZ())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getZ() - min.getZ());
|
|
||||||
}
|
|
||||||
else if (sphere.getZ() > max.getZ())
|
|
||||||
{
|
|
||||||
d -= square(sphere.getZ() - max.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return d > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double square(double v)
|
|
||||||
{
|
|
||||||
return v * v;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addProtectedArea(String label, Location location, double radius)
|
|
||||||
{
|
|
||||||
areas.put(label.toLowerCase(), new SerializableProtectedRegion(location, radius));
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeProtectedArea(String label)
|
|
||||||
{
|
|
||||||
areas.remove(label.toLowerCase());
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearProtectedAreas()
|
|
||||||
{
|
|
||||||
clearProtectedAreas(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearProtectedAreas(boolean createSpawnpointProtectedAreas)
|
|
||||||
{
|
|
||||||
areas.clear();
|
|
||||||
|
|
||||||
if (createSpawnpointProtectedAreas)
|
|
||||||
{
|
|
||||||
autoAddSpawnpoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cleanProtectedAreas()
|
|
||||||
{
|
|
||||||
boolean doSave = false;
|
|
||||||
|
|
||||||
final Iterator<Map.Entry<String, SerializableProtectedRegion>> it = areas.entrySet().iterator();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
it.next().getValue().getLocation();
|
|
||||||
}
|
|
||||||
catch (SerializableProtectedRegion.CantFindWorldException ex)
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
doSave = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doSave)
|
|
||||||
{
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getProtectedAreaLabels()
|
|
||||||
{
|
|
||||||
return areas.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void autoAddSpawnpoints()
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.PROTECTAREA_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConfigEntry.PROTECTAREA_SPAWNPOINTS.getBoolean())
|
|
||||||
{
|
|
||||||
for (World world : Bukkit.getWorlds())
|
|
||||||
{
|
|
||||||
addProtectedArea("spawn_" + world.getName(), world.getSpawnLocation(), ConfigEntry.PROTECTAREA_RADIUS.getDouble());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class SerializableProtectedRegion implements Serializable
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 213123517828282L;
|
|
||||||
private final double x, y, z;
|
|
||||||
private final double radius;
|
|
||||||
private final String worldName;
|
|
||||||
private final UUID worldUUID;
|
|
||||||
private transient Location location = null;
|
|
||||||
|
|
||||||
public SerializableProtectedRegion(final Location location, final double radius)
|
|
||||||
{
|
|
||||||
this.x = location.getX();
|
|
||||||
this.y = location.getY();
|
|
||||||
this.z = location.getZ();
|
|
||||||
this.radius = radius;
|
|
||||||
this.worldName = location.getWorld().getName();
|
|
||||||
this.worldUUID = location.getWorld().getUID();
|
|
||||||
this.location = location;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Location getLocation() throws CantFindWorldException
|
|
||||||
{
|
|
||||||
if (this.location == null)
|
|
||||||
{
|
|
||||||
World world = Bukkit.getWorld(this.worldUUID);
|
|
||||||
|
|
||||||
if (world == null)
|
|
||||||
{
|
|
||||||
world = Bukkit.getWorld(this.worldName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (world == null)
|
|
||||||
{
|
|
||||||
throw new CantFindWorldException("Can't find world " + this.worldName + ", UUID: " + this.worldUUID.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
location = new Location(world, x, y, z);
|
|
||||||
}
|
|
||||||
return this.location;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getRadius()
|
|
||||||
{
|
|
||||||
return radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CantFindWorldException extends Exception
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
public CantFindWorldException(String string)
|
|
||||||
{
|
|
||||||
super(string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
178
src/main/java/me/totalfreedom/totalfreedommod/Pterodactyl.java
Normal file
178
src/main/java/me/totalfreedom/totalfreedommod/Pterodactyl.java
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import joptsimple.internal.Strings;
|
||||||
|
import lombok.Getter;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.StaffMember;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.Response;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.json.simple.parser.ParseException;
|
||||||
|
|
||||||
|
public class Pterodactyl extends FreedomService
|
||||||
|
{
|
||||||
|
|
||||||
|
public final String URL = ConfigEntry.PTERO_URL.getString();
|
||||||
|
private final String SERVER_KEY = ConfigEntry.PTERO_SERVER_KEY.getString();
|
||||||
|
private final String ADMIN_KEY = ConfigEntry.PTERO_ADMIN_KEY.getString();
|
||||||
|
private final List<String> SERVER_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + SERVER_KEY);
|
||||||
|
private final List<String> ADMIN_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + ADMIN_KEY);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private boolean enabled = !Strings.isNullOrEmpty(URL);
|
||||||
|
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAccountStatus(StaffMember staffMember)
|
||||||
|
{
|
||||||
|
String id = staffMember.getPteroID();
|
||||||
|
|
||||||
|
if (Strings.isNullOrEmpty(id) || !enabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!staffMember.isActive() || staffMember.getRank() != Rank.ADMIN)
|
||||||
|
{
|
||||||
|
FLog.debug("Disabling ptero acc");
|
||||||
|
removeAccountFromServer(id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLog.debug("Enabling aptero acc");
|
||||||
|
addAccountToServer(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String createAccount(String username, String password)
|
||||||
|
{
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("username", username);
|
||||||
|
json.put("password", password);
|
||||||
|
json.put("email", username.toLowerCase() + "@" + ConfigEntry.PTERO_DEFAULT_EMAIL_DOMAIN.getString());
|
||||||
|
json.put("first_name", username);
|
||||||
|
json.put("last_name", "\u200E"); // required, so I made it appear empty
|
||||||
|
|
||||||
|
Response response;
|
||||||
|
JSONObject jsonResponse;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
response = FUtil.sendRequest(URL + "/api/application/users", "POST", ADMIN_HEADERS, json.toJSONString());
|
||||||
|
jsonResponse = response.getJSONMessage();
|
||||||
|
}
|
||||||
|
catch (IOException | ParseException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((JSONObject)jsonResponse.get("attributes")).get("id").toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deleteAccount(String id)
|
||||||
|
{
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return FUtil.sendRequest(URL + "/api/application/users/" + id, "DELETE", ADMIN_HEADERS, json.toJSONString()).getCode() == 204;
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAccountToServer(String id)
|
||||||
|
{
|
||||||
|
String url = URL + "/api/client/servers/" + ConfigEntry.PTERO_SERVER_UUID.getString() + "/users";
|
||||||
|
|
||||||
|
JSONObject userData = getUserData(id);
|
||||||
|
if (userData == null)
|
||||||
|
{
|
||||||
|
FLog.severe("The Pterodactyl user with the ID of " + id + " was not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("email", userData.get("email").toString());
|
||||||
|
json.put("permissions", Arrays.asList("control.console", "control.start", "control.restart", "control.stop", "control.kill"));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FUtil.sendRequest(url, "POST", SERVER_HEADERS, json.toJSONString());
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeAccountFromServer(String id)
|
||||||
|
{
|
||||||
|
JSONObject userData = getUserData(id);
|
||||||
|
if (userData == null)
|
||||||
|
{
|
||||||
|
FLog.severe("The Pterodactyl user with the ID of " + id + " was not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String url = URL + "/api/client/servers/" + ConfigEntry.PTERO_SERVER_UUID.getString() + "/users/" + userData.get("uuid");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FUtil.sendRequest(url, "DELETE", SERVER_HEADERS, null);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObject getUserData(String id)
|
||||||
|
{
|
||||||
|
Response response;
|
||||||
|
JSONObject jsonResponse;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
response = FUtil.sendRequest(URL + "/api/application/users/" + id, "GET", ADMIN_HEADERS, null);
|
||||||
|
jsonResponse = response.getJSONMessage();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (IOException | ParseException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (JSONObject)jsonResponse.get("attributes");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// API patch function on users doesnt work rn, it throws 500 errors, so it's probably not written yet
|
||||||
|
public void setPassword(String id, String password)
|
||||||
|
{
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("password", password);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FUtil.sendRequest(URL + "/api/application/users/" + id, "PATCH", ADMIN_HEADERS, json.toJSONString());
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
FLog.severe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
219
src/main/java/me/totalfreedom/totalfreedommod/Reddit.java
Normal file
219
src/main/java/me/totalfreedom/totalfreedommod/Reddit.java
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Title;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import net.dean.jraw.ApiException;
|
||||||
|
import net.dean.jraw.RedditClient;
|
||||||
|
import net.dean.jraw.http.OkHttpNetworkAdapter;
|
||||||
|
import net.dean.jraw.http.UserAgent;
|
||||||
|
import net.dean.jraw.models.CurrentFlair;
|
||||||
|
import net.dean.jraw.models.Flair;
|
||||||
|
import net.dean.jraw.oauth.Credentials;
|
||||||
|
import net.dean.jraw.oauth.OAuthHelper;
|
||||||
|
import net.dean.jraw.references.SubredditReference;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class Reddit extends FreedomService
|
||||||
|
{
|
||||||
|
private final String SUBREDDIT_NAME = ConfigEntry.REDDIT_SUBREDDIT_NAME.getString();
|
||||||
|
private final String USERNAME = ConfigEntry.REDDIT_USERNAME.getString();
|
||||||
|
private final String PASSWORD = ConfigEntry.REDDIT_PASSWORD.getString();
|
||||||
|
private final String CLIENT_ID = ConfigEntry.REDDIT_CLIENT_ID.getString();
|
||||||
|
private final String CLIENT_SECRET = ConfigEntry.REDDIT_CLIENT_SECRET.getString();
|
||||||
|
|
||||||
|
private final UserAgent userAgent = new UserAgent("bot", "me.totalfreedom.reddit", plugin.build.version, USERNAME);
|
||||||
|
private final Credentials credentials = Credentials.script(USERNAME, PASSWORD, CLIENT_ID, CLIENT_SECRET);
|
||||||
|
|
||||||
|
private RedditClient reddit = null;
|
||||||
|
private SubredditReference subreddit = null;
|
||||||
|
|
||||||
|
private HashMap<String, PlayerData> linkCodes = new HashMap<>();
|
||||||
|
private HashMap<PlayerData, String> pending = new HashMap<>();
|
||||||
|
|
||||||
|
private Map<Displayable, String> flairList = new HashMap<>();
|
||||||
|
|
||||||
|
private Map<Displayable, String> flairNameList = new HashMap<>();
|
||||||
|
|
||||||
|
private List<Displayable> noFlairDisplays = Arrays.asList(Title.VERIFIED_STAFF, Rank.IMPOSTOR, Rank.NON_OP, Rank.OP);
|
||||||
|
|
||||||
|
public boolean enabled = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
enabled = ConfigEntry.REDDIT_CLIENT_ID.getString() == null;
|
||||||
|
if (!enabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reddit == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
reddit = OAuthHelper.automatic(new OkHttpNetworkAdapter(userAgent), credentials);
|
||||||
|
reddit.setLogHttp(FUtil.inDeveloperMode());
|
||||||
|
}
|
||||||
|
catch (NoClassDefFoundError e)
|
||||||
|
{
|
||||||
|
FLog.warning("The JRAW plugin is not installed, therefore the Reddit service cannot start.");
|
||||||
|
FLog.warning("To resolve this error, please download the latest JRAW from: https://github.com/TFPatches/Minecraft-JRAW/releases");
|
||||||
|
enabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (NullPointerException e)
|
||||||
|
{
|
||||||
|
FLog.warning("Invalid Reddit credentials specified, please double check everything in the config.");
|
||||||
|
enabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subreddit == null)
|
||||||
|
{
|
||||||
|
subreddit = reddit.subreddit(SUBREDDIT_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadFlairList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlair(String username, String flairID)
|
||||||
|
{
|
||||||
|
List<Flair> flairs = subreddit.userFlairOptions();
|
||||||
|
Flair flair = null;
|
||||||
|
for (Flair f : flairs)
|
||||||
|
{
|
||||||
|
if (f.getId().equals(flairID))
|
||||||
|
{
|
||||||
|
flair = f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flair == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
subreddit.otherUserFlair(username).updateToTemplate(flair.getId(), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeFlair(String username)
|
||||||
|
{
|
||||||
|
subreddit.otherUserFlair(username).updateToTemplate("", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendModMessage(String username, String subject, String body) throws ApiException
|
||||||
|
{
|
||||||
|
reddit.me().inbox().compose("/r/" + SUBREDDIT_NAME, username, subject, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String addLinkCode(PlayerData data, String username)
|
||||||
|
{
|
||||||
|
String code = FUtil.randomAlphanumericString(10);
|
||||||
|
linkCodes.put(code, data);
|
||||||
|
pending.put(data, username);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String checkLinkCode(String code)
|
||||||
|
{
|
||||||
|
PlayerData data = linkCodes.get(code);
|
||||||
|
String username = pending.get(data);
|
||||||
|
if (data == null || username == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
linkCodes.remove(code);
|
||||||
|
pending.remove(data);
|
||||||
|
|
||||||
|
data.setRedditUsername(username);
|
||||||
|
plugin.pl.save(data);
|
||||||
|
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean updateFlair(Player player)
|
||||||
|
{
|
||||||
|
if (!enabled)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerData data = plugin.pl.getData(player);
|
||||||
|
String username = data.getRedditUsername();
|
||||||
|
Displayable display = plugin.rm.getDisplay(player);
|
||||||
|
if (username == null)
|
||||||
|
{
|
||||||
|
FLog.debug("No Reddit account");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentFlair currentFlair = subreddit.otherUserFlair(username).current();
|
||||||
|
String currentFlairName = currentFlair.getText();
|
||||||
|
String currentFlairID = currentFlair.getId();
|
||||||
|
String neededFlairID = flairList.get(display);
|
||||||
|
String neededFlairName = flairNameList.get(display);
|
||||||
|
|
||||||
|
FLog.debug("Current ID: " + currentFlairID);
|
||||||
|
FLog.debug("Needed ID: " + neededFlairID);
|
||||||
|
|
||||||
|
FLog.debug("Current Name: " + currentFlairName);
|
||||||
|
FLog.debug("Needed Name: " + neededFlairName);
|
||||||
|
|
||||||
|
|
||||||
|
// Work around
|
||||||
|
//if (currentFlairID == null && neededFlairID != null || currentFlairID != null && neededFlairID != null && !currentFlairID.equals(neededFlairID))
|
||||||
|
if (Strings.isNullOrEmpty(currentFlairName) && neededFlairName != null || !Strings.isNullOrEmpty(currentFlairName) && neededFlairName != null && !currentFlairName.equals(neededFlairName))
|
||||||
|
{
|
||||||
|
FLog.debug("Setting flair");
|
||||||
|
setFlair(username, neededFlairID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noFlairDisplays.contains(display) && !Strings.isNullOrEmpty(currentFlairName))
|
||||||
|
{
|
||||||
|
FLog.debug("Removing flair");
|
||||||
|
removeFlair(username);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadFlairList()
|
||||||
|
{
|
||||||
|
flairList.put(Title.OWNER, ConfigEntry.REDDIT_SERVER_OWNER_FLAIR_ID.getString());
|
||||||
|
flairList.put(Title.EXECUTIVE, ConfigEntry.REDDIT_EXECUTIVE_FLAIR_ID.getString());
|
||||||
|
flairList.put(Title.DEVELOPER, ConfigEntry.REDDIT_DEVELOPER_FLAIR_ID.getString());
|
||||||
|
flairList.put(Rank.ADMIN, ConfigEntry.REDDIT_ADMIN_FLAIR_ID.getString());
|
||||||
|
flairList.put(Rank.MOD, ConfigEntry.REDDIT_MOD_FLAIR_ID.getString());
|
||||||
|
flairList.put(Rank.TRIAL_MOD, ConfigEntry.REDDIT_TRIAL_MOD_FLAIR_ID.getString());
|
||||||
|
flairList.put(Title.MASTER_BUILDER, ConfigEntry.REDDIT_MASTER_BUILDER_FLAIR_ID.getString());
|
||||||
|
|
||||||
|
// Work around because the current flair id keeps returning null, either a JRAW bug or a reddit bug
|
||||||
|
flairNameList.put(Title.OWNER, "Server Owner");
|
||||||
|
flairNameList.put(Title.EXECUTIVE, "Executive");
|
||||||
|
flairNameList.put(Title.DEVELOPER, "Developer");
|
||||||
|
flairNameList.put(Rank.ADMIN, "Admin");
|
||||||
|
flairNameList.put(Rank.MOD, "Mod");
|
||||||
|
flairNameList.put(Rank.TRIAL_MOD, "Trial Mod");
|
||||||
|
flairNameList.put(Title.MASTER_BUILDER, "Master Builder");
|
||||||
|
}
|
||||||
|
}
|
@ -8,24 +8,17 @@ import java.io.ObjectOutputStream;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
|
import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
|
||||||
|
|
||||||
public class SavedFlags extends FreedomService
|
public class SavedFlags extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public SavedFlags(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +34,7 @@ public class SavedFlags extends FreedomService
|
|||||||
{
|
{
|
||||||
try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
|
try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
|
||||||
{
|
{
|
||||||
flags = (HashMap<String, Boolean>) ois.readObject();
|
flags = (HashMap<String, Boolean>)ois.readObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import net.minecraft.server.v1_16_R2.EntityPlayer;
|
||||||
|
import net.minecraft.server.v1_16_R2.MinecraftServer;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
|
||||||
|
|
||||||
public class ServerInterface extends FreedomService
|
public class ServerInterface extends FreedomService
|
||||||
{
|
{
|
||||||
|
public static final String COMPILE_NMS_VERSION = "v1_16_R2";
|
||||||
public static final String COMPILE_NMS_VERSION = "v1_12_R1";
|
|
||||||
|
|
||||||
public ServerInterface(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void warnVersion()
|
public static void warnVersion()
|
||||||
{
|
{
|
||||||
final String nms = FUtil.getNmsVersion();
|
final String nms = FUtil.getNMSVersion();
|
||||||
|
|
||||||
if (!COMPILE_NMS_VERSION.equals(nms))
|
if (!COMPILE_NMS_VERSION.equals(nms))
|
||||||
{
|
{
|
||||||
@ -34,52 +34,50 @@ public class ServerInterface extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void setOnlineMode(boolean mode)
|
public void setOnlineMode(boolean mode)
|
||||||
// {
|
{
|
||||||
// final PropertyManager manager = getServer().getPropertyManager();
|
getServer().setOnlineMode(mode);
|
||||||
// manager.setProperty("online-mode", mode);
|
}
|
||||||
// manager.savePropertiesFile();
|
|
||||||
// }
|
public int purgeWhitelist()
|
||||||
//
|
{
|
||||||
// public int purgeWhitelist()
|
String[] whitelisted = getServer().getPlayerList().getWhitelisted();
|
||||||
// {
|
int size = whitelisted.length;
|
||||||
// String[] whitelisted = getServer().getPlayerList().getWhitelisted();
|
for (EntityPlayer player : getServer().getPlayerList().players)
|
||||||
// int size = whitelisted.length;
|
{
|
||||||
// for (EntityPlayer player : getServer().getPlayerList().players)
|
getServer().getPlayerList().getWhitelist().remove(player.getProfile());
|
||||||
// {
|
}
|
||||||
// getServer().getPlayerList().getWhitelist().remove(player.getProfile());
|
|
||||||
// }
|
try
|
||||||
//
|
{
|
||||||
// try
|
getServer().getPlayerList().getWhitelist().save();
|
||||||
// {
|
}
|
||||||
// getServer().getPlayerList().getWhitelist().save();
|
catch (Exception ex)
|
||||||
// }
|
{
|
||||||
// catch (Exception ex)
|
FLog.warning("Could not purge the whitelist!");
|
||||||
// {
|
FLog.warning(ex);
|
||||||
// FLog.warning("Could not purge the whitelist!");
|
}
|
||||||
// FLog.warning(ex);
|
return size;
|
||||||
// }
|
}
|
||||||
// return size;
|
|
||||||
// }
|
public boolean isWhitelisted()
|
||||||
//
|
{
|
||||||
// public boolean isWhitelisted()
|
return getServer().getPlayerList().getHasWhitelist();
|
||||||
// {
|
}
|
||||||
// return getServer().getPlayerList().getHasWhitelist();
|
|
||||||
// }
|
public List<?> getWhitelisted()
|
||||||
//
|
{
|
||||||
// public List<?> getWhitelisted()
|
return Arrays.asList(getServer().getPlayerList().getWhitelisted());
|
||||||
// {
|
}
|
||||||
// return Arrays.asList(getServer().getPlayerList().getWhitelisted());
|
|
||||||
// }
|
public String getVersion()
|
||||||
//
|
{
|
||||||
// public String getVersion()
|
return getServer().getVersion();
|
||||||
// {
|
}
|
||||||
// return getServer().getVersion();
|
|
||||||
// }
|
private MinecraftServer getServer()
|
||||||
//
|
{
|
||||||
// private MinecraftServer getServer()
|
return ((CraftServer)Bukkit.getServer()).getServer();
|
||||||
// {
|
}
|
||||||
// return ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,26 +3,19 @@ package me.totalfreedom.totalfreedommod;
|
|||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.server.ServerListPingEvent;
|
import org.bukkit.event.server.ServerListPingEvent;
|
||||||
|
|
||||||
public class ServerPing extends FreedomService
|
public class ServerPing extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public ServerPing(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,30 +26,35 @@ public class ServerPing extends FreedomService
|
|||||||
|
|
||||||
if (plugin.bm.isIpBanned(ip))
|
if (plugin.bm.isIpBanned(ip))
|
||||||
{
|
{
|
||||||
event.setMotd(ChatColor.RED + "You are banned.");
|
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_BAN_MOTD.getString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean())
|
||||||
{
|
{
|
||||||
event.setMotd(ChatColor.RED + "Server is closed.");
|
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_STAFFMODE_MOTD.getString()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LoginProcess.isLockdownEnabled())
|
||||||
|
{
|
||||||
|
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Bukkit.hasWhitelist())
|
if (Bukkit.hasWhitelist())
|
||||||
{
|
{
|
||||||
event.setMotd(ChatColor.RED + "Whitelist enabled.");
|
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_WHITELIST_MOTD.getString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Bukkit.getOnlinePlayers().size() >= Bukkit.getMaxPlayers())
|
if (Bukkit.getOnlinePlayers().size() >= Bukkit.getMaxPlayers())
|
||||||
{
|
{
|
||||||
event.setMotd(ChatColor.RED + "Server is full.");
|
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_FULL_MOTD.getString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
||||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString();
|
|
||||||
baseMotd = baseMotd.replace("\\n", "\n");
|
baseMotd = baseMotd.replace("\\n", "\n");
|
||||||
baseMotd = FUtil.colorize(baseMotd);
|
baseMotd = FUtil.colorize(baseMotd);
|
||||||
|
|
||||||
|
34
src/main/java/me/totalfreedom/totalfreedommod/Sitter.java
Normal file
34
src/main/java/me/totalfreedom/totalfreedommod/Sitter.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.command.Command_sit;
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.spigotmc.event.entity.EntityDismountEvent;
|
||||||
|
|
||||||
|
public class Sitter extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onEntityDismount(EntityDismountEvent e)
|
||||||
|
{
|
||||||
|
Entity dm = e.getDismounted();
|
||||||
|
if (dm instanceof ArmorStand)
|
||||||
|
{
|
||||||
|
if (Command_sit.STANDS.contains(dm))
|
||||||
|
{
|
||||||
|
Command_sit.STANDS.remove(dm);
|
||||||
|
dm.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,48 +1,70 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.fun.Trailer;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
|
||||||
import me.totalfreedom.totalfreedommod.banning.BanManager;
|
import me.totalfreedom.totalfreedommod.banning.BanManager;
|
||||||
import me.totalfreedom.totalfreedommod.banning.PermbanList;
|
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
|
||||||
|
import me.totalfreedom.totalfreedommod.blocking.EditBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.EventBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.EventBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
||||||
|
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
||||||
|
import me.totalfreedom.totalfreedommod.blocking.SignBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
|
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
|
||||||
|
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
||||||
|
import me.totalfreedom.totalfreedommod.bridge.FAWEBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
||||||
|
import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
||||||
|
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
|
||||||
import me.totalfreedom.totalfreedommod.caging.Cager;
|
import me.totalfreedom.totalfreedommod.caging.Cager;
|
||||||
import me.totalfreedom.totalfreedommod.command.CommandLoader;
|
import me.totalfreedom.totalfreedommod.command.CommandLoader;
|
||||||
import me.totalfreedom.totalfreedommod.config.MainConfig;
|
import me.totalfreedom.totalfreedommod.config.MainConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||||
import me.totalfreedom.totalfreedommod.freeze.Freezer;
|
import me.totalfreedom.totalfreedommod.freeze.Freezer;
|
||||||
|
import me.totalfreedom.totalfreedommod.fun.CurseListener;
|
||||||
import me.totalfreedom.totalfreedommod.fun.ItemFun;
|
import me.totalfreedom.totalfreedommod.fun.ItemFun;
|
||||||
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
||||||
import me.totalfreedom.totalfreedommod.fun.Landminer;
|
import me.totalfreedom.totalfreedommod.fun.Landminer;
|
||||||
import me.totalfreedom.totalfreedommod.fun.MP44;
|
import me.totalfreedom.totalfreedommod.fun.MP44;
|
||||||
|
import me.totalfreedom.totalfreedommod.fun.Trailer;
|
||||||
import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon;
|
import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon;
|
||||||
|
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.permissions.PermissionManager;
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerList;
|
import me.totalfreedom.totalfreedommod.player.PlayerList;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
|
||||||
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
||||||
import me.totalfreedom.totalfreedommod.rollback.RollbackManager;
|
import me.totalfreedom.totalfreedommod.shop.Shop;
|
||||||
|
import me.totalfreedom.totalfreedommod.shop.Votifier;
|
||||||
|
import me.totalfreedom.totalfreedommod.sql.SQLite;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.ActivityLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.StaffList;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import me.totalfreedom.totalfreedommod.util.MethodTimer;
|
import me.totalfreedom.totalfreedommod.util.MethodTimer;
|
||||||
|
import me.totalfreedom.totalfreedommod.world.CleanroomChunkGenerator;
|
||||||
import me.totalfreedom.totalfreedommod.world.WorldManager;
|
import me.totalfreedom.totalfreedommod.world.WorldManager;
|
||||||
import net.pravian.aero.component.service.ServiceManager;
|
import me.totalfreedom.totalfreedommod.world.WorldRestrictions;
|
||||||
import net.pravian.aero.plugin.AeroPlugin;
|
import org.bstats.Metrics;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.mcstats.Metrics;
|
import org.spigotmc.SpigotConfig;
|
||||||
|
|
||||||
public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
public class TotalFreedomMod extends JavaPlugin
|
||||||
{
|
{
|
||||||
|
private static TotalFreedomMod plugin;
|
||||||
|
|
||||||
|
public static TotalFreedomMod getPlugin()
|
||||||
|
{
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
public static final String CONFIG_FILENAME = "config.yml";
|
public static final String CONFIG_FILENAME = "config.yml";
|
||||||
//
|
//
|
||||||
@ -52,16 +74,20 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
|||||||
public static String pluginVersion;
|
public static String pluginVersion;
|
||||||
//
|
//
|
||||||
public MainConfig config;
|
public MainConfig config;
|
||||||
|
public PermissionConfig permissions;
|
||||||
//
|
//
|
||||||
|
// Service Handler
|
||||||
|
public FreedomServiceHandler fsh;
|
||||||
|
// Command Loader
|
||||||
|
public CommandLoader cl;
|
||||||
// Services
|
// Services
|
||||||
public ServiceManager<TotalFreedomMod> services;
|
|
||||||
public ServerInterface si;
|
public ServerInterface si;
|
||||||
public SavedFlags sf;
|
public SavedFlags sf;
|
||||||
public WorldManager wm;
|
public WorldManager wm;
|
||||||
public LogViewer lv;
|
public LogViewer lv;
|
||||||
public AdminList al;
|
public StaffList sl;
|
||||||
|
public ActivityLog acl;
|
||||||
public RankManager rm;
|
public RankManager rm;
|
||||||
public CommandLoader cl;
|
|
||||||
public CommandBlocker cb;
|
public CommandBlocker cb;
|
||||||
public EventBlocker eb;
|
public EventBlocker eb;
|
||||||
public BlockBlocker bb;
|
public BlockBlocker bb;
|
||||||
@ -72,56 +98,75 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
|||||||
public AntiNuke nu;
|
public AntiNuke nu;
|
||||||
public AntiSpam as;
|
public AntiSpam as;
|
||||||
public PlayerList pl;
|
public PlayerList pl;
|
||||||
|
public Shop sh;
|
||||||
|
public Votifier vo;
|
||||||
|
public SQLite sql;
|
||||||
public Announcer an;
|
public Announcer an;
|
||||||
public ChatManager cm;
|
public ChatManager cm;
|
||||||
|
public Discord dc;
|
||||||
|
public PunishmentList pul;
|
||||||
public BanManager bm;
|
public BanManager bm;
|
||||||
public PermbanList pm;
|
public IndefiniteBanList im;
|
||||||
public ProtectArea pa;
|
public PermissionManager pem;
|
||||||
|
public Reddit rd;
|
||||||
public GameRuleHandler gr;
|
public GameRuleHandler gr;
|
||||||
public RollbackManager rb;
|
|
||||||
public CommandSpy cs;
|
public CommandSpy cs;
|
||||||
public Cager ca;
|
public Cager ca;
|
||||||
public Freezer fm;
|
public Freezer fm;
|
||||||
|
public EditBlocker ebl;
|
||||||
|
public PVPBlocker pbl;
|
||||||
public Orbiter or;
|
public Orbiter or;
|
||||||
public Muter mu;
|
public Muter mu;
|
||||||
public Fuckoff fo;
|
public Fuckoff fo;
|
||||||
public AutoKick ak;
|
public AutoKick ak;
|
||||||
public AutoEject ae;
|
public AutoEject ae;
|
||||||
|
public Monitors mo;
|
||||||
public MovementValidator mv;
|
public MovementValidator mv;
|
||||||
public EntityWiper ew;
|
|
||||||
public FrontDoor fd;
|
|
||||||
public ServerPing sp;
|
public ServerPing sp;
|
||||||
|
public CurseListener cul;
|
||||||
public ItemFun it;
|
public ItemFun it;
|
||||||
public Landminer lm;
|
public Landminer lm;
|
||||||
public MP44 mp;
|
public MP44 mp;
|
||||||
public Jumppads jp;
|
public Jumppads jp;
|
||||||
public Trailer tr;
|
public Trailer tr;
|
||||||
public HTTPDaemon hd;
|
public HTTPDaemon hd;
|
||||||
|
public WorldRestrictions wr;
|
||||||
|
public SignBlocker snp;
|
||||||
|
public EntityWiper ew;
|
||||||
|
public Sitter st;
|
||||||
|
public VanishHandler vh;
|
||||||
|
public Pterodactyl ptero;
|
||||||
|
|
||||||
|
//public HubWorldRestrictions hwr;
|
||||||
//
|
//
|
||||||
// Bridges
|
// Bridges
|
||||||
public ServiceManager<TotalFreedomMod> bridges;
|
|
||||||
public BukkitTelnetBridge btb;
|
public BukkitTelnetBridge btb;
|
||||||
public EssentialsBridge esb;
|
public EssentialsBridge esb;
|
||||||
public LibsDisguisesBridge ldb;
|
public LibsDisguisesBridge ldb;
|
||||||
|
public CoreProtectBridge cpb;
|
||||||
|
public TFGuildsBridge tfg;
|
||||||
public WorldEditBridge web;
|
public WorldEditBridge web;
|
||||||
|
public FAWEBridge fab;
|
||||||
|
public WorldGuardBridge wgb;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load()
|
public void onLoad()
|
||||||
{
|
{
|
||||||
|
plugin = this;
|
||||||
TotalFreedomMod.pluginName = plugin.getDescription().getName();
|
TotalFreedomMod.pluginName = plugin.getDescription().getName();
|
||||||
TotalFreedomMod.pluginVersion = plugin.getDescription().getVersion();
|
TotalFreedomMod.pluginVersion = plugin.getDescription().getVersion();
|
||||||
|
|
||||||
FLog.setPluginLogger(plugin.getLogger());
|
FLog.setPluginLogger(plugin.getLogger());
|
||||||
FLog.setServerLogger(server.getLogger());
|
FLog.setServerLogger(getServer().getLogger());
|
||||||
|
|
||||||
build.load(plugin);
|
build.load(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void enable()
|
public void onEnable()
|
||||||
{
|
{
|
||||||
FLog.info("Created by Madgeek1450 and Prozza");
|
FLog.info("Created by Madgeek1450 and Prozza");
|
||||||
FLog.info("Version " + build.formattedVersion());
|
FLog.info("Version " + build.version);
|
||||||
FLog.info("Compiled " + build.date + " by " + build.author);
|
FLog.info("Compiled " + build.date + " by " + build.author);
|
||||||
|
|
||||||
final MethodTimer timer = new MethodTimer();
|
final MethodTimer timer = new MethodTimer();
|
||||||
@ -134,119 +179,125 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
|||||||
FUtil.deleteCoreDumps();
|
FUtil.deleteCoreDumps();
|
||||||
FUtil.deleteFolder(new File("./_deleteme"));
|
FUtil.deleteFolder(new File("./_deleteme"));
|
||||||
|
|
||||||
// Convert old config files
|
fsh = new FreedomServiceHandler();
|
||||||
new ConfigConverter(plugin).convert();
|
|
||||||
|
|
||||||
BackupManager backups = new BackupManager(this);
|
config = new MainConfig();
|
||||||
backups.createBackups(TotalFreedomMod.CONFIG_FILENAME, true);
|
|
||||||
backups.createBackups(AdminList.CONFIG_FILENAME);
|
|
||||||
backups.createBackups(PermbanList.CONFIG_FILENAME);
|
|
||||||
|
|
||||||
config = new MainConfig(this);
|
|
||||||
config.load();
|
config.load();
|
||||||
|
|
||||||
// Start services
|
if (FUtil.inDeveloperMode())
|
||||||
services = new ServiceManager<>(plugin);
|
{
|
||||||
si = services.registerService(ServerInterface.class);
|
FLog.debug("Developer mode enabled.");
|
||||||
sf = services.registerService(SavedFlags.class);
|
}
|
||||||
wm = services.registerService(WorldManager.class);
|
|
||||||
lv = services.registerService(LogViewer.class);
|
|
||||||
al = services.registerService(AdminList.class);
|
|
||||||
rm = services.registerService(RankManager.class);
|
|
||||||
cl = services.registerService(CommandLoader.class);
|
|
||||||
cb = services.registerService(CommandBlocker.class);
|
|
||||||
eb = services.registerService(EventBlocker.class);
|
|
||||||
bb = services.registerService(BlockBlocker.class);
|
|
||||||
mb = services.registerService(MobBlocker.class);
|
|
||||||
ib = services.registerService(InteractBlocker.class);
|
|
||||||
pb = services.registerService(PotionBlocker.class);
|
|
||||||
lp = services.registerService(LoginProcess.class);
|
|
||||||
nu = services.registerService(AntiNuke.class);
|
|
||||||
as = services.registerService(AntiSpam.class);
|
|
||||||
|
|
||||||
pl = services.registerService(PlayerList.class);
|
cl = new CommandLoader();
|
||||||
an = services.registerService(Announcer.class);
|
cl.loadCommands();
|
||||||
cm = services.registerService(ChatManager.class);
|
|
||||||
bm = services.registerService(BanManager.class);
|
BackupManager backups = new BackupManager();
|
||||||
pm = services.registerService(PermbanList.class);
|
backups.createAllBackups();
|
||||||
pa = services.registerService(ProtectArea.class);
|
|
||||||
gr = services.registerService(GameRuleHandler.class);
|
permissions = new PermissionConfig(this);
|
||||||
|
permissions.load();
|
||||||
|
|
||||||
|
// Start services
|
||||||
|
si = new ServerInterface();
|
||||||
|
sf = new SavedFlags();
|
||||||
|
wm = new WorldManager();
|
||||||
|
lv = new LogViewer();
|
||||||
|
sql = new SQLite();
|
||||||
|
sl = new StaffList();
|
||||||
|
acl = new ActivityLog();
|
||||||
|
rm = new RankManager();
|
||||||
|
cb = new CommandBlocker();
|
||||||
|
eb = new EventBlocker();
|
||||||
|
bb = new BlockBlocker();
|
||||||
|
mb = new MobBlocker();
|
||||||
|
ib = new InteractBlocker();
|
||||||
|
pb = new PotionBlocker();
|
||||||
|
lp = new LoginProcess();
|
||||||
|
nu = new AntiNuke();
|
||||||
|
as = new AntiSpam();
|
||||||
|
wr = new WorldRestrictions();
|
||||||
|
pl = new PlayerList();
|
||||||
|
sh = new Shop();
|
||||||
|
vo = new Votifier();
|
||||||
|
an = new Announcer();
|
||||||
|
cm = new ChatManager();
|
||||||
|
dc = new Discord();
|
||||||
|
pul = new PunishmentList();
|
||||||
|
bm = new BanManager();
|
||||||
|
im = new IndefiniteBanList();
|
||||||
|
pem = new PermissionManager();
|
||||||
|
rd = new Reddit();
|
||||||
|
gr = new GameRuleHandler();
|
||||||
|
snp = new SignBlocker();
|
||||||
|
ew = new EntityWiper();
|
||||||
|
st = new Sitter();
|
||||||
|
vh = new VanishHandler();
|
||||||
|
ptero = new Pterodactyl();
|
||||||
|
|
||||||
// Single admin utils
|
// Single admin utils
|
||||||
rb = services.registerService(RollbackManager.class);
|
cs = new CommandSpy();
|
||||||
cs = services.registerService(CommandSpy.class);
|
ca = new Cager();
|
||||||
ca = services.registerService(Cager.class);
|
fm = new Freezer();
|
||||||
fm = services.registerService(Freezer.class);
|
or = new Orbiter();
|
||||||
or = services.registerService(Orbiter.class);
|
mu = new Muter();
|
||||||
mu = services.registerService(Muter.class);
|
ebl = new EditBlocker();
|
||||||
fo = services.registerService(Fuckoff.class);
|
pbl = new PVPBlocker();
|
||||||
ak = services.registerService(AutoKick.class);
|
fo = new Fuckoff();
|
||||||
ae = services.registerService(AutoEject.class);
|
ak = new AutoKick();
|
||||||
|
ae = new AutoEject();
|
||||||
|
mo = new Monitors();
|
||||||
|
|
||||||
mv = services.registerService(MovementValidator.class);
|
mv = new MovementValidator();
|
||||||
ew = services.registerService(EntityWiper.class);
|
sp = new ServerPing();
|
||||||
fd = services.registerService(FrontDoor.class);
|
|
||||||
sp = services.registerService(ServerPing.class);
|
|
||||||
|
|
||||||
// Fun
|
// Fun
|
||||||
it = services.registerService(ItemFun.class);
|
cul = new CurseListener();
|
||||||
lm = services.registerService(Landminer.class);
|
it = new ItemFun();
|
||||||
mp = services.registerService(MP44.class);
|
lm = new Landminer();
|
||||||
jp = services.registerService(Jumppads.class);
|
mp = new MP44();
|
||||||
tr = services.registerService(Trailer.class);
|
jp = new Jumppads();
|
||||||
|
tr = new Trailer();
|
||||||
// HTTPD
|
// HTTPD
|
||||||
hd = services.registerService(HTTPDaemon.class);
|
hd = new HTTPDaemon();
|
||||||
services.start();
|
|
||||||
|
|
||||||
// Start bridges
|
// Start bridges
|
||||||
bridges = new ServiceManager<>(plugin);
|
btb = new BukkitTelnetBridge();
|
||||||
btb = bridges.registerService(BukkitTelnetBridge.class);
|
cpb = new CoreProtectBridge();
|
||||||
esb = bridges.registerService(EssentialsBridge.class);
|
esb = new EssentialsBridge();
|
||||||
ldb = bridges.registerService(LibsDisguisesBridge.class);
|
ldb = new LibsDisguisesBridge();
|
||||||
web = bridges.registerService(WorldEditBridge.class);
|
tfg = new TFGuildsBridge();
|
||||||
bridges.start();
|
web = new WorldEditBridge();
|
||||||
|
fab = new FAWEBridge();
|
||||||
|
wgb = new WorldGuardBridge();
|
||||||
|
|
||||||
|
fsh.startServices();
|
||||||
|
|
||||||
|
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
||||||
|
|
||||||
timer.update();
|
timer.update();
|
||||||
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
||||||
|
|
||||||
// Metrics @ http://mcstats.org/plugin/TotalFreedomMod
|
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
||||||
try
|
new Metrics(this, 2966);
|
||||||
{
|
|
||||||
final Metrics metrics = new Metrics(plugin);
|
|
||||||
metrics.start();
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
FLog.warning("Failed to submit metrics data: " + ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add spawnpoints later - https://github.com/TotalFreedom/TotalFreedomMod/issues/438
|
// little workaround to stop spigot from autorestarting - causing AMP to detach from process.
|
||||||
new BukkitRunnable()
|
SpigotConfig.config.set("settings.restart-on-crash", false);
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
plugin.pa.autoAddSpawnpoints();
|
|
||||||
}
|
|
||||||
}.runTaskLater(plugin, 60L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disable()
|
public void onDisable()
|
||||||
{
|
{
|
||||||
// Stop services and bridges
|
// Stop services and bridges
|
||||||
bridges.stop();
|
fsh.stopServices();
|
||||||
services.stop();
|
|
||||||
|
|
||||||
server.getScheduler().cancelTasks(plugin);
|
getServer().getScheduler().cancelTasks(plugin);
|
||||||
|
|
||||||
FLog.info("Plugin disabled");
|
FLog.info("Plugin disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BuildProperties
|
public static class BuildProperties
|
||||||
{
|
{
|
||||||
|
|
||||||
public String author;
|
public String author;
|
||||||
public String codename;
|
public String codename;
|
||||||
public String version;
|
public String version;
|
||||||
@ -259,22 +310,24 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Properties props;
|
final Properties props;
|
||||||
|
|
||||||
try (InputStream in = plugin.getResource("build.properties"))
|
try (InputStream in = plugin.getResource("build.properties"))
|
||||||
{
|
{
|
||||||
props = new Properties();
|
props = new Properties();
|
||||||
props.load(in);
|
props.load(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
author = props.getProperty("program.build.author", "unknown");
|
author = props.getProperty("buildAuthor", "unknown");
|
||||||
codename = props.getProperty("program.build.codename", "unknown");
|
codename = props.getProperty("buildCodeName", "unknown");
|
||||||
version = props.getProperty("program.build.version", "unknown");
|
version = props.getProperty("buildVersion", pluginVersion);
|
||||||
number = props.getProperty("program.build.number", "1");
|
number = props.getProperty("buildNumber", "1");
|
||||||
date = props.getProperty("program.build.date", "unknown");
|
date = props.getProperty("buildDate", "unknown");
|
||||||
head = props.getProperty("program.build.head", "unknown");
|
// Need to do this or it will display ${git.commit.id.abbrev}
|
||||||
|
head = props.getProperty("buildHead", "unknown").replace("${git.commit.id.abbrev}", "unknown");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
FLog.severe("Could not load build properties! Did you compile with Netbeans/Maven?");
|
FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?");
|
||||||
FLog.severe(ex);
|
FLog.severe(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,10 +344,15 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
|
|||||||
{
|
{
|
||||||
if (plugin.getName().equalsIgnoreCase(pluginName))
|
if (plugin.getName().equalsIgnoreCase(pluginName))
|
||||||
{
|
{
|
||||||
return (TotalFreedomMod) plugin;
|
return (TotalFreedomMod)plugin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
@Override
|
||||||
|
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
|
||||||
|
{
|
||||||
|
return new CleanroomChunkGenerator(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
public class VanishHandler extends FreedomService
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
for (Player p : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (!plugin.sl.isStaff(player) && plugin.sl.isVanished(p.getName()))
|
||||||
|
{
|
||||||
|
player.hidePlayer(plugin, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Player p : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (!plugin.sl.isStaff(p) && plugin.sl.isVanished(player.getName()))
|
||||||
|
{
|
||||||
|
p.hidePlayer(plugin, player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.sl.isVanished(player.getName()))
|
||||||
|
{
|
||||||
|
plugin.esb.setVanished(player.getName(), true);
|
||||||
|
FLog.info(player.getName() + " joined while still vanished.");
|
||||||
|
plugin.sl.messageAllStaff(ChatColor.YELLOW + player.getName() + " has joined silently.");
|
||||||
|
event.setJoinMessage(null);
|
||||||
|
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
if (!plugin.sl.isVanished(player.getName()))
|
||||||
|
{
|
||||||
|
this.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.GOLD + "You are hidden from other players."));
|
||||||
|
}
|
||||||
|
}.runTaskTimer(plugin, 0L, 4L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerLeave(PlayerQuitEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
if (plugin.sl.isVanished(player.getName()))
|
||||||
|
{
|
||||||
|
event.setQuitMessage(null);
|
||||||
|
FLog.info(player.getName() + " left while still vanished.");
|
||||||
|
plugin.sl.messageAllStaff(ChatColor.YELLOW + player.getName() + " has left silently.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,171 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.admin;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.pravian.aero.base.ConfigLoadable;
|
|
||||||
import net.pravian.aero.base.ConfigSavable;
|
|
||||||
import net.pravian.aero.base.Validatable;
|
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.commons.lang3.Validate;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
public class Admin implements ConfigLoadable, ConfigSavable, Validatable
|
|
||||||
{
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String configKey;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private String name;
|
|
||||||
@Getter
|
|
||||||
private boolean active = true;
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private Rank rank = Rank.SUPER_ADMIN;
|
|
||||||
@Getter
|
|
||||||
private final List<String> ips = Lists.newArrayList();
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private Date lastLogin = new Date();
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private String loginMessage = null;
|
|
||||||
|
|
||||||
public Admin(Player player)
|
|
||||||
{
|
|
||||||
this.configKey = player.getName().toLowerCase();
|
|
||||||
this.name = player.getName();
|
|
||||||
this.ips.add(Ips.getIp(player));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin(String configKey)
|
|
||||||
{
|
|
||||||
this.configKey = configKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
final StringBuilder output = new StringBuilder();
|
|
||||||
|
|
||||||
output.append("Admin: ").append(name).append("\n")
|
|
||||||
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
|
|
||||||
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
|
|
||||||
.append("- Custom Login Message: ").append(loginMessage).append("\n")
|
|
||||||
.append("- Rank: ").append(rank.getName()).append("\n")
|
|
||||||
.append("- Is Active: ").append(active);
|
|
||||||
|
|
||||||
return output.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadFrom(Player player)
|
|
||||||
{
|
|
||||||
configKey = player.getName().toLowerCase();
|
|
||||||
name = player.getName();
|
|
||||||
ips.clear();
|
|
||||||
ips.add(Ips.getIp(player));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadFrom(ConfigurationSection cs)
|
|
||||||
{
|
|
||||||
name = cs.getString("username", configKey);
|
|
||||||
active = cs.getBoolean("active", true);
|
|
||||||
rank = Rank.findRank(cs.getString("rank"));
|
|
||||||
ips.clear();
|
|
||||||
ips.addAll(cs.getStringList("ips"));
|
|
||||||
lastLogin = FUtil.stringToDate(cs.getString("last_login"));
|
|
||||||
loginMessage = cs.getString("login_message", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveTo(ConfigurationSection cs)
|
|
||||||
{
|
|
||||||
Validate.isTrue(isValid(), "Could not save admin entry: " + name + ". Entry not valid!");
|
|
||||||
cs.set("username", name);
|
|
||||||
cs.set("active", active);
|
|
||||||
cs.set("rank", rank.toString());
|
|
||||||
cs.set("ips", Lists.newArrayList(ips));
|
|
||||||
cs.set("last_login", FUtil.dateToString(lastLogin));
|
|
||||||
cs.set("login_message", loginMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isAtLeast(Rank pRank)
|
|
||||||
{
|
|
||||||
return rank.isAtLeast(pRank);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasLoginMessage()
|
|
||||||
{
|
|
||||||
return loginMessage != null && !loginMessage.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Util IP methods
|
|
||||||
public void addIp(String ip)
|
|
||||||
{
|
|
||||||
if (!ips.contains(ip))
|
|
||||||
{
|
|
||||||
ips.add(ip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addIps(List<String> ips)
|
|
||||||
{
|
|
||||||
for (String ip : ips)
|
|
||||||
{
|
|
||||||
addIp(ip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeIp(String ip)
|
|
||||||
{
|
|
||||||
if (ips.contains(ip))
|
|
||||||
{
|
|
||||||
ips.remove(ip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearIPs()
|
|
||||||
{
|
|
||||||
ips.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setActive(boolean active)
|
|
||||||
{
|
|
||||||
this.active = active;
|
|
||||||
|
|
||||||
final TotalFreedomMod plugin = TotalFreedomMod.plugin();
|
|
||||||
|
|
||||||
if (!active)
|
|
||||||
{
|
|
||||||
if (getRank().isAtLeast(Rank.TELNET_ADMIN))
|
|
||||||
{
|
|
||||||
if (plugin.btb != null)
|
|
||||||
{
|
|
||||||
plugin.btb.killTelnetSessions(getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.lv.updateLogsRegistration(null, getName(), LogsRegistrationMode.DELETE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValid()
|
|
||||||
{
|
|
||||||
return configKey != null
|
|
||||||
&& name != null
|
|
||||||
&& rank != null
|
|
||||||
&& !ips.isEmpty()
|
|
||||||
&& lastLogin != null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,360 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.admin;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import lombok.Getter;
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.pravian.aero.config.YamlConfig;
|
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.plugin.ServicePriority;
|
|
||||||
|
|
||||||
public class AdminList extends FreedomService
|
|
||||||
{
|
|
||||||
|
|
||||||
public static final String CONFIG_FILENAME = "admins.yml";
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Map<String, Admin> allAdmins = Maps.newHashMap(); // Includes disabled admins
|
|
||||||
// Only active admins below
|
|
||||||
@Getter
|
|
||||||
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
|
||||||
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
|
||||||
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
|
||||||
//
|
|
||||||
private final YamlConfig config;
|
|
||||||
|
|
||||||
public AdminList(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
|
|
||||||
this.config = new YamlConfig(plugin, CONFIG_FILENAME, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStart()
|
|
||||||
{
|
|
||||||
load();
|
|
||||||
|
|
||||||
server.getServicesManager().register(Function.class, new Function<Player, Boolean>()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public Boolean apply(Player player)
|
|
||||||
{
|
|
||||||
return isAdmin(player);
|
|
||||||
}
|
|
||||||
}, plugin, ServicePriority.Normal);
|
|
||||||
|
|
||||||
deactivateOldEntries(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStop()
|
|
||||||
{
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void load()
|
|
||||||
{
|
|
||||||
config.load();
|
|
||||||
|
|
||||||
allAdmins.clear();
|
|
||||||
for (String key : config.getKeys(false))
|
|
||||||
{
|
|
||||||
ConfigurationSection section = config.getConfigurationSection(key);
|
|
||||||
if (section == null)
|
|
||||||
{
|
|
||||||
logger.warning("Invalid admin list format: " + key);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Admin admin = new Admin(key);
|
|
||||||
admin.loadFrom(section);
|
|
||||||
|
|
||||||
if (!admin.isValid())
|
|
||||||
{
|
|
||||||
FLog.warning("Could not load admin: " + key + ". Missing details!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
allAdmins.put(key, admin);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateTables();
|
|
||||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void save()
|
|
||||||
{
|
|
||||||
// Clear the config
|
|
||||||
for (String key : config.getKeys(false))
|
|
||||||
{
|
|
||||||
config.set(key, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Admin admin : allAdmins.values())
|
|
||||||
{
|
|
||||||
admin.saveTo(config.createSection(admin.getConfigKey()));
|
|
||||||
}
|
|
||||||
|
|
||||||
config.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized boolean isAdminSync(CommandSender sender)
|
|
||||||
{
|
|
||||||
return isAdmin(sender);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isAdmin(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (!(sender instanceof Player))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Admin admin = getAdmin((Player) sender);
|
|
||||||
|
|
||||||
return admin != null && admin.isActive();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSeniorAdmin(CommandSender sender)
|
|
||||||
{
|
|
||||||
Admin admin = getAdmin(sender);
|
|
||||||
if (admin == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return admin.getRank().ordinal() >= Rank.SENIOR_ADMIN.ordinal();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin getAdmin(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (sender instanceof Player)
|
|
||||||
{
|
|
||||||
return getAdmin((Player) sender);
|
|
||||||
}
|
|
||||||
|
|
||||||
return getEntryByName(sender.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin getAdmin(Player player)
|
|
||||||
{
|
|
||||||
// Find admin
|
|
||||||
String ip = Ips.getIp(player);
|
|
||||||
Admin admin = getEntryByName(player.getName());
|
|
||||||
|
|
||||||
// Admin by name
|
|
||||||
if (admin != null)
|
|
||||||
{
|
|
||||||
// Check if we're in online mode,
|
|
||||||
// Or the players IP is in the admin entry
|
|
||||||
if (Bukkit.getOnlineMode() || admin.getIps().contains(ip))
|
|
||||||
{
|
|
||||||
if (!admin.getIps().contains(ip))
|
|
||||||
{
|
|
||||||
// Add the new IP if we have to
|
|
||||||
admin.addIp(ip);
|
|
||||||
save();
|
|
||||||
updateTables();
|
|
||||||
}
|
|
||||||
return admin;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Impostor
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admin by ip
|
|
||||||
admin = getEntryByIp(ip);
|
|
||||||
if (admin != null)
|
|
||||||
{
|
|
||||||
// Set the new username
|
|
||||||
admin.setName(player.getName());
|
|
||||||
save();
|
|
||||||
updateTables();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin getEntryByName(String name)
|
|
||||||
{
|
|
||||||
return nameTable.get(name.toLowerCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin getEntryByIp(String ip)
|
|
||||||
{
|
|
||||||
return ipTable.get(ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Admin getEntryByIpFuzzy(String needleIp)
|
|
||||||
{
|
|
||||||
final Admin directAdmin = getEntryByIp(needleIp);
|
|
||||||
if (directAdmin != null)
|
|
||||||
{
|
|
||||||
return directAdmin;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String ip : ipTable.keySet())
|
|
||||||
{
|
|
||||||
if (FUtil.fuzzyIpMatch(needleIp, ip, 3))
|
|
||||||
{
|
|
||||||
return ipTable.get(ip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateLastLogin(Player player)
|
|
||||||
{
|
|
||||||
final Admin admin = getAdmin(player);
|
|
||||||
if (admin == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
admin.setLastLogin(new Date());
|
|
||||||
admin.setName(player.getName());
|
|
||||||
save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isAdminImpostor(Player player)
|
|
||||||
{
|
|
||||||
return getEntryByName(player.getName()) != null && !isAdmin(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIdentityMatched(Player player)
|
|
||||||
{
|
|
||||||
if (Bukkit.getOnlineMode())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Admin admin = getAdmin(player);
|
|
||||||
return admin == null ? false : admin.getName().equalsIgnoreCase(player.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addAdmin(Admin admin)
|
|
||||||
{
|
|
||||||
if (!admin.isValid())
|
|
||||||
{
|
|
||||||
logger.warning("Could not add admin: " + admin.getConfigKey() + " Admin is missing details!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final String key = admin.getConfigKey();
|
|
||||||
|
|
||||||
// Store admin, update views
|
|
||||||
allAdmins.put(key, admin);
|
|
||||||
updateTables();
|
|
||||||
|
|
||||||
// Save admin
|
|
||||||
admin.saveTo(config.createSection(key));
|
|
||||||
config.save();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean removeAdmin(Admin admin)
|
|
||||||
{
|
|
||||||
if (admin.getRank().isAtLeast(Rank.TELNET_ADMIN))
|
|
||||||
{
|
|
||||||
if (plugin.btb != null)
|
|
||||||
{
|
|
||||||
plugin.btb.killTelnetSessions(admin.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove admin, update views
|
|
||||||
if (allAdmins.remove(admin.getConfigKey()) == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
updateTables();
|
|
||||||
|
|
||||||
// 'Unsave' admin
|
|
||||||
config.set(admin.getConfigKey(), null);
|
|
||||||
config.save();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateTables()
|
|
||||||
{
|
|
||||||
activeAdmins.clear();
|
|
||||||
nameTable.clear();
|
|
||||||
ipTable.clear();
|
|
||||||
|
|
||||||
for (Admin admin : allAdmins.values())
|
|
||||||
{
|
|
||||||
if (!admin.isActive())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
activeAdmins.add(admin);
|
|
||||||
nameTable.put(admin.getName().toLowerCase(), admin);
|
|
||||||
|
|
||||||
for (String ip : admin.getIps())
|
|
||||||
{
|
|
||||||
ipTable.put(ip, admin);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.wm.adminworld.wipeAccessCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getAdminNames()
|
|
||||||
{
|
|
||||||
return nameTable.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getAdminIps()
|
|
||||||
{
|
|
||||||
return ipTable.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deactivateOldEntries(boolean verbose)
|
|
||||||
{
|
|
||||||
for (Admin admin : allAdmins.values())
|
|
||||||
{
|
|
||||||
if (!admin.isActive() || admin.getRank().isAtLeast(Rank.SENIOR_ADMIN))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Date lastLogin = admin.getLastLogin();
|
|
||||||
final long lastLoginHours = TimeUnit.HOURS.convert(new Date().getTime() - lastLogin.getTime(), TimeUnit.MILLISECONDS);
|
|
||||||
|
|
||||||
if (lastLoginHours < ConfigEntry.ADMINLIST_CLEAN_THESHOLD_HOURS.getInteger())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
FUtil.adminAction("TotalFreedomMod", "Deactivating superadmin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
admin.setActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
save();
|
|
||||||
updateTables();
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,26 +2,24 @@ package me.totalfreedom.totalfreedommod.banning;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.pravian.aero.base.ConfigLoadable;
|
|
||||||
import net.pravian.aero.base.ConfigSavable;
|
|
||||||
import net.pravian.aero.base.Validatable;
|
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
public class Ban
|
||||||
{
|
{
|
||||||
|
|
||||||
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z");
|
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z");
|
||||||
@ -30,12 +28,18 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
@Setter
|
@Setter
|
||||||
private String username = null;
|
private String username = null;
|
||||||
@Getter
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private UUID uuid = null;
|
||||||
|
@Getter
|
||||||
private final List<String> ips = Lists.newArrayList();
|
private final List<String> ips = Lists.newArrayList();
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private String by = null;
|
private String by = null;
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
|
private Date at = null;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
private String reason = null; // Unformatted, &[0-9,a-f] instead of ChatColor
|
private String reason = null; // Unformatted, &[0-9,a-f] instead of ChatColor
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -45,27 +49,28 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public Ban(String username, String ip, String by, Date expire, String reason)
|
public Ban(String username, UUID uuid, String ip, String by, Date at, Date expire, String reason)
|
||||||
{
|
{
|
||||||
this(username,
|
this(username,
|
||||||
new String[]
|
uuid,
|
||||||
{
|
Arrays.asList(ip),
|
||||||
ip
|
|
||||||
},
|
|
||||||
by,
|
by,
|
||||||
|
at,
|
||||||
expire,
|
expire,
|
||||||
reason);
|
reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Ban(String username, String[] ips, String by, Date expire, String reason)
|
public Ban(String username, UUID uuid, List<String> ips, String by, Date at, Date expire, String reason)
|
||||||
{
|
{
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
this.uuid = uuid;
|
||||||
if (ips != null)
|
if (ips != null)
|
||||||
{
|
{
|
||||||
this.ips.addAll(Arrays.asList(ips));
|
this.ips.addAll(ips);
|
||||||
}
|
}
|
||||||
dedupeIps();
|
dedupeIps();
|
||||||
this.by = by;
|
this.by = by;
|
||||||
|
this.at = at;
|
||||||
this.expiryUnix = FUtil.getUnixTime(expire);
|
this.expiryUnix = FUtil.getUnixTime(expire);
|
||||||
this.reason = reason;
|
this.reason = reason;
|
||||||
}
|
}
|
||||||
@ -79,15 +84,12 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
|
|
||||||
public static Ban forPlayerIp(Player player, CommandSender by, Date expiry, String reason)
|
public static Ban forPlayerIp(Player player, CommandSender by, Date expiry, String reason)
|
||||||
{
|
{
|
||||||
return new Ban(null, new String[]
|
return new Ban(null, null, Arrays.asList(FUtil.getIp(player)), by.getName(), Date.from(Instant.now()), expiry, reason);
|
||||||
{
|
|
||||||
Ips.getIp(player)
|
|
||||||
}, by.getName(), expiry, reason);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Ban forPlayerIp(String ip, CommandSender by, Date expiry, String reason)
|
public static Ban forPlayerIp(String ip, CommandSender by, Date expiry, String reason)
|
||||||
{
|
{
|
||||||
return new Ban(null, ip, by.getName(), expiry, reason);
|
return new Ban(null, null, ip, by.getName(), Date.from(Instant.now()), expiry, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -100,8 +102,10 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
public static Ban forPlayerName(String player, CommandSender by, Date expiry, String reason)
|
public static Ban forPlayerName(String player, CommandSender by, Date expiry, String reason)
|
||||||
{
|
{
|
||||||
return new Ban(player,
|
return new Ban(player,
|
||||||
(String[]) null,
|
null,
|
||||||
|
new ArrayList<>(),
|
||||||
by.getName(),
|
by.getName(),
|
||||||
|
Date.from(Instant.now()),
|
||||||
expiry,
|
expiry,
|
||||||
reason);
|
reason);
|
||||||
}
|
}
|
||||||
@ -116,8 +120,10 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
public static Ban forPlayer(Player player, CommandSender by, Date expiry, String reason)
|
public static Ban forPlayer(Player player, CommandSender by, Date expiry, String reason)
|
||||||
{
|
{
|
||||||
return new Ban(player.getName(),
|
return new Ban(player.getName(),
|
||||||
Ips.getIp(player),
|
player.getUniqueId(),
|
||||||
|
FUtil.getIp(player),
|
||||||
by.getName(),
|
by.getName(),
|
||||||
|
Date.from(Instant.now()),
|
||||||
expiry,
|
expiry,
|
||||||
reason);
|
reason);
|
||||||
}
|
}
|
||||||
@ -125,8 +131,10 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
public static Ban forPlayerFuzzy(Player player, CommandSender by, Date expiry, String reason)
|
public static Ban forPlayerFuzzy(Player player, CommandSender by, Date expiry, String reason)
|
||||||
{
|
{
|
||||||
return new Ban(player.getName(),
|
return new Ban(player.getName(),
|
||||||
FUtil.getFuzzyIp(Ips.getIp(player)),
|
player.getUniqueId(),
|
||||||
|
FUtil.getFuzzyIp(FUtil.getIp(player)),
|
||||||
by.getName(),
|
by.getName(),
|
||||||
|
Date.from(Instant.now()),
|
||||||
expiry,
|
expiry,
|
||||||
reason);
|
reason);
|
||||||
}
|
}
|
||||||
@ -136,6 +144,11 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
return username != null && !username.isEmpty();
|
return username != null && !username.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasUUID()
|
||||||
|
{
|
||||||
|
return uuid != null;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean addIp(String ip)
|
public boolean addIp(String ip)
|
||||||
{
|
{
|
||||||
return ips.add(ip);
|
return ips.add(ip);
|
||||||
@ -156,11 +169,6 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
return expiryUnix > 0;
|
return expiryUnix > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getExpiryDate()
|
|
||||||
{
|
|
||||||
return FUtil.getUnixDate(expiryUnix);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isExpired()
|
public boolean isExpired()
|
||||||
{
|
{
|
||||||
return hasExpiry() && expiryUnix < FUtil.getUnixTime();
|
return hasExpiry() && expiryUnix < FUtil.getUnixTime();
|
||||||
@ -170,7 +178,20 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
{
|
{
|
||||||
final StringBuilder message = new StringBuilder(ChatColor.GOLD + "You");
|
final StringBuilder message = new StringBuilder(ChatColor.GOLD + "You");
|
||||||
|
|
||||||
message.append(!hasUsername() ? "r IP address is" : " are").append(" temporarily banned from this server.");
|
if (!hasUsername())
|
||||||
|
{
|
||||||
|
message.append("r IP address is");
|
||||||
|
}
|
||||||
|
else if (!hasIps())
|
||||||
|
{
|
||||||
|
message.append("r username is");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.append(" are");
|
||||||
|
}
|
||||||
|
|
||||||
|
message.append(" temporarily banned from this server.");
|
||||||
message.append("\nAppeal at ").append(ChatColor.BLUE)
|
message.append("\nAppeal at ").append(ChatColor.BLUE)
|
||||||
.append(ConfigEntry.SERVER_BAN_URL.getString());
|
.append(ConfigEntry.SERVER_BAN_URL.getString());
|
||||||
|
|
||||||
@ -186,6 +207,12 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
.append(by);
|
.append(by);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (at != null)
|
||||||
|
{
|
||||||
|
message.append("\n").append(ChatColor.RED).append("Issued: ").append(ChatColor.GOLD)
|
||||||
|
.append(DATE_FORMAT.format(at));
|
||||||
|
}
|
||||||
|
|
||||||
if (getExpiryUnix() != 0)
|
if (getExpiryUnix() != 0)
|
||||||
{
|
{
|
||||||
message.append("\n").append(ChatColor.RED).append("Expires: ").append(ChatColor.GOLD)
|
message.append("\n").append(ChatColor.RED).append("Expires: ").append(ChatColor.GOLD)
|
||||||
@ -208,9 +235,9 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Ban ban = (Ban) object;
|
final Ban ban = (Ban)object;
|
||||||
if (hasIps() != ban.hasIps()
|
if (hasIps() != ban.hasIps()
|
||||||
|| hasUsername() != hasUsername())
|
|| hasUsername() != ban.hasUsername())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -223,44 +250,6 @@ public class Ban implements ConfigLoadable, ConfigSavable, Validatable
|
|||||||
return !(hasUsername() && !(getUsername().equalsIgnoreCase(ban.getUsername())));
|
return !(hasUsername() && !(getUsername().equalsIgnoreCase(ban.getUsername())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode()
|
|
||||||
{
|
|
||||||
int hash = 7;
|
|
||||||
hash = 79 * hash + (this.username != null ? this.username.toLowerCase().hashCode() : 0);
|
|
||||||
hash = 79 * hash + (this.ips != null ? this.ips.hashCode() : 0);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadFrom(ConfigurationSection cs)
|
|
||||||
{
|
|
||||||
this.username = cs.getString("username", null);
|
|
||||||
this.ips.clear();
|
|
||||||
this.ips.addAll(cs.getStringList("ips"));
|
|
||||||
this.by = cs.getString("by", null);
|
|
||||||
this.reason = cs.getString("reason", null);
|
|
||||||
this.expiryUnix = cs.getLong("expiry_unix", 0);
|
|
||||||
dedupeIps();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveTo(ConfigurationSection cs)
|
|
||||||
{
|
|
||||||
dedupeIps();
|
|
||||||
cs.set("username", username);
|
|
||||||
cs.set("ips", ips.isEmpty() ? null : ips);
|
|
||||||
cs.set("by", by);
|
|
||||||
cs.set("reason", reason);
|
|
||||||
cs.set("expiry_unix", expiryUnix > 0 ? expiryUnix : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValid()
|
|
||||||
{
|
|
||||||
return username != null || !ips.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void dedupeIps()
|
private void dedupeIps()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -3,20 +3,21 @@ package me.totalfreedom.totalfreedommod.banning;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.pravian.aero.config.YamlConfig;
|
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -27,42 +28,43 @@ public class BanManager extends FreedomService
|
|||||||
{
|
{
|
||||||
|
|
||||||
private final Set<Ban> bans = Sets.newHashSet();
|
private final Set<Ban> bans = Sets.newHashSet();
|
||||||
private final Map<String, Ban> ipBans = Maps.newHashMap();
|
|
||||||
private final Map<String, Ban> nameBans = Maps.newHashMap();
|
private final Map<String, Ban> nameBans = Maps.newHashMap();
|
||||||
|
private final Map<UUID, Ban> uuidBans = Maps.newHashMap();
|
||||||
|
private final Map<String, Ban> ipBans = Maps.newHashMap();
|
||||||
private final List<String> unbannableUsernames = Lists.newArrayList();
|
private final List<String> unbannableUsernames = Lists.newArrayList();
|
||||||
//
|
|
||||||
private final YamlConfig config;
|
|
||||||
|
|
||||||
public BanManager(TotalFreedomMod plugin)
|
//
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
this.config = new YamlConfig(plugin, "bans.yml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
config.load();
|
|
||||||
|
|
||||||
bans.clear();
|
bans.clear();
|
||||||
for (String id : config.getKeys(false))
|
try
|
||||||
{
|
{
|
||||||
if (!config.isConfigurationSection(id))
|
ResultSet banSet = plugin.sql.getBanList();
|
||||||
{
|
{
|
||||||
FLog.warning("Could not load username ban: " + id + ". Invalid format!");
|
while (banSet.next())
|
||||||
continue;
|
{
|
||||||
|
String name = banSet.getString("name");
|
||||||
|
UUID uuid = null;
|
||||||
|
String strUUID = banSet.getString("uuid");
|
||||||
|
if (strUUID != null)
|
||||||
|
{
|
||||||
|
uuid = UUID.fromString(strUUID);
|
||||||
|
}
|
||||||
|
List<String> ips = FUtil.stringToList(banSet.getString("ips"));
|
||||||
|
String by = banSet.getString("by");
|
||||||
|
Date at = new Date(banSet.getLong("at"));
|
||||||
|
Date expires = new Date(banSet.getLong("expires"));
|
||||||
|
String reason = banSet.getString("reason");
|
||||||
|
Ban ban = new Ban(name, uuid, ips, by, at, expires, reason);
|
||||||
|
bans.add(ban);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Ban ban = new Ban();
|
catch (SQLException e)
|
||||||
ban.loadFrom(config.getConfigurationSection(id));
|
{
|
||||||
|
FLog.severe("Failed to load ban list: " + e.getMessage());
|
||||||
if (!ban.isValid())
|
|
||||||
{
|
|
||||||
FLog.warning("Not adding username ban: " + id + ". Missing information.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bans.add(ban);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove expired bans, repopulate ipBans and nameBans,
|
// Remove expired bans, repopulate ipBans and nameBans,
|
||||||
@ -72,15 +74,13 @@ public class BanManager extends FreedomService
|
|||||||
|
|
||||||
// Load unbannable usernames
|
// Load unbannable usernames
|
||||||
unbannableUsernames.clear();
|
unbannableUsernames.clear();
|
||||||
unbannableUsernames.addAll((Collection<? extends String>) ConfigEntry.FAMOUS_PLAYERS.getList());
|
unbannableUsernames.addAll((Collection<? extends String>)ConfigEntry.FAMOUS_PLAYERS.getList());
|
||||||
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
|
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
saveAll();
|
|
||||||
logger.info("Saved " + bans.size() + " player bans");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Ban> getAllBans()
|
public Set<Ban> getAllBans()
|
||||||
@ -98,21 +98,6 @@ public class BanManager extends FreedomService
|
|||||||
return Collections.unmodifiableCollection(nameBans.values());
|
return Collections.unmodifiableCollection(nameBans.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveAll()
|
|
||||||
{
|
|
||||||
// Remove expired
|
|
||||||
updateViews();
|
|
||||||
|
|
||||||
config.clear();
|
|
||||||
for (Ban ban : bans)
|
|
||||||
{
|
|
||||||
ban.saveTo(config.createSection(String.valueOf(ban.hashCode())));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save config
|
|
||||||
config.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Ban getByIp(String ip)
|
public Ban getByIp(String ip)
|
||||||
{
|
{
|
||||||
final Ban directBan = ipBans.get(ip);
|
final Ban directBan = ipBans.get(ip);
|
||||||
@ -136,7 +121,7 @@ public class BanManager extends FreedomService
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ips.fuzzyIpMatch(ip, loopIp, 4))
|
if (FUtil.fuzzyIpMatch(ip, loopIp, 4))
|
||||||
{
|
{
|
||||||
return loopBan;
|
return loopBan;
|
||||||
}
|
}
|
||||||
@ -159,6 +144,18 @@ public class BanManager extends FreedomService
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Ban getByUUID(UUID uuid)
|
||||||
|
{
|
||||||
|
final Ban directBan = uuidBans.get(uuid);
|
||||||
|
|
||||||
|
if (directBan != null && !directBan.isExpired())
|
||||||
|
{
|
||||||
|
return directBan;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Ban unbanIp(String ip)
|
public Ban unbanIp(String ip)
|
||||||
{
|
{
|
||||||
final Ban ban = getByIp(ip);
|
final Ban ban = getByIp(ip);
|
||||||
@ -166,7 +163,6 @@ public class BanManager extends FreedomService
|
|||||||
if (ban != null)
|
if (ban != null)
|
||||||
{
|
{
|
||||||
bans.remove(ban);
|
bans.remove(ban);
|
||||||
saveAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ban;
|
return ban;
|
||||||
@ -179,7 +175,6 @@ public class BanManager extends FreedomService
|
|||||||
if (ban != null)
|
if (ban != null)
|
||||||
{
|
{
|
||||||
bans.remove(ban);
|
bans.remove(ban);
|
||||||
saveAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ban;
|
return ban;
|
||||||
@ -197,9 +192,27 @@ public class BanManager extends FreedomService
|
|||||||
|
|
||||||
public boolean addBan(Ban ban)
|
public boolean addBan(Ban ban)
|
||||||
{
|
{
|
||||||
|
if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null)
|
||||||
|
{
|
||||||
|
removeBan(ban);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
for (String ip : ban.getIps())
|
||||||
|
{
|
||||||
|
if (getByIp(ip) != null)
|
||||||
|
{
|
||||||
|
removeBan(ban);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bans.add(ban))
|
if (bans.add(ban))
|
||||||
{
|
{
|
||||||
saveAll();
|
plugin.sql.addBan(ban);
|
||||||
|
updateViews();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +223,8 @@ public class BanManager extends FreedomService
|
|||||||
{
|
{
|
||||||
if (bans.remove(ban))
|
if (bans.remove(ban))
|
||||||
{
|
{
|
||||||
saveAll();
|
plugin.sql.removeBan(ban);
|
||||||
|
updateViews();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,27 +233,30 @@ public class BanManager extends FreedomService
|
|||||||
|
|
||||||
public int purge()
|
public int purge()
|
||||||
{
|
{
|
||||||
config.clear();
|
|
||||||
config.save();
|
|
||||||
|
|
||||||
int size = bans.size();
|
int size = bans.size();
|
||||||
bans.clear();
|
bans.clear();
|
||||||
updateViews();
|
updateViews();
|
||||||
|
plugin.sql.truncate("bans");
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onPlayerLogin(PlayerLoginEvent event)
|
public void onPlayerLogin(PlayerLoginEvent event)
|
||||||
{
|
{
|
||||||
final String username = event.getPlayer().getName();
|
final String username = event.getPlayer().getName();
|
||||||
final String ip = Ips.getIp(event);
|
final UUID uuid = event.getPlayer().getUniqueId();
|
||||||
|
final String ip = FUtil.getIp(event);
|
||||||
|
|
||||||
// Regular ban
|
// Regular ban
|
||||||
Ban ban = getByUsername(username);
|
Ban ban = getByUsername(username);
|
||||||
if (ban == null)
|
if (ban == null)
|
||||||
{
|
{
|
||||||
ban = getByIp(ip);
|
ban = getByUUID(uuid);
|
||||||
|
|
||||||
|
if (ban == null)
|
||||||
|
{
|
||||||
|
ban = getByIp(ip);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ban != null && !ban.isExpired())
|
if (ban != null && !ban.isExpired())
|
||||||
@ -248,40 +265,47 @@ public class BanManager extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onPlayerJoin(PlayerJoinEvent event)
|
public void onPlayerJoin(PlayerJoinEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final PlayerData data = plugin.pl.getData(player);
|
final PlayerData data = plugin.pl.getData(player);
|
||||||
|
|
||||||
if (!plugin.al.isAdmin(player))
|
if (!plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unban admins
|
// Unban admins
|
||||||
for (String storedIp : data.getIps())
|
Ban ban = getByUsername(player.getName());
|
||||||
|
if (ban != null)
|
||||||
{
|
{
|
||||||
unbanIp(storedIp);
|
removeBan(ban);
|
||||||
unbanIp(FUtil.getFuzzyIp(storedIp));
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ban = getByIp(FUtil.getIp(player));
|
||||||
|
if (ban != null)
|
||||||
|
{
|
||||||
|
removeBan(ban);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unbanUsername(player.getName());
|
|
||||||
player.setOp(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateViews()
|
private void updateViews()
|
||||||
{
|
{
|
||||||
// Remove expired bans
|
// Remove expired bans
|
||||||
for (Iterator<Ban> it = bans.iterator(); it.hasNext();)
|
for (Ban ban : new ArrayList<>(bans))
|
||||||
{
|
{
|
||||||
if (it.next().isExpired())
|
if (ban.isExpired())
|
||||||
{
|
{
|
||||||
it.remove();
|
bans.remove(ban);
|
||||||
|
plugin.sql.removeBan(ban);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nameBans.clear();
|
nameBans.clear();
|
||||||
|
uuidBans.clear();
|
||||||
ipBans.clear();
|
ipBans.clear();
|
||||||
for (Ban ban : bans)
|
for (Ban ban : bans)
|
||||||
{
|
{
|
||||||
@ -290,6 +314,11 @@ public class BanManager extends FreedomService
|
|||||||
nameBans.put(ban.getUsername().toLowerCase(), ban);
|
nameBans.put(ban.getUsername().toLowerCase(), ban);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ban.hasUUID())
|
||||||
|
{
|
||||||
|
uuidBans.put(ban.getUuid(), ban);
|
||||||
|
}
|
||||||
|
|
||||||
if (ban.hasIps())
|
if (ban.hasIps())
|
||||||
{
|
{
|
||||||
for (String ip : ban.getIps())
|
for (String ip : ban.getIps())
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.banning;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.IConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
|
public class IndefiniteBan implements IConfig
|
||||||
|
{
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private String username = null;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private UUID uuid = null;
|
||||||
|
@Getter
|
||||||
|
private final List<String> ips = Lists.newArrayList();
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private String reason = null;
|
||||||
|
|
||||||
|
public IndefiniteBan()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadFrom(ConfigurationSection cs)
|
||||||
|
{
|
||||||
|
this.username = cs.getName();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String strUUID = cs.getString("uuid", null);
|
||||||
|
if (strUUID != null)
|
||||||
|
{
|
||||||
|
UUID uuid = UUID.fromString(strUUID);
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e)
|
||||||
|
{
|
||||||
|
FLog.warning("Failed to load indefinite banned UUID for " + this.username + ". Make sure the UUID is in the correct format with dashes.");
|
||||||
|
}
|
||||||
|
this.ips.clear();
|
||||||
|
this.ips.addAll(cs.getStringList("ips"));
|
||||||
|
this.reason = cs.getString("reason", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveTo(ConfigurationSection cs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isValid()
|
||||||
|
{
|
||||||
|
return username != null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.banning;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import lombok.Getter;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.YamlConfig;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
|
|
||||||
|
public class IndefiniteBanList extends FreedomService
|
||||||
|
{
|
||||||
|
|
||||||
|
public static final String CONFIG_FILENAME = "indefinitebans.yml";
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Set<IndefiniteBan> indefBans = Sets.newHashSet();
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int nameBanCount = 0;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int uuidBanCount = 0;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int ipBanCount = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
indefBans.clear();
|
||||||
|
|
||||||
|
final YamlConfig config = new YamlConfig(plugin, CONFIG_FILENAME, true);
|
||||||
|
config.load();
|
||||||
|
|
||||||
|
for (String name : config.getKeys(false))
|
||||||
|
{
|
||||||
|
if (!config.isConfigurationSection(name))
|
||||||
|
{
|
||||||
|
FLog.warning("Could not load indefinite ban for " + name + ": Invalid format!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
IndefiniteBan indefBan = new IndefiniteBan();
|
||||||
|
ConfigurationSection cs = config.getConfigurationSection(name);
|
||||||
|
indefBan.loadFrom(cs);
|
||||||
|
|
||||||
|
if (!indefBan.isValid())
|
||||||
|
{
|
||||||
|
FLog.warning("Not adding indefinite ban for " + name + ": Missing information.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
indefBans.add(indefBan);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCount();
|
||||||
|
|
||||||
|
FLog.info("Loaded " + nameBanCount + " indefinite name bans, " + uuidBanCount + " UUID bans, and " + ipBanCount + " ip bans");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void onPlayerLogin(PlayerLoginEvent event)
|
||||||
|
{
|
||||||
|
final String username = event.getPlayer().getName();
|
||||||
|
final UUID uuid = event.getPlayer().getUniqueId();
|
||||||
|
final String ip = FUtil.getIp(event);
|
||||||
|
|
||||||
|
String bannedBy = "";
|
||||||
|
IndefiniteBan ban = null;
|
||||||
|
|
||||||
|
for (IndefiniteBan indefBan : indefBans)
|
||||||
|
{
|
||||||
|
if (username.toLowerCase().equals(indefBan.getUsername().toLowerCase()))
|
||||||
|
{
|
||||||
|
bannedBy = "username";
|
||||||
|
ban = indefBan;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (indefBan.getUuid() != null && indefBan.getUuid().equals(uuid))
|
||||||
|
{
|
||||||
|
bannedBy = "UUID";
|
||||||
|
ban = indefBan;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (indefBan.getIps().contains(ip))
|
||||||
|
{
|
||||||
|
bannedBy = "IP address";
|
||||||
|
ban = indefBan;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ban != null)
|
||||||
|
{
|
||||||
|
String kickMessage = ChatColor.RED + "Your " + bannedBy + " is indefinitely banned from this server.";
|
||||||
|
String reason = ban.getReason();
|
||||||
|
if (!Strings.isNullOrEmpty(reason))
|
||||||
|
{
|
||||||
|
kickMessage += "\nReason: " + ChatColor.GOLD + reason;
|
||||||
|
}
|
||||||
|
String appealURL = ConfigEntry.SERVER_INDEFBAN_URL.getString();
|
||||||
|
if (!Strings.isNullOrEmpty(appealURL))
|
||||||
|
{
|
||||||
|
kickMessage += ChatColor.RED + "\n\nRelease procedures are available at\n" + ChatColor.GOLD + ConfigEntry.SERVER_INDEFBAN_URL.getString();
|
||||||
|
}
|
||||||
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, kickMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCount()
|
||||||
|
{
|
||||||
|
nameBanCount = 0;
|
||||||
|
uuidBanCount = 0;
|
||||||
|
ipBanCount = 0;
|
||||||
|
|
||||||
|
for (IndefiniteBan indefBan : indefBans)
|
||||||
|
{
|
||||||
|
nameBanCount += 1;
|
||||||
|
if (indefBan.getUuid() != null)
|
||||||
|
{
|
||||||
|
uuidBanCount += 1;
|
||||||
|
}
|
||||||
|
ipBanCount += indefBan.getIps().size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,90 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.banning;
|
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import java.util.Set;
|
|
||||||
import lombok.Getter;
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.pravian.aero.config.YamlConfig;
|
|
||||||
import net.pravian.aero.util.Ips;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.player.PlayerLoginEvent;
|
|
||||||
|
|
||||||
public class PermbanList extends FreedomService
|
|
||||||
{
|
|
||||||
|
|
||||||
public static final String CONFIG_FILENAME = "permbans.yml";
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Set<String> permbannedNames = Sets.newHashSet();
|
|
||||||
@Getter
|
|
||||||
private final Set<String> permbannedIps = Sets.newHashSet();
|
|
||||||
|
|
||||||
public PermbanList(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStart()
|
|
||||||
{
|
|
||||||
permbannedNames.clear();
|
|
||||||
permbannedIps.clear();
|
|
||||||
|
|
||||||
final YamlConfig config = new YamlConfig(plugin, CONFIG_FILENAME, true);
|
|
||||||
config.load();
|
|
||||||
|
|
||||||
for (String name : config.getKeys(false))
|
|
||||||
{
|
|
||||||
permbannedNames.add(name.toLowerCase().trim());
|
|
||||||
permbannedIps.addAll(config.getStringList(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
FLog.info("Loaded " + permbannedIps.size() + " perm IP bans and " + permbannedNames.size() + " perm username bans.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStop()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
|
||||||
public void onPlayerLogin(PlayerLoginEvent event)
|
|
||||||
{
|
|
||||||
final String username = event.getPlayer().getName();
|
|
||||||
final String ip = Ips.getIp(event);
|
|
||||||
|
|
||||||
// Permbanned IPs
|
|
||||||
for (String testIp : getPermbannedIps())
|
|
||||||
{
|
|
||||||
if (FUtil.fuzzyIpMatch(testIp, ip, 4))
|
|
||||||
{
|
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
|
||||||
ChatColor.RED + "Your IP address is permanently banned from this server.\n"
|
|
||||||
+ "Release procedures are available at\n"
|
|
||||||
+ ChatColor.GOLD + ConfigEntry.SERVER_PERMBAN_URL.getString());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Permbanned usernames
|
|
||||||
for (String testPlayer : getPermbannedNames())
|
|
||||||
{
|
|
||||||
if (testPlayer.equalsIgnoreCase(username))
|
|
||||||
{
|
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
|
||||||
ChatColor.RED + "Your username is permanently banned from this server.\n"
|
|
||||||
+ "Release procedures are available at\n"
|
|
||||||
+ ChatColor.GOLD + ConfigEntry.SERVER_PERMBAN_URL.getString());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,33 +1,31 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking;
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Banner;
|
||||||
|
import org.bukkit.block.Skull;
|
||||||
|
import org.bukkit.block.banner.Pattern;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
public class BlockBlocker extends FreedomService
|
public class BlockBlocker extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public BlockBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,33 +37,18 @@ public class BlockBlocker extends FreedomService
|
|||||||
switch (event.getBlockPlaced().getType())
|
switch (event.getBlockPlaced().getType())
|
||||||
{
|
{
|
||||||
case LAVA:
|
case LAVA:
|
||||||
case STATIONARY_LAVA:
|
|
||||||
{
|
{
|
||||||
if (ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
if (!ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
||||||
{
|
|
||||||
FLog.info(String.format("%s placed lava @ %s", player.getName(), FUtil.formatLocation(event.getBlock().getLocation())));
|
|
||||||
|
|
||||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
player.sendMessage(ChatColor.GRAY + "Lava placement is currently disabled.");
|
player.sendMessage(ChatColor.GRAY + "Lava placement is currently disabled.");
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WATER:
|
case WATER:
|
||||||
case STATIONARY_WATER:
|
|
||||||
{
|
{
|
||||||
if (ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
if (!ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
||||||
{
|
|
||||||
FLog.info(String.format("%s placed water @ %s", player.getName(), FUtil.formatLocation(event.getBlock().getLocation())));
|
|
||||||
|
|
||||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
player.sendMessage(ChatColor.GRAY + "Water placement is currently disabled.");
|
player.sendMessage(ChatColor.GRAY + "Water placement is currently disabled.");
|
||||||
@ -75,48 +58,129 @@ public class BlockBlocker extends FreedomService
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FIRE:
|
case FIRE:
|
||||||
|
case SOUL_FIRE:
|
||||||
{
|
{
|
||||||
if (ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
|
if (!ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
|
||||||
{
|
|
||||||
FLog.info(String.format("%s placed fire @ %s", player.getName(), FUtil.formatLocation(event.getBlock().getLocation())));
|
|
||||||
|
|
||||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
player.sendMessage(ChatColor.GRAY + "Fire placement is currently disabled.");
|
player.sendMessage(ChatColor.GRAY + "Fire placement is currently disabled.");
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TNT:
|
|
||||||
{
|
|
||||||
if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
|
||||||
{
|
|
||||||
FLog.info(String.format("%s placed TNT @ %s", player.getName(), FUtil.formatLocation(event.getBlock().getLocation())));
|
|
||||||
|
|
||||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
|
||||||
|
|
||||||
player.sendMessage(ChatColor.GRAY + "TNT is currently disabled.");
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case STRUCTURE_BLOCK:
|
case STRUCTURE_BLOCK:
|
||||||
case STRUCTURE_VOID:
|
|
||||||
{
|
{
|
||||||
player.sendMessage(ChatColor.GRAY + "Structure blocks are disabled.");
|
if (!ConfigEntry.ALLOW_STRUCTURE_BLOCKS.getBoolean())
|
||||||
|
{
|
||||||
event.setCancelled(true);
|
player.sendMessage(ChatColor.GRAY + "Structure blocks are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JIGSAW:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_JIGSAWS.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Jigsaws are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GRINDSTONE:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_GRINDSTONES.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Grindstones are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JUKEBOX:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_JUKEBOXES.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Jukeboxes are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPAWNER:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_SPAWNERS.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Spawners are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BEEHIVE:
|
||||||
|
case BEE_NEST:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_BEEHIVES.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Beehives are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PLAYER_HEAD:
|
||||||
|
case PLAYER_WALL_HEAD:
|
||||||
|
{
|
||||||
|
Skull skull = (Skull) event.getBlockPlaced().getState();
|
||||||
|
if (skull.getOwner() != null)
|
||||||
|
{
|
||||||
|
if (skull.getOwner().contains("\u00A7"))
|
||||||
|
{
|
||||||
|
skull.setOwner(skull.getOwner().replace("\u00A7", ""));
|
||||||
|
SkullMeta meta = (SkullMeta) event.getItemInHand().getItemMeta();
|
||||||
|
if (meta != null)
|
||||||
|
{
|
||||||
|
ItemStack newHead = new ItemStack(Material.PLAYER_HEAD, 1);
|
||||||
|
ItemMeta headMeta = newHead.getItemMeta();
|
||||||
|
headMeta.setDisplayName(ChatColor.YELLOW + "C-sectioned Head");
|
||||||
|
newHead.setItemMeta(headMeta);
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), newHead);
|
||||||
|
player.sendMessage(ChatColor.GRAY + "The player head you are attempting to place has a section symbol. Your player head has been C-sectioned.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (skull.getOwner().length() > 100)
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Instead of using Pi to crash players, be useful with your life and use it to discover things.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RESPAWN_ANCHOR:
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_RESPAWN_ANCHORS.getBoolean())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Respawn anchors are disabled.");
|
||||||
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
|
||||||
|
{
|
||||||
|
Banner banner = (Banner) event.getBlockPlaced().getState();
|
||||||
|
List<Pattern> patterns = banner.getPatterns();;
|
||||||
|
if (patterns.size() >= 2)
|
||||||
|
{
|
||||||
|
banner.setPatterns(patterns.subList(0, 2));
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Your banner had too many patterns on it, so some were removed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
|
||||||
|
public class EditBlocker extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event)
|
||||||
|
{
|
||||||
|
FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer());
|
||||||
|
if (!fPlayer.isEditBlocked())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.sl.isStaffSync(event.getPlayer()))
|
||||||
|
{
|
||||||
|
fPlayer.setEditBlocked(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to place blocks has been disabled!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
public void onBlockBreak(BlockBreakEvent event)
|
||||||
|
{
|
||||||
|
FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer());
|
||||||
|
if (!fPlayer.isEditBlocked())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.sl.isStaffSync(event.getPlayer()))
|
||||||
|
{
|
||||||
|
fPlayer.setEditBlocked(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to destroy blocks has been disabled!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,41 +1,50 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking;
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.attribute.Attribute;
|
||||||
|
import org.bukkit.attribute.AttributeModifier;
|
||||||
|
import org.bukkit.block.data.AnaloguePowerable;
|
||||||
|
import org.bukkit.block.data.Powerable;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
import org.bukkit.entity.Projectile;
|
|
||||||
import org.bukkit.entity.Tameable;
|
import org.bukkit.entity.Tameable;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.block.BlockBurnEvent;
|
import org.bukkit.event.block.BlockBurnEvent;
|
||||||
|
import org.bukkit.event.block.BlockDispenseEvent;
|
||||||
import org.bukkit.event.block.BlockFromToEvent;
|
import org.bukkit.event.block.BlockFromToEvent;
|
||||||
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
import org.bukkit.event.block.BlockIgniteEvent;
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
|
import org.bukkit.event.block.BlockRedstoneEvent;
|
||||||
import org.bukkit.event.block.LeavesDecayEvent;
|
import org.bukkit.event.block.LeavesDecayEvent;
|
||||||
import org.bukkit.event.entity.EntityCombustEvent;
|
import org.bukkit.event.entity.EntityCombustEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.bukkit.event.entity.ExplosionPrimeEvent;
|
import org.bukkit.event.entity.ExplosionPrimeEvent;
|
||||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
import org.bukkit.event.entity.FireworkExplodeEvent;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
|
|
||||||
public class EventBlocker extends FreedomService
|
public class EventBlocker extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public EventBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +80,7 @@ public class EventBlocker extends FreedomService
|
|||||||
{
|
{
|
||||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.blockList().clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,19 +117,6 @@ public class EventBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
|
||||||
public void onProjectileHit(ProjectileHitEvent event)
|
|
||||||
{
|
|
||||||
if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
|
||||||
{
|
|
||||||
Projectile entity = event.getEntity();
|
|
||||||
if (event.getEntityType() == EntityType.ARROW)
|
|
||||||
{
|
|
||||||
entity.getWorld().createExplosion(entity.getLocation(), 2F);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onEntityDamage(EntityDamageEvent event)
|
public void onEntityDamage(EntityDamageEvent event)
|
||||||
{
|
{
|
||||||
@ -141,7 +137,7 @@ public class EventBlocker extends FreedomService
|
|||||||
Entity entity = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
if (entity instanceof Tameable)
|
if (entity instanceof Tameable)
|
||||||
{
|
{
|
||||||
if (((Tameable) entity).isTamed())
|
if (((Tameable)entity).isTamed())
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
@ -152,6 +148,11 @@ public class EventBlocker extends FreedomService
|
|||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onPlayerDropItem(PlayerDropItemEvent event)
|
public void onPlayerDropItem(PlayerDropItemEvent event)
|
||||||
{
|
{
|
||||||
|
if (!plugin.sl.isStaff(event.getPlayer()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
if (!ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@ -169,4 +170,89 @@ public class EventBlocker extends FreedomService
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onBlockGrowth(BlockGrowEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onFireworkExplode(FireworkExplodeEvent event)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_FIREWORK_EXPLOSION.getBoolean())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onBlockPistonRetract(BlockPistonRetractEvent event)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onBlockPistonExtend(BlockPistonExtendEvent event)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onBlockRedstone(BlockRedstoneEvent event)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
|
||||||
|
{
|
||||||
|
event.setNewCurrent(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Revert back to old redstone block system when (or if) it is fixed in Bukkit, Spigot or Paper.
|
||||||
|
private ArrayList<Material> redstoneBlocks = new ArrayList<>(Arrays.asList(Material.REDSTONE, Material.DISPENSER, Material.DROPPER, Material.REDSTONE_LAMP));
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockPhysics(BlockPhysicsEvent event)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
|
||||||
|
{
|
||||||
|
// Check if the block is involved with redstone.
|
||||||
|
if(event.getBlock().getBlockData() instanceof AnaloguePowerable || event.getBlock().getBlockData() instanceof Powerable || redstoneBlocks.contains(event.getBlock().getType()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onPlayerRespawn(PlayerRespawnEvent event)
|
||||||
|
{
|
||||||
|
double maxHealth = event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue();
|
||||||
|
if (maxHealth < 1)
|
||||||
|
{
|
||||||
|
for (AttributeModifier attributeModifier : event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getModifiers())
|
||||||
|
{
|
||||||
|
event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).removeModifier(attributeModifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onBlockDispense(BlockDispenseEvent event)
|
||||||
|
{
|
||||||
|
List<Material> banned = Arrays.asList(Material.TNT_MINECART, Material.MINECART);
|
||||||
|
if (Groups.SPAWN_EGGS.contains(event.getItem().getType()) || banned.contains(event.getItem().getType()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onPlayerDeath(PlayerDeathEvent event)
|
||||||
|
{
|
||||||
|
FUtil.fixCommandVoid(event.getEntity());
|
||||||
|
event.setDeathMessage(event.getDeathMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,32 +1,26 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking;
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.player.PlayerBedEnterEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class InteractBlocker extends FreedomService
|
public class InteractBlocker extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public InteractBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,15 +45,52 @@ public class InteractBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
public void onRightClickBell(PlayerInteractEvent event)
|
||||||
|
{
|
||||||
|
if (event.getClickedBlock() != null && event.getClickedBlock().getType().equals(Material.BELL) && !ConfigEntry.ALLOW_BELLS.getBoolean())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBedEnter(PlayerBedEnterEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (Groups.EXPLOSIVE_BED_BIOMES.contains(event.getBed().getBiome()))
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + "You may not sleep here.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void handleRightClick(PlayerInteractEvent event)
|
private void handleRightClick(PlayerInteractEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
|
||||||
|
if (event.getClickedBlock() != null)
|
||||||
|
{
|
||||||
|
if (event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK) || event.getClickedBlock().getType().equals(Material.JIGSAW) || event.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
event.getPlayer().closeInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Groups.SPAWN_EGGS.contains(event.getMaterial()))
|
||||||
|
{
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Spawn eggs are currently disabled.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (event.getMaterial())
|
switch (event.getMaterial())
|
||||||
{
|
{
|
||||||
case WATER_BUCKET:
|
case WATER_BUCKET:
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
if (plugin.sl.isStaff(player) || ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -72,7 +103,7 @@ public class InteractBlocker extends FreedomService
|
|||||||
|
|
||||||
case LAVA_BUCKET:
|
case LAVA_BUCKET:
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
if (plugin.sl.isStaff(player) || ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -83,7 +114,7 @@ public class InteractBlocker extends FreedomService
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case EXPLOSIVE_MINECART:
|
case TNT_MINECART:
|
||||||
{
|
{
|
||||||
if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
|
if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
|
||||||
{
|
{
|
||||||
@ -95,12 +126,36 @@ public class InteractBlocker extends FreedomService
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SIGN:
|
case ARMOR_STAND:
|
||||||
case SIGN_POST:
|
|
||||||
case WALL_SIGN:
|
|
||||||
{
|
{
|
||||||
player.sendMessage(ChatColor.GRAY + "Sign interaction is currently disabled.");
|
if (ConfigEntry.ALLOW_ARMOR_STANDS.getBoolean())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Armor stands are currently disabled.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MINECART:
|
||||||
|
{
|
||||||
|
if (ConfigEntry.ALLOW_MINECARTS.getBoolean())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Minecarts are currently disabled.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WRITTEN_BOOK:
|
||||||
|
{
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Books are currently disabled.");
|
||||||
|
event.setCancelled(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,58 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking;
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import org.bukkit.attribute.Attributable;
|
||||||
|
import org.bukkit.attribute.Attribute;
|
||||||
import org.bukkit.entity.Bat;
|
import org.bukkit.entity.Bat;
|
||||||
import org.bukkit.entity.EnderDragon;
|
import org.bukkit.entity.EnderDragon;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Ghast;
|
import org.bukkit.entity.Ghast;
|
||||||
import org.bukkit.entity.Giant;
|
import org.bukkit.entity.Giant;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Slime;
|
import org.bukkit.entity.Slime;
|
||||||
|
import org.bukkit.entity.Wither;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||||
|
|
||||||
public class MobBlocker extends FreedomService
|
public class MobBlocker extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public MobBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fixes crash mobs, credit to Mafrans
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onEntitySpawn(EntitySpawnEvent e)
|
||||||
|
{
|
||||||
|
if (!(e instanceof LivingEntity))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
if (entity instanceof Attributable)
|
||||||
|
{
|
||||||
|
if (((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getBaseValue() > 255.0)
|
||||||
|
{
|
||||||
|
((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(255.0);
|
||||||
|
}
|
||||||
|
if (((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getBaseValue() > 10.0)
|
||||||
|
{
|
||||||
|
((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(10.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onCreatureSpawn(CreatureSpawnEvent event)
|
public void onCreatureSpawn(CreatureSpawnEvent event)
|
||||||
{
|
{
|
||||||
@ -41,6 +62,7 @@ public class MobBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
final Entity spawned = event.getEntity();
|
final Entity spawned = event.getEntity();
|
||||||
|
|
||||||
if (spawned instanceof EnderDragon)
|
if (spawned instanceof EnderDragon)
|
||||||
{
|
{
|
||||||
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
|
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
|
||||||
@ -65,6 +87,14 @@ public class MobBlocker extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (spawned instanceof Wither)
|
||||||
|
{
|
||||||
|
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (spawned instanceof Giant)
|
else if (spawned instanceof Giant)
|
||||||
{
|
{
|
||||||
if (ConfigEntry.MOB_LIMITER_DISABLE_GIANT.getBoolean())
|
if (ConfigEntry.MOB_LIMITER_DISABLE_GIANT.getBoolean())
|
||||||
@ -89,7 +119,7 @@ public class MobBlocker extends FreedomService
|
|||||||
int mobcount = 0;
|
int mobcount = 0;
|
||||||
for (Entity entity : event.getLocation().getWorld().getLivingEntities())
|
for (Entity entity : event.getLocation().getWorld().getLivingEntities())
|
||||||
{
|
{
|
||||||
if (!(entity instanceof HumanEntity))
|
if (!(entity instanceof HumanEntity) && entity instanceof LivingEntity)
|
||||||
{
|
{
|
||||||
mobcount++;
|
mobcount++;
|
||||||
}
|
}
|
||||||
@ -100,5 +130,4 @@ public class MobBlocker extends FreedomService
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.entity.Arrow;
|
||||||
|
import org.bukkit.entity.FishHook;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.SpectralArrow;
|
||||||
|
import org.bukkit.entity.Trident;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
public class PVPBlocker extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
public void onEntityDamageByEntity(EntityDamageByEntityEvent event)
|
||||||
|
{
|
||||||
|
Player player = null;
|
||||||
|
Player target = null;
|
||||||
|
if (event.getEntity() instanceof Player)
|
||||||
|
{
|
||||||
|
target = (Player)event.getEntity();
|
||||||
|
if (event.getDamager() instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)event.getDamager();
|
||||||
|
}
|
||||||
|
else if (event.getDamager() instanceof Arrow)
|
||||||
|
{
|
||||||
|
Arrow arrow = (Arrow)event.getDamager();
|
||||||
|
if (arrow.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)arrow.getShooter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event.getDamager() instanceof SpectralArrow)
|
||||||
|
{
|
||||||
|
SpectralArrow spectralArrow = (SpectralArrow)event.getDamager();
|
||||||
|
if (spectralArrow.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)spectralArrow.getShooter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event.getDamager() instanceof Trident)
|
||||||
|
{
|
||||||
|
Trident trident = (Trident)event.getDamager();
|
||||||
|
if (trident.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)trident.getShooter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event.getDamager() instanceof FishHook)
|
||||||
|
{
|
||||||
|
FishHook fishhook = (FishHook)event.getDamager();
|
||||||
|
if (fishhook.getShooter() instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)fishhook.getShooter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player != null & !plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE)
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + "Creative PvP is not allowed!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
else if (plugin.esb.getEssentialsUser(player.getName()).isGodModeEnabled())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + "God mode PvP is not allowed!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
else if (plugin.pl.getPlayer(target).isPvpBlocked())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + target.getName() + " has PvP disabled!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
else if (plugin.pl.getPlayer(player).isPvpBlocked())
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + "You have PvP disabled!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,16 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking;
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.ThrownPotion;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.entity.LingeringPotionSplashEvent;
|
||||||
import org.bukkit.event.entity.PotionSplashEvent;
|
import org.bukkit.event.entity.PotionSplashEvent;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
import org.bukkit.projectiles.ProjectileSource;
|
import org.bukkit.projectiles.ProjectileSource;
|
||||||
|
|
||||||
public class PotionBlocker extends FreedomService
|
public class PotionBlocker extends FreedomService
|
||||||
@ -14,49 +18,69 @@ public class PotionBlocker extends FreedomService
|
|||||||
|
|
||||||
public static final int POTION_BLOCK_RADIUS_SQUARED = 20 * 20;
|
public static final int POTION_BLOCK_RADIUS_SQUARED = 20 * 20;
|
||||||
|
|
||||||
public PotionBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||||
public void onThrowPotion(PotionSplashEvent event)
|
public void onThrowPotion(PotionSplashEvent event)
|
||||||
{
|
{
|
||||||
ProjectileSource source = event.getEntity().getShooter();
|
ThrownPotion potion = event.getEntity();
|
||||||
|
ProjectileSource projectileSource = potion.getShooter();
|
||||||
if (!(source instanceof Player))
|
Player player = null;
|
||||||
|
if (projectileSource instanceof Player)
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
player = (Player)projectileSource;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Player thrower = (Player) source;
|
if (isDeathPotion(potion.getEffects()))
|
||||||
|
|
||||||
if (plugin.al.isAdmin(thrower))
|
|
||||||
{
|
{
|
||||||
return;
|
if (player != null)
|
||||||
}
|
|
||||||
|
|
||||||
for (Player player : thrower.getWorld().getPlayers())
|
|
||||||
{
|
|
||||||
if (thrower.getLocation().distanceSquared(player.getLocation()) < POTION_BLOCK_RADIUS_SQUARED)
|
|
||||||
{
|
{
|
||||||
thrower.sendMessage(ChatColor.RED + "You cannot use splash potions close to other players.");
|
player.sendMessage(ChatColor.RED + "You are not allowed to use death potions.");
|
||||||
event.setCancelled(true);
|
}
|
||||||
return;
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||||
|
public void onThrowLingeringPotion(LingeringPotionSplashEvent event)
|
||||||
|
{
|
||||||
|
ThrownPotion potion = event.getEntity();
|
||||||
|
ProjectileSource projectileSource = potion.getShooter();
|
||||||
|
Player player = null;
|
||||||
|
if (projectileSource instanceof Player)
|
||||||
|
{
|
||||||
|
player = (Player)projectileSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDeathPotion(potion.getEffects()))
|
||||||
|
{
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.RED + "You are not allowed to use death potions.");
|
||||||
|
}
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDeathPotion(Collection<PotionEffect> effects)
|
||||||
|
{
|
||||||
|
for (PotionEffect effect : effects)
|
||||||
|
{
|
||||||
|
int amplifier = effect.getAmplifier();
|
||||||
|
if (effect.getType().equals(PotionEffectType.HEAL) && (amplifier == 29 || amplifier == 61 || amplifier == 93 || amplifier == 125))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import net.minecraft.server.v1_16_R2.NBTTagCompound;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Tag;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
//codebeat:disable[LOC,ABC]
|
||||||
|
|
||||||
|
public class SignBlocker extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onPlayerPlaceBlock(BlockPlaceEvent event)
|
||||||
|
{
|
||||||
|
|
||||||
|
final Player player = event.getPlayer();
|
||||||
|
if (Tag.SIGNS.getValues().contains(event.getBlock().getType()))
|
||||||
|
{
|
||||||
|
ItemStack sign = event.getItemInHand();
|
||||||
|
net.minecraft.server.v1_16_R2.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
|
||||||
|
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
|
||||||
|
NBTTagCompound bet = compound.getCompound("BlockEntityTag");
|
||||||
|
String line1 = bet.getString("Text1");
|
||||||
|
String line2 = bet.getString("Text2");
|
||||||
|
String line3 = bet.getString("Text3");
|
||||||
|
String line4 = bet.getString("Text4");
|
||||||
|
if (line1.contains("run_command") || line2.contains("run_command") || line3.contains("run_command") || line4.contains("run_command"))
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "You are not allowed to place command signs.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void onPlayerInteractSign(PlayerInteractEvent event)
|
||||||
|
{
|
||||||
|
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getClickedBlock() != null && Tag.SIGNS.getValues().contains(event.getClickedBlock().getType()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,23 +2,25 @@ package me.totalfreedom.totalfreedommod.blocking.command;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.pravian.aero.command.CommandReflection;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandMap;
|
import org.bukkit.command.CommandMap;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.SimpleCommandMap;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.plugin.SimplePluginManager;
|
||||||
|
|
||||||
public class CommandBlocker extends FreedomService
|
public class CommandBlocker extends FreedomService
|
||||||
{
|
{
|
||||||
@ -28,37 +30,46 @@ public class CommandBlocker extends FreedomService
|
|||||||
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
|
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
|
||||||
private final List<String> unknownCommands = Lists.newArrayList();
|
private final List<String> unknownCommands = Lists.newArrayList();
|
||||||
|
|
||||||
public CommandBlocker(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
entryList.clear();
|
entryList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static CommandMap getCommandMap()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SimplePluginManager simplePluginManager = (SimplePluginManager) Bukkit.getServer().getPluginManager();
|
||||||
|
|
||||||
|
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
|
||||||
|
commandMapField.setAccessible(true);
|
||||||
|
|
||||||
|
SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(simplePluginManager);
|
||||||
|
return simpleCommandMap;
|
||||||
|
}
|
||||||
|
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
|
||||||
|
{
|
||||||
|
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void load()
|
public void load()
|
||||||
{
|
{
|
||||||
entryList.clear();
|
entryList.clear();
|
||||||
unknownCommands.clear();
|
unknownCommands.clear();
|
||||||
|
|
||||||
final CommandMap commandMap = CommandReflection.getCommandMap();
|
final CommandMap commandMap = getCommandMap();
|
||||||
if (commandMap == null)
|
|
||||||
{
|
|
||||||
FLog.severe("Error loading commandMap.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<String> blockedCommands = (List<String>) ConfigEntry.BLOCKED_COMMANDS.getList();
|
List<String> blockedCommands = (List<String>)ConfigEntry.BLOCKED_COMMANDS.getList();
|
||||||
for (String rawEntry : blockedCommands)
|
for (String rawEntry : blockedCommands)
|
||||||
{
|
{
|
||||||
final String[] parts = rawEntry.split(":");
|
final String[] parts = rawEntry.split(":");
|
||||||
@ -105,9 +116,9 @@ public class CommandBlocker extends FreedomService
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final CommandBlockerEntry blockedCommandEntry = new CommandBlockerEntry(rank, action, commandName, subCommand, message);
|
|
||||||
entryList.put(blockedCommandEntry.getCommand(), blockedCommandEntry);
|
|
||||||
|
|
||||||
|
final CommandBlockerEntry blockedCommandEntry = new CommandBlockerEntry(rank, action, commandName, subCommand, message);
|
||||||
|
entryList.put(commandName, blockedCommandEntry);
|
||||||
if (command != null)
|
if (command != null)
|
||||||
{
|
{
|
||||||
for (String alias : command.getAliases())
|
for (String alias : command.getAliases())
|
||||||
@ -160,6 +171,11 @@ public class CommandBlocker extends FreedomService
|
|||||||
|
|
||||||
for (String part : commandParts)
|
for (String part : commandParts)
|
||||||
{
|
{
|
||||||
|
if (command.startsWith("/") && !plugin.sl.isStaff(sender) && (part.contains("#copy") || part.contains("#clipboard")))
|
||||||
|
{
|
||||||
|
FUtil.playerMsg(sender, "WorldEdit copy variables are disabled.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
Matcher matcher = flagPattern.matcher(part);
|
Matcher matcher = flagPattern.matcher(part);
|
||||||
if (!matcher.matches())
|
if (!matcher.matches())
|
||||||
{
|
{
|
||||||
@ -207,4 +223,4 @@ public class CommandBlocker extends FreedomService
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,6 +6,7 @@ import me.totalfreedom.totalfreedommod.util.FUtil;
|
|||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.spigotmc.SpigotConfig;
|
||||||
|
|
||||||
public class CommandBlockerEntry
|
public class CommandBlockerEntry
|
||||||
{
|
{
|
||||||
@ -31,25 +32,23 @@ public class CommandBlockerEntry
|
|||||||
this.rank = rank;
|
this.rank = rank;
|
||||||
this.action = action;
|
this.action = action;
|
||||||
this.command = command;
|
this.command = command;
|
||||||
this.subCommand = (subCommand == null ? null : subCommand.toLowerCase().trim());
|
this.subCommand = ((subCommand == null) ? null : subCommand.toLowerCase().trim());
|
||||||
this.message = (message == null || message.equals("_") ? "That command is blocked." : message);
|
this.message = ((message == null || message.equals("_")) ? "That command is blocked." : message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doActions(CommandSender sender)
|
public void doActions(CommandSender sender)
|
||||||
{
|
{
|
||||||
if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player)
|
if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player)
|
||||||
{
|
{
|
||||||
TotalFreedomMod.plugin().ae.autoEject((Player) sender, "You used a prohibited command: " + command);
|
TotalFreedomMod.plugin().ae.autoEject((Player)sender, "You used a prohibited command: " + command);
|
||||||
FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
|
FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
||||||
{
|
{
|
||||||
FUtil.playerMsg(sender, "Unknown command. Type \"help\" for help.", ChatColor.RESET);
|
sender.sendMessage(SpigotConfig.unknownCommandMessage);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.playerMsg(sender, FUtil.colorize(message));
|
FUtil.playerMsg(sender, FUtil.colorize(message));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package me.totalfreedom.totalfreedommod.blocking.command;
|
package me.totalfreedom.totalfreedommod.blocking.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.StaffMember;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@ -40,10 +40,10 @@ public enum CommandBlockerRank
|
|||||||
return TELNET;
|
return TELNET;
|
||||||
}
|
}
|
||||||
|
|
||||||
Admin admin = TotalFreedomMod.plugin().al.getAdmin(sender);
|
StaffMember staffMember = TotalFreedomMod.plugin().sl.getAdmin(sender);
|
||||||
if (admin != null)
|
if (staffMember != null)
|
||||||
{
|
{
|
||||||
if (admin.getRank() == Rank.SENIOR_ADMIN)
|
if (staffMember.getRank() == Rank.ADMIN)
|
||||||
{
|
{
|
||||||
return SENIOR;
|
return SENIOR;
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,8 @@ import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent;
|
|||||||
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
|
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
|
||||||
import me.totalfreedom.bukkittelnet.session.ClientSession;
|
import me.totalfreedom.bukkittelnet.session.ClientSession;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.staff.StaffMember;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@ -24,18 +23,13 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
|
|
||||||
private BukkitTelnet bukkitTelnetPlugin = null;
|
private BukkitTelnet bukkitTelnetPlugin = null;
|
||||||
|
|
||||||
public BukkitTelnetBridge(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,15 +43,15 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
|
final StaffMember staffMember = plugin.sl.getEntryByIpFuzzy(ip);
|
||||||
|
|
||||||
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
if (staffMember == null || !staffMember.isActive() || !staffMember.getRank().hasConsoleVariant())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.setBypassPassword(true);
|
event.setBypassPassword(true);
|
||||||
event.setName(admin.getName());
|
event.setName(staffMember.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
@ -83,14 +77,14 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
boolean isTelnetAdmin = false;
|
boolean isTelnetAdmin = false;
|
||||||
boolean isSeniorAdmin = false;
|
boolean isSeniorAdmin = false;
|
||||||
|
|
||||||
final Admin admin = plugin.al.getAdmin(player);
|
final StaffMember staffMember = plugin.sl.getAdmin(player);
|
||||||
if (admin != null)
|
if (staffMember != null)
|
||||||
{
|
{
|
||||||
boolean active = admin.isActive();
|
boolean active = staffMember.isActive();
|
||||||
|
|
||||||
isAdmin = active;
|
isAdmin = active;
|
||||||
isSeniorAdmin = active && admin.getRank() == Rank.SENIOR_ADMIN;
|
isSeniorAdmin = active && staffMember.getRank() == Rank.ADMIN;
|
||||||
isTelnetAdmin = active && (isSeniorAdmin || admin.getRank() == Rank.TELNET_ADMIN);
|
isTelnetAdmin = active && (isSeniorAdmin || staffMember.getRank() == Rank.MOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
playerTags.put("tfm.admin.isAdmin", isAdmin);
|
playerTags.put("tfm.admin.isAdmin", isAdmin);
|
||||||
@ -114,7 +108,7 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
if (bukkitTelnet instanceof BukkitTelnet)
|
if (bukkitTelnet instanceof BukkitTelnet)
|
||||||
{
|
{
|
||||||
bukkitTelnetPlugin = (BukkitTelnet) bukkitTelnet;
|
bukkitTelnetPlugin = (BukkitTelnet)bukkitTelnet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,6 +121,24 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
return bukkitTelnetPlugin;
|
return bukkitTelnetPlugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<StaffMember> getConnectedAdmins()
|
||||||
|
{
|
||||||
|
List<StaffMember> staffMembers = new ArrayList<>();
|
||||||
|
final BukkitTelnet telnet = getBukkitTelnetPlugin();
|
||||||
|
if (telnet != null)
|
||||||
|
{
|
||||||
|
for (ClientSession session : telnet.appender.getSessions())
|
||||||
|
{
|
||||||
|
StaffMember staffMember = plugin.sl.getEntryByName(session.getUserName().toLowerCase());
|
||||||
|
if (staffMember != null && !staffMembers.contains(staffMember))
|
||||||
|
{
|
||||||
|
staffMembers.add(staffMember);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return staffMembers;
|
||||||
|
}
|
||||||
|
|
||||||
public void killTelnetSessions(final String name)
|
public void killTelnetSessions(final String name)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -0,0 +1,220 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import net.coreprotect.CoreProtect;
|
||||||
|
import net.coreprotect.CoreProtectAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
public class CoreProtectBridge extends FreedomService
|
||||||
|
{
|
||||||
|
private CoreProtectAPI coreProtectAPI = null;
|
||||||
|
|
||||||
|
private final List<String> tables = Arrays.asList("co_sign", "co_session", "co_container", "co_block");
|
||||||
|
|
||||||
|
private BukkitTask wiper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreProtect getCoreProtect()
|
||||||
|
{
|
||||||
|
CoreProtect coreProtect = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final Plugin coreProtectPlugin = Bukkit.getServer().getPluginManager().getPlugin("CoreProtect");
|
||||||
|
|
||||||
|
if (coreProtectPlugin != null && coreProtectPlugin instanceof CoreProtect)
|
||||||
|
{
|
||||||
|
coreProtect = (CoreProtect)coreProtectPlugin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
return coreProtect;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreProtectAPI getCoreProtectAPI()
|
||||||
|
{
|
||||||
|
if (coreProtectAPI == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final CoreProtect coreProtect = getCoreProtect();
|
||||||
|
|
||||||
|
coreProtectAPI = coreProtect.getAPI();
|
||||||
|
|
||||||
|
// Check if the plugin or api is not enabled, if so, return null
|
||||||
|
if (!coreProtect.isEnabled() || !coreProtectAPI.isEnabled())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return coreProtectAPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled()
|
||||||
|
{
|
||||||
|
final CoreProtect coreProtect = getCoreProtect();
|
||||||
|
|
||||||
|
return coreProtect != null && coreProtect.isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rollback the specified player's edits that were in the last 24 hours.
|
||||||
|
public void rollback(final String name)
|
||||||
|
{
|
||||||
|
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||||
|
|
||||||
|
if (!isEnabled())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
coreProtect.performRollback(86400, Arrays.asList(name), null, null, null, null, 0, null);
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reverts a rollback for the specified player's edits that were in the last 24 hours.
|
||||||
|
public void restore(final String name)
|
||||||
|
{
|
||||||
|
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||||
|
|
||||||
|
if (!isEnabled())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
coreProtect.performRestore(86400, Arrays.asList(name), null, null, null, null, 0, null);
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getDatabase()
|
||||||
|
{
|
||||||
|
if (!isEnabled())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new File(getCoreProtect().getDataFolder(), "database.db"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDBSize()
|
||||||
|
{
|
||||||
|
double bytes = getDatabase().length();
|
||||||
|
double kilobytes = (bytes / 1024);
|
||||||
|
double megabytes = (kilobytes / 1024);
|
||||||
|
return (megabytes / 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wipes DB for the specified world
|
||||||
|
public void clearDatabase(World world)
|
||||||
|
{
|
||||||
|
clearDatabase(world, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wipes DB for the specified world
|
||||||
|
public void clearDatabase(World world, Boolean shutdown)
|
||||||
|
{
|
||||||
|
if (!ConfigEntry.COREPROTECT_MYSQL_ENABLED.getBoolean())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final CoreProtect coreProtect = getCoreProtect();
|
||||||
|
|
||||||
|
if (coreProtect == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* As CoreProtect doesn't have an API method for deleting all of the data for a specific world
|
||||||
|
we have to do this manually via SQL */
|
||||||
|
Connection connection = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String host = ConfigEntry.COREPROTECT_MYSQL_HOST.getString();
|
||||||
|
String port = ConfigEntry.COREPROTECT_MYSQL_PORT.getString();
|
||||||
|
String username = ConfigEntry.COREPROTECT_MYSQL_USERNAME.getString();
|
||||||
|
String password = ConfigEntry.COREPROTECT_MYSQL_PASSWORD.getString();
|
||||||
|
String database = ConfigEntry.COREPROTECT_MYSQL_DATABASE.getString();
|
||||||
|
String url = host + ":" + port + "/" + database + "?user=" + username + "&password=" + password + "&useSSL=false";
|
||||||
|
connection = DriverManager.getConnection("jdbc:sql://" + url);
|
||||||
|
final Statement statement = connection.createStatement();
|
||||||
|
statement.setQueryTimeout(30);
|
||||||
|
|
||||||
|
// Obtain world ID from CoreProtect database
|
||||||
|
ResultSet resultSet = statement.executeQuery("SELECT id FROM co_world WHERE world = '" + world.getName() + "'");
|
||||||
|
String worldID = null;
|
||||||
|
while (resultSet.next())
|
||||||
|
{
|
||||||
|
worldID = String.valueOf(resultSet.getInt("id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the world ID is not null
|
||||||
|
|
||||||
|
if (worldID == null)
|
||||||
|
{
|
||||||
|
FLog.warning("Failed to obtain the world ID for the " + world.getName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through each table and delete their data if the world ID matches
|
||||||
|
for (String table : tables)
|
||||||
|
{
|
||||||
|
statement.executeQuery("DELETE FROM " + table + " WHERE wid = " + worldID);
|
||||||
|
}
|
||||||
|
|
||||||
|
connection.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (SQLException e)
|
||||||
|
{
|
||||||
|
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This exits for flatlands wipes
|
||||||
|
if (shutdown)
|
||||||
|
{
|
||||||
|
server.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,29 +3,35 @@ package me.totalfreedom.totalfreedommod.bridge;
|
|||||||
import com.earth2me.essentials.Essentials;
|
import com.earth2me.essentials.Essentials;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
public class EssentialsBridge extends FreedomService
|
public class EssentialsBridge extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
private Essentials essentialsPlugin = null;
|
private Essentials essentialsPlugin = null;
|
||||||
|
|
||||||
public EssentialsBridge(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,13 +41,10 @@ public class EssentialsBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Plugin essentials = Bukkit.getServer().getPluginManager().getPlugin("Essentials");
|
final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
|
||||||
if (essentials != null)
|
if (essentials != null && essentials instanceof Essentials)
|
||||||
{
|
{
|
||||||
if (essentials instanceof Essentials)
|
essentialsPlugin = (Essentials)essentials;
|
||||||
{
|
|
||||||
essentialsPlugin = (Essentials) essentials;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -56,7 +59,7 @@ public class EssentialsBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Essentials essentials = getEssentialsPlugin();
|
Essentials essentials = getEssentialsPlugin();
|
||||||
if (essentials != null)
|
if (essentials != null)
|
||||||
{
|
{
|
||||||
return essentials.getUserMap().getUser(username);
|
return essentials.getUserMap().getUser(username);
|
||||||
@ -73,7 +76,7 @@ public class EssentialsBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final User user = getEssentialsUser(username);
|
User user = getEssentialsUser(username);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
user.setNickname(nickname);
|
user.setNickname(nickname);
|
||||||
@ -90,7 +93,7 @@ public class EssentialsBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final User user = getEssentialsUser(username);
|
User user = getEssentialsUser(username);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
return user.getNickname();
|
return user.getNickname();
|
||||||
@ -107,10 +110,10 @@ public class EssentialsBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final User user = getEssentialsUser(username);
|
User user = getEssentialsUser(username);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
return FUtil.<Long>getField(user, "lastActivity"); // This is weird
|
return FUtil.getField(user, "lastActivity");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -120,20 +123,96 @@ public class EssentialsBridge extends FreedomService
|
|||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEssentialsEnabled()
|
public void setVanished(String username, boolean vanished)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Essentials essentials = getEssentialsPlugin();
|
User user = getEssentialsUser(username);
|
||||||
if (essentials != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
return essentials.isEnabled();
|
user.setVanished(vanished);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
FLog.severe(ex);
|
FLog.severe(ex);
|
||||||
}
|
}
|
||||||
return false;
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onInventoryClick(InventoryClickEvent event)
|
||||||
|
{
|
||||||
|
Player refreshPlayer = null;
|
||||||
|
Inventory inventory = event.getView().getTopInventory();
|
||||||
|
InventoryType inventoryType = inventory.getType();
|
||||||
|
Player player = (Player)event.getWhoClicked();
|
||||||
|
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee())
|
||||||
|
{
|
||||||
|
final InventoryHolder inventoryHolder = inventory.getHolder();
|
||||||
|
if (inventoryHolder != null && inventoryHolder instanceof HumanEntity)
|
||||||
|
{
|
||||||
|
Player invOwner = (Player)inventoryHolder;
|
||||||
|
Rank recieverRank = plugin.rm.getRank(player);
|
||||||
|
Rank playerRank = plugin.rm.getRank(invOwner);
|
||||||
|
if (playerRank.ordinal() >= recieverRank.ordinal() || !invOwner.isOnline())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
refreshPlayer = player;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (refreshPlayer != null)
|
||||||
|
{
|
||||||
|
final Player p = refreshPlayer;
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
p.updateInventory();
|
||||||
|
}
|
||||||
|
}.runTaskLater(plugin, 20L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onInventoryClose(InventoryCloseEvent event)
|
||||||
|
{
|
||||||
|
Player refreshPlayer = null;
|
||||||
|
Inventory inventory = event.getView().getTopInventory();
|
||||||
|
InventoryType inventoryType = inventory.getType();
|
||||||
|
Player player = (Player)event.getPlayer();
|
||||||
|
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee())
|
||||||
|
{
|
||||||
|
fPlayer.setInvSee(false);
|
||||||
|
refreshPlayer = player;
|
||||||
|
}
|
||||||
|
if (refreshPlayer != null)
|
||||||
|
{
|
||||||
|
final Player p = refreshPlayer;
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
p.updateInventory();
|
||||||
|
}
|
||||||
|
}.runTaskLater(plugin, 20L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled()
|
||||||
|
{
|
||||||
|
final Essentials ess = getEssentialsPlugin();
|
||||||
|
|
||||||
|
return ess != null && ess.isEnabled();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,185 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
|
import java.util.AbstractMap;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import net.coreprotect.CoreProtect;
|
||||||
|
import net.coreprotect.CoreProtectAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
public class FAWEBridge extends FreedomService
|
||||||
|
{
|
||||||
|
private CoreProtectAPI api;
|
||||||
|
private World world = null;
|
||||||
|
private final Map<Map.Entry<String, EditSession>, Map<BlockVector3, String>> blocksBroken = new HashMap<>();
|
||||||
|
private final Map<Map.Entry<String, EditSession>, Map.Entry<Pattern, List<BlockVector3>>> blocksPlaced = new HashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
api = ((CoreProtect)Bukkit.getPluginManager().getPlugin("CoreProtect")).getAPI();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterates over blocks placed by GenerationCommands (in the EditSession) and adds them to the CoreProtect logs.
|
||||||
|
*/
|
||||||
|
server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
if (!(blocksBroken.isEmpty() && blocksPlaced.isEmpty()))
|
||||||
|
{
|
||||||
|
// Send all broken blocks from the last ticks to the CoreProtect API.
|
||||||
|
Map.Entry<String, EditSession> playerAndSessionEntry = null;
|
||||||
|
for (Map.Entry<Map.Entry<String, EditSession>, Map<BlockVector3, String>> entry : blocksBroken.entrySet())
|
||||||
|
{
|
||||||
|
playerAndSessionEntry = entry.getKey();
|
||||||
|
Map<BlockVector3, String> dataAndVectorEntry = entry.getValue();
|
||||||
|
List<BlockVector3> blockVector3List = new ArrayList<>();
|
||||||
|
blockVector3List.addAll(dataAndVectorEntry.keySet()); // Deep clone the block vector to avoid a change later in the code.
|
||||||
|
|
||||||
|
for (BlockVector3 blockVector3 : blockVector3List)
|
||||||
|
{
|
||||||
|
if (blockVector3 != null)
|
||||||
|
{
|
||||||
|
EditSession editSession = playerAndSessionEntry.getValue();
|
||||||
|
World world = server.getWorld(editSession.getWorld().getName());
|
||||||
|
Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
|
||||||
|
BlockData blockData = server.createBlockData(dataAndVectorEntry.get(blockVector3));
|
||||||
|
api.logRemoval(playerAndSessionEntry.getKey(), location, blockData.getMaterial(), blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear after broken blocks have been updated.
|
||||||
|
blocksBroken.values().clear();
|
||||||
|
blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>());
|
||||||
|
|
||||||
|
// Send all blocks placed to the CoreProtect API (except from the air as it's only a broken block).
|
||||||
|
for (Map.Entry<Map.Entry<String, EditSession>, Map.Entry<Pattern, List<BlockVector3>>> entry : blocksPlaced.entrySet())
|
||||||
|
{
|
||||||
|
playerAndSessionEntry = entry.getKey();
|
||||||
|
Map.Entry<Pattern, List<BlockVector3>> patternAndListEntry = entry.getValue();
|
||||||
|
Pattern pattern = patternAndListEntry.getKey();
|
||||||
|
List<BlockVector3> blockVector3List = new ArrayList<>();
|
||||||
|
blockVector3List.addAll(patternAndListEntry.getValue()); // Deep clone the block vector to avoid a change later in the code.
|
||||||
|
|
||||||
|
for (BlockVector3 blockVector3 : blockVector3List)
|
||||||
|
{
|
||||||
|
if (blockVector3 != null && !pattern.apply(blockVector3).getBlockType().getMaterial().isAir())
|
||||||
|
{
|
||||||
|
World world = server.getWorld(playerAndSessionEntry.getValue().getWorld().getName());
|
||||||
|
Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
|
||||||
|
BaseBlock block = pattern.apply(blockVector3);
|
||||||
|
Material material = Material.getMaterial(block.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase());
|
||||||
|
api.logPlacement(playerAndSessionEntry.getKey(), location, material, material.createBlockData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
blocksPlaced.values().forEach(collection -> collection.getValue().clear());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0L, 40L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, BlockVector3 blockVector3)
|
||||||
|
{
|
||||||
|
// Cache the world used for the next iterations to come.
|
||||||
|
if (world == null || !world.getName().equals(editSession.getWorld().getName()))
|
||||||
|
{
|
||||||
|
world = server.getWorld(editSession.getWorld().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
Map.Entry<String, EditSession> playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession);
|
||||||
|
Block block = world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ());
|
||||||
|
|
||||||
|
// Add the broken block to CoreProtect if it's not air.
|
||||||
|
if (!block.getType().isAir())
|
||||||
|
{
|
||||||
|
String blockData = block.getBlockData().getAsString();
|
||||||
|
blockData = new Gson().fromJson(new Gson().toJson(blockData), blockData.getClass()); // Overwrite original with deep clones.
|
||||||
|
blockVector3 = new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass()); // Overwrite original with deep clones.
|
||||||
|
blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>());
|
||||||
|
blocksBroken.get(playerAndSessionEntry).put(blockVector3, blockData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the placed block to CoreProtect if it's not air.
|
||||||
|
if (!pattern.apply(blockVector3).getBlockType().getMaterial().isAir())
|
||||||
|
{
|
||||||
|
blocksPlaced.putIfAbsent(playerAndSessionEntry, new AbstractMap.SimpleEntry<>(pattern, new ArrayList<>()));
|
||||||
|
BlockVector3 vectorClone = new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass());
|
||||||
|
|
||||||
|
if (!blocksPlaced.get(playerAndSessionEntry).getValue().contains(vectorClone))
|
||||||
|
{
|
||||||
|
blocksPlaced.get(playerAndSessionEntry).getValue().add(vectorClone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logBlockEdits(String playerName, EditSession editSession, Region region, Pattern pattern)
|
||||||
|
{
|
||||||
|
// Add the broken blocks to CoreProtect.
|
||||||
|
if (world == null || !world.getName().equals(editSession.getWorld().getName()))
|
||||||
|
{
|
||||||
|
world = server.getWorld(editSession.getWorld().getName());
|
||||||
|
}
|
||||||
|
List<BlockState> blocks = new ArrayList<>();
|
||||||
|
|
||||||
|
for (BlockVector3 blockVector3 : region)
|
||||||
|
{
|
||||||
|
blocks.add(world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ()).getState());
|
||||||
|
}
|
||||||
|
|
||||||
|
logBlockEdit(playerName, editSession, pattern, blocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, List<BlockState> blocks)
|
||||||
|
{
|
||||||
|
Map.Entry<String, EditSession> playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession);
|
||||||
|
|
||||||
|
server.getScheduler().scheduleAsyncDelayedTask(plugin, () ->
|
||||||
|
{
|
||||||
|
for (BlockState block : blocks)
|
||||||
|
{
|
||||||
|
BlockVector3 blockVector3 = BlockVector3.at(block.getX(), block.getY(), block.getZ());
|
||||||
|
|
||||||
|
// Add the broken block to CoreProtect if it's not air.
|
||||||
|
if (!block.getType().isAir())
|
||||||
|
{
|
||||||
|
api.logRemoval(playerAndSessionEntry.getKey(), block.getLocation(), block.getType(), block.getBlockData());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the placed block to CoreProtect if it's not air.
|
||||||
|
BaseBlock baseBlock = pattern.apply(blockVector3);
|
||||||
|
if (!baseBlock.getBlockType().getMaterial().isAir())
|
||||||
|
{
|
||||||
|
Material material = Material.getMaterial(baseBlock.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase());
|
||||||
|
api.logPlacement(playerAndSessionEntry.getKey(), block.getLocation(), material, material.createBlockData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0L);
|
||||||
|
}
|
||||||
|
}
|
@ -1,35 +1,27 @@
|
|||||||
package me.totalfreedom.totalfreedommod.bridge;
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
//import me.libraryaddict.disguise.DisallowedDisguises;
|
import me.libraryaddict.disguise.BlockedDisguises;
|
||||||
//import me.libraryaddict.disguise.LibsDisguises;
|
import me.libraryaddict.disguise.DisguiseAPI;
|
||||||
//import me.libraryaddict.disguise.DisguiseAPI;
|
import me.libraryaddict.disguise.LibsDisguises;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
public class LibsDisguisesBridge extends FreedomService
|
public class LibsDisguisesBridge extends FreedomService
|
||||||
{
|
{
|
||||||
|
private LibsDisguises libsDisguisesPlugin = null;
|
||||||
// private LibsDisguises libsDisguisesPlugin = null;
|
|
||||||
|
|
||||||
public LibsDisguisesBridge(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
public LibsDisguises getLibsDisguisesPlugin()
|
public LibsDisguises getLibsDisguisesPlugin()
|
||||||
{
|
{
|
||||||
if (libsDisguisesPlugin == null)
|
if (libsDisguisesPlugin == null)
|
||||||
@ -41,7 +33,7 @@ public class LibsDisguisesBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
if (libsDisguises instanceof LibsDisguises)
|
if (libsDisguises instanceof LibsDisguises)
|
||||||
{
|
{
|
||||||
libsDisguisesPlugin = (LibsDisguises) libsDisguises;
|
libsDisguisesPlugin = (LibsDisguises)libsDisguises;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,24 +46,7 @@ public class LibsDisguisesBridge extends FreedomService
|
|||||||
return libsDisguisesPlugin;
|
return libsDisguisesPlugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean isDisguised(Player player)
|
public void undisguiseAll(boolean staff)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
|
||||||
if (libsDisguises != null)
|
|
||||||
{
|
|
||||||
return DisguiseAPI.isDisguised(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void undisguiseAll(boolean admins)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -86,7 +61,7 @@ public class LibsDisguisesBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
if (DisguiseAPI.isDisguised(player))
|
if (DisguiseAPI.isDisguised(player))
|
||||||
{
|
{
|
||||||
if (!admins && plugin.al.isAdmin(player))
|
if (!staff && plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -109,30 +84,18 @@ public class LibsDisguisesBridge extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state)
|
BlockedDisguises.disabled = !state;
|
||||||
{
|
|
||||||
DisguiseAPI.enableDisguises();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DisguiseAPI.disableDisguises();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDisguisesEnabled()
|
public boolean isDisguisesEnabled()
|
||||||
{
|
{
|
||||||
return !DisallowedDisguises.disabled;
|
return !BlockedDisguises.disabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPluginEnabled()
|
public boolean isEnabled()
|
||||||
{
|
{
|
||||||
Plugin ld = getLibsDisguisesPlugin();
|
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
||||||
|
|
||||||
if (ld == null)
|
return libsDisguises != null;
|
||||||
{
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ld.isEnabled();
|
|
||||||
}*/
|
|
||||||
}
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
|
import me.totalfreedom.tfguilds.Common;
|
||||||
|
import me.totalfreedom.tfguilds.TFGuilds;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class TFGuildsBridge extends FreedomService
|
||||||
|
{
|
||||||
|
|
||||||
|
public boolean enabled = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTFGuildsEnabled()
|
||||||
|
{
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final Plugin tfGuilds = server.getPluginManager().getPlugin("TFGuilds");
|
||||||
|
if (tfGuilds != null && tfGuilds.isEnabled())
|
||||||
|
{
|
||||||
|
if (tfGuilds instanceof TFGuilds)
|
||||||
|
{
|
||||||
|
enabled = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (NoClassDefFoundError ex)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean inGuildChat(Player player)
|
||||||
|
{
|
||||||
|
if (!isTFGuildsEnabled())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Common.IN_GUILD_CHAT.contains(player);
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,6 @@ import com.sk89q.worldedit.LocalSession;
|
|||||||
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
@ -12,26 +11,41 @@ import org.bukkit.plugin.Plugin;
|
|||||||
public class WorldEditBridge extends FreedomService
|
public class WorldEditBridge extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
private final WorldEditListener listener;
|
|
||||||
//
|
//
|
||||||
private WorldEditPlugin worldedit = null;
|
private WorldEditPlugin worldeditPlugin = null;
|
||||||
|
|
||||||
public WorldEditBridge(TotalFreedomMod plugin)
|
@Override
|
||||||
|
public void onStart()
|
||||||
{
|
{
|
||||||
super(plugin);
|
|
||||||
listener = new WorldEditListener(plugin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStop()
|
||||||
{
|
{
|
||||||
listener.register();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public WorldEditPlugin getWorldEditPlugin()
|
||||||
protected void onStop()
|
|
||||||
{
|
{
|
||||||
listener.unregister();
|
if (worldeditPlugin == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Plugin we = server.getPluginManager().getPlugin("WorldEdit");
|
||||||
|
if (we != null)
|
||||||
|
{
|
||||||
|
if (we instanceof WorldEditPlugin)
|
||||||
|
{
|
||||||
|
worldeditPlugin = (WorldEditPlugin)we;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return worldeditPlugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void undo(Player player, int count)
|
public void undo(Player player, int count)
|
||||||
@ -46,7 +60,8 @@ public class WorldEditBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
com.sk89q.worldedit.entity.Player fuckyou = (com.sk89q.worldedit.entity.Player)bukkitPlayer;
|
||||||
|
session.undo(session.getBlockBag(fuckyou), fuckyou);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,28 +72,28 @@ public class WorldEditBridge extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldEditPlugin getWorldEditPlugin()
|
public void redo(Player player, int count)
|
||||||
{
|
{
|
||||||
if (worldedit == null)
|
try
|
||||||
{
|
{
|
||||||
try
|
LocalSession session = getPlayerSession(player);
|
||||||
|
if (session != null)
|
||||||
{
|
{
|
||||||
Plugin we = server.getPluginManager().getPlugin("WorldEdit");
|
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||||
if (we != null)
|
if (bukkitPlayer != null)
|
||||||
{
|
{
|
||||||
if (we instanceof WorldEditPlugin)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
worldedit = (WorldEditPlugin) we;
|
com.sk89q.worldedit.entity.Player fuckyou = (com.sk89q.worldedit.entity.Player)bukkitPlayer;
|
||||||
|
session.redo(session.getBlockBag(fuckyou), fuckyou);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
FLog.severe(ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
return worldedit;
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLimit(Player player, int limit)
|
public void setLimit(Player player, int limit)
|
||||||
@ -98,6 +113,30 @@ public class WorldEditBridge extends FreedomService
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getDefaultLimit()
|
||||||
|
{
|
||||||
|
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||||
|
if (wep == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wep.getLocalConfiguration().defaultChangeLimit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxLimit()
|
||||||
|
{
|
||||||
|
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||||
|
if (wep == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wep.getLocalConfiguration().maxChangeLimit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private LocalSession getPlayerSession(Player player)
|
private LocalSession getPlayerSession(Player player)
|
||||||
{
|
{
|
||||||
final WorldEditPlugin wep = getWorldEditPlugin();
|
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.bridge;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
// These imports are not in the latest releases of WorldEdit, and the new versions of WorldEdit do not build properly. This will need to be reverted once the new WorldEdit builds are building properly.
|
|
||||||
//
|
|
||||||
//import me.totalfreedom.worldedit.LimitChangedEvent;
|
|
||||||
//import me.totalfreedom.worldedit.SelectionChangedEvent;
|
|
||||||
//
|
|
||||||
//The following two imports are a temporary measure as mentioned above.
|
|
||||||
//
|
|
||||||
import me.StevenLawson.worldedit.LimitChangedEvent;
|
|
||||||
import me.StevenLawson.worldedit.SelectionChangedEvent;
|
|
||||||
//
|
|
||||||
import net.pravian.aero.component.PluginListener;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
|
|
||||||
public class WorldEditListener extends PluginListener<TotalFreedomMod>
|
|
||||||
{
|
|
||||||
|
|
||||||
public WorldEditListener(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onSelectionChange(final SelectionChangedEvent event)
|
|
||||||
{
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
|
|
||||||
if (plugin.al.isAdmin(player))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.pa.isInProtectedArea(
|
|
||||||
event.getMinVector(),
|
|
||||||
event.getMaxVector(),
|
|
||||||
event.getWorld().getName()))
|
|
||||||
{
|
|
||||||
|
|
||||||
player.sendMessage(ChatColor.RED + "The region that you selected contained a protected area. Selection cleared.");
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onLimitChanged(LimitChangedEvent event)
|
|
||||||
{
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
|
|
||||||
if (plugin.al.isAdmin(player))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!event.getPlayer().equals(event.getTarget()))
|
|
||||||
{
|
|
||||||
player.sendMessage(ChatColor.RED + "Only admins can change the limit for other players!");
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.getLimit() < 0 || event.getLimit() > 10000)
|
|
||||||
{
|
|
||||||
player.setOp(false);
|
|
||||||
FUtil.bcastMsg(event.getPlayer().getName() + " tried to set their WorldEdit limit to " + event.getLimit() + " and has been de-opped", ChatColor.RED);
|
|
||||||
event.setCancelled(true);
|
|
||||||
player.sendMessage(ChatColor.RED + "You cannot set your limit higher than 10000 or to -1!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,55 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
|
import com.sk89q.worldguard.WorldGuard;
|
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||||
|
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class WorldGuardBridge extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
plugin.wr.protectWorld(plugin.wm.hubworld.getWorld());
|
||||||
|
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegionManager getRegionManager(World world)
|
||||||
|
{
|
||||||
|
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||||
|
return container.get(BukkitAdapter.adapt(world));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int wipeRegions(World world)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
RegionManager regionManager = getRegionManager(world);
|
||||||
|
if (regionManager != null)
|
||||||
|
{
|
||||||
|
Map<String, ProtectedRegion> regions = regionManager.getRegions();
|
||||||
|
for (ProtectedRegion region : regions.values())
|
||||||
|
{
|
||||||
|
regionManager.removeRegion(region.getId());
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled()
|
||||||
|
{
|
||||||
|
Plugin plugin = server.getPluginManager().getPlugin("WorldGuard");
|
||||||
|
|
||||||
|
return plugin != null && plugin.isEnabled();
|
||||||
|
}
|
||||||
|
}
|
@ -6,7 +6,6 @@ import lombok.Getter;
|
|||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.SkullType;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.Skull;
|
import org.bukkit.block.Skull;
|
||||||
|
|
||||||
@ -25,6 +24,8 @@ public class CageData
|
|||||||
private Material outerMaterial = Material.GLASS;
|
private Material outerMaterial = Material.GLASS;
|
||||||
@Getter
|
@Getter
|
||||||
private Material innerMaterial = Material.AIR;
|
private Material innerMaterial = Material.AIR;
|
||||||
|
@Getter
|
||||||
|
private static String input = null;
|
||||||
|
|
||||||
public CageData(FPlayer player)
|
public CageData(FPlayer player)
|
||||||
{
|
{
|
||||||
@ -57,6 +58,24 @@ public class CageData
|
|||||||
this.location = location;
|
this.location = location;
|
||||||
this.outerMaterial = outer;
|
this.outerMaterial = outer;
|
||||||
this.innerMaterial = inner;
|
this.innerMaterial = inner;
|
||||||
|
this.input = null;
|
||||||
|
|
||||||
|
buildHistory(location, 2, fPlayer);
|
||||||
|
regenerate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cage(Location location, Material outer, Material inner, String input)
|
||||||
|
{
|
||||||
|
if (isCaged())
|
||||||
|
{
|
||||||
|
setCaged(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.caged = true;
|
||||||
|
this.location = location;
|
||||||
|
this.outerMaterial = outer;
|
||||||
|
this.innerMaterial = inner;
|
||||||
|
this.input = input;
|
||||||
|
|
||||||
buildHistory(location, 2, fPlayer);
|
buildHistory(location, 2, fPlayer);
|
||||||
regenerate();
|
regenerate();
|
||||||
@ -85,7 +104,7 @@ public class CageData
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cage(fPlayer.getPlayer().getLocation(), outerMaterial, innerMaterial);
|
cage(fPlayer.getPlayer().getLocation(), outerMaterial, innerMaterial, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playerQuit()
|
public void playerQuit()
|
||||||
@ -165,7 +184,7 @@ public class CageData
|
|||||||
|
|
||||||
final Block block = center.getRelative(xOffset, yOffset, zOffset);
|
final Block block = center.getRelative(xOffset, yOffset, zOffset);
|
||||||
|
|
||||||
if (material != Material.SKULL)
|
if (material != Material.PLAYER_HEAD)
|
||||||
{
|
{
|
||||||
// Glowstone light
|
// Glowstone light
|
||||||
if (material != Material.GLASS && xOffset == 0 && yOffset == 2 && zOffset == 0)
|
if (material != Material.GLASS && xOffset == 0 && yOffset == 2 && zOffset == 0)
|
||||||
@ -176,7 +195,7 @@ public class CageData
|
|||||||
|
|
||||||
block.setType(material);
|
block.setType(material);
|
||||||
}
|
}
|
||||||
else // Darth mode
|
else
|
||||||
{
|
{
|
||||||
if (Math.abs(xOffset) == length && Math.abs(yOffset) == length && Math.abs(zOffset) == length)
|
if (Math.abs(xOffset) == length && Math.abs(yOffset) == length && Math.abs(zOffset) == length)
|
||||||
{
|
{
|
||||||
@ -184,11 +203,20 @@ public class CageData
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
block.setType(Material.SKULL);
|
block.setType(Material.PLAYER_HEAD);
|
||||||
final Skull skull = (Skull) block.getState();
|
if (input != null)
|
||||||
skull.setSkullType(SkullType.PLAYER);
|
{
|
||||||
skull.setOwner("Prozza");
|
try
|
||||||
skull.update();
|
{
|
||||||
|
Skull skull = (Skull)block.getState();
|
||||||
|
// This may or may not work in future versions of spigot
|
||||||
|
skull.setOwner(input);
|
||||||
|
skull.update();
|
||||||
|
}
|
||||||
|
catch (ClassCastException e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package me.totalfreedom.totalfreedommod.caging;
|
package me.totalfreedom.totalfreedommod.caging;
|
||||||
|
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -11,25 +11,19 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerKickEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.event.player.PlayerKickEvent;
|
|
||||||
|
|
||||||
public class Cager extends FreedomService
|
public class Cager extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
public Cager(TotalFreedomMod plugin)
|
|
||||||
{
|
|
||||||
super(plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +32,7 @@ public class Cager extends FreedomService
|
|||||||
{
|
{
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (player == null
|
if (player == null
|
||||||
|| plugin.al.isAdmin(player))
|
|| plugin.sl.isStaff(player))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -78,7 +72,7 @@ public class Cager extends FreedomService
|
|||||||
|
|
||||||
if (outOfCage)
|
if (outOfCage)
|
||||||
{
|
{
|
||||||
player.getPlayer().teleport(cageLoc.subtract(0, 0.1, 0));
|
PaperLib.teleportAsync(player.getPlayer(), cageLoc.subtract(0, 0.1, 0));
|
||||||
FUtil.playerMsg(player.getPlayer(), "You may not leave your cage.", ChatColor.RED);
|
FUtil.playerMsg(player.getPlayer(), "You may not leave your cage.", ChatColor.RED);
|
||||||
cage.regenerate();
|
cage.regenerate();
|
||||||
}
|
}
|
||||||
|
@ -10,4 +10,4 @@ public class CommandFailException extends RuntimeException
|
|||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,45 +1,78 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import net.pravian.aero.command.handler.SimpleCommandHandler;
|
import org.reflections.Reflections;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
|
|
||||||
public class CommandLoader extends FreedomService
|
public class CommandLoader extends FreedomService
|
||||||
{
|
{
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final SimpleCommandHandler<TotalFreedomMod> handler;
|
private final List<FreedomCommand> commands;
|
||||||
|
|
||||||
public CommandLoader(TotalFreedomMod plugin)
|
public CommandLoader()
|
||||||
{
|
{
|
||||||
super(plugin);
|
commands = new ArrayList<>();
|
||||||
|
|
||||||
handler = new SimpleCommandHandler<>(plugin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
handler.clearCommands();
|
|
||||||
handler.setExecutorFactory(new FreedomCommandExecutor.FreedomExecutorFactory(plugin));
|
|
||||||
handler.setCommandClassPrefix("Command_");
|
|
||||||
handler.setPermissionMessage(ChatColor.RED + "You do not have permission to use this command.");
|
|
||||||
handler.setOnlyConsoleMessage(ChatColor.RED + "This command can only be used from the console.");
|
|
||||||
handler.setOnlyPlayerMessage(ChatColor.RED + "This command can only be used by players.");
|
|
||||||
|
|
||||||
handler.loadFrom(FreedomCommand.class.getPackage());
|
|
||||||
handler.registerAll("TotalFreedomMod", true);
|
|
||||||
|
|
||||||
FLog.info("Loaded " + handler.getExecutors().size() + " commands.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
handler.clearCommands();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public void add(FreedomCommand command)
|
||||||
|
{
|
||||||
|
commands.add(command);
|
||||||
|
command.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FreedomCommand getByName(String name)
|
||||||
|
{
|
||||||
|
for (FreedomCommand command : commands)
|
||||||
|
{
|
||||||
|
if (name.equals(command.getName()))
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAlias(String alias)
|
||||||
|
{
|
||||||
|
for (FreedomCommand command : commands)
|
||||||
|
{
|
||||||
|
if (Arrays.asList(command.getAliases().split(",")).contains(alias))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadCommands()
|
||||||
|
{
|
||||||
|
Reflections commandDir = new Reflections("me.totalfreedom.totalfreedommod.command");
|
||||||
|
|
||||||
|
Set<Class<? extends FreedomCommand>> commandClasses = commandDir.getSubTypesOf(FreedomCommand.class);
|
||||||
|
|
||||||
|
for (Class<? extends FreedomCommand> commandClass : commandClasses)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
add(commandClass.newInstance());
|
||||||
|
}
|
||||||
|
catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex)
|
||||||
|
{
|
||||||
|
FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_" , ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FLog.info("Loaded " + commands.size() + " commands");
|
||||||
|
}
|
||||||
|
}
|
@ -12,4 +12,4 @@ public @interface CommandParameters
|
|||||||
String usage();
|
String usage();
|
||||||
|
|
||||||
String aliases() default ""; // "alias1,alias2,alias3" - no spaces
|
String aliases() default ""; // "alias1,alias2,alias3" - no spaces
|
||||||
}
|
}
|
@ -8,9 +8,11 @@ import me.totalfreedom.totalfreedommod.rank.Rank;
|
|||||||
public @interface CommandPermissions
|
public @interface CommandPermissions
|
||||||
{
|
{
|
||||||
|
|
||||||
Rank level();
|
Rank level() default Rank.NON_OP;
|
||||||
|
|
||||||
SourceType source();
|
SourceType source() default SourceType.BOTH;
|
||||||
|
|
||||||
boolean blockHostConsole() default false;
|
boolean blockHostConsole() default false;
|
||||||
}
|
|
||||||
|
int cooldown() default 0;
|
||||||
|
}
|
@ -1,41 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH)
|
|
||||||
@CommandParameters(
|
|
||||||
description = "AdminChat - Talk privately with other admins. Using <command> itself will toggle AdminChat on and off for all messages.",
|
|
||||||
usage = "/<command> [message...]",
|
|
||||||
aliases = "o,ac")
|
|
||||||
public class Command_adminchat extends FreedomCommand
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
|
||||||
{
|
|
||||||
if (args.length == 0)
|
|
||||||
{
|
|
||||||
if (senderIsConsole)
|
|
||||||
{
|
|
||||||
msg("Only in-game players can toggle AdminChat.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
FPlayer userinfo = plugin.pl.getPlayer(playerSender);
|
|
||||||
userinfo.setAdminChat(!userinfo.inAdminChat());
|
|
||||||
msg("Toggled Admin Chat " + (userinfo.inAdminChat() ? "on" : "off") + ".");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plugin.cm.adminChat(sender, StringUtils.join(args, " "));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
|
|
||||||
@CommandParameters(description = "Close server to non-superadmins.", usage = "/<command> [on | off]")
|
|
||||||
public class Command_adminmode extends FreedomCommand
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
|
||||||
{
|
|
||||||
if (args.length != 1)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[0].equalsIgnoreCase("off"))
|
|
||||||
{
|
|
||||||
ConfigEntry.ADMIN_ONLY_MODE.setBoolean(false);
|
|
||||||
FUtil.adminAction(sender.getName(), "Opening the server to all players.", true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (args[0].equalsIgnoreCase("on"))
|
|
||||||
{
|
|
||||||
ConfigEntry.ADMIN_ONLY_MODE.setBoolean(true);
|
|
||||||
FUtil.adminAction(sender.getName(), "Closing the server to non-superadmins.", true);
|
|
||||||
for (Player player : server.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (!isAdmin(player))
|
|
||||||
{
|
|
||||||
player.kickPlayer("Server is now closed to non-superadmins.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,8 +7,8 @@ import org.bukkit.command.Command;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Quickly change your own gamemode to adventure, or define someone's username to change theirs.", usage = "/<command> <-a | [partialname]>", aliases = "gma")
|
@CommandParameters(description = "Quickly change your own gamemode to adventure, define someone's username to change theirs, or change everyone's gamemode on the server.", usage = "/<command> <[partialname] | -a>", aliases = "gma")
|
||||||
public class Command_adventure extends FreedomCommand
|
public class Command_adventure extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -24,10 +24,12 @@ public class Command_adventure extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
playerSender.setGameMode(GameMode.ADVENTURE);
|
playerSender.setGameMode(GameMode.ADVENTURE);
|
||||||
msg("Gamemode set to adventure.");
|
msg("Your gamemode has been set to adventure.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkRank(Rank.TRIAL_MOD);
|
||||||
|
|
||||||
if (args[0].equals("-a"))
|
if (args[0].equals("-a"))
|
||||||
{
|
{
|
||||||
for (Player targetPlayer : server.getOnlinePlayers())
|
for (Player targetPlayer : server.getOnlinePlayers())
|
||||||
@ -35,7 +37,8 @@ public class Command_adventure extends FreedomCommand
|
|||||||
targetPlayer.setGameMode(GameMode.ADVENTURE);
|
targetPlayer.setGameMode(GameMode.ADVENTURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to adventure", false);
|
FUtil.staffAction(sender.getName(), "Changing everyone's gamemode to adventure", false);
|
||||||
|
msg("Your gamemode has been set to adventure.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,10 +50,9 @@ public class Command_adventure extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg("Setting " + player.getName() + " to game mode adventure");
|
msg("Setting " + player.getName() + " to game mode adventure.");
|
||||||
msg(player, sender.getName() + " set your game mode to adventure");
|
msg(player, sender.getName() + " set your game mode to adventure.");
|
||||||
player.setGameMode(GameMode.ADVENTURE);
|
player.setGameMode(GameMode.ADVENTURE);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.AreaEffectCloud;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Clears lingering potion area effect clouds.", usage = "/<command>", aliases = "aec")
|
||||||
|
public class Command_aeclear extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Removing all area effect clouds.", true);
|
||||||
|
int removed = 0;
|
||||||
|
for (World world : server.getWorlds())
|
||||||
|
{
|
||||||
|
for (Entity entity : world.getEntities())
|
||||||
|
{
|
||||||
|
if (entity instanceof AreaEffectCloud)
|
||||||
|
{
|
||||||
|
entity.remove();
|
||||||
|
removed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg(removed + " area effect clouds removed.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -1,18 +1,18 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.MOD, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Make an announcement", usage = "/<command> <message>")
|
@CommandParameters(description = "Make an announcement anonymously to operators.", usage = "/<command> <message>")
|
||||||
public class Command_announce extends FreedomCommand
|
public class Command_announce extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
{
|
{
|
||||||
if (args.length < 1)
|
if (args.length < 1)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.attribute.Attribute;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Lists all possible attributes.", usage = "/<command>")
|
||||||
|
public class Command_attributelist extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
String list = "All possible attributes: ";
|
||||||
|
|
||||||
|
for (Attribute attribute : Attribute.values())
|
||||||
|
{
|
||||||
|
list += attribute.name() + ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove extra comma at the end of the list
|
||||||
|
list = list.substring(0, list.length() - 2);
|
||||||
|
|
||||||
|
msg(list);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Toggle whether or not a player has their inventory automatically cleared when they join", usage = "/<command> <player>")
|
||||||
|
public class Command_autoclear extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean enabled = plugin.lp.CLEAR_ON_JOIN.contains(args[0]);
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
plugin.lp.CLEAR_ON_JOIN.remove(args[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plugin.lp.CLEAR_ON_JOIN.add(args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg(args[0] + " will " + (enabled ? "no longer" : "now") + " have their inventory cleared when they join.");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Toggle whether or not a player is automatically teleported when they join", usage = "/<command> <player>")
|
||||||
|
public class Command_autotp extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean enabled = plugin.lp.TELEPORT_ON_JOIN.contains(args[0]);
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
plugin.lp.TELEPORT_ON_JOIN.remove(args[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plugin.lp.TELEPORT_ON_JOIN.add(args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg(args[0] + " will " + (enabled ? "no longer" : "now") + " be automatically teleported when they join.");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,178 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH, blockHostConsole = true)
|
||||||
|
@CommandParameters(description = "Bans the specified player.", usage = "/<command> <username> [reason] [-nrb | -q]", aliases = "gtfo")
|
||||||
|
public class Command_ban extends FreedomCommand
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
Boolean silent = false;
|
||||||
|
Boolean cancelRollback = false;
|
||||||
|
if (args.length >= 2)
|
||||||
|
{
|
||||||
|
if (args[args.length - 1].equalsIgnoreCase("-nrb") || args[args.length - 1].equalsIgnoreCase("-q"))
|
||||||
|
{
|
||||||
|
if (args[args.length - 1].equalsIgnoreCase("-nrb"))
|
||||||
|
{
|
||||||
|
cancelRollback = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[args.length - 1].equalsIgnoreCase("-q"))
|
||||||
|
{
|
||||||
|
silent = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length >= 3)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String username;
|
||||||
|
final List<String> ips = new ArrayList<>();
|
||||||
|
|
||||||
|
final Player player = getPlayer(args[0]);
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||||
|
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
username = entry.getName();
|
||||||
|
ips.addAll(entry.getIps());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final PlayerData entry = plugin.pl.getData(player);
|
||||||
|
username = player.getName();
|
||||||
|
//ips.addAll(entry.getIps());/
|
||||||
|
ips.add(FUtil.getIp(player));
|
||||||
|
|
||||||
|
// Deop
|
||||||
|
player.setOp(false);
|
||||||
|
|
||||||
|
// Gamemode survival
|
||||||
|
player.setGameMode(GameMode.SURVIVAL);
|
||||||
|
|
||||||
|
// Clear inventory
|
||||||
|
player.getInventory().clear();
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
{
|
||||||
|
// Strike with lightning
|
||||||
|
final Location targetPos = player.getLocation();
|
||||||
|
for (int x = -1; x <= 1; x++)
|
||||||
|
{
|
||||||
|
for (int z = -1; z <= 1; z++)
|
||||||
|
{
|
||||||
|
final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z);
|
||||||
|
targetPos.getWorld().strikeLightning(strike_pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg("Banned " + player.getName() + " quietly.");
|
||||||
|
}
|
||||||
|
// Kill player
|
||||||
|
player.setHealth(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks if CoreProtect is loaded and installed, and skips the rollback and uses CoreProtect directly
|
||||||
|
if (!cancelRollback)
|
||||||
|
{
|
||||||
|
plugin.cpb.rollback(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player != null && !silent)
|
||||||
|
{
|
||||||
|
FUtil.bcastMsg(player.getName() + " has been a VERY naughty, naughty boy.", ChatColor.RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ban player
|
||||||
|
Ban ban;
|
||||||
|
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
ban = Ban.forPlayer(player, sender, null, reason);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ban = Ban.forPlayerName(username, sender, null, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
ban.addIp(ip);
|
||||||
|
ban.addIp(FUtil.getFuzzyIp(ip));
|
||||||
|
}
|
||||||
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
{
|
||||||
|
// Broadcast
|
||||||
|
final StringBuilder bcast = new StringBuilder()
|
||||||
|
.append("Banning: ")
|
||||||
|
.append(username);
|
||||||
|
if (reason != null)
|
||||||
|
{
|
||||||
|
bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason);
|
||||||
|
}
|
||||||
|
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", "));
|
||||||
|
FUtil.staffAction(sender.getName(), String.format(bcast.toString()), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kick player and handle others on IP
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
player.kickPlayer(ban.bakeKickMessage());
|
||||||
|
for (Player p : Bukkit.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (FUtil.getIp(p).equals(FUtil.getIp(player)))
|
||||||
|
{
|
||||||
|
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log ban
|
||||||
|
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH, blockHostConsole = true)
|
||||||
|
@CommandParameters(description = "Bans the specified ip.", usage = "/<command> <ip> [reason] [-q]")
|
||||||
|
public class Command_banip extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean silent = false;
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
|
||||||
|
String ip = args[0];
|
||||||
|
|
||||||
|
if (!FUtil.isValidIPv4(ip))
|
||||||
|
{
|
||||||
|
msg(ip + " is not a valid IP address", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.bm.getByIp(ip) != null)
|
||||||
|
{
|
||||||
|
msg("The IP " + ip + " is already banned", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[args.length - 1].equalsIgnoreCase("-q"))
|
||||||
|
{
|
||||||
|
silent = true;
|
||||||
|
|
||||||
|
if (args.length >= 2)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (args.length > 1)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ban player
|
||||||
|
Ban ban = Ban.forPlayerIp(ip, sender, null, reason);
|
||||||
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
|
// Kick player and handle others on IP
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (FUtil.getIp(player).equals(ip))
|
||||||
|
{
|
||||||
|
player.kickPlayer(ban.bakeKickMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
{
|
||||||
|
// Broadcast
|
||||||
|
FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip);
|
||||||
|
String message = ChatColor.RED + sender.getName() + " - Banned " + (plugin.sl.isStaff(player) ? "the IP " + ip : "an IP");
|
||||||
|
player.sendMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -2,13 +2,12 @@ package me.totalfreedom.totalfreedommod.command;
|
|||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Shows all banned player names. Superadmins may optionally use 'purge' to clear the list.", usage = "/<command> [purge]")
|
@CommandParameters(description = "Shows all banned player names. Admins may optionally use 'purge' to clear the list.", usage = "/<command> [purge]")
|
||||||
public class Command_banlist extends FreedomCommand
|
public class Command_banlist extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -19,23 +18,19 @@ public class Command_banlist extends FreedomCommand
|
|||||||
{
|
{
|
||||||
if (args[0].equalsIgnoreCase("purge"))
|
if (args[0].equalsIgnoreCase("purge"))
|
||||||
{
|
{
|
||||||
checkRank(Rank.SENIOR_ADMIN);
|
checkRank(Rank.ADMIN);
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Purging the ban list", true);
|
FUtil.staffAction(sender.getName(), "Purging the ban list", true);
|
||||||
int amount = plugin.bm.purge();
|
int amount = plugin.bm.purge();
|
||||||
sender.sendMessage(ChatColor.GRAY + "Purged " + amount + " player bans.");
|
msg("Purged " + amount + " player bans.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg(plugin.bm.getAllBans().size() + " player bans ("
|
msg(plugin.bm.getAllBans().size() + " player bans ("
|
||||||
+ plugin.bm.getUsernameBans().size() + " usernames, "
|
+ plugin.bm.getUsernameBans().size() + " usernames, "
|
||||||
+ plugin.bm.getIpBans().size() + " IPs)");
|
+ plugin.bm.getIpBans().size() + " IPs)");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH, blockHostConsole = true)
|
||||||
|
@CommandParameters(description = "Bans the specified name.", usage = "/<command> <name> [reason] [-q]")
|
||||||
|
public class Command_banname extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean silent = false;
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
|
||||||
|
String name = args[0];;
|
||||||
|
|
||||||
|
if (plugin.bm.getByUsername(name) != null)
|
||||||
|
{
|
||||||
|
msg("The name " + name + " is already banned", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[args.length - 1].equalsIgnoreCase("-q"))
|
||||||
|
{
|
||||||
|
silent = true;
|
||||||
|
|
||||||
|
if (args.length >= 2)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (args.length > 1)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ban player
|
||||||
|
Ban ban = Ban.forPlayerName(name, sender, null, reason);
|
||||||
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Banned the name " + name, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = getPlayer(name);
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
player.kickPlayer(ban.bakeKickMessage());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Spawns a random type of fish at your location.", usage = "/<command>")
|
||||||
|
public class Command_bird extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
Location location = playerSender.getTargetBlock(null, 15).getLocation().add(0, 1, 0);
|
||||||
|
playerSender.getWorld().spawnEntity(location, getRandomFish());
|
||||||
|
msg(":goodbird:");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityType getRandomFish()
|
||||||
|
{
|
||||||
|
List<EntityType> fishTypes = Arrays.asList(EntityType.COD, EntityType.SALMON, EntityType.PUFFERFISH, EntityType.TROPICAL_FISH);
|
||||||
|
Random random = new Random();
|
||||||
|
return fishTypes.get(random.nextInt(fishTypes.size()));
|
||||||
|
}
|
||||||
|
}
|
@ -8,8 +8,8 @@ import org.bukkit.command.Command;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Block all commands for a specific player.", usage = "/<command> <-a | purge | <player>>", aliases = "blockcommands,blockcommand,bc,bcmd")
|
@CommandParameters(description = "Block all commands for everyone on the server, or a specific player.", usage = "/<command> <-a | purge | <player>>", aliases = "blockcommands,blockcommand,bc,bcmd")
|
||||||
public class Command_blockcmd extends FreedomCommand
|
public class Command_blockcmd extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ public class Command_blockcmd extends FreedomCommand
|
|||||||
|
|
||||||
if (args[0].equals("purge"))
|
if (args[0].equals("purge"))
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Unblocking commands for all players", true);
|
FUtil.staffAction(sender.getName(), "Unblocking commands for all players", true);
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
@ -40,18 +40,18 @@ public class Command_blockcmd extends FreedomCommand
|
|||||||
|
|
||||||
if (args[0].equals("-a"))
|
if (args[0].equals("-a"))
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Blocking commands for all non-admins", true);
|
FUtil.staffAction(sender.getName(), "Blocking commands for all non-staff", true);
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (isAdmin(player))
|
if (isStaff(player))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
counter += 1;
|
counter += 1;
|
||||||
plugin.pl.getPlayer(player).setCommandsBlocked(true);
|
plugin.pl.getPlayer(player).setCommandsBlocked(true);
|
||||||
msg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
|
msg(player, "Your commands have been blocked by a staff member.", ChatColor.RED);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg("Blocked commands for " + counter + " players.");
|
msg("Blocked commands for " + counter + " players.");
|
||||||
@ -66,19 +66,23 @@ public class Command_blockcmd extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAdmin(player))
|
if (isStaff(player))
|
||||||
{
|
{
|
||||||
msg(player.getName() + " is a Superadmin, and cannot have their commands blocked.");
|
msg(player.getName() + " is a staff member, and cannot have their commands blocked.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||||
|
if (!playerdata.allCommandsBlocked())
|
||||||
playerdata.setCommandsBlocked(!playerdata.allCommandsBlocked());
|
{
|
||||||
|
playerdata.setCommandsBlocked(true);
|
||||||
FUtil.adminAction(sender.getName(), (playerdata.allCommandsBlocked() ? "B" : "Unb") + "locking all commands for " + player.getName(), true);
|
FUtil.staffAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
||||||
msg((playerdata.allCommandsBlocked() ? "B" : "Unb") + "locked all commands.");
|
msg("Blocked commands for " + player.getName() + ".");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg("That players commands are already blocked.", ChatColor.RED);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,134 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Restricts/unrestricts block modification abilities for everyone on the server or a certain player.", usage = "/<command> [[-s] <player> [reason] | list | purge | all]")
|
||||||
|
public class Command_blockedit extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, String[] args, final boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("list"))
|
||||||
|
{
|
||||||
|
msg("The following have block modification abilities restricted:");
|
||||||
|
int count = 0;
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
final FPlayer info = plugin.pl.getPlayer(player);
|
||||||
|
if (info.isEditBlocked())
|
||||||
|
{
|
||||||
|
msg("- " + player.getName());
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
msg("- none");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("purge"))
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Unblocking block modification abilities for all players.", true);
|
||||||
|
int count = 0;
|
||||||
|
for (final Player player : this.server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
final FPlayer info = plugin.pl.getPlayer(player);
|
||||||
|
if (info.isEditBlocked())
|
||||||
|
{
|
||||||
|
info.setEditBlocked(false);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg("Unblocked all block modification abilities for " + count + " players.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("all"))
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Blocking block modification abilities for all non-staff.", true);
|
||||||
|
int counter = 0;
|
||||||
|
for (final Player player : this.server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (!plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
final FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||||
|
playerdata.setEditBlocked(true);
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg("Blocked block modification abilities for " + counter + " players.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean smite = args[0].equals("-s");
|
||||||
|
if (smite)
|
||||||
|
{
|
||||||
|
args = (String[])ArrayUtils.subarray(args, 1, args.length);
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final Player player2 = getPlayer(args[0]);
|
||||||
|
if (player2 == null)
|
||||||
|
{
|
||||||
|
sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
if (args.length > 1)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(args, " ", 1, args.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
final FPlayer pd = plugin.pl.getPlayer(player2);
|
||||||
|
if (pd.isEditBlocked())
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Unblocking block modification abilities for " + player2.getName(), true);
|
||||||
|
pd.setEditBlocked(false);
|
||||||
|
msg("Unblocking block modification abilities for " + player2.getName());
|
||||||
|
msg(player2, "Your block modification abilities have been restored.", ChatColor.RED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (plugin.sl.isStaff(player2))
|
||||||
|
{
|
||||||
|
msg(player2.getName() + " is a staff member, and cannot have their block edits blocked.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FUtil.staffAction(sender.getName(), "Blocking block modification abilities for " + player2.getName(), true);
|
||||||
|
pd.setEditBlocked(true);
|
||||||
|
|
||||||
|
if (smite)
|
||||||
|
{
|
||||||
|
Command_smite.smite(sender, player2, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED);
|
||||||
|
msg("Blocked all block modification abilities for " + player2.getName());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,134 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.TRIAL_MOD, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Toggle PVP mode for everyone or a certain player.", usage = "/<command> [[-s] <player> [reason] | list | purge | all]", aliases = "pvpblock,pvpmode")
|
||||||
|
public class Command_blockpvp extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, String[] args, final boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("list"))
|
||||||
|
{
|
||||||
|
msg("PVP is blocked for players:");
|
||||||
|
int count = 0;
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
final FPlayer info = plugin.pl.getPlayer(player);
|
||||||
|
if (info.isPvpBlocked())
|
||||||
|
{
|
||||||
|
msg(" - " + player.getName());
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
msg(" - none");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("purge"))
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Enabling PVP for all players.", true);
|
||||||
|
int count = 0;
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
final FPlayer info = plugin.pl.getPlayer(player);
|
||||||
|
if (info.isPvpBlocked())
|
||||||
|
{
|
||||||
|
info.setPvpBlocked(false);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg("Enabled PVP for " + count + " players.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equals("all"))
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Disabling PVP for all non-staff", true);
|
||||||
|
int counter = 0;
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (!plugin.sl.isStaff(player))
|
||||||
|
{
|
||||||
|
final FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||||
|
playerdata.setPvpBlocked(true);
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg("Disabling PVP for " + counter + " players.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean smite = args[0].equals("-s");
|
||||||
|
if (smite)
|
||||||
|
{
|
||||||
|
args = ArrayUtils.subarray(args, 1, args.length);
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final Player p = getPlayer(args[0]);
|
||||||
|
if (p == null)
|
||||||
|
{
|
||||||
|
sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
if (args.length > 1)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(args, " ", 1, args.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
final FPlayer pd = plugin.pl.getPlayer(p);
|
||||||
|
if (pd.isPvpBlocked())
|
||||||
|
{
|
||||||
|
FUtil.staffAction(sender.getName(), "Enabling PVP for " + p.getName(), true);
|
||||||
|
pd.setPvpBlocked(false);
|
||||||
|
msg("Enabling PVP for " + p.getName());
|
||||||
|
msg(p, "Your PVP have been enabled.", ChatColor.GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (plugin.sl.isStaff(p))
|
||||||
|
{
|
||||||
|
msg(p.getName() + " is a staff member, and cannot have their PVP disabled.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FUtil.staffAction(sender.getName(), "Disabling PVP for " + p.getName(), true);
|
||||||
|
pd.setPvpBlocked(true);
|
||||||
|
if (smite)
|
||||||
|
{
|
||||||
|
Command_smite.smite(sender, p, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg(p, "Your PVP has been disabled.", ChatColor.RED);
|
||||||
|
msg("Disabled PVP for " + p.getName());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user