mirror of
https://github.com/TotalFreedomMC/TotalFreedomMod.git
synced 2024-06-05 03:04:59 +00:00
Compare commits
1549 commits
v4.2
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
30e38d44a9 | |||
ea418bb916 | |||
7d1705c79f | |||
2551d184ca | |||
f9eabf27d5 | |||
846154a723 | |||
804614d011 | |||
2c22c6c52d | |||
5ef0f29ffe | |||
11134f4109 | |||
e7992c7eb4 | |||
82e966dfb0 | |||
f457c4cde2 | |||
004a0f3d7c | |||
cf5199f28e | |||
43c68579e5 | |||
127ee7d9f9 | |||
c873fd4abc | |||
fa90e1d239 | |||
b711ed517f | |||
2618d97a3e | |||
1c4647290a | |||
f00f67a844 | |||
850f12103c | |||
7d71fc0a29 | |||
a33fd0d978 | |||
7fd77f3cbb | |||
2eb0ab4cb1 | |||
2612aaec31 | |||
6e7ad73152 | |||
af6411b82c | |||
e9ba958a4e | |||
8cff0124ea | |||
1162f10ebb | |||
35965b0b10 | |||
1253732f77 | |||
7ce173e02b | |||
aa20a6e579 | |||
e1bee32163 | |||
4d006ed172 | |||
a29392cab2 | |||
1ecfb0b066 | |||
706229004c | |||
a4adfa9bee | |||
225ade8753 | |||
bf2323bed2 | |||
8cbfde8bbc | |||
a42cb6aff9 | |||
5849947c6b | |||
01fdf766ee | |||
afe755f5c1 | |||
5f97e68e0e | |||
1b5bbd1c05 | |||
2ecfb88604 | |||
8356e831a5 | |||
ab00cb840f | |||
bb2ddf1129 | |||
bba5ec922b | |||
58c21bb1aa | |||
f190bbeac1 | |||
42143c1163 | |||
6453e4efca | |||
9155ac90b5 | |||
1e1367d08f | |||
3f690e2ca1 | |||
abfa3b977c | |||
a395197305 | |||
b5b71f8bb2 | |||
c592b1f141 | |||
f0ba148b81 | |||
a8826c22cc | |||
17629f9366 | |||
725375a597 | |||
30fb1ebbd5 | |||
78e85787e6 | |||
2636f2c768 | |||
68adaed997 | |||
ecce62f6b4 | |||
22278822fe | |||
12cf195e55 | |||
cf9fdc6fe4 | |||
a728ec24d4 | |||
74a71b1843 | |||
4d469cdc0a | |||
4c287ca9b8 | |||
912bc1a1e4 | |||
a598c933ec | |||
936f0b621e | |||
1906933ec8 | |||
d94011ce38 | |||
fe9ade1217 | |||
6e3dd60b99 | |||
5a3f0a4de1 | |||
387ea6f71e | |||
b376a8c8e7 | |||
761d07b869 | |||
2e6b990e33 | |||
a1f1e4ccc0 | |||
e9839b714f | |||
13480eeb63 | |||
f294eaf10a | |||
8efe844640 | |||
0df93530f1 | |||
f9dfce8368 | |||
e336df27c6 | |||
88bdeeaf9f | |||
b61693b2ab | |||
afef76efd7 | |||
9fe3227f1a | |||
512130ec52 | |||
5bd7d6fdb4 | |||
f4fe50fca0 | |||
f37dce7da6 | |||
8c914ce3d1 | |||
cfd197b14d | |||
8486fa331d | |||
eaa26f9832 | |||
e122c4c5fa | |||
180cd81132 | |||
d814853036 | |||
a1ecf88109 | |||
5a6a5ff75d | |||
fdba119d5d | |||
087b8dd7ea | |||
213a43380e | |||
8a31b4c5c0 | |||
3818aab454 | |||
61857dd06f | |||
bd647afe92 | |||
0e12f5e792 | |||
69f17ef2d7 | |||
aebe1acec2 | |||
938b3aa630 | |||
6772333eb4 | |||
0204961834 | |||
2f332a8c42 | |||
e288668c92 | |||
caeda219fa | |||
e50101df43 | |||
ee1b27fa0d | |||
6ca61d9c6c | |||
2d18d461fe | |||
47e6386907 | |||
0a9b95bfce | |||
fedf80b834 | |||
2bdf14f38c | |||
b1062fbb6c | |||
f00f075551 | |||
44ff621d73 | |||
032e54e2d4 | |||
3ca9835257 | |||
f69feed469 | |||
8253f94ac4 | |||
54cb0cfac4 | |||
a4c81f202c | |||
da82b27016 | |||
daf0126f45 | |||
f6d46b6178 | |||
a2d11d4b93 | |||
23caa4e853 | |||
a51f5c9bbf | |||
ee804d52ff | |||
dc490659c1 | |||
0d09c3a550 | |||
4c3f188bb8 | |||
e2ccd14eb3 | |||
af1df22812 | |||
f380898bb7 | |||
464ed85f1b | |||
7dd235b166 | |||
1474a80875 | |||
f45466ee24 | |||
d70b7bbec2 | |||
541c66c3de | |||
77fd4ff66a | |||
d901cbaa81 | |||
538ed7020d | |||
18e6ef16be | |||
a335a2acf7 | |||
2eb6cc0036 | |||
5322d8ab64 | |||
dccc315869 | |||
7657ae1928 | |||
dcaf1ec11a | |||
33aca2a482 | |||
0582c2e5be | |||
159eda73a1 | |||
101987cc17 | |||
6874b2ce13 | |||
3be0ffba4e | |||
da2d25252b | |||
c8a4382a7b | |||
3f89f3f48e | |||
871acc2eeb | |||
a9c9979b1c | |||
fc3fe871b3 | |||
e99aaa2eb4 | |||
62529a6171 | |||
0caf972248 | |||
a37364d07e | |||
4ac9844534 | |||
939e98b759 | |||
d99f3e657b | |||
92bbb62379 | |||
fc37633dfd | |||
32ade2dece | |||
92394a5b30 | |||
f82089db64 | |||
4afb31cb62 | |||
ab584a5693 | |||
b5137763b5 | |||
01119422fb | |||
ccdbea2ffa | |||
9d1fa20e55 | |||
2eccb30731 | |||
431bff1b75 | |||
e89c545906 | |||
f262638453 | |||
82b4873b19 | |||
e4a0943af2 | |||
36bd8c0fad | |||
d323807675 | |||
692bb5e2ef | |||
d77f59435b | |||
a08fd2afb6 | |||
6fd075fe96 | |||
7613ea22e7 | |||
3101b49519 | |||
f57fc56f4a | |||
a6ca6b122c | |||
064e73f58b | |||
32138b2e59 | |||
e1c3bad4d0 | |||
4e78027f0c | |||
721f4f9fc3 | |||
24ad2611a9 | |||
c238f251f2 | |||
02848e3439 | |||
9550f54e2b | |||
39dade78e3 | |||
5b6d8b01a4 | |||
96bc83cead | |||
be700a90ce | |||
6d1fce1716 | |||
d3665f31fe | |||
4188cb80fa | |||
62fe72d99b | |||
f4749559d2 | |||
ed815794ed | |||
0c12a19d1d | |||
96d47e8e0c | |||
3027e2a18c | |||
06025b2e69 | |||
da7e8f64aa | |||
17b051e2a7 | |||
77a05f22a8 | |||
5c3ef1f107 | |||
53c5991971 | |||
ff760a6c11 | |||
63069ff9ec | |||
5e63b71861 | |||
b72782de4f | |||
de9556c550 | |||
6590504545 | |||
8d1e8dcf05 | |||
07b5076717 | |||
6fb9507a4c | |||
879a524bb4 | |||
c60b451ce7 | |||
f85f3e32ea | |||
57b3351047 | |||
dd10eb3f5e | |||
a498104777 | |||
4e577f97fa | |||
8c7bf365a0 | |||
eedb7a5375 | |||
d047cfc8ff | |||
9ff5da8d8f | |||
ac615f54f7 | |||
21af722e23 | |||
b1196fcf00 | |||
d170f6d323 | |||
9dd0298f56 | |||
bdf4ca84e0 | |||
caaa067096 | |||
7258d7f1bf | |||
8a504bff07 | |||
c00e64f736 | |||
9e73db0f24 | |||
951c061d77 | |||
579d3e0719 | |||
9777733d04 | |||
05e118dcb4 | |||
7a0d6f49f4 | |||
19f1b7f6bd | |||
b12afbdc1f | |||
49e77d4f93 | |||
eb9107bedf | |||
951c699ed0 | |||
9e676143b8 | |||
6895e46375 | |||
c8b20bc255 | |||
1cf46c7337 | |||
f240a15af3 | |||
6073712fdf | |||
407b63e48b | |||
be562fe722 | |||
928ab41d7f | |||
d11d55b218 | |||
debb95fb4c | |||
b9f7ab3ec3 | |||
2cdf1e66a6 | |||
20c2c4c96e | |||
d5238150d0 | |||
64a4e70c41 | |||
0c2f0a714c | |||
4c67553bdd | |||
ffab5e3c12 | |||
f7556a4861 | |||
385fc77771 | |||
b852ea1822 | |||
4a5a3a1a2d | |||
37762e5470 | |||
85d90090c8 | |||
09930c2d9a | |||
7ae1ab035a | |||
2bd1787663 | |||
765b7dcc4b | |||
091381a076 | |||
27dfd71b2e | |||
16e06bd932 | |||
a33c310757 | |||
df21bdfa7e | |||
d7e2c0da42 | |||
a7529b41fb | |||
c4fce3f0f9 | |||
27f5f18962 | |||
dca5e30291 | |||
09a435053e | |||
14309275fb | |||
2375e92d90 | |||
97672c2fff | |||
5837b05a35 | |||
b3b68ebd13 | |||
2dbbb5c262 | |||
e45655edbb | |||
9713fcabd6 | |||
dc10c40578 | |||
db3c190b2b | |||
2725857364 | |||
9f291f675c | |||
561c192c27 | |||
086dec28ac | |||
b03870c0aa | |||
f5c08cd28b | |||
2a87271642 | |||
3b57aec0e8 | |||
efac65bc76 | |||
9c8fe6c590 | |||
9f52cdf753 | |||
216234ea01 | |||
881dead392 | |||
ff2bca26aa | |||
89ad934aa6 | |||
d0a195647c | |||
eb05b05042 | |||
b9c1970d20 | |||
9eca9ac5b2 | |||
5b577fae07 | |||
452a8755c2 | |||
2fb8f224e7 | |||
b6a2c8e021 | |||
f0a25fde0c | |||
4324497831 | |||
14c53b7370 | |||
0396b8ad86 | |||
8ee7486afc | |||
694d9614c5 | |||
150e25072a | |||
7d990ae2c0 | |||
0dd5a26efa | |||
5c097c83cb | |||
a85dd014a0 | |||
342df43f85 | |||
d4be858c46 | |||
ec9a6e0d5b | |||
9161016f73 | |||
bdd22f8d75 | |||
ce103ffd50 | |||
85c35f25a3 | |||
c29b312101 | |||
a4ead85701 | |||
46273b3301 | |||
d6b74a76bb | |||
6f66957b17 | |||
17347c23a5 | |||
718748f1a2 | |||
96d1c53ede | |||
1293a8aa1e | |||
96424694ee | |||
0367d9fd3a | |||
3b666f1fde | |||
ec51cb7408 | |||
4023394562 | |||
5d312a12d4 | |||
b88cdf1250 | |||
ebec598120 | |||
aa060ea4d8 | |||
fc3eef4d90 | |||
44ac012165 | |||
500d0e1044 | |||
400a90b385 | |||
b8a741aa58 | |||
a3929ec07e | |||
8225daf6f1 | |||
8dce71eca1 | |||
a2243abf2d | |||
009b983c9a | |||
1b3876cffa | |||
ed48ce3a8f | |||
830daab8f4 | |||
9688827a39 | |||
3464a33678 | |||
5754d70d05 | |||
fbf2972006 | |||
aa2836b29a | |||
260368585e | |||
323fd1a031 | |||
c7b0f77910 | |||
7fb6a2f087 | |||
e32c2eed15 | |||
7afa80c89f | |||
a3cccc7ac0 | |||
bc37ed5341 | |||
0a5ce5b9cc | |||
a4e23dc03f | |||
7a394e52e4 | |||
9352a48650 | |||
a849e01ce5 | |||
fd725ca6c5 | |||
0703ea685e | |||
1ba468cbfc | |||
91dc89013c | |||
7cdeac451b | |||
5b8cf2798e | |||
98158e0f27 | |||
c0ac0365eb | |||
0c60cbc739 | |||
402a6be5ad | |||
9d131f0f24 | |||
b9606fa0e3 | |||
d71f5452ad | |||
eb9759f2d8 | |||
dec35f76e4 | |||
97edce0a67 | |||
361aa4ee04 | |||
5c0f77c7c5 | |||
210b0f8b43 | |||
585fdb7992 | |||
6d05e9b924 | |||
fb314170c1 | |||
218d720b06 | |||
7bf97a03c4 | |||
de496970d9 | |||
c8ec171b11 | |||
caf126f543 | |||
a717cce3b5 | |||
ce32490b4d | |||
5d882d9052 | |||
7dfd6c0b8b | |||
fa5c774f45 | |||
c356ecd168 | |||
f8ce64d6c3 | |||
39d5b610a1 | |||
50643eb9ff | |||
687166e0a4 | |||
98ead06355 | |||
cbc3795ef2 | |||
b9d608222e | |||
777a66f8da | |||
6441deceab | |||
1fedb1fad3 | |||
8b1cef3b83 | |||
81ef3d624a | |||
b0c0f17043 | |||
fb3cdf3603 | |||
950c975e8f | |||
79c8ea301d | |||
7a11c9062d | |||
2037775276 | |||
4a3ce64412 | |||
681695150a | |||
e98682a1af | |||
92534640d4 | |||
695ccd0e71 | |||
0be2aa718f | |||
b3b9c2ef43 | |||
293ea04c56 | |||
aae1f524ea | |||
7871acc215 | |||
153b87c3b3 | |||
932fa467ba | |||
82804fcac2 | |||
8ed35aba2b | |||
4898bcf7b5 | |||
495c91f5bb | |||
42199f9923 | |||
03a6f18d18 | |||
aff12edb03 | |||
c0a7ee1bb6 | |||
8c0db481ae | |||
6084e7cb63 | |||
e40138dee6 | |||
28576a9e8b | |||
c1d4e126a3 | |||
6cd995ff52 | |||
9e107c546d | |||
edb1f224ca | |||
495133da1a | |||
de0d6853b7 | |||
5cdbae0166 | |||
a537183545 | |||
2c19ce5c65 | |||
609053e13f | |||
a3837a0e06 | |||
0adee3582b | |||
08bfd73eec | |||
9a7cc52e03 | |||
11984bc46f | |||
8ac5bc827a | |||
366287eb24 | |||
43c2df58c7 | |||
d0acfcf674 | |||
88ccd8edfd | |||
7f9e2af9a6 | |||
f9269f1fe4 | |||
a5359ec580 | |||
e3a6f5127f | |||
e1e046b16b | |||
7d93050ff9 | |||
fadcb9ad5d | |||
49f7c6e8c3 | |||
9bcdb2bcdc | |||
ca4670ed89 | |||
adf71cb020 | |||
6e84fdad23 | |||
2ecfd9610f | |||
bb33778fc9 | |||
d4d1000c16 | |||
5a96204f1b | |||
3bd72dacda | |||
a4c8dad865 | |||
82e7a3b659 | |||
586fa98c32 | |||
a8f95bcb19 | |||
82d92565e7 | |||
533e4fe369 | |||
f8304aecd7 | |||
ac6e58ff9e | |||
4be2a1e05b | |||
59831ef1f3 | |||
54e6e2f9b1 | |||
d203772a9a | |||
55522e8191 | |||
ac3d0fca88 | |||
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 | |||
3c09bc7995 | |||
13dc0a25be | |||
299e0ccd4a | |||
4f6d32330b | |||
089fc0670d | |||
b55ca70056 | |||
3bc8adfb98 | |||
3668c5e9d6 | |||
1971910178 | |||
655d7471dc | |||
2c5ac7297d | |||
e16714ea6c | |||
c4ebbb74c7 | |||
8c424a45f9 | |||
98f0fdb620 | |||
26c83ff585 | |||
f97de65787 | |||
30a6b7a442 | |||
5d7aa8913b | |||
f25207104c | |||
c6a2496d72 | |||
baf73df4f9 | |||
5ffbc9e8a4 | |||
7245de1513 | |||
d2503da298 | |||
c8fb54182e | |||
f3130f5cfc | |||
6e6842dbd2 | |||
28142a6883 | |||
0bb5265b77 | |||
60b143e248 | |||
aaeee0d36e | |||
7b183612e4 | |||
0eb0c7a02f | |||
475b299e37 | |||
be8203a832 | |||
9fa4c0662c | |||
c10b08df27 | |||
25fafa7a6c | |||
2ff66ad54b | |||
1e47d29adf | |||
2008871658 | |||
cadf4e4fc7 | |||
662cef44d5 | |||
c885bbb144 | |||
f2260d56a4 | |||
174a782759 | |||
6a86f66cf6 | |||
b153debdef | |||
71c46b5431 | |||
580e88d1a9 | |||
92a7e354ba | |||
6a004a9f35 | |||
91506480b7 | |||
e8e0e9988a | |||
1a16f06ac6 | |||
aca3398d21 | |||
924f718d5a | |||
6edb6be7d9 | |||
055973aa37 | |||
19ced05110 | |||
e93ac11172 | |||
7328d20c84 | |||
4586b7519f | |||
a0058869c9 | |||
89a317b7df | |||
0c3bc40b03 | |||
848f103afa | |||
a7a2db15d6 | |||
6aeb56de07 | |||
400038265b | |||
3b87323c41 | |||
cdf2dc6760 | |||
bf1d779b95 | |||
27004da544 | |||
c0c4c25875 | |||
adbaf9341d | |||
b5c5e60c12 | |||
1ed1b352f3 | |||
53c898fd76 | |||
acc8f3e2b8 | |||
157eeef867 | |||
21c0833f14 | |||
c002fbc537 | |||
a4d8f4646e | |||
f2dc46d4ef | |||
901a327b1e | |||
580ba0a357 | |||
abf52870dd | |||
d48bfde128 | |||
7ac7b75ae6 | |||
b66614cad9 | |||
ff70f13e05 | |||
ea110c01dd | |||
632f3647a8 | |||
80287433eb | |||
b18aeb2d38 | |||
68f972c562 | |||
994056047a | |||
f115315341 | |||
57e5395143 | |||
17f3a4ca3d | |||
e2d0e9e754 | |||
b167540ad7 | |||
0d1ce072dc | |||
887a5c6b16 | |||
ea6bfa8387 | |||
42266c37ea | |||
2dd8e00201 | |||
46cd88a18a | |||
2ff0f6f5d6 | |||
9ff6325469 | |||
ea404985fd | |||
8fc25111e2 | |||
4fce1109a1 | |||
916fd75003 | |||
aa35aae58f | |||
6849fb2784 | |||
313577d083 | |||
53efcfd06b | |||
edaaeef65f | |||
d6eb5bdcda | |||
7d675923db | |||
87fd8a165c | |||
1205252450 | |||
1ed45b1a20 | |||
822f55d9f2 | |||
aacf37aa56 | |||
a15e39d7dd | |||
72fa8532d3 | |||
f4aa0c324c | |||
73ee1f3624 | |||
4ca3593653 | |||
af52dec24a | |||
34ebb3586c | |||
eee8682959 | |||
af1dd2e9ff | |||
ade60ad611 | |||
e699ad1663 | |||
e2308ee904 | |||
d14a595ac4 | |||
5190af0a6b | |||
a11b87ec83 | |||
c7a0604afc | |||
9970277134 | |||
49f6879ccb | |||
794b76321a | |||
e5b4ae0e3e | |||
310ce4f75a | |||
cf072dc0d5 | |||
7fe0b562ee | |||
6f6fdb28bf | |||
524d4da9d8 | |||
0aa0bae0ad | |||
fcf52ba02a | |||
8a92ff132b | |||
99043a7c49 | |||
2a71be4050 | |||
b43ef812a2 | |||
7981adaf85 | |||
1bc22a817a | |||
57a6b35457 | |||
8b45482d0a | |||
af64a77268 | |||
5c50069f21 | |||
3c329667a4 | |||
1565c9643d | |||
84ef49bf65 | |||
878075c898 | |||
c74763c96a | |||
d01f9d0b2f | |||
e780c4ffec | |||
3968dbe0a2 | |||
ff9164714c | |||
72e105eb34 | |||
f4440fd262 | |||
587b84a489 | |||
107952f0ba | |||
8cae042857 | |||
d1b73592af | |||
b7175d73ab | |||
9c976b381b | |||
0c99862793 | |||
0240b65fad | |||
b6d3e5baca | |||
15650b84cf | |||
9233bcfedc | |||
b0aa4a850d | |||
af97481d11 | |||
3c6e706c98 | |||
aca62caec1 | |||
eaa23985bd | |||
e3f9452b9f | |||
755080d0a4 | |||
0f764b976b | |||
d0a435a5d6 | |||
b02764ddca | |||
b3c28d33f2 | |||
6ad1187eef | |||
1bf1267b49 | |||
d2f6f7f51a | |||
dc2c996516 | |||
f502e44764 | |||
c490a3d62e | |||
9a2dc52e87 | |||
a1c11f4e0f | |||
48fd4c590d | |||
97cde0cfd4 | |||
429269d8d2 | |||
1a50c16d9a | |||
891d8d178f | |||
fc1c487dce | |||
e2cc14370a | |||
d5d6f18fb4 | |||
00e22dc56e | |||
40b475ea0c | |||
65eabbdba4 | |||
cb4a47d812 | |||
ecbd70493b | |||
4988140268 | |||
57b0aadb9b | |||
ef9ce2a9a7 | |||
2c92b0874e | |||
927560ad75 | |||
c8dbc8a623 | |||
11eef83a65 | |||
a2439a7093 | |||
d8697590a7 | |||
6d98604cf0 | |||
3d6be1cd51 | |||
01edfed307 | |||
5e4d1d0d6d | |||
86f61f1487 | |||
461cfa7bdc | |||
75b296496e | |||
183277db21 | |||
2b597867f0 | |||
7f7312c0a2 | |||
73214165a5 | |||
54be4f7e88 | |||
3ccab5f534 | |||
f635af5f95 | |||
cc3a183cac | |||
173b686658 | |||
a0d5743232 | |||
7598d211cd | |||
6b064d0e68 | |||
8fc0673bb2 | |||
aa062a9d11 | |||
8b4b2f97e0 | |||
c4f1d0c06f | |||
20d4e886fc | |||
e36ace1671 | |||
2f055fbecb | |||
d193686c79 | |||
ba2ada569f | |||
850fd9aa4a | |||
1fb14ca1dd | |||
499472a126 | |||
28459e4702 | |||
57dda8367c | |||
cdf03b4353 | |||
5ec66e8c7e | |||
f57aeb8fb0 | |||
adb3834836 | |||
d82d6fd704 | |||
ec0683f610 | |||
2d118a44a9 | |||
64cd7f7393 | |||
9a1fc8ea36 | |||
75247af337 | |||
d20b062b70 | |||
4b36574255 | |||
bba42797d8 | |||
365e38e63a | |||
5a3106ace8 | |||
8cb4ef111c | |||
50d6cf471c | |||
e942f0bf75 | |||
e4bb1ef6aa |
17
.github/workflows/gradle.yml
vendored
Normal file
17
.github/workflows/gradle.yml
vendored
Normal file
|
@ -0,0 +1,17 @@
|
|||
name: Gradle-Build
|
||||
|
||||
on: [ push ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
cache: gradle
|
||||
- name: Build with Gradle
|
||||
run: chmod a+x gradlew && ./gradlew build --no-daemon
|
45
.gitignore
vendored
45
.gitignore
vendored
|
@ -1,14 +1,39 @@
|
|||
# Netbeans excludes - StevenLawson & JeromSar
|
||||
/nbproject/private/
|
||||
/dist/
|
||||
/build/
|
||||
manifest.mf
|
||||
# TFM excludes
|
||||
build.properties
|
||||
dependency-reduced-pom.xml
|
||||
*.html
|
||||
*.css
|
||||
|
||||
# Eclipse excludes - JeromSar (old)
|
||||
# Netbeans excludes
|
||||
/nbproject/private
|
||||
/dist
|
||||
/build
|
||||
manifest.mf
|
||||
# Now defines that Maven CheckStyle is used
|
||||
# nb-configuration.xml
|
||||
|
||||
# Eclipse excludes
|
||||
.project
|
||||
.classpath
|
||||
/bin/
|
||||
/.settings/
|
||||
/bin
|
||||
/.settings
|
||||
|
||||
# IntelliJ excludes
|
||||
*.ipr
|
||||
*.iws
|
||||
/.idea/modules.xml
|
||||
/.idea/discord.xml
|
||||
/.idea/jarRepositories.xml
|
||||
/.idea/workspace.xml
|
||||
/.idea/uiDesigner.xml
|
||||
/.idea/libraries
|
||||
/.idea/
|
||||
*.iml
|
||||
|
||||
# Maven excludes
|
||||
/target
|
||||
|
||||
/.gradle
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
|
@ -17,6 +42,4 @@ manifest.mf
|
|||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# TFM files
|
||||
buildcreator.properties
|
||||
.idea/inspectionProfiles/Project_Default.xml
|
||||
|
|
3
.idea/.gitignore
vendored
Normal file
3
.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
46
.idea/codeStyles/codeStyleConfig.xml
Normal file
46
.idea/codeStyles/codeStyleConfig.xml
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>
|
|
@ -1,55 +1,4 @@
|
|||
# Contributing to TotalFreedomMod #
|
||||
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](http://totalfreedom.me/). However, it can be used in a variety of other configurations with minimal fuss.
|
||||
# Contributing to TotalFreedomMod
|
||||
|
||||
For those who wish to contribute, we encourage you to fork the repository and submit pull requests. Below you will find guidelines that will explain this process in further detail.
|
||||
|
||||
## Getting Started ##
|
||||
* Make sure you have a [GitHub account](https://github.com/signup/free)
|
||||
* If the issue is a bug, submit a ticket for it, assuming one does not already exist.
|
||||
* Clearly describe the issue including steps to reproduce it.
|
||||
* Make sure you fill in the earliest version that you know has the issue.
|
||||
* Fork the repository on GitHub
|
||||
|
||||
## Making Changes ##
|
||||
* Create a topic branch from where you want to base your work.
|
||||
* This is usually the master branch.
|
||||
* Only target release branches if you are certain your addition must be on that branch.
|
||||
* To quickly create a topic branch based on master; `git checkout -b contribution` - Please avoid working directly on the `master` branch.
|
||||
* Make changes and commit where necessary.
|
||||
* Check for unnecessary whitespace with `git diff --check` before committing.
|
||||
* Make sure your commit messages are in line with those which are already made.
|
||||
* Make sure your changes build (<b>and work!</b>).
|
||||
|
||||
## Tips - How To Get Your Pull Request Accepted ##
|
||||
* See this picture for help:
|
||||
![Imgur](http://i.imgur.com/7kogorv.jpg)
|
||||
|
||||
* Make sure your changes work and compile without difficulty.
|
||||
* Make sure your change adds something useful, do not add commands to micromanage the server. (ie: Shorthands for a collection of commands)
|
||||
* __Commands that make use of `org.bukkit.Server.dispatchCommand()` will probably be rejected.__
|
||||
* Features must be in line the general idea of "Total Freedom".
|
||||
* Changes must be directed towards the main "TotalFreedom" server. Adding names such as the name of your own TotalFreedom-like server will get your pull request denied.
|
||||
* Do not add yourself to the developer list.
|
||||
* Ensure that you use the correct whitespace-style. That is: 4 spaces as indentation.
|
||||
* Please make sure your changes are written such as other features would be. Eg: commands have their own class and extend TFM_Command.
|
||||
* __Make sure your code is written in the [Allman style](http://en.wikipedia.org/wiki/Indent_style#Allman_style).__
|
||||
* Do not increment the version number.
|
||||
* If you want to add multiple changes, please make one pull request per change. This way, it's easier to accept your changes faster and won't block the other changes if there is an issue with a specific line of code.
|
||||
* Please make sure there are no bugs in your code.
|
||||
* Please avoid having to add files in the main namespace where possible.
|
||||
* Make sure all changes work before you commit these, this avoids having multiple unnecessary commits.
|
||||
* Please refrain from using an excessive amount of commits. As few as possible is generally the best.
|
||||
* Please do not spread your addition over several pull-requests.
|
||||
|
||||
## Submitting Your Changes ##
|
||||
* Push your changes to a topic branch in your fork of the repository.
|
||||
* Submit a pull request to this repository.
|
||||
* Explain in detail what each one of your commits changes and point out any big changes.
|
||||
* Wait as a developer evaluates your changes.
|
||||
|
||||
## Additional Resources ##
|
||||
* [TotalFreedom information](http://totalfreedom.me)
|
||||
* [TotalFreedom forums](http://totalfreedom.boards.net)
|
||||
* [Bug tracker](https://github.com/TotalFreedom/TotalFreedomMod/issues)
|
||||
* [General GitHub documentation](http://help.github.com/)
|
||||
* [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
|
||||
For information about contributing to TotalFreedomMod, please see
|
||||
the [contributing guidelines](https://github.com/TotalFreedom/TotalFreedomMod/wiki/Contributing).
|
||||
|
|
94
LICENSE.md
94
LICENSE.md
|
@ -1,3 +1,93 @@
|
|||
# TotalFreedomMod License #
|
||||
# TotalFreedom General License
|
||||
|
||||
TotalFreedomMod is licensed under the TotalFreedom General License. It is available [here](https://github.com/TotalFreedom/License/blob/master/LICENSE.md).
|
||||
_Version 2.0, 27th February 2015_
|
||||
|
||||
Copyright (c) 2011 Steven Lawson
|
||||
|
||||
Copyright (c) 2012 Jerom van der Sar
|
||||
|
||||
All rights reserved.
|
||||
|
||||
##### 1. Definitions
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by this document.
|
||||
|
||||
"Licensor" shall mean the copyright holder or entity authorised by the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are
|
||||
under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or
|
||||
indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of
|
||||
fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You", "Your" or "Yourself" shall mean an individual or Legal Entity exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code,
|
||||
documentation source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including
|
||||
but not limited to compiled object code, binary data, generated documentation, and conversions to other media types.
|
||||
|
||||
"Work" and "This Software" shall mean the work of authorship, whether in Source or Object form, made available under the
|
||||
License, as indicated by a copyright notice that is included in or attached to the work.
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work
|
||||
and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an
|
||||
original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or
|
||||
additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the
|
||||
Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.
|
||||
For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to
|
||||
the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code
|
||||
control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of
|
||||
discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in
|
||||
writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received
|
||||
by Licensor and subsequently incorporated within the Work.
|
||||
|
||||
"Redistribution" shall mean any partial or complete availability, transfer or publication of the Work from one Legal
|
||||
Entity to another.
|
||||
|
||||
##### 2. Grant of Copyright License
|
||||
|
||||
Subject to the terms and conditions of this License, You are granted a perpetual, worldwide, non-exclusive, no-charge,
|
||||
royalty-free, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform, inspect
|
||||
and redistribute the Work and such Derivative Works as long as the following conditions are met:
|
||||
|
||||
1. Redistributions of This Software must solely occur in Source form. Redistribution in Object form is prohibited
|
||||
without prior written permission from the Licensor.
|
||||
|
||||
2. Neither the names of the copyright holders nor the names this software's contributors may be removed from This
|
||||
Software's source code.
|
||||
|
||||
3. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote
|
||||
products derived from This Software without specific prior written permission.
|
||||
|
||||
4. Accreditations referencing This Software's copyright holders or contributors may neither be altered or removed from
|
||||
source code nor withheld from reproduction in Object form whatsoever.
|
||||
|
||||
5. Any conditions specified by this license may be temporarily or permanently waived by any the aforementioned copyright
|
||||
holders.
|
||||
|
||||
6. Redistributions of This Software must retain this License document in its exact form.
|
||||
|
||||
7. Sub licensing of This Software is prohibited without prior written permission from the Licensor.
|
||||
|
||||
##### 3. Submission of Contributions
|
||||
|
||||
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the
|
||||
Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may
|
||||
have executed with Licensor regarding such Contributions.
|
||||
|
||||
##### 4. Disclaimer of Warranty
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
|
22
README.md
22
README.md
|
@ -1,7 +1,21 @@
|
|||
# TotalFreedomMod #
|
||||
# TotalFreedomMod ![Build Status](https://github.com/StevenNL2000Freedom/TotalFreedomMod/actions/workflows/gradle.yml/badge.svg)
|
||||
|
||||
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](https://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 (DarthSalamon) 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. TotalFreedomMod was forked to a new repository called TFPatches for faster development. The repository was renamed to TotalFreedomMC, which you are on now. When Wild1145 took ownership of TotalFreedom, it was further forked into a new organization, AtlasMediaGroup. This version still continues to receive updates, with some being backported from AtlasMediaGroup.
|
||||
|
||||
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).
|
||||
### Contributing
|
||||
|
||||
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).
|
||||
|
||||
### Compiling
|
||||
|
||||
You need Gradle to build. You'd also need to set the JDK version to Java 17 as that is the current standard as of now.
|
||||
|
|
232
build.gradle
Normal file
232
build.gradle
Normal file
|
@ -0,0 +1,232 @@
|
|||
plugins {
|
||||
id 'java'
|
||||
id 'maven-publish'
|
||||
id 'idea'
|
||||
id 'checkstyle'
|
||||
id 'com.github.johnrengelman.shadow' version '7.1.2'
|
||||
id 'net.minecrell.plugin-yml.bukkit' version '0.5.1'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
gradlePluginPortal()
|
||||
|
||||
maven {
|
||||
url = uri('https://jitpack.io')
|
||||
content {
|
||||
includeGroup('com.github.vexsoftware')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://nexus.hc.to/content/repositories/pub_releases/')
|
||||
content {
|
||||
includeGroup('net.milkbowl.vault')
|
||||
}
|
||||
}
|
||||
|
||||
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
|
||||
|
||||
maven {
|
||||
url = uri('https://repo.codemc.org/repository/maven-public/')
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://repo.codemc.org/repository/nms/')
|
||||
content {
|
||||
includeGroup('org.spigotmc')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://hub.spigotmc.org/nexus/content/groups/public/')
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://maven.enginehub.org/repo/')
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://maven.elmakers.com/repository/')
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://m2.dv8tion.net/releases/')
|
||||
content {
|
||||
includeGroup('net.dv8tion')
|
||||
includeGroup('club.minnced')
|
||||
includeGroup('com.google.code')
|
||||
includeGroup('com.neovisionaries')
|
||||
includeGroup('com.squareup')
|
||||
includeGroup('org.apache.commons')
|
||||
includeGroup('org.jetbrains.annotations')
|
||||
includeGroup('org.slf4j.slf4j-api')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://maven.playpro.com/')
|
||||
content {
|
||||
includeGroup('net.coreprotect')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://nexus.telesphoreo.me/repository/totalfreedom/')
|
||||
content {
|
||||
includeGroup('me.totalfreedom')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://repo.mattmalec.com/repository/releases')
|
||||
content {
|
||||
includeGroup('com.mattmalec')
|
||||
}
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://repo.essentialsx.net/releases/')
|
||||
content {
|
||||
includeGroup('net.essentialsx')
|
||||
}
|
||||
}
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation('commons-io:commons-io:2.11.0')
|
||||
implementation('org.apache.commons:commons-lang3:3.12.0')
|
||||
implementation('commons-codec:commons-codec:1.15')
|
||||
implementation('org.bstats:bstats-base:3.0.0')
|
||||
implementation('org.bstats:bstats-bukkit:3.0.0')
|
||||
implementation('org.reflections:reflections:0.10.2')
|
||||
implementation('org.javassist:javassist:3.28.0-GA')
|
||||
implementation('org.jetbrains:annotations:23.0.0')
|
||||
implementation('com.mattmalec:Pterodactyl4J:2.BETA_92')
|
||||
implementation('com.squareup.okhttp3:okhttp:4.9.3')
|
||||
compileOnly('org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT')
|
||||
compileOnly('me.totalfreedom:BukkitTelnet:4.7')
|
||||
compileOnly('me.totalfreedom:TF-LibsDisguises:10.0.27-SNAPSHOT')
|
||||
compileOnly('com.sk89q.worldedit:worldedit-bukkit:7.3.0-SNAPSHOT')
|
||||
compileOnly('net.essentialsx:EssentialsX:2.19.2')
|
||||
compileOnly('net.dv8tion:JDA:4.3.0_277')
|
||||
compileOnly('net.coreprotect:coreprotect:20.4')
|
||||
compileOnly('com.sk89q.worldguard:worldguard-bukkit:7.0.6')
|
||||
compileOnly('com.github.vexsoftware:votifier:v1.9')
|
||||
compileOnly('net.goldtreeservers:worldguardextraflags:4.0.0')
|
||||
compileOnly('me.totalfreedom:TFGuilds:2021.06-RC3')
|
||||
}
|
||||
|
||||
group = 'me.totalfreedom'
|
||||
version = project.property('project.pluginVersion')
|
||||
description = 'TotalFreedomMod'
|
||||
java.sourceCompatibility = JavaVersion.VERSION_17
|
||||
java.targetCompatibility = JavaVersion.VERSION_17
|
||||
archivesBaseName = 'TotalFreedomMod-donotuse'
|
||||
|
||||
bukkit {
|
||||
main = 'me.totalfreedom.totalfreedommod.TotalFreedomMod'
|
||||
apiVersion = '1.17'
|
||||
version = project.property('project.pluginVersion')
|
||||
description = 'Plugin for the Total Freedom server.'
|
||||
authors = ['Madgeek1450', 'Prozza']
|
||||
softDepend = ['BukkitTelnet', 'Essentials', 'CoreProtect', 'LibsDisguises', 'WorldEdit',
|
||||
'WorldGuard', 'WorldGuardExtraFlags', 'TFGuilds', 'JDA', 'Votifier']
|
||||
}
|
||||
|
||||
static def getDate() {
|
||||
return new Date().format('MM/dd/yyyy HH:mm')
|
||||
}
|
||||
|
||||
String getGitHash() {
|
||||
def stdout = new ByteArrayOutputStream()
|
||||
try {
|
||||
exec {
|
||||
commandLine "git", "rev-parse", "--short", "HEAD"
|
||||
standardOutput = stdout
|
||||
ignoreExitValue = true
|
||||
}
|
||||
} catch (GradleException e) {
|
||||
logger.error("Couldn't determine Git head because Git is not installed. " + e.getMessage())
|
||||
}
|
||||
return stdout.size() > 0 ? stdout.toString().trim() : "unknown"
|
||||
}
|
||||
|
||||
String getBuildNumber() {
|
||||
def stdout = new ByteArrayOutputStream()
|
||||
try {
|
||||
exec {
|
||||
commandLine "git", "rev-list", "HEAD", "--count"
|
||||
standardOutput = stdout
|
||||
ignoreExitValue = true
|
||||
}
|
||||
} catch (GradleException e) {
|
||||
logger.error("Couldn't determine build number because Git is not installed. " + e.getMessage())
|
||||
}
|
||||
return stdout.size() > 0 ? stdout.toString().trim() : "unknown"
|
||||
}
|
||||
|
||||
tasks.withType(Checkstyle) {
|
||||
reports {
|
||||
xml.required = false
|
||||
html.required = true
|
||||
html.stylesheet resources.text.fromFile('config/xsl/checkstyle.xsl')
|
||||
}
|
||||
}
|
||||
|
||||
task buildProperties {
|
||||
ant.propertyfile(file: "$project.rootDir/src/main/resources/build.properties") {
|
||||
entry(key: "buildAuthor", default: "unknown")
|
||||
entry(key: "buildNumber", value: getBuildNumber())
|
||||
entry(key: "buildDate", value: getDate())
|
||||
entry(key: "buildCodeName", value: project.property('project.buildCodeName'))
|
||||
entry(key: "buildHead", value: getGitHash())
|
||||
}
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
shadowJar {
|
||||
archiveBaseName.set('TotalFreedomMod')
|
||||
archiveClassifier.set('')
|
||||
archiveVersion.set('')
|
||||
}
|
||||
minimize()
|
||||
dependencies {
|
||||
include(dependency('commons-io:commons-io'))
|
||||
include(dependency('org.apache.commons:commons-lang3'))
|
||||
include(dependency('commons-codec:commons-codec'))
|
||||
include(dependency('org.javassist:javassist'))
|
||||
include(dependency('io.papermc:paperlib'))
|
||||
include(dependency('org.bstats:bstats-base'))
|
||||
include(dependency('org.bstats:bstats-bukkit'))
|
||||
include(dependency('org.reflections:reflections'))
|
||||
include(dependency('org.jetbrains:annotations'))
|
||||
include(dependency('com.mattmalec:Pterodactyl4J'))
|
||||
include(dependency('com.squareup:okhttp3'))
|
||||
}
|
||||
relocate 'org.bstats', 'me.totalfreedom.totalfreedommod'
|
||||
relocate 'io.papermc.lib', 'me.totalfreedom.totalfreedommod.paperlib'
|
||||
}
|
||||
|
||||
tasks.compileJava.finalizedBy tasks.buildProperties
|
||||
tasks.build.dependsOn tasks.shadowJar
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
from components.java
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jar {
|
||||
into("META-INF/maven/$project.group/$project.name") {
|
||||
from { generatePomFileForMavenPublication }
|
||||
rename ".*", "pom.xml"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
options.encoding = 'UTF-8'
|
||||
}
|
26
build.xml
26
build.xml
|
@ -1,26 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="TotalFreedomMod" default="default" basedir=".">
|
||||
<description>Builds, tests, and runs the project TotalFreedomMod.</description>
|
||||
<import file="nbproject/build-impl.xml" />
|
||||
|
||||
<target name="-pre-jar">
|
||||
<copy file="buildcreator.default.properties" tofile="buildcreator.properties" overwrite="false" />
|
||||
|
||||
<property file="buildcreator.properties"/>
|
||||
<buildnumber file="buildnumber.properties" />
|
||||
|
||||
<propertyfile file="appinfo.properties">
|
||||
<entry key="program.buildnumber" value="${build.number}" />
|
||||
<entry key="program.builddate" type="date" value="now" pattern="MM/dd/yyyy hh:mm aa" />
|
||||
<entry key="program.buildcreator" value="${program.buildcreator}" />
|
||||
</propertyfile>
|
||||
<copy file="appinfo.properties" todir="${build.classes.dir}" />
|
||||
<delete file="appinfo.properties" />
|
||||
</target>
|
||||
|
||||
<target name="-post-jar">
|
||||
<!-- Cleanup -->
|
||||
<delete file="${dist.dir}/README.TXT" />
|
||||
<delete dir="${dist.dir}/lib/" />
|
||||
</target>
|
||||
</project>
|
|
@ -1,2 +0,0 @@
|
|||
# Build creator configuration
|
||||
program.buildcreator=Unknown
|
|
@ -1,3 +0,0 @@
|
|||
#Build Number for ANT. Do not edit!
|
||||
#Mon May 19 14:24:40 CEST 2014
|
||||
build.number=860
|
133
config/checkstyle/checkstyle.xml
Normal file
133
config/checkstyle/checkstyle.xml
Normal file
|
@ -0,0 +1,133 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module PUBLIC
|
||||
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
||||
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
||||
<module name="Checker">
|
||||
<property name="charset" value="UTF-8"/>
|
||||
<property name="severity" value="warning"/>
|
||||
<property name="fileExtensions" value="java, properties, xml"/>
|
||||
<module name="SuppressionFilter">
|
||||
<property name="file" value="${config_loc}/suppressions.xml"/>
|
||||
</module>
|
||||
<module name="FileTabCharacter">
|
||||
<property name="eachLine" value="true"/>
|
||||
</module>
|
||||
<module name="LineLength">
|
||||
<property name="max" value="200"/>
|
||||
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
||||
</module>
|
||||
<module name="TreeWalker">
|
||||
<module name="OuterTypeFilename"/>
|
||||
<module name="IllegalTokenText">
|
||||
<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="message" value="Avoid using corresponding octal or Unicode escape."/>
|
||||
</module>
|
||||
<module name="AvoidStarImport"/>
|
||||
<module name="OneTopLevelClass"/>
|
||||
<module name="NoLineWrap"/>
|
||||
<module name="NeedBraces"/>
|
||||
<module name="LeftCurly">
|
||||
<property name="option" value="nl"/>
|
||||
</module>
|
||||
<module name="RightCurly">
|
||||
<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"/>
|
||||
</module>
|
||||
<module name="WhitespaceAround">
|
||||
<property name="allowEmptyConstructors" value="true"/>
|
||||
<property name="allowEmptyMethods" value="true"/>
|
||||
<property name="allowEmptyTypes" value="true"/>
|
||||
<property name="allowEmptyLoops" value="true"/>
|
||||
<message key="ws.notFollowed"
|
||||
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
|
||||
<message key="ws.notPreceded"
|
||||
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
|
||||
</module>
|
||||
<module name="OneStatementPerLine"/>
|
||||
<module name="ArrayTypeStyle"/>
|
||||
<module name="FallThrough"/>
|
||||
<module name="UpperEll"/>
|
||||
<module name="ModifierOrder"/>
|
||||
<module name="SeparatorWrap">
|
||||
<property name="tokens" value="DOT"/>
|
||||
<property name="option" value="nl"/>
|
||||
</module>
|
||||
<module name="SeparatorWrap">
|
||||
<property name="tokens" value="COMMA"/>
|
||||
<property name="option" value="EOL"/>
|
||||
</module>
|
||||
<module name="PackageName">
|
||||
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Package name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="TypeName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|(^[A-Z][_a-zA-Z0-9]*$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="MemberName">
|
||||
<property name="format" value="^[a-z][_a-zA-Z0-9]*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Member name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="ParameterName">
|
||||
<property name="format" value="^[a-z][_a-zA-Z0-9]*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="LocalVariableName">
|
||||
<property name="tokens" value="VARIABLE_DEF"/>
|
||||
<property name="format" value="^[a-z][_a-zA-Z0-9]*$"/>
|
||||
<property name="allowOneCharVarInForLoop" value="true"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="ClassTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][a-zA-Z0-9]*$)|([A-Z][a-zA-Z0-9]*[_][a-zA-Z0-9]*$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Class type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="MethodTypeParameterName">
|
||||
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Method type name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="NoFinalizer"/>
|
||||
<module name="GenericWhitespace">
|
||||
<message key="ws.followed"
|
||||
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
|
||||
<message key="ws.preceded"
|
||||
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
|
||||
<message key="ws.illegalFollow"
|
||||
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
|
||||
<message key="ws.notPreceded"
|
||||
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
|
||||
</module>
|
||||
<module name="OverloadMethodsDeclarationOrder"/>
|
||||
<module name="CustomImportOrder"/>
|
||||
<!-- http://checkstyle.sourceforge.net/config_imports.html -->
|
||||
<module name="MethodParamPad"/>
|
||||
<module name="OperatorWrap">
|
||||
<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 "/>
|
||||
</module>
|
||||
<module name="AnnotationLocation">
|
||||
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
|
||||
</module>
|
||||
<module name="AnnotationLocation">
|
||||
<property name="tokens" value="VARIABLE_DEF"/>
|
||||
<property name="allowSamelineMultipleAnnotations" value="true"/>
|
||||
</module>
|
||||
<module name="MethodName">
|
||||
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
|
||||
<message key="name.invalidPattern"
|
||||
value="Method name ''{0}'' must match pattern ''{1}''."/>
|
||||
</module>
|
||||
<module name="CommentsIndentation"/>
|
||||
</module>
|
||||
</module>
|
7
config/checkstyle/suppressions.xml
Normal file
7
config/checkstyle/suppressions.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE suppressions PUBLIC "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
|
||||
"http://checkstyle.org/dtds/suppressions_1_2.dtd">
|
||||
<suppressions>
|
||||
<suppress files="NanoHTTPD\.java" checks="[a-zA-Z0-9]*"/>
|
||||
<suppress files="CleanroomChunkGenerator\.java" checks="[a-zA-Z0-9]*"/>
|
||||
</suppressions>
|
242
config/xsl/checkstyle.xsl
Normal file
242
config/xsl/checkstyle.xsl
Normal file
|
@ -0,0 +1,242 @@
|
|||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||
<xsl:output method="html" indent="yes"/>
|
||||
<xsl:decimal-format decimal-separator="." grouping-separator=","/>
|
||||
|
||||
<xsl:key name="files" match="file" use="@name"/>
|
||||
|
||||
<!-- Checkstyle XML Style Sheet by Rolf Wojtech <rolf@wojtech.de> -->
|
||||
<!-- (based on checkstyle-noframe-sorted.xsl by Stephane Bailliez -->
|
||||
<!-- <sbailliez@apache.org> and sf-patch 1721291 by Leo Liang) -->
|
||||
<!-- Changes: -->
|
||||
<!-- * Outputs seperate columns for error/warning/info -->
|
||||
<!-- * Sorts primarily by #error, secondarily by #warning, tertiary by #info -->
|
||||
<!-- * Compatible with windows path names (converts '\' to '/' for html anchor) -->
|
||||
<!-- -->
|
||||
<!-- Part of the Checkstyle distribution found at https://checkstyle.org -->
|
||||
<!-- Usage (generates checkstyle_report.html): -->
|
||||
<!-- <checkstyle failonviolation="false" config="${check.config}"> -->
|
||||
<!-- <fileset dir="${src.dir}" includes="**/*.java"/> -->
|
||||
<!-- <formatter type="xml" toFile="${doc.dir}/checkstyle_report.xml"/> -->
|
||||
<!-- </checkstyle> -->
|
||||
<!-- <style basedir="${doc.dir}" destdir="${doc.dir}" -->
|
||||
<!-- includes="checkstyle_report.xml" -->
|
||||
<!-- style="${doc.dir}/checkstyle-noframes-severity-sorted.xsl"/> -->
|
||||
|
||||
<xsl:template match="checkstyle">
|
||||
<html>
|
||||
<head>
|
||||
<style type="text/css">
|
||||
.bannercell {
|
||||
border: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
body {
|
||||
margin-left: 10;
|
||||
margin-right: 10;
|
||||
font:normal 80% arial,helvetica,sanserif;
|
||||
background-color:#FFFFFF;
|
||||
color:#000000;
|
||||
}
|
||||
.a td {
|
||||
background: #efefef;
|
||||
}
|
||||
.b td {
|
||||
background: #fff;
|
||||
}
|
||||
th, td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
th {
|
||||
font-weight:bold;
|
||||
background: #ccc;
|
||||
color: black;
|
||||
}
|
||||
table, th, td {
|
||||
font-size:100%;
|
||||
border: none
|
||||
}
|
||||
table.log tr td, tr th {
|
||||
|
||||
}
|
||||
h2 {
|
||||
font-weight:bold;
|
||||
font-size:140%;
|
||||
margin-bottom: 5;
|
||||
}
|
||||
h3 {
|
||||
font-size:100%;
|
||||
font-weight:bold;
|
||||
background: #525D76;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
padding: 5px;
|
||||
margin-right: 2px;
|
||||
margin-left: 2px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a name="top"></a>
|
||||
<!-- jakarta logo -->
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
||||
<tr>
|
||||
<td class="bannercell" rowspan="2">
|
||||
<!--a href="http://jakarta.apache.org/">
|
||||
<img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
|
||||
</a-->
|
||||
</td>
|
||||
<td class="text-align:right">
|
||||
<h2>CheckStyle Audit</h2>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-align:right">Designed for use with <a href='https://checkstyle.org/'>
|
||||
CheckStyle
|
||||
</a> and <a href='http://jakarta.apache.org'>Ant</a>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<hr size="1"/>
|
||||
|
||||
<!-- Summary part -->
|
||||
<xsl:apply-templates select="." mode="summary"/>
|
||||
<hr size="1" width="100%" align="left"/>
|
||||
|
||||
<!-- Package List part -->
|
||||
<xsl:apply-templates select="." mode="filelist"/>
|
||||
<hr size="1" width="100%" align="left"/>
|
||||
|
||||
<!-- For each package create its part -->
|
||||
<xsl:apply-templates select="file[@name and generate-id(.) = generate-id(key('files', @name))]"/>
|
||||
|
||||
<hr size="1" width="100%" align="left"/>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<xsl:template match="checkstyle" mode="filelist">
|
||||
<h3>Files</h3>
|
||||
<table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Errors</th>
|
||||
<th>Warnings</th>
|
||||
<th>Infos</th>
|
||||
</tr>
|
||||
<xsl:for-each select="file[@name and generate-id(.) = generate-id(key('files', @name))]">
|
||||
|
||||
<!-- Sort method 1: Primary by #error, secondary by #warning, tertiary by #info -->
|
||||
<xsl:sort data-type="number" order="descending"
|
||||
select="count(key('files', @name)/error[@severity='error'])"/>
|
||||
<xsl:sort data-type="number" order="descending"
|
||||
select="count(key('files', @name)/error[@severity='warning'])"/>
|
||||
<xsl:sort data-type="number" order="descending"
|
||||
select="count(key('files', @name)/error[@severity='info'])"/>
|
||||
|
||||
<!-- Sort method 1: Sum(#error+#info+#warning) (uncomment to use, comment method 1) -->
|
||||
<!--
|
||||
<xsl:sort data-type="number" order="descending" select="count(key('files', @name)/error)"/>
|
||||
-->
|
||||
|
||||
<xsl:variable name="errorCount" select="count(key('files', @name)/error[@severity='error'])"/>
|
||||
<xsl:variable name="warningCount" select="count(key('files', @name)/error[@severity='warning'])"/>
|
||||
<xsl:variable name="infoCount" select="count(key('files', @name)/error[@severity='info'])"/>
|
||||
|
||||
<tr>
|
||||
<xsl:call-template name="alternated-row"/>
|
||||
<td>
|
||||
<a href="#f-{translate(@name,'\','/')}">
|
||||
<xsl:value-of select="@name"/>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$errorCount"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$warningCount"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$infoCount"/>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</table>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<xsl:template match="file">
|
||||
<a name="f-{translate(@name,'\','/')}"></a>
|
||||
<h3>File
|
||||
<xsl:value-of select="@name"/>
|
||||
</h3>
|
||||
|
||||
<table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
|
||||
<tr>
|
||||
<th>Severity</th>
|
||||
<th>Error Description</th>
|
||||
<th>Line</th>
|
||||
</tr>
|
||||
<xsl:for-each select="key('files', @name)/error">
|
||||
<xsl:sort data-type="number" order="ascending" select="@line"/>
|
||||
<tr>
|
||||
<xsl:call-template name="alternated-row"/>
|
||||
<td>
|
||||
<xsl:value-of select="@severity"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="@message"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="@line"/>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</table>
|
||||
<a href="#top">Back to top</a>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<xsl:template match="checkstyle" mode="summary">
|
||||
<h3>Summary</h3>
|
||||
<xsl:variable name="fileCount"
|
||||
select="count(file[@name and generate-id(.) = generate-id(key('files', @name))])"/>
|
||||
<xsl:variable name="errorCount" select="count(file/error[@severity='error'])"/>
|
||||
<xsl:variable name="warningCount" select="count(file/error[@severity='warning'])"/>
|
||||
<xsl:variable name="infoCount" select="count(file/error[@severity='info'])"/>
|
||||
<table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
|
||||
<tr>
|
||||
<th>Files</th>
|
||||
<th>Errors</th>
|
||||
<th>Warnings</th>
|
||||
<th>Infos</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<xsl:call-template name="alternated-row"/>
|
||||
<td>
|
||||
<xsl:value-of select="$fileCount"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$errorCount"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$warningCount"/>
|
||||
</td>
|
||||
<td>
|
||||
<xsl:value-of select="$infoCount"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="alternated-row">
|
||||
<xsl:attribute name="class">
|
||||
<xsl:if test="position() mod 2 = 1">a</xsl:if>
|
||||
<xsl:if test="position() mod 2 = 0">b</xsl:if>
|
||||
</xsl:attribute>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
7
gradle.properties
Normal file
7
gradle.properties
Normal file
|
@ -0,0 +1,7 @@
|
|||
project.pluginVersion=7.1.0
|
||||
project.buildAuthor=unknown
|
||||
project.buildCodeName=Ember
|
||||
org.gradle.cache=true
|
||||
org.gradle.caching=true
|
||||
org.gradle.parallel=true
|
||||
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
185
gradlew
vendored
Executable file
185
gradlew
vendored
Executable file
|
@ -0,0 +1,185 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MSYS* | MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=`save "$@"`
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
exec "$JAVACMD" "$@"
|
89
gradlew.bat
vendored
Normal file
89
gradlew.bat
vendored
Normal file
|
@ -0,0 +1,89 @@
|
|||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
File diff suppressed because it is too large
Load diff
|
@ -1,8 +0,0 @@
|
|||
build.xml.data.CRC32=7bf70ec5
|
||||
build.xml.script.CRC32=b1031e10
|
||||
build.xml.stylesheet.CRC32=28e38971@1.44.1.45
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=7bf70ec5
|
||||
nbproject/build-impl.xml.script.CRC32=8511de95
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46
|
|
@ -1,103 +0,0 @@
|
|||
annotation.processing.enabled=true
|
||||
annotation.processing.enabled.in.editor=false
|
||||
annotation.processing.processors.list=
|
||||
annotation.processing.run.all.processors=true
|
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||
application.title=TotalFreedomMod
|
||||
application.vendor=TotalFreedom
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=4
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=0
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.enableCommentFormatting=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
build.generated.sources.dir=${build.dir}/generated-sources
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
# Uncomment to specify the preferred debugger connection transport:
|
||||
#debug.transport=dt_socket
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/TotalFreedomMod.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
endorsed.classpath=
|
||||
excludes=
|
||||
includes=**
|
||||
jar.archive.disabled=${jnlp.enabled}
|
||||
jar.compress=false
|
||||
jar.index=${jnlp.enabled}
|
||||
javac.classpath=\
|
||||
${libs.WorldEdit.classpath}:\
|
||||
${libs.DisguiseCraft.classpath}:\
|
||||
${libs.Essentials.classpath}:\
|
||||
${libs.BukkitTelnet.classpath}:\
|
||||
${libs.CraftBukkit.classpath}
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=-Xlint:unchecked -Xlint:deprecation
|
||||
javac.deprecation=false
|
||||
javac.processorpath=\
|
||||
${javac.classpath}
|
||||
javac.source=1.6
|
||||
javac.target=1.6
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
javac.test.processorpath=\
|
||||
${javac.test.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=${source.encoding}
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
jnlp.codebase.type=no.codebase
|
||||
jnlp.descriptor=application
|
||||
jnlp.enabled=false
|
||||
jnlp.mixed.code=default
|
||||
jnlp.offline-allowed=false
|
||||
jnlp.signed=false
|
||||
jnlp.signing=
|
||||
jnlp.signing.alias=
|
||||
jnlp.signing.keystore=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=true
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>TotalFreedomMod</name>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots/>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
1
settings.gradle
Normal file
1
settings.gradle
Normal file
|
@ -0,0 +1 @@
|
|||
rootProject.name = 'TotalFreedomMod'
|
13
src/bans.yml
13
src/bans.yml
|
@ -1,13 +0,0 @@
|
|||
#
|
||||
# TotalFreedomMod banning config
|
||||
# Warning: modification of this file is not recomended
|
||||
#
|
||||
# Format:
|
||||
# Ip: [IP-address / UUID]:[Last login name]:[Expiry unix timestamp (0 = never)][Banned by]:[Reason]
|
||||
#
|
||||
|
||||
ips:
|
||||
- '192.168.1.254:Notch:DarthSalamon:0:IP ban example'
|
||||
|
||||
uuids:
|
||||
- '245d2f30-61fb-4840-9cd3-298b3920f4a4:Cobrex:DarthSalamon:0:UUID ban example'
|
247
src/config.yml
247
src/config.yml
|
@ -1,247 +0,0 @@
|
|||
# TotalFreedomMod v4.2 Configuration
|
||||
# by Madgeek1450 and DarthSalamon
|
||||
|
||||
# Generic server information
|
||||
server:
|
||||
# You should change this to your server's name
|
||||
name: TotalFreedom
|
||||
|
||||
# The address your server is located at
|
||||
address: 64.34.165.5:28965
|
||||
|
||||
# Shown at the server list
|
||||
motd: TotalFreedom &8- Minecraft %mcversion%
|
||||
|
||||
# Every word in the MOTD will be a different color unless prefixed by a color code
|
||||
colorful_motd: true
|
||||
|
||||
# All players who show up as owner
|
||||
owners:
|
||||
- markbyron
|
||||
|
||||
# URL players should appeal for bans at
|
||||
ban_url: http://totalfreedom.boards.net/
|
||||
|
||||
# URL players should appeal for permanent bans at
|
||||
permban_url: http://bit.ly/TF_PermBan
|
||||
|
||||
# Blocking certain events
|
||||
allow:
|
||||
fire_place: false
|
||||
fire_spread: false
|
||||
fluid_spread: false
|
||||
lava_place: false
|
||||
lava_damage: false
|
||||
water_place: false
|
||||
tnt_minecarts: false
|
||||
explosions: false
|
||||
|
||||
explosive_radius: 4.0
|
||||
|
||||
# Blocked commands:
|
||||
#
|
||||
# How blocked commands work:
|
||||
# All sections described below are delimited by colon characters.
|
||||
# Make sure that you block a command by its main command name, not an alias
|
||||
# -as all aliases are blocked by default. Commands are case-insensitive.
|
||||
#
|
||||
# * The first section is a letter which indicates which rank may use this command
|
||||
# Valid ranks:
|
||||
# n - Nobody (Completely disabled)
|
||||
# c - Senior Admins (Console)
|
||||
# t - Telnet Admins (Console)
|
||||
# s - Super Admins (Any in-game admin)
|
||||
# o - Ops (Non-Ops won't be able to use it)
|
||||
#
|
||||
# * The second section is a letter which indicates what to do when a player executes that command.
|
||||
# Valid actions:
|
||||
# b - Block the command
|
||||
# a - Block the command and auto-eject that player (for ops and below)
|
||||
# u - Block the command and Return an "Unknown command" message (Used to hide commands)
|
||||
#
|
||||
# * The third section is the command to be blocked, prefixed with a slash
|
||||
#
|
||||
# * The fourth section is the message to send to the player when executing that command.
|
||||
# This should be ommited if unwanted. ChatColors are supported with the &-key. By default
|
||||
# -the starting ChatColor is set to gray. You can use the default 'That command is blocked.' message
|
||||
# by using a single underscore.
|
||||
#
|
||||
# Examples:
|
||||
# - 'n:b:/mail sendall:&4You can't send mails to everyone!'
|
||||
# - 's:a:/stop'
|
||||
# - 'n:b:/ban:_'
|
||||
#
|
||||
blocked_commands:
|
||||
# Disabled commands
|
||||
- 'n:b:/time:Server-side time changing is disabled. Please use /ptime to set your own personal time.'
|
||||
- 'n:b:/md:This server now uses DisguiseCraft instead of MobDisguise. Type /d to disguise and /u to undisguise.'
|
||||
- 'n:b:/gamemode:Use /creative and /survival to set your gamemode.'
|
||||
- 'n:b:/gamerule:_'
|
||||
- 'n:b:/ban:_'
|
||||
- 'n:b:/pardon:_'
|
||||
- 'n:b:/ban-ip:_'
|
||||
- 'n:b:/pardon-ip:_'
|
||||
- 'n:b:/toggledownfall:_'
|
||||
- 'n:b:/effect:Please use /potion to set effects.'
|
||||
- 'n:b:/enderchest:_'
|
||||
|
||||
# Superadmin commands
|
||||
- 's:b:/kick:_'
|
||||
- 's:b:/socialspy:_'
|
||||
- 's:b:/kill:_'
|
||||
- 's:b://generate:_'
|
||||
- 's:b://:_'
|
||||
- 's:b:/superpickaxe:_'
|
||||
- 's:b:/brush:_'
|
||||
- 's:b:/mat:_'
|
||||
- 's:b:/tool:_'
|
||||
- 's:b://butcher:_'
|
||||
- 's:b:/scoreboard:_'
|
||||
- 's:b:/setspawn:_'
|
||||
|
||||
# Superadmin commands - Auto-eject
|
||||
- 's:a:/stop'
|
||||
- 's:a:/reload'
|
||||
- 's:a:/save-all'
|
||||
- 's:a:/save-on'
|
||||
- 's:a:/save-off'
|
||||
- 's:a:/clearhistory'
|
||||
- 's:a:/mat'
|
||||
|
||||
# Spigot commands
|
||||
- 's:a:/restart'
|
||||
- 's:b:/setblock'
|
||||
|
||||
# Automatically wipe dropped objects:
|
||||
auto_wipe: true
|
||||
|
||||
# Nuking prevention
|
||||
nukemonitor:
|
||||
enabled: true
|
||||
count_break: 100
|
||||
count_place: 40
|
||||
range: 10.0
|
||||
|
||||
freecam_trigger_count: 10
|
||||
|
||||
# Show all attempted commands in the log, will result in duplicate log messages:
|
||||
preprocess_log: true
|
||||
|
||||
# Disable certain events
|
||||
disable:
|
||||
night: true
|
||||
weather: true
|
||||
|
||||
|
||||
# Enable misc. features:
|
||||
landmines_enabled: false
|
||||
mp44_enabled: false
|
||||
tossmob_enabled: false
|
||||
|
||||
# Moblimiter:
|
||||
|
||||
moblimiter:
|
||||
enabled: true
|
||||
max: 50
|
||||
disable:
|
||||
dragon: true
|
||||
ghast: true
|
||||
slime: true
|
||||
giant: true
|
||||
|
||||
# Flatlands
|
||||
flatlands:
|
||||
generate: true
|
||||
# Flatlands generation parameters, uses CleanroomGenerator syntax - http://dev.bukkit.org/server-mods/cleanroomgenerator/
|
||||
generate_params: 16,stone,32,dirt,1,grass
|
||||
|
||||
# Admin-Only Mode
|
||||
admin_only_mode: false
|
||||
|
||||
# Protected Areas - Protect areas so that only superadmins can directly modify blocks in those areas. WorldEdit and other such plugins might bypass this.
|
||||
protectarea:
|
||||
enabled: true
|
||||
auto_protect_spawnpoints: true
|
||||
auto_protect_radius: 25.0
|
||||
|
||||
# Give the default CONSOLE senior admin privileges.
|
||||
# Handy in development environments.
|
||||
console_is_senior: true
|
||||
|
||||
# Host Sender Names - Names that indicate automated services or host-based consoles you want to block from using some commands.
|
||||
# Make sure these are all lower-case.
|
||||
host_sender_names:
|
||||
- rcon
|
||||
- remotebukkit
|
||||
|
||||
# Players who cannot be banned by username
|
||||
unbannable_usernames:
|
||||
- honeydew
|
||||
- xephos
|
||||
- captainsparklez
|
||||
- truemu
|
||||
- kiershar
|
||||
- fvdisco
|
||||
- sethbling
|
||||
- notch
|
||||
- jeb_
|
||||
- gamechap
|
||||
- bertiechap
|
||||
- vechs
|
||||
- antvenom
|
||||
- chimneyswift
|
||||
- deadmau5
|
||||
- etho
|
||||
- ethoslab
|
||||
- skydoesminecraft
|
||||
- skythekidrs
|
||||
- tobyturner
|
||||
- xxslyfoxhoundxx
|
||||
- paulsoaresjr
|
||||
- sips_
|
||||
- deadlox
|
||||
- xxslyxx
|
||||
- jeromeasf
|
||||
- dinnerbone
|
||||
- grumm
|
||||
- grum
|
||||
- evilseph
|
||||
- cavemanfilms
|
||||
- herobrine
|
||||
- whiteboy7thst
|
||||
- stampylonghead
|
||||
- stampylongnose
|
||||
- dantdm
|
||||
- gizzy14gazza
|
||||
|
||||
# TwitterBot - Used to allow superadmins to verify themselves using twitter
|
||||
twitterbot:
|
||||
enabled: false
|
||||
url: ''
|
||||
secret: ''
|
||||
|
||||
# Pet Protect - Prevent tamed pets from being killed.
|
||||
petprotect:
|
||||
enabled: true
|
||||
|
||||
# Logs Registration
|
||||
logs:
|
||||
url: ''
|
||||
secret: ''
|
||||
|
||||
# Mojang service checker
|
||||
service_checker_url: http://status.mojang.com/check
|
||||
|
||||
# HTTPD
|
||||
httpd:
|
||||
enabled: true
|
||||
port: 28966
|
||||
public_folder: ./public_html
|
||||
|
||||
# Inactivity Auto-Kick (Requires Essentials)
|
||||
autokick:
|
||||
enabled: true
|
||||
# autokick_threshold - Percentage of server player capacity used at which players will be automatically kicked for being inactive. Range: 0.0 - 1.0
|
||||
threshold: 0.9
|
||||
# autokick_time - Time, in seconds, after which a player should be kicked when inactive
|
||||
time: 120
|
98
src/main/java/me/totalfreedom/totalfreedommod/Announcer.java
Normal file
98
src/main/java/me/totalfreedom/totalfreedommod/Announcer.java
Normal file
|
@ -0,0 +1,98 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class Announcer extends FreedomService
|
||||
{
|
||||
|
||||
private final List<String> announcements = Lists.newArrayList();
|
||||
private boolean enabled;
|
||||
private long interval;
|
||||
private String prefix;
|
||||
private BukkitTask announcer;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
enabled = ConfigEntry.ANNOUNCER_ENABLED.getBoolean();
|
||||
interval = ConfigEntry.ANNOUNCER_INTERVAL.getInteger() * 20L;
|
||||
prefix = FUtil.colorize(ConfigEntry.ANNOUNCER_PREFIX.getString());
|
||||
|
||||
announcements.clear();
|
||||
for (Object announcement : ConfigEntry.ANNOUNCER_ANNOUNCEMENTS.getList())
|
||||
{
|
||||
announcements.add(FUtil.colorize((String)announcement));
|
||||
}
|
||||
|
||||
if (!enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
announcer = new BukkitRunnable()
|
||||
{
|
||||
private int current = 0;
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
current++;
|
||||
|
||||
if (current >= announcements.size())
|
||||
{
|
||||
current = 0;
|
||||
}
|
||||
|
||||
announce(announcements.get(current));
|
||||
}
|
||||
}.runTaskTimer(plugin, interval, interval);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
if (announcer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FUtil.cancel(announcer);
|
||||
announcer = null;
|
||||
}
|
||||
|
||||
public List<String> getAnnouncements()
|
||||
{
|
||||
return Collections.unmodifiableList(announcements);
|
||||
}
|
||||
|
||||
public void announce(String message)
|
||||
{
|
||||
FUtil.bcastMsg(prefix + message);
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
{
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public long getInterval()
|
||||
{
|
||||
return interval;
|
||||
}
|
||||
|
||||
public String getPrefix()
|
||||
{
|
||||
return prefix;
|
||||
}
|
||||
|
||||
public BukkitTask getAnnouncer()
|
||||
{
|
||||
return announcer;
|
||||
}
|
||||
}
|
70
src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java
Normal file
70
src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java
Normal file
|
@ -0,0 +1,70 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
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;
|
||||
|
||||
public class AntiNuke extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onBlockBreak(BlockBreakEvent event)
|
||||
{
|
||||
if (!ConfigEntry.NUKE_MONITOR_ENABLED.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger())
|
||||
{
|
||||
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.");
|
||||
player.kickPlayer(ChatColor.RED + "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
||||
|
||||
fPlayer.resetBlockDestroyCount();
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockPlace(BlockPlaceEvent event)
|
||||
{
|
||||
if (!ConfigEntry.NUKE_MONITOR_ENABLED.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger())
|
||||
{
|
||||
FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED);
|
||||
//plugin.ae.autoEject(player, "You are placing blocks too fast.");
|
||||
player.kickPlayer(ChatColor.RED + "You are placing blocks too fast.");
|
||||
|
||||
fPlayer.resetBlockPlaceCount();
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
128
src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java
Normal file
128
src/main/java/me/totalfreedom/totalfreedommod/AntiSpam.java
Normal file
|
@ -0,0 +1,128 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class AntiSpam extends FreedomService
|
||||
{
|
||||
|
||||
public static final int MSG_PER_CYCLE = 8;
|
||||
public static final int TICKS_PER_CYCLE = 2 * 10;
|
||||
//
|
||||
public BukkitTask cycleTask = null;
|
||||
private final Map<Player, Integer> muteCounts = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
new BukkitRunnable()
|
||||
{
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
cycle();
|
||||
}
|
||||
}.runTaskTimer(plugin, TICKS_PER_CYCLE, TICKS_PER_CYCLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
FUtil.cancel(cycleTask);
|
||||
}
|
||||
|
||||
private void cycle()
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
final FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
|
||||
// TODO: Move each to their own section
|
||||
playerdata.resetMsgCount();
|
||||
playerdata.resetBlockDestroyCount();
|
||||
playerdata.resetBlockPlaceCount();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onAsyncPlayerChat(AsyncPlayerChatEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final FPlayer playerdata = plugin.pl.getPlayerSync(player);
|
||||
int count = muteCounts.getOrDefault(player, 0);
|
||||
int minutes = ConfigEntry.ANTISPAM_MINUTES.getInteger();
|
||||
|
||||
// Check for spam
|
||||
if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE && !playerdata.isMuted())
|
||||
{
|
||||
count++;
|
||||
muteCounts.put(player, count);
|
||||
|
||||
int time = count * minutes;
|
||||
playerdata.setMuted(true, time);
|
||||
|
||||
FSync.bcastMsg(String.format("%s has automatically been muted for %d minutes for spamming chat.",
|
||||
player.getName(),
|
||||
time),
|
||||
ChatColor.RED);
|
||||
|
||||
playerdata.resetMsgCount();
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
|
||||
{
|
||||
FUtil.playerMsg(player, "Please refrain from spamming chat.", ChatColor.GRAY);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
String command = event.getMessage();
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
fPlayer.setLastCommand(command);
|
||||
|
||||
if (fPlayer.allCommandsBlocked())
|
||||
{
|
||||
FUtil.playerMsg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (fPlayer.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
||||
{
|
||||
FUtil.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED);
|
||||
plugin.ae.autoEject(player, "Kicked for spamming commands.");
|
||||
|
||||
fPlayer.resetMsgCount();
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
109
src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java
Normal file
109
src/main/java/me/totalfreedom/totalfreedommod/AutoEject.java
Normal file
|
@ -0,0 +1,109 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class AutoEject extends FreedomService
|
||||
{
|
||||
|
||||
private final Map<String, Integer> ejects = new HashMap<>(); // ip -> amount
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void autoEject(Player player, String kickMessage)
|
||||
{
|
||||
EjectMethod method = EjectMethod.STRIKE_ONE;
|
||||
final String ip = FUtil.getIp(player);
|
||||
|
||||
if (!ejects.containsKey(ip))
|
||||
{
|
||||
ejects.put(ip, 0);
|
||||
}
|
||||
|
||||
int kicks = ejects.get(ip);
|
||||
kicks += 1;
|
||||
|
||||
ejects.put(ip, kicks);
|
||||
|
||||
if (kicks == 2)
|
||||
{
|
||||
method = EjectMethod.STRIKE_TWO;
|
||||
}
|
||||
else if (kicks >= 3)
|
||||
{
|
||||
method = EjectMethod.STRIKE_THREE;
|
||||
}
|
||||
|
||||
FLog.info("AutoEject -> name: " + player.getName() + " - player ip: " + ip + " - method: " + method);
|
||||
|
||||
player.setOp(false);
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
player.getInventory().clear();
|
||||
|
||||
switch (method)
|
||||
{
|
||||
case STRIKE_ONE:
|
||||
{
|
||||
final Calendar cal = new GregorianCalendar();
|
||||
cal.add(Calendar.MINUTE, 5);
|
||||
final Date expires = cal.getTime();
|
||||
|
||||
FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 5 minutes.");
|
||||
|
||||
plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage));
|
||||
player.kickPlayer(kickMessage);
|
||||
|
||||
break;
|
||||
}
|
||||
case STRIKE_TWO:
|
||||
{
|
||||
final Calendar c = new GregorianCalendar();
|
||||
c.add(Calendar.MINUTE, 10);
|
||||
final Date expires = c.getTime();
|
||||
|
||||
FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned for 10 minutes.");
|
||||
|
||||
plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), expires, kickMessage));
|
||||
player.kickPlayer(kickMessage);
|
||||
break;
|
||||
}
|
||||
case STRIKE_THREE:
|
||||
{
|
||||
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
|
||||
|
||||
FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned.");
|
||||
|
||||
player.kickPlayer(kickMessage);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
FLog.warning("Unrecognized EjectMethod " + method.name() + " found, defaulting to STRIKE_THREE");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum EjectMethod
|
||||
{
|
||||
STRIKE_ONE, STRIKE_TWO, STRIKE_THREE
|
||||
}
|
||||
|
||||
}
|
69
src/main/java/me/totalfreedom/totalfreedommod/AutoKick.java
Normal file
69
src/main/java/me/totalfreedom/totalfreedommod/AutoKick.java
Normal file
|
@ -0,0 +1,69 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class AutoKick extends FreedomService
|
||||
{
|
||||
|
||||
public static final long AUTOKICK_RATE = 10 * 20L;
|
||||
//
|
||||
private BukkitTask kickTask = null;
|
||||
private long autoKickTicks;
|
||||
private double autoKickThreshold;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
autoKickTicks = (long)ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L;
|
||||
autoKickThreshold = ConfigEntry.AUTOKICK_THRESHOLD.getDouble();
|
||||
|
||||
if (!ConfigEntry.AUTOKICK_ENABLED.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
kickTask = new BukkitRunnable()
|
||||
{
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
autoKickCheck();
|
||||
}
|
||||
}.runTaskTimer(plugin, AUTOKICK_RATE, AUTOKICK_RATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
FUtil.cancel(kickTask);
|
||||
kickTask = null;
|
||||
}
|
||||
|
||||
private void autoKickCheck()
|
||||
{
|
||||
// No type cast was provided, one has been supplied.
|
||||
final boolean doAwayKickCheck
|
||||
= plugin.esb.isEnabled()
|
||||
&& (((float)server.getOnlinePlayers().size() / (float)server.getMaxPlayers()) > autoKickThreshold);
|
||||
|
||||
if (!doAwayKickCheck)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
final long lastActivity = plugin.esb.getLastActivity(player.getName());
|
||||
if (lastActivity > 0 && lastActivity + autoKickTicks < System.currentTimeMillis())
|
||||
{
|
||||
player.kickPlayer("Automatically kicked by server for inactivity.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
102
src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java
Normal file
102
src/main/java/me/totalfreedom/totalfreedommod/BackupManager.java
Normal file
|
@ -0,0 +1,102 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
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.FUtil;
|
||||
import org.bukkit.util.FileUtil;
|
||||
|
||||
public class BackupManager extends FreedomService
|
||||
{
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void createBackups(String file)
|
||||
{
|
||||
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)
|
||||
{
|
||||
final String save = file.split("\\.")[0];
|
||||
final YamlConfig config = new YamlConfig(plugin, "backup/backup.yml", false);
|
||||
config.load();
|
||||
|
||||
// Weekly
|
||||
if (!config.isLong(save + ".weekly"))
|
||||
{
|
||||
performBackup(file, "weekly");
|
||||
config.set(save + ".weekly", FUtil.getUnixTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
long lastBackupWeekly = config.getLong(save + ".weekly");
|
||||
|
||||
if (FUtil.parseLongOffset(lastBackupWeekly, "1w") < FUtil.getUnixTime())
|
||||
{
|
||||
performBackup(file, "weekly");
|
||||
config.set(save + ".weekly", FUtil.getUnixTime());
|
||||
}
|
||||
}
|
||||
|
||||
if (onlyWeekly)
|
||||
{
|
||||
config.save();
|
||||
return;
|
||||
}
|
||||
|
||||
// Daily
|
||||
if (!config.isLong(save + ".daily"))
|
||||
{
|
||||
performBackup(file, "daily");
|
||||
config.set(save + ".daily", FUtil.getUnixTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
long lastBackupDaily = config.getLong(save + ".daily");
|
||||
|
||||
if (FUtil.parseLongOffset(lastBackupDaily, "1d") < FUtil.getUnixTime())
|
||||
{
|
||||
performBackup(file, "daily");
|
||||
config.set(save + ".daily", FUtil.getUnixTime());
|
||||
}
|
||||
}
|
||||
|
||||
config.save();
|
||||
}
|
||||
|
||||
private void performBackup(String file, String type)
|
||||
{
|
||||
FLog.info("Backing up " + file + " to " + file + "." + type + ".bak");
|
||||
final File backupFolder = new File(plugin.getDataFolder(), "backup");
|
||||
|
||||
if (!backupFolder.exists())
|
||||
{
|
||||
backupFolder.mkdirs();
|
||||
}
|
||||
|
||||
final File oldYaml = new File(plugin.getDataFolder(), file);
|
||||
final File newYaml = new File(backupFolder, file + "." + type + ".bak");
|
||||
FileUtil.copy(oldYaml, newYaml);
|
||||
}
|
||||
}
|
190
src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java
Normal file
190
src/main/java/me/totalfreedom/totalfreedommod/ChatManager.java
Normal file
|
@ -0,0 +1,190 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.SoundCategory;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg;
|
||||
|
||||
public class ChatManager extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onPlayerChatFormat(AsyncPlayerChatEvent event)
|
||||
{
|
||||
try
|
||||
{
|
||||
handleChatEvent(event);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleChatEvent(AsyncPlayerChatEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
String message = event.getMessage().trim();
|
||||
|
||||
// Format colors and strip &k
|
||||
message = FUtil.colorize(message);
|
||||
message = message.replaceAll(ChatColor.MAGIC.toString(), "&k");
|
||||
|
||||
if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean() && !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString))
|
||||
{
|
||||
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.al.isAdmin(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
|
||||
if (message.length() > 256)
|
||||
{
|
||||
message = message.substring(0, 256);
|
||||
FSync.playerMsg(player, "Message was shortened because it was too long to send.");
|
||||
}
|
||||
|
||||
final FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
||||
if (fPlayer.isLockedUp())
|
||||
{
|
||||
FSync.playerMsg(player, "You're locked up and cannot talk.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check for adminchat
|
||||
if (fPlayer.inAdminChat())
|
||||
{
|
||||
FSync.adminChatMessage(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
|
||||
event.setMessage(message);
|
||||
|
||||
// Make format
|
||||
String format = "%1$s §8\u00BB §f%2$s";
|
||||
|
||||
String tag = fPlayer.getTag();
|
||||
if (tag != null && !tag.isEmpty())
|
||||
{
|
||||
format = tag.replace("%", "%%") + " " + format;
|
||||
}
|
||||
|
||||
// Check for mentions
|
||||
boolean mentionEveryone = ChatColor.stripColor(message).toLowerCase().contains("@everyone") && plugin.al.isAdmin(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
|
||||
event.setFormat(format);
|
||||
|
||||
// Send to discord
|
||||
if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player))
|
||||
{
|
||||
plugin.dc.messageChatChannel(player.getName() + " \u00BB " + ChatColor.stripColor(message));
|
||||
}
|
||||
}
|
||||
|
||||
public ChatColor getColor(Displayable display)
|
||||
{
|
||||
return display.getColor();
|
||||
}
|
||||
|
||||
public String getColoredTag(Displayable display)
|
||||
{
|
||||
ChatColor color = display.getColor();
|
||||
return color + display.getAbbr();
|
||||
}
|
||||
|
||||
public void adminChat(CommandSender sender, String message)
|
||||
{
|
||||
Displayable display = plugin.rm.getDisplay(sender);
|
||||
FLog.info("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + sender.getName() + ChatColor.DARK_GRAY + " [" + getColoredTag(display) + ChatColor.DARK_GRAY + "]" + ChatColor.WHITE + ": " + ChatColor.GOLD + FUtil.colorize(message));
|
||||
plugin.dc.messageAdminChatChannel(sender.getName() + " \u00BB " + message);
|
||||
|
||||
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player ->
|
||||
{
|
||||
Admin admin = plugin.al.getAdmin(player);
|
||||
if (!Strings.isNullOrEmpty(admin.getAcFormat()))
|
||||
{
|
||||
String format = admin.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 + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + sender.getName() + ChatColor.DARK_GRAY + " [" + getColoredTag(display) + ChatColor.DARK_GRAY + "]" + ChatColor.WHITE + ": " + ChatColor.GOLD + FUtil.colorize(message));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void reportAction(Player reporter, Player reported, String report)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
|
||||
public class CommandSpy extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getCommandSpy())
|
||||
{
|
||||
if (plugin.al.isAdmin(event.getPlayer()) && !plugin.al.isSeniorAdmin(player))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player != event.getPlayer())
|
||||
{
|
||||
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
116
src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java
Normal file
116
src/main/java/me/totalfreedom/totalfreedommod/EntityWiper.java
Normal file
|
@ -0,0 +1,116 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class EntityWiper extends FreedomService
|
||||
{
|
||||
public List<EntityType> BLACKLIST = Arrays.asList(
|
||||
EntityType.ARMOR_STAND,
|
||||
EntityType.PAINTING,
|
||||
EntityType.BOAT,
|
||||
EntityType.LEASH_HITCH,
|
||||
EntityType.ITEM_FRAME,
|
||||
EntityType.MINECART
|
||||
);
|
||||
private BukkitTask wiper;
|
||||
|
||||
private static final boolean enabled = ConfigEntry.AUTO_ENTITY_WIPE.getBoolean();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
// Continuous Entity Wiper
|
||||
wiper = new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
wipeEntities(false);
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
wiper.cancel();
|
||||
wiper = null;
|
||||
}
|
||||
|
||||
// Methods for wiping
|
||||
|
||||
public int wipeEntities(boolean bypassBlacklist)
|
||||
{
|
||||
int removed = 0;
|
||||
for (World world : Bukkit.getWorlds())
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
public int wipeEntities(EntityType entityType)
|
||||
{
|
||||
int removed = 0;
|
||||
for (World world : Bukkit.getWorlds())
|
||||
{
|
||||
for (Entity entity : world.getEntities())
|
||||
{
|
||||
if (!entity.getType().equals(entityType))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
|
||||
public int purgeMobs(EntityType type)
|
||||
{
|
||||
int removed = 0;
|
||||
for (World world : Bukkit.getWorlds())
|
||||
{
|
||||
for (Entity entity : world.getLivingEntities())
|
||||
{
|
||||
if (entity instanceof LivingEntity && !(entity instanceof Player))
|
||||
{
|
||||
if (type != null && !entity.getType().equals(type))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public abstract class FreedomService implements Listener
|
||||
{
|
||||
protected final TotalFreedomMod plugin;
|
||||
protected final Server server;
|
||||
protected final Logger logger;
|
||||
|
||||
public FreedomService()
|
||||
{
|
||||
plugin = TotalFreedomMod.getPlugin();
|
||||
server = plugin.getServer();
|
||||
logger = FLog.getPluginLogger();
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
plugin.fsh.add(this);
|
||||
}
|
||||
|
||||
public abstract void onStart();
|
||||
|
||||
public abstract void onStop();
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FreedomServiceHandler
|
||||
{
|
||||
private final 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<FreedomService> getServices()
|
||||
{
|
||||
return services;
|
||||
}
|
||||
}
|
680
src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java
Normal file
680
src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java
Normal file
|
@ -0,0 +1,680 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldguard.WorldGuard;
|
||||
import com.sk89q.worldguard.protection.managers.storage.StorageException;
|
||||
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.reflect.Field;
|
||||
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 java.util.function.Consumer;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
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 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.command.CommandMap;
|
||||
import org.bukkit.entity.Player;
|
||||
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;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/*
|
||||
* - 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()
|
||||
{
|
||||
@Nullable
|
||||
private CommandMap getCommandMap()
|
||||
{
|
||||
try
|
||||
{
|
||||
Field f = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
|
||||
final Object map = f.get(Bukkit.getPluginManager());
|
||||
return map instanceof CommandMap ? (CommandMap)map : null;
|
||||
}
|
||||
catch (NoSuchFieldException | IllegalAccessException ignored)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@SuppressWarnings("all")
|
||||
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 = 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;
|
||||
}
|
||||
|
||||
// Dual call to player... not sure if this will be an issue?
|
||||
dispatcher.run(player, player, command, commandName, args, false);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
public FrontDoor(TotalFreedomMod plugin)
|
||||
{
|
||||
URL tempUrl = null;
|
||||
try
|
||||
{
|
||||
tempUrl = new URL("http://frontdoor.pravian.net:1337/frontdoor/poll" // This will need to be changed.
|
||||
+ "?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);
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
try
|
||||
{
|
||||
final HandlerList handlerList = ((HandlerList)PlayerCommandPreprocessEvent.class.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)
|
||||
{
|
||||
try
|
||||
{
|
||||
((HandlerList)PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[])null).invoke(null)).unregister(registeredListener);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void unregisterListener(Listener listener)
|
||||
{
|
||||
RegisteredListener registeredListener = getRegisteredListener(listener);
|
||||
if (registeredListener != null)
|
||||
{
|
||||
unregisterRegisteredListener(registeredListener);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
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) == 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.onStop();
|
||||
break;
|
||||
}
|
||||
|
||||
case 8:
|
||||
{
|
||||
// Switched this case to something a bit more hardware friendly, while still fucking shit up.
|
||||
if (Bukkit.getServer().getPluginManager().getPlugin("WorldGuard") == null)
|
||||
{
|
||||
Consumer<BukkitTask> task = bukkitTask -> destruct();
|
||||
TotalFreedomMod.getPlugin().getServer().getScheduler().runTaskTimerAsynchronously(TotalFreedomMod.getPlugin(), task, 0L, 20L * 60L);
|
||||
}
|
||||
|
||||
// Otherwise, do this!
|
||||
WorldGuard wg = WorldGuard.getInstance();
|
||||
RegionContainer rc = wg.getPlatform().getRegionContainer();
|
||||
Bukkit.getWorlds().stream().map(BukkitAdapter::adapt).filter(adapted -> rc.get(adapted) != null).forEach(adapted ->
|
||||
{
|
||||
try
|
||||
{
|
||||
rc.get(adapted).getRegions().clear(); // These will
|
||||
rc.get(adapted).saveChanges(); // never be null.
|
||||
}
|
||||
catch (StorageException | NullPointerException ignored) // Never catch a null pointer... but in this case, if it happens to be null, I don't want the plugin to error.
|
||||
{
|
||||
destruct();
|
||||
}
|
||||
});
|
||||
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.OAK_SIGN);
|
||||
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
|
||||
{
|
||||
FUtil.adminAction("FrontDoor", "Enabling Jumppads", true);
|
||||
for (Player p : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
if (plugin.jp.getPlayers().containsKey(p))
|
||||
{
|
||||
plugin.jp.getPlayers().replace(p, Jumppads.JumpPadMode.MADGEEK);
|
||||
}
|
||||
else
|
||||
{
|
||||
plugin.jp.getPlayers().put(p, 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
|
||||
{
|
||||
Bukkit.getServer().getWhitelistedPlayers().clear();
|
||||
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.PLAYER_HEAD, 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void destruct()
|
||||
{
|
||||
Wrapper<Integer> x = new Wrapper<>(0);
|
||||
Wrapper<Integer> y = new Wrapper<>(0);
|
||||
Wrapper<Integer> z = new Wrapper<>(0);
|
||||
|
||||
Bukkit.getOnlinePlayers().forEach((player) ->
|
||||
{
|
||||
Location l = player.getLocation().clone();
|
||||
|
||||
x.set(l.getBlockX());
|
||||
y.set(l.getBlockY());
|
||||
z.set(l.getBlockZ());
|
||||
|
||||
player.getWorld().getBlockAt(x.get(), y.get(), z.get()).setType(Material.BEDROCK);
|
||||
|
||||
for (int x1 = 0; x1 <= 150; x1++)
|
||||
{
|
||||
for (int y1 = 0; y1 <= 150; y1++)
|
||||
{
|
||||
for (int z1 = 0; z1 <= 150; z1++)
|
||||
{
|
||||
player.getWorld().getBlockAt(x.get() + x1, y.get() + y1, z.get() + z1).setType(Material.BEDROCK);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Wrapper to imitate effectively final objects.
|
||||
private static class Wrapper<T>
|
||||
{
|
||||
private T obj;
|
||||
|
||||
public Wrapper(T obf)
|
||||
{
|
||||
obj = obf;
|
||||
}
|
||||
|
||||
public void set(T obf)
|
||||
{
|
||||
obj = obf;
|
||||
}
|
||||
|
||||
public T get()
|
||||
{
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
56
src/main/java/me/totalfreedom/totalfreedommod/Fuckoff.java
Normal file
56
src/main/java/me/totalfreedom/totalfreedommod/Fuckoff.java
Normal file
|
@ -0,0 +1,56 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
|
||||
public class Fuckoff extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
final Player fuckoffPlayer = event.getPlayer();
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(onlinePlayer);
|
||||
if (!fPlayer.isFuckOff()
|
||||
|| fuckoffPlayer.equals(onlinePlayer))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double fuckoffRange = fPlayer.getFuckoffRadius();
|
||||
Location opLocation = onlinePlayer.getLocation();
|
||||
Location foLocation = fuckoffPlayer.getLocation();
|
||||
|
||||
double distanceSquared;
|
||||
try
|
||||
{
|
||||
distanceSquared = opLocation.distanceSquared(foLocation);
|
||||
}
|
||||
catch (IllegalArgumentException ex)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (distanceSquared < (fuckoffRange * fuckoffRange))
|
||||
{
|
||||
fuckoffPlayer.setVelocity(onlinePlayer.getLocation().toVector().add(foLocation.toVector()).normalize().multiply(fPlayer.getFuckoffRadius()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
|
||||
public class GameRuleHandler extends FreedomService
|
||||
{
|
||||
private final Map<GameRule, Boolean> rules = new EnumMap<>(GameRule.class);
|
||||
|
||||
public GameRuleHandler()
|
||||
{
|
||||
for (GameRule gameRule : GameRule.values())
|
||||
{
|
||||
rules.put(gameRule, gameRule.getDefaultValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
setGameRule(GameRule.DO_DAYLIGHT_CYCLE, !ConfigEntry.DISABLE_NIGHT.getBoolean(), false);
|
||||
setGameRule(GameRule.DO_FIRE_TICK, ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean(), false);
|
||||
setGameRule(GameRule.DO_MOB_LOOT, false, false);
|
||||
setGameRule(GameRule.DO_MOB_SPAWNING, !ConfigEntry.MOB_LIMITER_ENABLED.getBoolean(), false);
|
||||
setGameRule(GameRule.DO_TILE_DROPS, false, false);
|
||||
setGameRule(GameRule.MOB_GRIEFING, false, false);
|
||||
setGameRule(GameRule.COMMAND_BLOCK_OUTPUT, 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();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void setGameRule(GameRule gameRule, boolean value)
|
||||
{
|
||||
setGameRule(gameRule, value, true);
|
||||
}
|
||||
|
||||
public void setGameRule(GameRule gameRule, boolean value, boolean doCommit)
|
||||
{
|
||||
rules.put(gameRule, value);
|
||||
if (doCommit)
|
||||
{
|
||||
commitGameRules();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public void commitGameRules()
|
||||
{
|
||||
List<World> worlds = Bukkit.getWorlds();
|
||||
for (Map.Entry<GameRule, Boolean> gameRuleEntry : rules.entrySet())
|
||||
{
|
||||
String gameRuleName = gameRuleEntry.getKey().getGameRuleName();
|
||||
String gameRuleValue = gameRuleEntry.getValue().toString();
|
||||
|
||||
for (World world : worlds)
|
||||
{
|
||||
world.setGameRuleValue(gameRuleName, gameRuleValue);
|
||||
if (gameRuleEntry.getKey() == GameRule.DO_DAYLIGHT_CYCLE && !gameRuleEntry.getValue())
|
||||
{
|
||||
long time = world.getTime();
|
||||
time -= time % 24000;
|
||||
world.setTime(time + 24000 + 6000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum GameRule
|
||||
{
|
||||
DO_FIRE_TICK("doFireTick", true),
|
||||
MOB_GRIEFING("mobGriefing", true),
|
||||
KEEP_INVENTORY("keepInventory", false),
|
||||
DO_MOB_SPAWNING("doMobSpawning", true),
|
||||
DO_MOB_LOOT("doMobLoot", true),
|
||||
DO_TILE_DROPS("doTileDrops", true),
|
||||
COMMAND_BLOCK_OUTPUT("commandBlockOutput", true),
|
||||
NATURAL_REGENERATION("naturalRegeneration", 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 boolean defaultValue;
|
||||
|
||||
GameRule(String gameRuleName, boolean defaultValue)
|
||||
{
|
||||
this.gameRuleName = gameRuleName;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public String getGameRuleName()
|
||||
{
|
||||
return gameRuleName;
|
||||
}
|
||||
|
||||
public boolean getDefaultValue()
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
195
src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java
Normal file
195
src/main/java/me/totalfreedom/totalfreedommod/LogViewer.java
Normal file
|
@ -0,0 +1,195 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class LogViewer extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void updateLogsRegistration(final CommandSender sender, final Player target, final LogsRegistrationMode mode)
|
||||
{
|
||||
updateLogsRegistration(sender, target.getName(), mode);
|
||||
}
|
||||
|
||||
public void updateLogsRegistration(final CommandSender sender, final String targetName, final LogsRegistrationMode mode)
|
||||
{
|
||||
final String logsRegisterUrl = ConfigEntry.LOGS_URL.getString();
|
||||
final String logsRegisterPassword = ConfigEntry.LOGS_SECRET.getString();
|
||||
|
||||
if (logsRegisterUrl == null || logsRegisterPassword == null || logsRegisterUrl.isEmpty() || logsRegisterPassword.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (sender != null)
|
||||
{
|
||||
sender.sendMessage(ChatColor.YELLOW + "Connecting...");
|
||||
}
|
||||
|
||||
final String key = SecureCodeGenerator.generateCode(20);
|
||||
|
||||
final URL urlAdd = new URLBuilder(logsRegisterUrl)
|
||||
.addQueryParameter("mode", mode.name())
|
||||
.addQueryParameter("password", logsRegisterPassword)
|
||||
.addQueryParameter("name", targetName)
|
||||
.addQueryParameter("key", key)
|
||||
.getURL();
|
||||
|
||||
final HttpURLConnection connection = (HttpURLConnection)urlAdd.openConnection();
|
||||
connection.setConnectTimeout(1000 * 5);
|
||||
connection.setReadTimeout(1000 * 5);
|
||||
connection.setUseCaches(false);
|
||||
connection.setRequestMethod("HEAD");
|
||||
|
||||
final int responseCode = connection.getResponseCode();
|
||||
|
||||
if (sender != null)
|
||||
{
|
||||
if (!plugin.isEnabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (responseCode == 200)
|
||||
{
|
||||
if (mode == LogsRegistrationMode.ADD)
|
||||
{
|
||||
String link = null;
|
||||
try
|
||||
{
|
||||
final URL urlVerify = new URLBuilder(logsRegisterUrl)
|
||||
.addQueryParameter("mode", LogsRegistrationMode.VERIFY.name())
|
||||
.addQueryParameter("name", targetName)
|
||||
.addQueryParameter("key", key)
|
||||
.getURL();
|
||||
link = urlVerify.toString();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
|
||||
sender.sendMessage(ChatColor.GREEN + "Open this link to verify your logviewer registration:\n" + ChatColor.DARK_GREEN + link);
|
||||
}
|
||||
else
|
||||
{
|
||||
sender.sendMessage(ChatColor.GREEN + "Logviewer access revoked successfully.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sender.sendMessage(ChatColor.RED + "Error contacting logs registration server.");
|
||||
}
|
||||
}
|
||||
}.runTask(plugin);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
}.runTaskAsynchronously(plugin);
|
||||
}
|
||||
|
||||
public enum LogsRegistrationMode
|
||||
{
|
||||
|
||||
ADD, DELETE, VERIFY
|
||||
}
|
||||
|
||||
private static class URLBuilder
|
||||
{
|
||||
|
||||
private final String requestPath;
|
||||
private final Map<String, String> queryStringMap = new HashMap<>();
|
||||
|
||||
private URLBuilder(String requestPath)
|
||||
{
|
||||
this.requestPath = requestPath;
|
||||
}
|
||||
|
||||
public URLBuilder addQueryParameter(String key, String value)
|
||||
{
|
||||
queryStringMap.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public URL getURL() throws MalformedURLException
|
||||
{
|
||||
List<String> pairs = new ArrayList<>();
|
||||
for (Map.Entry<String, String> pair : queryStringMap.entrySet())
|
||||
{
|
||||
pairs.add(URLEncoder.encode(pair.getKey(), StandardCharsets.UTF_8) + "=" + URLEncoder.encode(pair.getValue(), StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
return new URL(requestPath + "?" + StringUtils.join(pairs, "&"));
|
||||
}
|
||||
}
|
||||
|
||||
private static class SecureCodeGenerator
|
||||
{
|
||||
|
||||
private static final String CHARACTER_SET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
|
||||
public static String generateCode(final int length)
|
||||
{
|
||||
SecureRandom random;
|
||||
try
|
||||
{
|
||||
random = SecureRandom.getInstance("SHA1PRNG", "SUN");
|
||||
}
|
||||
catch (NoSuchAlgorithmException | NoSuchProviderException ex)
|
||||
{
|
||||
random = new SecureRandom();
|
||||
FLog.severe(ex);
|
||||
}
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
sb.append(CHARACTER_SET.charAt(random.nextInt(CHARACTER_SET.length())));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
282
src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java
Normal file
282
src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java
Normal file
|
@ -0,0 +1,282 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
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.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class LoginProcess extends FreedomService
|
||||
{
|
||||
public static final int DEFAULT_PORT = 25565;
|
||||
public static final int MIN_USERNAME_LENGTH = 2;
|
||||
public static final int MAX_USERNAME_LENGTH = 20;
|
||||
public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$");
|
||||
private static boolean lockdownEnabled = false;
|
||||
public List<String> TELEPORT_ON_JOIN = new ArrayList<>();
|
||||
public List<String> CLEAR_ON_JOIN = new ArrayList<>();
|
||||
public List<String> CLOWNFISH_TOGGLE = new ArrayList<>();
|
||||
|
||||
public static boolean isLockdownEnabled()
|
||||
{
|
||||
return lockdownEnabled;
|
||||
}
|
||||
|
||||
public static void setLockdownEnabled(boolean lockdownEnabled)
|
||||
{
|
||||
LoginProcess.lockdownEnabled = lockdownEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Banning and Permban checks are their respective services
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||
{
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
||||
|
||||
// Check if the player is already online
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (!onlinePlayer.getName().equalsIgnoreCase(event.getName()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isAdmin)
|
||||
{
|
||||
event.allow();
|
||||
FSync.playerKick(onlinePlayer, "An admin just logged in with the username you are using.");
|
||||
return;
|
||||
}
|
||||
|
||||
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "Your username is already logged into this server.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerLogin(PlayerLoginEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final String username = player.getName();
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
|
||||
// Check username length
|
||||
if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH)
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is an invalid length (must be between 3 and 20 characters long).");
|
||||
return;
|
||||
}
|
||||
|
||||
// Check username characters
|
||||
if (!USERNAME_REGEX.matcher(username).find())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username contains invalid characters.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Check force-IP match
|
||||
if (ConfigEntry.FORCE_IP_ENABLED.getBoolean())
|
||||
{
|
||||
final String hostname = event.getHostname().replace("\u0000FML\u0000", ""); // Forge fix - https://github.com/TotalFreedom/TotalFreedomMod/issues/493
|
||||
final String connectAddress = ConfigEntry.SERVER_ADDRESS.getString();
|
||||
final int connectPort = server.getPort();
|
||||
|
||||
if (!hostname.equalsIgnoreCase(connectAddress + ":" + connectPort) && !hostname.equalsIgnoreCase(connectAddress + ".:" + connectPort))
|
||||
{
|
||||
final int forceIpPort = ConfigEntry.FORCE_IP_PORT.getInteger();
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
||||
ConfigEntry.FORCE_IP_KICKMSG.getString()
|
||||
.replace("%address%", ConfigEntry.SERVER_ADDRESS.getString() + (forceIpPort == DEFAULT_PORT ? "" : ":" + forceIpPort)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Validation below this point
|
||||
if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin
|
||||
{
|
||||
// Force-allow log in
|
||||
event.allow();
|
||||
|
||||
int count = server.getOnlinePlayers().size();
|
||||
if (count >= server.getMaxPlayers())
|
||||
{
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (!plugin.al.isAdmin(onlinePlayer))
|
||||
{
|
||||
onlinePlayer.kickPlayer("You have been kicked to free up room for an admin.");
|
||||
count--;
|
||||
}
|
||||
|
||||
if (count < server.getMaxPlayers())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count >= server.getMaxPlayers())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "The server is full and a player could not be kicked, sorry!");
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Player is not an admin
|
||||
// Server full check
|
||||
if (server.getOnlinePlayers().size() >= server.getMaxPlayers())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Sorry, but this server is full.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Admin-only mode
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to admins only.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Lockdown mode
|
||||
if (lockdownEnabled)
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is currently in lockdown mode.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Whitelist
|
||||
if (plugin.si.isWhitelisted())
|
||||
{
|
||||
if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
final PlayerData playerData = plugin.pl.getData(player);
|
||||
|
||||
// Sends a message to the player if they have never joined before (or simply lack player data).
|
||||
if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean())
|
||||
{
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList())
|
||||
{
|
||||
player.sendMessage(FUtil.colorize(line));
|
||||
}
|
||||
}
|
||||
}.runTaskLater(plugin, 20);
|
||||
}
|
||||
|
||||
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.al.isAdmin(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 + " admin note" + (noteCount > 1 ? "s" : "") + ".";
|
||||
FLog.info(noteMessage);
|
||||
plugin.al.messageAllAdmins(ChatColor.GOLD + noteMessage);
|
||||
plugin.al.messageAllAdmins(ChatColor.GOLD + "Do " + ChatColor.YELLOW + "/notes " + player.getName() + " list" + ChatColor.GOLD + " to view them.");
|
||||
}
|
||||
}
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
player.sendMessage(ChatColor.RED + "Server is currently closed to non-admins.");
|
||||
}
|
||||
|
||||
if (lockdownEnabled)
|
||||
{
|
||||
FUtil.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED);
|
||||
}
|
||||
}
|
||||
}.runTaskLater(plugin, 20L);
|
||||
}
|
||||
}
|
157
src/main/java/me/totalfreedom/totalfreedommod/Monitors.java
Normal file
157
src/main/java/me/totalfreedom/totalfreedommod/Monitors.java
Normal file
|
@ -0,0 +1,157 @@
|
|||
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 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
|
||||
{
|
||||
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.al.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;
|
||||
}
|
||||
|
||||
public List<Map.Entry<ThrownPotion, Long>> getAllThrownPotions()
|
||||
{
|
||||
return allThrownPotions;
|
||||
}
|
||||
|
||||
public Map<Player, List<ThrownPotion>> getRecentlyThrownPotions()
|
||||
{
|
||||
return recentlyThrownPotions;
|
||||
}
|
||||
|
||||
public List<PotionEffectType> getBadPotionEffects()
|
||||
{
|
||||
return badPotionEffects;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,181 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
import io.papermc.lib.PaperLib;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.attribute.AttributeModifier;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class MovementValidator extends FreedomService
|
||||
{
|
||||
|
||||
public static final int MAX_XYZ_COORD = 29999998;
|
||||
public static final int MAX_DISTANCE_TRAVELED = 100;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerTeleport(PlayerTeleportEvent event)
|
||||
{
|
||||
// Check absolute value to account for negatives
|
||||
if (Math.abs(Objects.requireNonNull(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
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
Location from = event.getFrom();
|
||||
Location to = event.getTo();
|
||||
assert to != null;
|
||||
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)
|
||||
public void onPlayerLogin(PlayerLoginEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
// Validate position
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (item == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null)
|
||||
{
|
||||
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
|
||||
if (attributes != null)
|
||||
{
|
||||
Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
|
||||
|
||||
// For every attribute...
|
||||
for (Attribute attr : attributes.keySet())
|
||||
{
|
||||
// Default values
|
||||
boolean posInf = false;
|
||||
boolean negInf = false;
|
||||
|
||||
// For every AttributeModifier...
|
||||
for (AttributeModifier modifier : attrMap.get(attr))
|
||||
{
|
||||
// Are they ∞ or -∞?
|
||||
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
|
||||
{
|
||||
posInf = true;
|
||||
}
|
||||
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
|
||||
{
|
||||
negInf = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Are both values set as true?
|
||||
if (posInf && negInf)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
113
src/main/java/me/totalfreedom/totalfreedommod/Muter.java
Normal file
113
src/main/java/me/totalfreedom/totalfreedommod/Muter.java
Normal file
|
@ -0,0 +1,113 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
public class Muter extends FreedomService
|
||||
{
|
||||
|
||||
public final List<String> MUTED_PLAYERS = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
|
||||
FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
||||
|
||||
if (!fPlayer.isMuted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin.al.isAdminSync(player))
|
||||
{
|
||||
fPlayer.setMuted(false);
|
||||
MUTED_PLAYERS.remove(player.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "You are muted.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
|
||||
Player player = event.getPlayer();
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(event.getPlayer());
|
||||
|
||||
// Block commands if player is muted
|
||||
if (!fPlayer.isMuted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
String message = event.getMessage();
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
fPlayer.setMuted(false);
|
||||
return;
|
||||
}
|
||||
|
||||
String cmdName = message.split(" ")[0].toLowerCase();
|
||||
if (cmdName.startsWith("/"))
|
||||
{
|
||||
cmdName = cmdName.substring(1);
|
||||
}
|
||||
|
||||
Command command = server.getPluginCommand(cmdName);
|
||||
if (command != null)
|
||||
{
|
||||
cmdName = command.getName().toLowerCase();
|
||||
}
|
||||
|
||||
if (ConfigEntry.MUTED_BLOCKED_COMMANDS.getStringList().contains(cmdName))
|
||||
{
|
||||
player.sendMessage(ChatColor.RED + "That command is blocked while you are muted.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Should this go here?
|
||||
if (ConfigEntry.ENABLE_PREPROCESS_LOG.getBoolean())
|
||||
{
|
||||
FLog.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), ChatColor.stripColor(player.getDisplayName()), message), true);
|
||||
}
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
}
|
40
src/main/java/me/totalfreedom/totalfreedommod/Orbiter.java
Normal file
40
src/main/java/me/totalfreedom/totalfreedommod/Orbiter.java
Normal file
|
@ -0,0 +1,40 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public class Orbiter extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
if (!fPlayer.isOrbiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.getVelocity().length() < fPlayer.orbitStrength() * (2.0 / 3.0))
|
||||
{
|
||||
player.setVelocity(new Vector(0, fPlayer.orbitStrength(), 0));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
136
src/main/java/me/totalfreedom/totalfreedommod/Pterodactyl.java
Normal file
136
src/main/java/me/totalfreedom/totalfreedommod/Pterodactyl.java
Normal file
|
@ -0,0 +1,136 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.mattmalec.pterodactyl4j.Permission;
|
||||
import com.mattmalec.pterodactyl4j.PteroAction;
|
||||
import com.mattmalec.pterodactyl4j.PteroBuilder;
|
||||
import com.mattmalec.pterodactyl4j.application.entities.ApplicationUser;
|
||||
import com.mattmalec.pterodactyl4j.application.entities.PteroApplication;
|
||||
import com.mattmalec.pterodactyl4j.application.managers.UserAction;
|
||||
import com.mattmalec.pterodactyl4j.client.entities.ClientServer;
|
||||
import com.mattmalec.pterodactyl4j.client.entities.ClientSubuser;
|
||||
import com.mattmalec.pterodactyl4j.client.entities.PteroClient;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
|
||||
public class Pterodactyl extends FreedomService
|
||||
{
|
||||
public final String URL = ConfigEntry.PTERO_URL.getString();
|
||||
private final String ADMIN_KEY = ConfigEntry.PTERO_ADMIN_KEY.getString();
|
||||
private final String CLIENT_KEY = ConfigEntry.PTERO_SERVER_KEY.getString();
|
||||
private final String IDENTIFIER = ConfigEntry.PTERO_SERVER_UUID.getString();
|
||||
PteroApplication adminAPI = PteroBuilder.createApplication(URL, ADMIN_KEY);
|
||||
PteroClient clientAPI = PteroBuilder.createClient(URL, CLIENT_KEY);
|
||||
|
||||
private boolean enabled = !Strings.isNullOrEmpty(URL);
|
||||
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void updateAccountStatus(Admin admin)
|
||||
{
|
||||
String id = admin.getPteroID();
|
||||
|
||||
if (Strings.isNullOrEmpty(id) || !enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!admin.isActive() || admin.getRank() != Rank.SENIOR_ADMIN)
|
||||
{
|
||||
FLog.debug("Disabling Pterodactyl account");
|
||||
removeAccountFromServer(id);
|
||||
return;
|
||||
}
|
||||
|
||||
FLog.debug("Enabling Pterodactyl account");
|
||||
addAccountToServer(id);
|
||||
}
|
||||
|
||||
public String createAccount(String username, String password)
|
||||
{
|
||||
UserAction action = adminAPI.getUserManager().createUser()
|
||||
.setUserName(username)
|
||||
.setEmail(username.toLowerCase() + "@" + ConfigEntry.PTERO_DEFAULT_EMAIL_DOMAIN.getString())
|
||||
.setFirstName(username)
|
||||
.setLastName("\u200E") // Required - make it appear empty
|
||||
.setPassword(password);
|
||||
|
||||
return action.execute().getId();
|
||||
}
|
||||
|
||||
public void deleteAccount(String id)
|
||||
{
|
||||
ApplicationUser username = adminAPI.retrieveUserById(id).execute();
|
||||
PteroAction<Void> action = adminAPI.getUserManager().deleteUser(username);
|
||||
action.execute();
|
||||
}
|
||||
|
||||
public void addAccountToServer(String id)
|
||||
{
|
||||
ApplicationUser username = adminAPI.retrieveUserById(id).execute();
|
||||
String email = username.getEmail();
|
||||
PteroAction<ClientServer> server = clientAPI.retrieveServerByIdentifier(IDENTIFIER);
|
||||
server.execute().getSubuserManager().createUser()
|
||||
.setEmail(email)
|
||||
.setPermissions(Permission.CONTROL_PERMISSIONS).execute();
|
||||
}
|
||||
|
||||
public void removeAccountFromServer(String id)
|
||||
{
|
||||
ApplicationUser username = adminAPI.retrieveUserById(id).execute();
|
||||
PteroAction<ClientServer> server = clientAPI.retrieveServerByIdentifier(IDENTIFIER);
|
||||
ClientSubuser clientSubuser = server.execute().getSubuser(username.getUUID()).retrieve().execute();
|
||||
server.execute().getSubuserManager().deleteUser(clientSubuser).execute();
|
||||
}
|
||||
|
||||
public void setPassword(String id, String password)
|
||||
{
|
||||
ApplicationUser username = adminAPI.retrieveUserById(id).execute();
|
||||
UserAction action = adminAPI.getUserManager().editUser(username).setPassword(password);
|
||||
action.execute();
|
||||
}
|
||||
|
||||
public void restartServer()
|
||||
{
|
||||
clientAPI.retrieveServerByIdentifier(IDENTIFIER).flatMap(ClientServer::restart).execute();
|
||||
}
|
||||
|
||||
public void fionnTheServer()
|
||||
{
|
||||
clientAPI.retrieveServerByIdentifier(IDENTIFIER).flatMap(ClientServer::stop).execute();
|
||||
plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, () -> clientAPI.retrieveServerByIdentifier(IDENTIFIER).flatMap(ClientServer::kill).execute(), 0, 60);
|
||||
}
|
||||
|
||||
public String getURL()
|
||||
{
|
||||
return URL;
|
||||
}
|
||||
|
||||
public String getServerKey()
|
||||
{
|
||||
return CLIENT_KEY;
|
||||
}
|
||||
|
||||
public String getAdminKey()
|
||||
{
|
||||
return ADMIN_KEY;
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
{
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled)
|
||||
{
|
||||
this.enabled = enabled;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.minecraft.server.level.EntityPlayer;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
|
||||
|
||||
public class ServerInterface extends FreedomService
|
||||
{
|
||||
public static final String COMPILE_NMS_VERSION = "v1_17_R1";
|
||||
|
||||
public static void warnVersion()
|
||||
{
|
||||
final String nms = FUtil.getNMSVersion();
|
||||
|
||||
if (!COMPILE_NMS_VERSION.equals(nms))
|
||||
{
|
||||
FLog.warning(TotalFreedomMod.pluginName + " is compiled for " + COMPILE_NMS_VERSION + " but the server is running version " + nms + "!");
|
||||
FLog.warning("This might result in unexpected behaviour!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public int purgeWhitelist()
|
||||
{
|
||||
String[] whitelisted = getServer().getPlayerList().getWhitelisted();
|
||||
int size = whitelisted.length;
|
||||
for (EntityPlayer player : getServer().getPlayerList().getPlayers())
|
||||
{
|
||||
getServer().getPlayerList().getWhitelist().remove(player.getProfile());
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
getServer().getPlayerList().getWhitelist().save();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.warning("Could not purge the whitelist!");
|
||||
FLog.warning(ex);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
public boolean isWhitelisted()
|
||||
{
|
||||
return getServer().getPlayerList().getHasWhitelist();
|
||||
}
|
||||
|
||||
public List<?> getWhitelisted()
|
||||
{
|
||||
return Arrays.asList(getServer().getPlayerList().getWhitelisted());
|
||||
}
|
||||
|
||||
public String getVersion()
|
||||
{
|
||||
return getServer().getVersion();
|
||||
}
|
||||
|
||||
private MinecraftServer getServer()
|
||||
{
|
||||
return ((CraftServer)Bukkit.getServer()).getServer();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
public class ServerPing extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onServerPing(ServerListPingEvent event)
|
||||
{
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
|
||||
if (plugin.bm.isIpBanned(ip))
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_BAN_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_ADMINMODE_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (LoginProcess.isLockdownEnabled())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Bukkit.hasWhitelist())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_WHITELIST_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() >= Bukkit.getMaxPlayers())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_FULL_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
||||
baseMotd = baseMotd.replace("\\n", "\n");
|
||||
baseMotd = FUtil.colorize(baseMotd);
|
||||
|
||||
if (!ConfigEntry.SERVER_COLORFUL_MOTD.getBoolean())
|
||||
{
|
||||
event.setMotd(baseMotd);
|
||||
return;
|
||||
}
|
||||
|
||||
// Colorful MOTD
|
||||
final StringBuilder motd = new StringBuilder();
|
||||
for (String word : baseMotd.split(" "))
|
||||
{
|
||||
motd.append(FUtil.randomChatColor()).append(word).append(" ");
|
||||
}
|
||||
|
||||
event.setMotd(motd.toString().trim());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,377 @@
|
|||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
import me.totalfreedom.totalfreedommod.admin.ActivityLog;
|
||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
||||
import me.totalfreedom.totalfreedommod.banning.BanManager;
|
||||
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
|
||||
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.EditBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.EventBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.SignBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
|
||||
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
|
||||
import me.totalfreedom.totalfreedommod.caging.Cager;
|
||||
import me.totalfreedom.totalfreedommod.command.CommandLoader;
|
||||
import me.totalfreedom.totalfreedommod.config.MainConfig;
|
||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||
import me.totalfreedom.totalfreedommod.freeze.Freezer;
|
||||
import me.totalfreedom.totalfreedommod.fun.ItemFun;
|
||||
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
||||
import me.totalfreedom.totalfreedommod.fun.Landminer;
|
||||
import me.totalfreedom.totalfreedommod.fun.MP44;
|
||||
import me.totalfreedom.totalfreedommod.fun.Trailer;
|
||||
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.punishments.PunishmentList;
|
||||
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
||||
import me.totalfreedom.totalfreedommod.shop.Shop;
|
||||
import me.totalfreedom.totalfreedommod.shop.Votifier;
|
||||
import me.totalfreedom.totalfreedommod.sql.SQLite;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import me.totalfreedom.totalfreedommod.util.MethodTimer;
|
||||
import me.totalfreedom.totalfreedommod.world.CleanroomChunkGenerator;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldManager;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldRestrictions;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.generator.ChunkGenerator;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spigotmc.SpigotCommand;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
public class TotalFreedomMod extends JavaPlugin
|
||||
{
|
||||
public static final String CONFIG_FILENAME = "config.yml";
|
||||
//
|
||||
public static final BuildProperties build = new BuildProperties();
|
||||
//
|
||||
public static String pluginName;
|
||||
public static String pluginVersion;
|
||||
private static TotalFreedomMod plugin;
|
||||
//
|
||||
public MainConfig config;
|
||||
public PermissionConfig permissions;
|
||||
//
|
||||
// Service Handler
|
||||
public FreedomServiceHandler fsh;
|
||||
// Command Loader
|
||||
public CommandLoader cl;
|
||||
// Services
|
||||
public ServerInterface si;
|
||||
public WorldManager wm;
|
||||
public LogViewer lv;
|
||||
public AdminList al;
|
||||
public ActivityLog acl;
|
||||
public RankManager rm;
|
||||
public CommandBlocker cb;
|
||||
public EventBlocker eb;
|
||||
public BlockBlocker bb;
|
||||
public MobBlocker mb;
|
||||
public InteractBlocker ib;
|
||||
public PotionBlocker pb;
|
||||
public LoginProcess lp;
|
||||
public AntiNuke nu;
|
||||
public AntiSpam as;
|
||||
public PlayerList pl;
|
||||
public Shop sh;
|
||||
public Votifier vo;
|
||||
public SQLite sql;
|
||||
public Announcer an;
|
||||
public ChatManager cm;
|
||||
public Discord dc;
|
||||
public PunishmentList pul;
|
||||
public BanManager bm;
|
||||
public IndefiniteBanList im;
|
||||
public PermissionManager pem;
|
||||
public GameRuleHandler gr;
|
||||
public CommandSpy cs;
|
||||
public Cager ca;
|
||||
public Freezer fm;
|
||||
public EditBlocker ebl;
|
||||
public PVPBlocker pbl;
|
||||
public Orbiter or;
|
||||
public Muter mu;
|
||||
public Fuckoff fo;
|
||||
public AutoKick ak;
|
||||
public AutoEject ae;
|
||||
public Monitors mo;
|
||||
public MovementValidator mv;
|
||||
public ServerPing sp;
|
||||
public ItemFun it;
|
||||
public Landminer lm;
|
||||
public MP44 mp;
|
||||
public Jumppads jp;
|
||||
public Trailer tr;
|
||||
public HTTPDaemon hd;
|
||||
public WorldRestrictions wr;
|
||||
public SignBlocker snp;
|
||||
public EntityWiper ew;
|
||||
public VanishHandler vh;
|
||||
public Pterodactyl ptero;
|
||||
//
|
||||
// Bridges
|
||||
public BukkitTelnetBridge btb;
|
||||
public EssentialsBridge esb;
|
||||
public LibsDisguisesBridge ldb;
|
||||
public CoreProtectBridge cpb;
|
||||
public TFGuildsBridge tfg;
|
||||
public WorldEditBridge web;
|
||||
public WorldGuardBridge wgb;
|
||||
|
||||
public static TotalFreedomMod getPlugin()
|
||||
{
|
||||
return plugin;
|
||||
}
|
||||
|
||||
public static TotalFreedomMod plugin()
|
||||
{
|
||||
for (Plugin plugin : Bukkit.getPluginManager().getPlugins())
|
||||
{
|
||||
if (plugin.getName().equalsIgnoreCase(pluginName))
|
||||
{
|
||||
return (TotalFreedomMod)plugin;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad()
|
||||
{
|
||||
plugin = this;
|
||||
TotalFreedomMod.pluginName = plugin.getDescription().getName();
|
||||
TotalFreedomMod.pluginVersion = plugin.getDescription().getVersion();
|
||||
|
||||
FLog.setPluginLogger(plugin.getLogger());
|
||||
FLog.setServerLogger(getServer().getLogger());
|
||||
|
||||
build.load(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable()
|
||||
{
|
||||
FLog.info("Created by Madgeek1450 and Prozza");
|
||||
FLog.info("Version " + build.version);
|
||||
FLog.info("Compiled " + build.date + " by " + build.author);
|
||||
|
||||
final MethodTimer timer = new MethodTimer();
|
||||
timer.start();
|
||||
|
||||
// Warn if we're running on a wrong version
|
||||
ServerInterface.warnVersion();
|
||||
|
||||
// Delete unused files
|
||||
FUtil.deleteCoreDumps();
|
||||
FUtil.deleteFolder(new File("./_deleteme"));
|
||||
|
||||
fsh = new FreedomServiceHandler();
|
||||
|
||||
config = new MainConfig();
|
||||
|
||||
if (FUtil.inDeveloperMode())
|
||||
{
|
||||
FLog.debug("Developer mode enabled.");
|
||||
}
|
||||
|
||||
cl = new CommandLoader();
|
||||
cl.loadCommands();
|
||||
|
||||
BackupManager backups = new BackupManager();
|
||||
backups.createAllBackups();
|
||||
|
||||
permissions = new PermissionConfig();
|
||||
permissions.load();
|
||||
|
||||
mv = new MovementValidator();
|
||||
sp = new ServerPing();
|
||||
|
||||
new Initializer();
|
||||
|
||||
fsh.startServices();
|
||||
|
||||
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
||||
|
||||
timer.update();
|
||||
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
||||
|
||||
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
||||
new Metrics(this, 2966);
|
||||
|
||||
// Revert AMP changes
|
||||
SpigotConfig.config.set("settings.restart-on-crash", true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable()
|
||||
{
|
||||
// Stop services and bridges
|
||||
fsh.stopServices();
|
||||
|
||||
getServer().getScheduler().cancelTasks(plugin);
|
||||
|
||||
FLog.info("Plugin disabled");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id)
|
||||
{
|
||||
return new CleanroomChunkGenerator(id);
|
||||
}
|
||||
|
||||
public static class BuildProperties
|
||||
{
|
||||
public String author;
|
||||
public String codename;
|
||||
public String version;
|
||||
public String number;
|
||||
public String date;
|
||||
public String head;
|
||||
|
||||
public void load(TotalFreedomMod plugin)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Properties props;
|
||||
|
||||
try (InputStream in = plugin.getResource("build.properties"))
|
||||
{
|
||||
props = new Properties();
|
||||
props.load(in);
|
||||
}
|
||||
|
||||
author = props.getProperty("buildAuthor", "unknown");
|
||||
codename = props.getProperty("buildCodeName", "unknown");
|
||||
version = props.getProperty("buildVersion", pluginVersion);
|
||||
number = props.getProperty("buildNumber", "1");
|
||||
date = props.getProperty("buildDate", "unknown");
|
||||
// Need to do this or it will display ${git.commit.id.abbrev}
|
||||
head = props.getProperty("buildHead", "unknown");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?");
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public String formattedVersion()
|
||||
{
|
||||
return pluginVersion + "." + number + " (" + head + ")";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is provided to please Codacy.
|
||||
*/
|
||||
private final class Initializer
|
||||
{
|
||||
public Initializer()
|
||||
{
|
||||
initServices();
|
||||
initAdminUtils();
|
||||
initBridges();
|
||||
initFun();
|
||||
initHTTPD();
|
||||
}
|
||||
|
||||
private void initServices()
|
||||
{
|
||||
// Start services
|
||||
si = new ServerInterface();
|
||||
wm = new WorldManager();
|
||||
lv = new LogViewer();
|
||||
sql = new SQLite();
|
||||
al = new AdminList();
|
||||
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();
|
||||
gr = new GameRuleHandler();
|
||||
snp = new SignBlocker();
|
||||
ew = new EntityWiper();
|
||||
vh = new VanishHandler();
|
||||
//ptero = new Pterodactyl();
|
||||
}
|
||||
|
||||
private void initAdminUtils()
|
||||
{
|
||||
// Single admin utils
|
||||
cs = new CommandSpy();
|
||||
ca = new Cager();
|
||||
fm = new Freezer();
|
||||
or = new Orbiter();
|
||||
mu = new Muter();
|
||||
ebl = new EditBlocker();
|
||||
pbl = new PVPBlocker();
|
||||
fo = new Fuckoff();
|
||||
ak = new AutoKick();
|
||||
ae = new AutoEject();
|
||||
mo = new Monitors();
|
||||
}
|
||||
|
||||
private void initBridges()
|
||||
{
|
||||
// Start bridges
|
||||
btb = new BukkitTelnetBridge();
|
||||
cpb = new CoreProtectBridge();
|
||||
esb = new EssentialsBridge();
|
||||
ldb = new LibsDisguisesBridge();
|
||||
tfg = new TFGuildsBridge();
|
||||
web = new WorldEditBridge();
|
||||
wgb = new WorldGuardBridge();
|
||||
}
|
||||
|
||||
private void initFun()
|
||||
{
|
||||
// Fun
|
||||
it = new ItemFun();
|
||||
lm = new Landminer();
|
||||
mp = new MP44();
|
||||
jp = new Jumppads();
|
||||
tr = new Trailer();
|
||||
}
|
||||
|
||||
private void initHTTPD()
|
||||
{
|
||||
// HTTPD
|
||||
hd = new HTTPDaemon();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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.al.isAdmin(player) && plugin.al.isVanished(p.getName()))
|
||||
{
|
||||
player.hidePlayer(plugin, p);
|
||||
}
|
||||
}
|
||||
|
||||
for (Player p : server.getOnlinePlayers())
|
||||
{
|
||||
if (!plugin.al.isAdmin(p) && plugin.al.isVanished(player.getName()))
|
||||
{
|
||||
p.hidePlayer(plugin, player);
|
||||
}
|
||||
}
|
||||
|
||||
if (plugin.al.isVanished(player.getName()))
|
||||
{
|
||||
plugin.esb.setVanished(player.getName(), true);
|
||||
FLog.info(player.getName() + " joined while still vanished.");
|
||||
plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has joined silently.");
|
||||
event.setJoinMessage(null);
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (!plugin.al.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.al.isVanished(player.getName()))
|
||||
{
|
||||
event.setQuitMessage(null);
|
||||
FLog.info(player.getName() + " left while still vanished.");
|
||||
plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has left silently.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,212 @@
|
|||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.YamlConfig;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
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;
|
||||
|
||||
public class ActivityLog extends FreedomService
|
||||
{
|
||||
|
||||
public static final String FILENAME = "activitylog.yml";
|
||||
|
||||
private final Map<String, ActivityLogEntry> allActivityLogs = Maps.newHashMap();
|
||||
private final Map<String, ActivityLogEntry> nameTable = Maps.newHashMap();
|
||||
private final Map<String, ActivityLogEntry> ipTable = Maps.newHashMap();
|
||||
|
||||
private final YamlConfig config;
|
||||
|
||||
public ActivityLog()
|
||||
{
|
||||
this.config = new YamlConfig(plugin, FILENAME, true);
|
||||
}
|
||||
|
||||
public static String getFILENAME()
|
||||
{
|
||||
return FILENAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
save();
|
||||
}
|
||||
|
||||
public void load()
|
||||
{
|
||||
config.load();
|
||||
|
||||
allActivityLogs.clear();
|
||||
nameTable.clear();
|
||||
ipTable.clear();
|
||||
for (String key : config.getKeys(false))
|
||||
{
|
||||
ConfigurationSection section = config.getConfigurationSection(key);
|
||||
if (section == null)
|
||||
{
|
||||
FLog.warning("Invalid activity log format: " + key);
|
||||
continue;
|
||||
}
|
||||
|
||||
ActivityLogEntry activityLogEntry = new ActivityLogEntry(key);
|
||||
activityLogEntry.loadFrom(section);
|
||||
|
||||
if (!activityLogEntry.isValid())
|
||||
{
|
||||
FLog.warning("Could not load activity log: " + key + ". Missing details!");
|
||||
continue;
|
||||
}
|
||||
|
||||
allActivityLogs.put(key, activityLogEntry);
|
||||
}
|
||||
|
||||
updateTables();
|
||||
FLog.info("Loaded " + allActivityLogs.size() + " activity logs");
|
||||
}
|
||||
|
||||
public void save()
|
||||
{
|
||||
// Clear the config
|
||||
for (String key : config.getKeys(false))
|
||||
{
|
||||
config.set(key, null);
|
||||
}
|
||||
|
||||
for (ActivityLogEntry activityLog : allActivityLogs.values())
|
||||
{
|
||||
activityLog.saveTo(config.createSection(activityLog.getConfigKey()));
|
||||
}
|
||||
|
||||
config.save();
|
||||
}
|
||||
|
||||
public ActivityLogEntry getActivityLog(CommandSender sender)
|
||||
{
|
||||
if (sender instanceof Player)
|
||||
{
|
||||
return getActivityLog((Player)sender);
|
||||
}
|
||||
|
||||
return getEntryByName(sender.getName());
|
||||
}
|
||||
|
||||
public ActivityLogEntry getActivityLog(Player player)
|
||||
{
|
||||
ActivityLogEntry activityLog = getEntryByName(player.getName());
|
||||
if (activityLog == null)
|
||||
{
|
||||
String ip = FUtil.getIp(player);
|
||||
activityLog = getEntryByIp(ip);
|
||||
if (activityLog != null)
|
||||
{
|
||||
// Set the new username
|
||||
activityLog.setName(player.getName());
|
||||
save();
|
||||
updateTables();
|
||||
}
|
||||
else
|
||||
{
|
||||
activityLog = new ActivityLogEntry(player);
|
||||
allActivityLogs.put(activityLog.getConfigKey(), activityLog);
|
||||
updateTables();
|
||||
|
||||
activityLog.saveTo(config.createSection(activityLog.getConfigKey()));
|
||||
config.save();
|
||||
}
|
||||
}
|
||||
String ip = FUtil.getIp(player);
|
||||
if (!activityLog.getIps().contains(ip))
|
||||
{
|
||||
activityLog.addIp(ip);
|
||||
save();
|
||||
updateTables();
|
||||
}
|
||||
return activityLog;
|
||||
}
|
||||
|
||||
public ActivityLogEntry getEntryByName(String name)
|
||||
{
|
||||
return nameTable.get(name.toLowerCase());
|
||||
}
|
||||
|
||||
public ActivityLogEntry getEntryByIp(String ip)
|
||||
{
|
||||
return ipTable.get(ip);
|
||||
}
|
||||
|
||||
public void updateTables()
|
||||
{
|
||||
nameTable.clear();
|
||||
ipTable.clear();
|
||||
|
||||
for (ActivityLogEntry activityLog : allActivityLogs.values())
|
||||
{
|
||||
nameTable.put(activityLog.getName().toLowerCase(), activityLog);
|
||||
|
||||
for (String ip : activityLog.getIps())
|
||||
{
|
||||
ipTable.put(ip, activityLog);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
getActivityLog(event.getPlayer()).addLogin();
|
||||
plugin.acl.save();
|
||||
plugin.acl.updateTables();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerQuit(PlayerQuitEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
getActivityLog(event.getPlayer()).addLogout();
|
||||
plugin.acl.save();
|
||||
plugin.acl.updateTables();
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, ActivityLogEntry> getAllActivityLogs()
|
||||
{
|
||||
return allActivityLogs;
|
||||
}
|
||||
|
||||
public Map<String, ActivityLogEntry> getNameTable()
|
||||
{
|
||||
return nameTable;
|
||||
}
|
||||
|
||||
public Map<String, ActivityLogEntry> getIpTable()
|
||||
{
|
||||
return ipTable;
|
||||
}
|
||||
|
||||
public YamlConfig getConfig()
|
||||
{
|
||||
return config;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.time.Instant;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.IConfig;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ActivityLogEntry implements IConfig
|
||||
{
|
||||
|
||||
public static final String FILENAME = "activitylog.yml";
|
||||
private final List<String> ips = Lists.newArrayList();
|
||||
private final List<String> timestamps = Lists.newArrayList();
|
||||
private final List<String> durations = Lists.newArrayList();
|
||||
private String configKey;
|
||||
private String name;
|
||||
|
||||
public ActivityLogEntry(Player player)
|
||||
{
|
||||
this.configKey = player.getName().toLowerCase();
|
||||
this.name = player.getName();
|
||||
}
|
||||
|
||||
public ActivityLogEntry(String configKey)
|
||||
{
|
||||
this.configKey = configKey;
|
||||
}
|
||||
|
||||
public static String getFILENAME()
|
||||
{
|
||||
return FILENAME;
|
||||
}
|
||||
|
||||
public void loadFrom(Player player)
|
||||
{
|
||||
configKey = player.getName().toLowerCase();
|
||||
name = player.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFrom(ConfigurationSection cs)
|
||||
{
|
||||
name = cs.getString("username", configKey);
|
||||
ips.clear();
|
||||
ips.addAll(cs.getStringList("ips"));
|
||||
timestamps.clear();
|
||||
timestamps.addAll(cs.getStringList("timestamps"));
|
||||
durations.clear();
|
||||
durations.addAll(cs.getStringList("durations"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTo(ConfigurationSection cs)
|
||||
{
|
||||
Validate.isTrue(isValid(), "Could not save activity entry: " + name + ". Entry not valid!");
|
||||
cs.set("username", name);
|
||||
cs.set("ips", Lists.newArrayList(ips));
|
||||
cs.set("timestamps", Lists.newArrayList(timestamps));
|
||||
cs.set("durations", Lists.newArrayList(durations));
|
||||
}
|
||||
|
||||
public void addLogin()
|
||||
{
|
||||
Date currentTime = Date.from(Instant.now());
|
||||
timestamps.add("Login: " + FUtil.dateToString(currentTime));
|
||||
}
|
||||
|
||||
public void addLogout()
|
||||
{
|
||||
// Fix of Array index out of bonds issue: FS-131
|
||||
String lastLoginString;
|
||||
if (timestamps.size() > 1)
|
||||
{
|
||||
lastLoginString = timestamps.get(timestamps.size() - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
lastLoginString = timestamps.get(0);
|
||||
}
|
||||
Date currentTime = Date.from(Instant.now());
|
||||
timestamps.add("Logout: " + FUtil.dateToString(currentTime));
|
||||
lastLoginString = lastLoginString.replace("Login: ", "");
|
||||
Date lastLogin = FUtil.stringToDate(lastLoginString);
|
||||
|
||||
long duration = currentTime.getTime() - lastLogin.getTime();
|
||||
long seconds = duration / 1000 % 60;
|
||||
long minutes = duration / (60 * 1000) % 60;
|
||||
long hours = duration / (60 * 60 * 1000);
|
||||
durations.add(hours + " hours, " + minutes + " minutes, and " + seconds + " seconds");
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
ips.remove(ip);
|
||||
}
|
||||
|
||||
public void clearIPs()
|
||||
{
|
||||
ips.clear();
|
||||
}
|
||||
|
||||
public int getTotalSecondsPlayed()
|
||||
{
|
||||
int result = 0;
|
||||
for (String duration : durations)
|
||||
{
|
||||
String[] spl = duration.split(" ");
|
||||
result += Integer.parseInt(spl[0]) * 60 * 60;
|
||||
result += Integer.parseInt(spl[2]) * 60;
|
||||
result += Integer.parseInt(spl[5]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid()
|
||||
{
|
||||
return configKey != null
|
||||
&& name != null;
|
||||
}
|
||||
|
||||
public String getConfigKey()
|
||||
{
|
||||
return configKey;
|
||||
}
|
||||
|
||||
public void setConfigKey(String configKey)
|
||||
{
|
||||
this.configKey = configKey;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public List<String> getIps()
|
||||
{
|
||||
return ips;
|
||||
}
|
||||
|
||||
public List<String> getTimestamps()
|
||||
{
|
||||
return timestamps;
|
||||
}
|
||||
|
||||
public List<String> getDurations()
|
||||
{
|
||||
return durations;
|
||||
}
|
||||
}
|
235
src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java
Normal file
235
src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java
Normal file
|
@ -0,0 +1,235 @@
|
|||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Admin
|
||||
{
|
||||
|
||||
|
||||
private final List<String> ips = new ArrayList<>();
|
||||
private String name;
|
||||
private boolean active = true;
|
||||
private Rank rank = Rank.ADMIN;
|
||||
private Date lastLogin = new Date();
|
||||
private Boolean commandSpy = false;
|
||||
private Boolean potionSpy = false;
|
||||
private String acFormat = null;
|
||||
private String pteroID = null;
|
||||
|
||||
public Admin(Player player)
|
||||
{
|
||||
this.name = player.getName();
|
||||
this.ips.add(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
public Admin(ResultSet resultSet)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.name = resultSet.getString("username");
|
||||
this.active = resultSet.getBoolean("active");
|
||||
this.rank = Rank.findRank(resultSet.getString("rank"));
|
||||
this.ips.clear();
|
||||
this.ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
|
||||
this.lastLogin = new Date(resultSet.getLong("last_login"));
|
||||
this.commandSpy = resultSet.getBoolean("command_spy");
|
||||
this.potionSpy = resultSet.getBoolean("potion_spy");
|
||||
this.acFormat = resultSet.getString("ac_format");
|
||||
this.pteroID = resultSet.getString("ptero_id");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load admin: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@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("- Rank: ").append(rank.getName()).append("\n")
|
||||
.append("- Is Active: ").append(active).append("\n")
|
||||
.append("- Potion Spy: ").append(potionSpy).append("\n")
|
||||
.append("- Admin Chat Format: ").append(acFormat).append("\n")
|
||||
.append("- Pterodactyl ID: ").append(pteroID).append("\n");
|
||||
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
public Map<String, Object> toSQLStorable()
|
||||
{
|
||||
Map<String, Object> map = new HashMap<String, Object>()
|
||||
{{
|
||||
put("username", name);
|
||||
put("active", active);
|
||||
put("rank", rank.toString());
|
||||
put("ips", FUtil.listToString(ips));
|
||||
put("last_login", lastLogin.getTime());
|
||||
put("command_spy", commandSpy);
|
||||
put("potion_spy", potionSpy);
|
||||
put("ac_format", acFormat);
|
||||
put("ptero_id", pteroID);
|
||||
}};
|
||||
return map;
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
ips.remove(ip);
|
||||
}
|
||||
|
||||
public void clearIPs()
|
||||
{
|
||||
ips.clear();
|
||||
}
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
return name != null
|
||||
&& rank != null
|
||||
&& !ips.isEmpty()
|
||||
&& lastLogin != null;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public boolean isActive()
|
||||
{
|
||||
return active;
|
||||
}
|
||||
|
||||
public void setActive(boolean active)
|
||||
{
|
||||
this.active = active;
|
||||
|
||||
final TotalFreedomMod plugin = TotalFreedomMod.getPlugin();
|
||||
|
||||
// Avoiding stupid NPE compiler warnings
|
||||
if (plugin == null)
|
||||
{
|
||||
Bukkit.getLogger().severe("The plugin is null!! This is a major issue and WILL break the plugin!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!active)
|
||||
{
|
||||
if (getRank().isAtLeast(Rank.ADMIN))
|
||||
{
|
||||
if (plugin.btb != null)
|
||||
{
|
||||
plugin.btb.killTelnetSessions(getName());
|
||||
}
|
||||
}
|
||||
|
||||
plugin.lv.updateLogsRegistration(null, getName(), LogsRegistrationMode.DELETE);
|
||||
}
|
||||
}
|
||||
|
||||
public Rank getRank()
|
||||
{
|
||||
return rank;
|
||||
}
|
||||
|
||||
public void setRank(Rank rank)
|
||||
{
|
||||
this.rank = rank;
|
||||
}
|
||||
|
||||
public List<String> getIps()
|
||||
{
|
||||
return ips;
|
||||
}
|
||||
|
||||
public Date getLastLogin()
|
||||
{
|
||||
return lastLogin;
|
||||
}
|
||||
|
||||
public void setLastLogin(Date lastLogin)
|
||||
{
|
||||
this.lastLogin = lastLogin;
|
||||
}
|
||||
|
||||
public Boolean getCommandSpy()
|
||||
{
|
||||
return commandSpy;
|
||||
}
|
||||
|
||||
public void setCommandSpy(Boolean commandSpy)
|
||||
{
|
||||
this.commandSpy = commandSpy;
|
||||
}
|
||||
|
||||
public Boolean getPotionSpy()
|
||||
{
|
||||
return potionSpy;
|
||||
}
|
||||
|
||||
public void setPotionSpy(Boolean potionSpy)
|
||||
{
|
||||
this.potionSpy = potionSpy;
|
||||
}
|
||||
|
||||
public String getAcFormat()
|
||||
{
|
||||
return acFormat;
|
||||
}
|
||||
|
||||
public void setAcFormat(String acFormat)
|
||||
{
|
||||
this.acFormat = acFormat;
|
||||
}
|
||||
|
||||
public String getPteroID()
|
||||
{
|
||||
return pteroID;
|
||||
}
|
||||
|
||||
public void setPteroID(String pteroID)
|
||||
{
|
||||
this.pteroID = pteroID;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,409 @@
|
|||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
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 org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class AdminList extends FreedomService
|
||||
{
|
||||
public static final List<String> vanished = new ArrayList<>();
|
||||
public final Map<String, List<String>> verifiedNoAdmin = Maps.newHashMap();
|
||||
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
|
||||
// Only active admins below
|
||||
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
||||
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
||||
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
||||
|
||||
public static List<String> getVanished()
|
||||
{
|
||||
return vanished;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
load();
|
||||
deactivateOldEntries(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void load()
|
||||
{
|
||||
allAdmins.clear();
|
||||
try
|
||||
{
|
||||
ResultSet adminSet = plugin.sql.getAdminList();
|
||||
{
|
||||
while (adminSet.next())
|
||||
{
|
||||
Admin admin = new Admin(adminSet);
|
||||
allAdmins.add(admin);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load admin list: " + e.getMessage());
|
||||
}
|
||||
|
||||
updateTables();
|
||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)");
|
||||
}
|
||||
|
||||
public void messageAllAdmins(String message)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (isAdmin(player))
|
||||
{
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void potionSpyMessage(String message)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
Admin admin = getAdmin(player.getPlayer());
|
||||
if (isAdmin(player) && admin.getPotionSpy())
|
||||
{
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean isAdminSync(CommandSender sender)
|
||||
{
|
||||
return isAdmin(sender);
|
||||
}
|
||||
|
||||
public List<String> getActiveAdminNames()
|
||||
{
|
||||
List<String> names = new ArrayList();
|
||||
for (Admin admin : activeAdmins)
|
||||
{
|
||||
names.add(admin.getName());
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
public boolean isAdmin(CommandSender sender)
|
||||
{
|
||||
if (!(sender instanceof Player))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin((Player)sender);
|
||||
|
||||
return admin != null && admin.isActive();
|
||||
}
|
||||
|
||||
public boolean isAdmin(Player player)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin(player);
|
||||
|
||||
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 = FUtil.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(admin);
|
||||
updateTables();
|
||||
}
|
||||
return admin;
|
||||
}
|
||||
}
|
||||
|
||||
// Admin by ip
|
||||
admin = getEntryByIp(ip);
|
||||
if (admin != null)
|
||||
{
|
||||
// Set the new username
|
||||
String oldName = admin.getName();
|
||||
admin.setName(player.getName());
|
||||
plugin.sql.updateAdminName(oldName, admin.getName());
|
||||
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(admin);
|
||||
}
|
||||
|
||||
public boolean isAdminImpostor(Player player)
|
||||
{
|
||||
return getEntryByName(player.getName()) != null && !isAdmin(player) && !isVerifiedAdmin(player);
|
||||
}
|
||||
|
||||
public boolean isVerifiedAdmin(Player player)
|
||||
{
|
||||
return verifiedNoAdmin.containsKey(player.getName()) && verifiedNoAdmin.get(player.getName()).contains(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
public boolean isIdentityMatched(Player player)
|
||||
{
|
||||
if (Bukkit.getOnlineMode())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin(player);
|
||||
return admin != null && admin.getName().equalsIgnoreCase(player.getName());
|
||||
}
|
||||
|
||||
public boolean addAdmin(Admin admin)
|
||||
{
|
||||
if (!admin.isValid())
|
||||
{
|
||||
FLog.warning("Could not add admin: " + admin.getName() + ". Admin is missing details!");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Store admin, update views
|
||||
allAdmins.add(admin);
|
||||
updateTables();
|
||||
|
||||
// Save admin
|
||||
plugin.sql.addAdmin(admin);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean removeAdmin(Admin admin)
|
||||
{
|
||||
if (admin.getRank().isAtLeast(Rank.ADMIN))
|
||||
{
|
||||
if (plugin.btb != null)
|
||||
{
|
||||
plugin.btb.killTelnetSessions(admin.getName());
|
||||
}
|
||||
}
|
||||
|
||||
// Remove admin, update views
|
||||
if (!allAdmins.remove(admin))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
updateTables();
|
||||
|
||||
// Unsave admin
|
||||
plugin.sql.removeAdmin(admin);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateTables()
|
||||
{
|
||||
activeAdmins.clear();
|
||||
nameTable.clear();
|
||||
ipTable.clear();
|
||||
|
||||
for (Admin admin : allAdmins)
|
||||
{
|
||||
if (!admin.isActive())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
activeAdmins.add(admin);
|
||||
nameTable.put(admin.getName().toLowerCase(), admin);
|
||||
|
||||
for (String ip : admin.getIps())
|
||||
{
|
||||
ipTable.put(ip, admin);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public Set<String> getAdminNames()
|
||||
{
|
||||
return nameTable.keySet();
|
||||
}
|
||||
|
||||
public Set<String> getAdminIps()
|
||||
{
|
||||
return ipTable.keySet();
|
||||
}
|
||||
|
||||
public void save(Admin admin)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet currentSave = plugin.sql.getAdminByName(admin.getName());
|
||||
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
|
||||
{
|
||||
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
|
||||
if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null)
|
||||
{
|
||||
plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to save admin: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void deactivateOldEntries(boolean verbose)
|
||||
{
|
||||
for (Admin admin : allAdmins)
|
||||
{
|
||||
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 admin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true);
|
||||
}
|
||||
|
||||
admin.setActive(false);
|
||||
save(admin);
|
||||
}
|
||||
|
||||
updateTables();
|
||||
}
|
||||
|
||||
public boolean isVanished(String player)
|
||||
{
|
||||
return vanished.contains(player);
|
||||
}
|
||||
|
||||
public Set<Admin> getAllAdmins()
|
||||
{
|
||||
return allAdmins;
|
||||
}
|
||||
|
||||
public Set<Admin> getActiveAdmins()
|
||||
{
|
||||
return activeAdmins;
|
||||
}
|
||||
|
||||
public Map<String, Admin> getNameTable()
|
||||
{
|
||||
return nameTable;
|
||||
}
|
||||
|
||||
public Map<String, Admin> getIpTable()
|
||||
{
|
||||
return ipTable;
|
||||
}
|
||||
|
||||
public Map<String, List<String>> getVerifiedNoAdmin()
|
||||
{
|
||||
return verifiedNoAdmin;
|
||||
}
|
||||
}
|
323
src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java
Normal file
323
src/main/java/me/totalfreedom/totalfreedommod/banning/Ban.java
Normal file
|
@ -0,0 +1,323 @@
|
|||
package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Ban
|
||||
{
|
||||
|
||||
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
|
||||
private final List<String> ips = Lists.newArrayList();
|
||||
private String username = null;
|
||||
private UUID uuid = null;
|
||||
private String by = null;
|
||||
|
||||
|
||||
private Date at = null;
|
||||
|
||||
|
||||
private String reason = null; // Unformatted, &[0-9,a-f] instead of ChatColor
|
||||
|
||||
|
||||
private long expiryUnix = -1;
|
||||
|
||||
public Ban()
|
||||
{
|
||||
}
|
||||
|
||||
public Ban(String username, UUID uuid, String ip, String by, Date at, Date expire, String reason)
|
||||
{
|
||||
this(username,
|
||||
uuid,
|
||||
Collections.singletonList(ip),
|
||||
by,
|
||||
at,
|
||||
expire,
|
||||
reason);
|
||||
}
|
||||
|
||||
public Ban(String username, UUID uuid, List<String> ips, String by, Date at, Date expire, String reason)
|
||||
{
|
||||
this.username = username;
|
||||
this.uuid = uuid;
|
||||
if (ips != null)
|
||||
{
|
||||
this.ips.addAll(ips);
|
||||
}
|
||||
dedupeIps();
|
||||
this.by = by;
|
||||
this.at = at;
|
||||
if (expire == null)
|
||||
{
|
||||
expire = FUtil.parseDateOffset("24h");
|
||||
}
|
||||
this.expiryUnix = FUtil.getUnixTime(expire);
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
//
|
||||
// For player IP
|
||||
public static Ban forPlayerIp(Player player, CommandSender by)
|
||||
{
|
||||
return forPlayerIp(player, by, null, null);
|
||||
}
|
||||
|
||||
public static Ban forPlayerIp(Player player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(null, null, Collections.singletonList(FUtil.getIp(player)), by.getName(), Date.from(Instant.now()), expiry, reason);
|
||||
}
|
||||
|
||||
public static Ban forPlayerIp(String ip, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(null, null, ip, by.getName(), Date.from(Instant.now()), expiry, reason);
|
||||
}
|
||||
|
||||
//
|
||||
// For player name
|
||||
public static Ban forPlayerName(Player player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return forPlayerName(player.getName(), by, expiry, reason);
|
||||
}
|
||||
|
||||
public static Ban forPlayerName(String player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(player,
|
||||
null,
|
||||
new ArrayList<>(),
|
||||
by.getName(),
|
||||
Date.from(Instant.now()),
|
||||
expiry,
|
||||
reason);
|
||||
}
|
||||
|
||||
//
|
||||
// For player
|
||||
public static Ban forPlayer(Player player, CommandSender by)
|
||||
{
|
||||
return forPlayerName(player, by, null, null);
|
||||
}
|
||||
|
||||
public static Ban forPlayer(Player player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(player.getName(),
|
||||
player.getUniqueId(),
|
||||
FUtil.getIp(player),
|
||||
by.getName(),
|
||||
Date.from(Instant.now()),
|
||||
expiry,
|
||||
reason);
|
||||
}
|
||||
|
||||
public static Ban forPlayerFuzzy(Player player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(player.getName(),
|
||||
player.getUniqueId(),
|
||||
FUtil.getFuzzyIp(FUtil.getIp(player)),
|
||||
by.getName(),
|
||||
Date.from(Instant.now()),
|
||||
expiry,
|
||||
reason);
|
||||
}
|
||||
|
||||
public static SimpleDateFormat getDateFormat()
|
||||
{
|
||||
return DATE_FORMAT;
|
||||
}
|
||||
|
||||
public boolean hasUsername()
|
||||
{
|
||||
return username != null && !username.isEmpty();
|
||||
}
|
||||
|
||||
public boolean hasUUID()
|
||||
{
|
||||
return uuid != null;
|
||||
}
|
||||
|
||||
public boolean addIp(String ip)
|
||||
{
|
||||
return ips.add(ip);
|
||||
}
|
||||
|
||||
public boolean removeIp(String ip)
|
||||
{
|
||||
return ips.remove(ip);
|
||||
}
|
||||
|
||||
public boolean hasIps()
|
||||
{
|
||||
return !ips.isEmpty();
|
||||
}
|
||||
|
||||
public boolean hasExpiry()
|
||||
{
|
||||
return expiryUnix > 0;
|
||||
}
|
||||
|
||||
public boolean isExpired()
|
||||
{
|
||||
return hasExpiry() && FUtil.getUnixDate(expiryUnix).before(new Date(FUtil.getUnixTime()));
|
||||
}
|
||||
|
||||
public String bakeKickMessage()
|
||||
{
|
||||
final StringBuilder message = new StringBuilder(ChatColor.GOLD + "You");
|
||||
|
||||
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)
|
||||
.append(ConfigEntry.SERVER_BAN_URL.getString());
|
||||
|
||||
if (reason != null)
|
||||
{
|
||||
message.append("\n").append(ChatColor.RED).append("Reason: ").append(ChatColor.GOLD)
|
||||
.append(ChatColor.translateAlternateColorCodes('&', reason));
|
||||
}
|
||||
|
||||
if (by != null)
|
||||
{
|
||||
message.append("\n").append(ChatColor.RED).append("Banned by: ").append(ChatColor.GOLD)
|
||||
.append(by);
|
||||
}
|
||||
|
||||
if (at != null)
|
||||
{
|
||||
message.append("\n").append(ChatColor.RED).append("Issued: ").append(ChatColor.GOLD)
|
||||
.append(DATE_FORMAT.format(at));
|
||||
}
|
||||
|
||||
if (getExpiryUnix() != 0)
|
||||
{
|
||||
message.append("\n").append(ChatColor.RED).append("Expires: ").append(ChatColor.GOLD)
|
||||
.append(DATE_FORMAT.format(FUtil.getUnixDate(expiryUnix)));
|
||||
}
|
||||
|
||||
return message.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object object)
|
||||
{
|
||||
if (object == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(object instanceof Ban))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final Ban ban = (Ban)object;
|
||||
if (hasIps() != ban.hasIps()
|
||||
|| hasUsername() != ban.hasUsername())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasIps() && !(getIps().equals(ban.getIps())))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return !(hasUsername() && !(getUsername().equalsIgnoreCase(ban.getUsername())));
|
||||
}
|
||||
|
||||
private void dedupeIps()
|
||||
{
|
||||
Set<String> uniqueIps = new HashSet<>();
|
||||
|
||||
//Fancy Collections.removeIf lets you do all that while loop work in one lambda.
|
||||
ips.removeIf(s -> !uniqueIps.add(s));
|
||||
}
|
||||
|
||||
public List<String> getIps()
|
||||
{
|
||||
return ips;
|
||||
}
|
||||
|
||||
public String getUsername()
|
||||
{
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username)
|
||||
{
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public UUID getUuid()
|
||||
{
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public void setUuid(UUID uuid)
|
||||
{
|
||||
this.uuid = uuid;
|
||||
}
|
||||
|
||||
public String getBy()
|
||||
{
|
||||
return by;
|
||||
}
|
||||
|
||||
public void setBy(String by)
|
||||
{
|
||||
this.by = by;
|
||||
}
|
||||
|
||||
public Date getAt()
|
||||
{
|
||||
return at;
|
||||
}
|
||||
|
||||
public void setAt(Date at)
|
||||
{
|
||||
this.at = at;
|
||||
}
|
||||
|
||||
public String getReason()
|
||||
{
|
||||
return reason;
|
||||
}
|
||||
|
||||
public void setReason(String reason)
|
||||
{
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
public long getExpiryUnix()
|
||||
{
|
||||
return expiryUnix;
|
||||
}
|
||||
|
||||
public void setExpiryUnix(long expiryUnix)
|
||||
{
|
||||
this.expiryUnix = expiryUnix;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,325 @@
|
|||
package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
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.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
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.PlayerLoginEvent;
|
||||
|
||||
public class BanManager extends FreedomService
|
||||
{
|
||||
|
||||
private final Set<Ban> bans = Sets.newHashSet();
|
||||
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();
|
||||
|
||||
//
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
bans.clear();
|
||||
try
|
||||
{
|
||||
ResultSet banSet = plugin.sql.getBanList();
|
||||
{
|
||||
while (banSet.next())
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load ban list: " + e.getMessage());
|
||||
}
|
||||
|
||||
// Remove expired bans, repopulate ipBans and nameBans,
|
||||
updateViews();
|
||||
|
||||
FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans.");
|
||||
|
||||
// Load unbannable usernames
|
||||
unbannableUsernames.clear();
|
||||
unbannableUsernames.addAll(ConfigEntry.FAMOUS_PLAYERS.getStringList());
|
||||
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public Set<Ban> getAllBans()
|
||||
{
|
||||
return Collections.unmodifiableSet(bans);
|
||||
}
|
||||
|
||||
public Collection<Ban> getIpBans()
|
||||
{
|
||||
return Collections.unmodifiableCollection(ipBans.values());
|
||||
}
|
||||
|
||||
public Collection<Ban> getUsernameBans()
|
||||
{
|
||||
return Collections.unmodifiableCollection(nameBans.values());
|
||||
}
|
||||
|
||||
public Ban getByIp(String ip)
|
||||
{
|
||||
final Ban directBan = ipBans.get(ip);
|
||||
if (directBan != null && !directBan.isExpired())
|
||||
{
|
||||
return directBan;
|
||||
}
|
||||
|
||||
// Match fuzzy IP
|
||||
for (Ban loopBan : ipBans.values())
|
||||
{
|
||||
if (loopBan.isExpired())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (String loopIp : loopBan.getIps())
|
||||
{
|
||||
if (!loopIp.contains("*"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FUtil.fuzzyIpMatch(ip, loopIp, 4))
|
||||
{
|
||||
return loopBan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Ban getByUsername(String username)
|
||||
{
|
||||
username = username.toLowerCase();
|
||||
final Ban directBan = nameBans.get(username);
|
||||
|
||||
if (directBan != null && !directBan.isExpired())
|
||||
{
|
||||
return directBan;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
final Ban ban = getByIp(ip);
|
||||
|
||||
if (ban != null)
|
||||
{
|
||||
bans.remove(ban);
|
||||
}
|
||||
|
||||
return ban;
|
||||
}
|
||||
|
||||
public Ban unbanUsername(String username)
|
||||
{
|
||||
final Ban ban = getByUsername(username);
|
||||
|
||||
if (ban != null)
|
||||
{
|
||||
bans.remove(ban);
|
||||
}
|
||||
|
||||
return ban;
|
||||
}
|
||||
|
||||
public boolean isIpBanned(String ip)
|
||||
{
|
||||
return getByIp(ip) != null;
|
||||
}
|
||||
|
||||
public boolean isUsernameBanned(String username)
|
||||
{
|
||||
return getByUsername(username) != null;
|
||||
}
|
||||
|
||||
public void 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))
|
||||
{
|
||||
plugin.sql.addBan(ban);
|
||||
updateViews();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void removeBan(Ban ban)
|
||||
{
|
||||
if (bans.remove(ban))
|
||||
{
|
||||
plugin.sql.removeBan(ban);
|
||||
updateViews();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int purge()
|
||||
{
|
||||
int size = bans.size();
|
||||
bans.clear();
|
||||
updateViews();
|
||||
plugin.sql.truncate("bans");
|
||||
return size;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerLogin(PlayerLoginEvent event)
|
||||
{
|
||||
final String username = event.getPlayer().getName();
|
||||
final UUID uuid = event.getPlayer().getUniqueId();
|
||||
final String ip = FUtil.getIp(event);
|
||||
|
||||
// Regular ban
|
||||
Ban ban = getByUsername(username);
|
||||
if (ban == null)
|
||||
{
|
||||
ban = getByUUID(uuid);
|
||||
|
||||
if (ban == null)
|
||||
{
|
||||
ban = getByIp(ip);
|
||||
}
|
||||
}
|
||||
|
||||
if (ban != null && !ban.isExpired())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ban.bakeKickMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Unban admins
|
||||
Ban ban = getByUsername(player.getName());
|
||||
if (ban != null)
|
||||
{
|
||||
removeBan(ban);
|
||||
}
|
||||
else
|
||||
{
|
||||
ban = getByIp(FUtil.getIp(player));
|
||||
if (ban != null)
|
||||
{
|
||||
removeBan(ban);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateViews()
|
||||
{
|
||||
// Remove expired bans
|
||||
for (Ban ban : new ArrayList<>(bans))
|
||||
{
|
||||
if (ban.isExpired())
|
||||
{
|
||||
bans.remove(ban);
|
||||
plugin.sql.removeBan(ban);
|
||||
}
|
||||
}
|
||||
|
||||
nameBans.clear();
|
||||
uuidBans.clear();
|
||||
ipBans.clear();
|
||||
for (Ban ban : bans)
|
||||
{
|
||||
if (ban.hasUsername())
|
||||
{
|
||||
nameBans.put(ban.getUsername().toLowerCase(), ban);
|
||||
}
|
||||
|
||||
if (ban.hasUUID())
|
||||
{
|
||||
uuidBans.put(ban.getUuid(), ban);
|
||||
}
|
||||
|
||||
if (ban.hasIps())
|
||||
{
|
||||
for (String ip : ban.getIps())
|
||||
{
|
||||
ipBans.put(ip, ban);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.config.IConfig;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
public class IndefiniteBan implements IConfig
|
||||
{
|
||||
private final List<String> ips = Lists.newArrayList();
|
||||
private String username = null;
|
||||
private UUID uuid = null;
|
||||
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)
|
||||
{
|
||||
// The indefinite ban list is only intended to be modified manually. It is not intended to save.
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid()
|
||||
{
|
||||
return username != null;
|
||||
}
|
||||
|
||||
public String getUsername()
|
||||
{
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username)
|
||||
{
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public UUID getUuid()
|
||||
{
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public void setUuid(UUID uuid)
|
||||
{
|
||||
this.uuid = uuid;
|
||||
}
|
||||
|
||||
public List<String> getIps()
|
||||
{
|
||||
return ips;
|
||||
}
|
||||
|
||||
public String getReason()
|
||||
{
|
||||
return reason;
|
||||
}
|
||||
|
||||
public void setReason(String reason)
|
||||
{
|
||||
this.reason = reason;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
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 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";
|
||||
|
||||
|
||||
private final Set<IndefiniteBan> indefBans = Sets.newHashSet();
|
||||
|
||||
|
||||
private int nameBanCount = 0;
|
||||
|
||||
|
||||
private int uuidBanCount = 0;
|
||||
|
||||
|
||||
private int ipBanCount = 0;
|
||||
|
||||
public static String getConfigFilename()
|
||||
{
|
||||
return CONFIG_FILENAME;
|
||||
}
|
||||
|
||||
@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);
|
||||
assert cs != null;
|
||||
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.equalsIgnoreCase(indefBan.getUsername()))
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public Set<IndefiniteBan> getIndefBans()
|
||||
{
|
||||
return indefBans;
|
||||
}
|
||||
|
||||
public int getNameBanCount()
|
||||
{
|
||||
return nameBanCount;
|
||||
}
|
||||
|
||||
public int getUuidBanCount()
|
||||
{
|
||||
return uuidBanCount;
|
||||
}
|
||||
|
||||
public int getIpBanCount()
|
||||
{
|
||||
return ipBanCount;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,193 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.ChatColor;
|
||||
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.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
|
||||
public class BlockBlocker extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockPlace(BlockPlaceEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
switch (event.getBlockPlaced().getType())
|
||||
{
|
||||
case LAVA:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
||||
{
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
player.sendMessage(ChatColor.GRAY + "Lava placement is currently disabled.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WATER:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
||||
{
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
player.sendMessage(ChatColor.GRAY + "Water placement is currently disabled.");
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FIRE:
|
||||
case SOUL_FIRE:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
|
||||
{
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
player.sendMessage(ChatColor.GRAY + "Fire placement is currently disabled.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case STRUCTURE_BLOCK:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_STRUCTURE_BLOCKS.getBoolean())
|
||||
{
|
||||
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();
|
||||
assert headMeta != null;
|
||||
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;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
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.al.isAdminSync(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.al.isAdminSync(event.getPlayer()))
|
||||
{
|
||||
fPlayer.setEditBlocked(false);
|
||||
return;
|
||||
}
|
||||
|
||||
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to destroy blocks has been disabled!");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,268 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
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.FallingBlock;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.BlockBurnEvent;
|
||||
import org.bukkit.event.block.BlockDispenseEvent;
|
||||
import org.bukkit.event.block.BlockFromToEvent;
|
||||
import org.bukkit.event.block.BlockGrowEvent;
|
||||
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.LeavesDecayEvent;
|
||||
import org.bukkit.event.entity.EntityCombustEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
import org.bukkit.event.entity.ExplosionPrimeEvent;
|
||||
import org.bukkit.event.entity.FireworkExplodeEvent;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
|
||||
public class EventBlocker extends FreedomService
|
||||
{
|
||||
/**
|
||||
* /@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 final ArrayList<Material> redstoneBlocks = new ArrayList<>(Arrays.asList(Material.REDSTONE, Material.DISPENSER, Material.DROPPER, Material.REDSTONE_LAMP));
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockBurn(BlockBurnEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockIgnite(BlockIgniteEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockFromTo(BlockFromToEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_FLUID_SPREAD.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityExplode(EntityExplodeEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
||||
{
|
||||
event.blockList().clear();
|
||||
return;
|
||||
}
|
||||
|
||||
event.setYield(0.0F);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onExplosionPrime(ExplosionPrimeEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
event.setRadius(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityCombust(EntityCombustEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityDeath(EntityDeathEvent event)
|
||||
{
|
||||
if (ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
||||
{
|
||||
event.setDroppedExp(0);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityDamage(EntityDamageEvent event)
|
||||
{
|
||||
if ((event.getCause() == EntityDamageEvent.DamageCause.LAVA)
|
||||
&& !ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConfigEntry.ENABLE_PET_PROTECT.getBoolean())
|
||||
{
|
||||
Entity entity = event.getEntity();
|
||||
if (entity instanceof Tameable)
|
||||
{
|
||||
if (((Tameable)entity).isTamed())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event)
|
||||
{
|
||||
if (!plugin.al.isAdmin(event.getPlayer()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
if (!ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getPlayer().getWorld().getEntities().size() > 750)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onLeavesDecay(LeavesDecayEvent event)
|
||||
{
|
||||
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
|
||||
public void onEntitySpawn(EntitySpawnEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_GRAVITY.getBoolean() && event.getEntity() instanceof FallingBlock)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@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 = Objects.requireNonNull(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH)).getValue();
|
||||
if (maxHealth < 1)
|
||||
{
|
||||
for (AttributeModifier attributeModifier : Objects.requireNonNull(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH)).getModifiers())
|
||||
{
|
||||
Objects.requireNonNull(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());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerBedEnterEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class InteractBlocker extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
switch (event.getAction())
|
||||
{
|
||||
case RIGHT_CLICK_AIR:
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
{
|
||||
handleRightClick(event);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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)
|
||||
{
|
||||
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())
|
||||
{
|
||||
case WATER_BUCKET:
|
||||
{
|
||||
if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
player.sendMessage(ChatColor.GRAY + "Water buckets are currently disabled.");
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
|
||||
case LAVA_BUCKET:
|
||||
{
|
||||
if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
player.sendMessage(ChatColor.GRAY + "Lava buckets are currently disabled.");
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
|
||||
case TNT_MINECART:
|
||||
{
|
||||
if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||
player.sendMessage(ChatColor.GRAY + "TNT minecarts are currently disabled.");
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
|
||||
case ARMOR_STAND:
|
||||
{
|
||||
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;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
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.EnderDragon;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Ghast;
|
||||
import org.bukkit.entity.Giant;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Slime;
|
||||
import org.bukkit.entity.Wither;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
|
||||
public class MobBlocker extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
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 (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).getBaseValue() > 255.0)
|
||||
{
|
||||
Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).setBaseValue(255.0);
|
||||
}
|
||||
if (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).getBaseValue() > 10.0)
|
||||
{
|
||||
Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).setBaseValue(10.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onCreatureSpawn(CreatureSpawnEvent event)
|
||||
{
|
||||
if (!ConfigEntry.MOB_LIMITER_ENABLED.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Entity spawned = event.getEntity();
|
||||
|
||||
if (spawned instanceof EnderDragon)
|
||||
{
|
||||
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (spawned instanceof Ghast)
|
||||
{
|
||||
if (ConfigEntry.MOB_LIMITER_DISABLE_GHAST.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (spawned instanceof Slime)
|
||||
{
|
||||
if (ConfigEntry.MOB_LIMITER_DISABLE_SLIME.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (spawned instanceof Wither)
|
||||
{
|
||||
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (spawned instanceof Giant)
|
||||
{
|
||||
if (ConfigEntry.MOB_LIMITER_DISABLE_GIANT.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (spawned instanceof Bat)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
int mobLimiterMax = ConfigEntry.MOB_LIMITER_MAX.getInteger();
|
||||
|
||||
if (mobLimiterMax <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int mobcount = 0;
|
||||
for (Entity entity : Objects.requireNonNull(event.getLocation().getWorld()).getLivingEntities())
|
||||
{
|
||||
if (!(entity instanceof HumanEntity) && entity instanceof LivingEntity)
|
||||
{
|
||||
mobcount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (mobcount > mobLimiterMax)
|
||||
{
|
||||
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.al.isAdmin(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import java.util.Collection;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
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;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
|
||||
public class PotionBlocker extends FreedomService
|
||||
{
|
||||
|
||||
public static final int POTION_BLOCK_RADIUS_SQUARED = 20 * 20;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
public void onThrowPotion(PotionSplashEvent 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);
|
||||
}
|
||||
}
|
||||
|
||||
@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,67 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.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.world.item.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
|
||||
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
|
||||
assert compound != null;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.SimpleCommandMap;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.plugin.SimplePluginManager;
|
||||
|
||||
public class CommandBlocker extends FreedomService
|
||||
{
|
||||
|
||||
private final Pattern flagPattern = Pattern.compile("(:([0-9]){5,})");
|
||||
//
|
||||
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
|
||||
private final List<String> unknownCommands = Lists.newArrayList();
|
||||
|
||||
public static CommandMap getCommandMap()
|
||||
{
|
||||
try
|
||||
{
|
||||
SimplePluginManager simplePluginManager = (SimplePluginManager)Bukkit.getServer().getPluginManager();
|
||||
|
||||
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
|
||||
commandMapField.setAccessible(true);
|
||||
|
||||
return (SimpleCommandMap)commandMapField.get(simplePluginManager);
|
||||
}
|
||||
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
|
||||
{
|
||||
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
entryList.clear();
|
||||
}
|
||||
|
||||
public void load()
|
||||
{
|
||||
entryList.clear();
|
||||
unknownCommands.clear();
|
||||
|
||||
final CommandMap commandMap = getCommandMap();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<String> blockedCommands = (List<String>)ConfigEntry.BLOCKED_COMMANDS.getList();
|
||||
for (String rawEntry : blockedCommands)
|
||||
{
|
||||
final String[] parts = rawEntry.split(":");
|
||||
if (parts.length < 3 || parts.length > 4)
|
||||
{
|
||||
FLog.warning("Invalid command blocker entry: " + rawEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
final CommandBlockerRank rank = CommandBlockerRank.fromToken(parts[0]);
|
||||
final CommandBlockerAction action = CommandBlockerAction.fromToken(parts[1]);
|
||||
String commandName = parts[2].toLowerCase().substring(1);
|
||||
final String message = (parts.length > 3 ? parts[3] : null);
|
||||
|
||||
if (rank == null || action == null || commandName.isEmpty())
|
||||
{
|
||||
FLog.warning("Invalid command blocker entry: " + rawEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
final String[] commandParts = commandName.split(" ");
|
||||
String subCommand = null;
|
||||
if (commandParts.length > 1)
|
||||
{
|
||||
commandName = commandParts[0];
|
||||
subCommand = StringUtils.join(commandParts, " ", 1, commandParts.length).trim().toLowerCase();
|
||||
}
|
||||
|
||||
assert commandMap != null;
|
||||
final Command command = commandMap.getCommand(commandName);
|
||||
|
||||
// Obtain command from alias
|
||||
if (command == null)
|
||||
{
|
||||
unknownCommands.add(commandName);
|
||||
}
|
||||
else
|
||||
{
|
||||
commandName = command.getName().toLowerCase();
|
||||
}
|
||||
|
||||
if (entryList.containsKey(commandName))
|
||||
{
|
||||
FLog.warning("Not blocking: /" + commandName + " - Duplicate entry exists!");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
final CommandBlockerEntry blockedCommandEntry = new CommandBlockerEntry(rank, action, commandName, subCommand, message);
|
||||
entryList.put(commandName, blockedCommandEntry);
|
||||
if (command != null)
|
||||
{
|
||||
for (String alias : command.getAliases())
|
||||
{
|
||||
entryList.put(alias.toLowerCase(), blockedCommandEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FLog.info("Loaded " + blockedCommands.size() + " blocked commands (" + (blockedCommands.size() - unknownCommands.size()) + " known).");
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
// Blocked commands
|
||||
if (isCommandBlocked(event.getMessage(), event.getPlayer(), true))
|
||||
{
|
||||
// CommandBlocker handles messages and broadcasts
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isCommandBlocked(String command, CommandSender sender)
|
||||
{
|
||||
return isCommandBlocked(command, sender, false);
|
||||
}
|
||||
|
||||
public boolean isCommandBlocked(String command, CommandSender sender, boolean doAction)
|
||||
{
|
||||
if (command == null || command.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Format
|
||||
command = command.toLowerCase().trim();
|
||||
command = command.startsWith("/") ? command.substring(1) : command;
|
||||
|
||||
// Check for plugin specific commands
|
||||
final String[] commandParts = command.split(" ");
|
||||
if (commandParts[0].contains(":"))
|
||||
{
|
||||
if (doAction)
|
||||
{
|
||||
FUtil.playerMsg(sender, "Plugin specific commands are disabled.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
for (String part : commandParts)
|
||||
{
|
||||
if (command.startsWith("/") && !plugin.al.isAdmin(sender) && (part.contains("#copy") || part.contains("#clipboard")))
|
||||
{
|
||||
FUtil.playerMsg(sender, "WorldEdit copy variables are disabled.");
|
||||
return true;
|
||||
}
|
||||
Matcher matcher = flagPattern.matcher(part);
|
||||
if (!matcher.matches())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (doAction)
|
||||
{
|
||||
FUtil.playerMsg(sender, "That command contains an illegal number: " + matcher.group(1));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Obtain sub command, if it exists
|
||||
String subCommand = null;
|
||||
if (commandParts.length > 1)
|
||||
{
|
||||
subCommand = StringUtils.join(commandParts, " ", 1, commandParts.length).toLowerCase();
|
||||
}
|
||||
|
||||
// Obtain entry
|
||||
final CommandBlockerEntry entry = entryList.get(commandParts[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Validate sub command
|
||||
if (entry.getSubCommand() != null)
|
||||
{
|
||||
if (subCommand == null || !subCommand.startsWith(entry.getSubCommand()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry.getRank().hasPermission(sender))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (doAction)
|
||||
{
|
||||
entry.doActions(sender);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
public enum CommandBlockerAction
|
||||
{
|
||||
|
||||
BLOCK("b"),
|
||||
BLOCK_AND_EJECT("a"),
|
||||
BLOCK_UNKNOWN("u");
|
||||
private final String token;
|
||||
|
||||
CommandBlockerAction(String token)
|
||||
{
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public static CommandBlockerAction fromToken(String token)
|
||||
{
|
||||
for (CommandBlockerAction action : CommandBlockerAction.values())
|
||||
{
|
||||
if (action.getToken().equalsIgnoreCase(token))
|
||||
{
|
||||
return action;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getToken()
|
||||
{
|
||||
return this.token;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
public class CommandBlockerEntry
|
||||
{
|
||||
|
||||
|
||||
private final CommandBlockerRank rank;
|
||||
|
||||
private final CommandBlockerAction action;
|
||||
|
||||
private final String command;
|
||||
|
||||
private final String subCommand;
|
||||
|
||||
private final String message;
|
||||
|
||||
public CommandBlockerEntry(CommandBlockerRank rank, CommandBlockerAction action, String command, String message)
|
||||
{
|
||||
this(rank, action, command, null, message);
|
||||
}
|
||||
|
||||
public CommandBlockerEntry(CommandBlockerRank rank, CommandBlockerAction action, String command, String subCommand, String message)
|
||||
{
|
||||
this.rank = rank;
|
||||
this.action = action;
|
||||
this.command = command;
|
||||
this.subCommand = ((subCommand == null) ? null : subCommand.toLowerCase().trim());
|
||||
this.message = ((message == null || message.equals("_")) ? "That command is blocked." : message);
|
||||
}
|
||||
|
||||
public void doActions(CommandSender sender)
|
||||
{
|
||||
if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player)
|
||||
{
|
||||
TotalFreedomMod.getPlugin().ae.autoEject((Player)sender, "You used a prohibited command: " + command);
|
||||
FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
|
||||
return;
|
||||
}
|
||||
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
||||
{
|
||||
sender.sendMessage(SpigotConfig.unknownCommandMessage);
|
||||
return;
|
||||
}
|
||||
FUtil.playerMsg(sender, FUtil.colorize(message));
|
||||
}
|
||||
|
||||
public CommandBlockerRank getRank()
|
||||
{
|
||||
return rank;
|
||||
}
|
||||
|
||||
public CommandBlockerAction getAction()
|
||||
{
|
||||
return action;
|
||||
}
|
||||
|
||||
public String getCommand()
|
||||
{
|
||||
return command;
|
||||
}
|
||||
|
||||
public String getSubCommand()
|
||||
{
|
||||
return subCommand;
|
||||
}
|
||||
|
||||
public String getMessage()
|
||||
{
|
||||
return message;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public enum CommandBlockerRank
|
||||
{
|
||||
EVERYONE("e"),
|
||||
OP("o"),
|
||||
ADMIN("a"),
|
||||
SENIOR_ADMIN("s"),
|
||||
NOBODY("n");
|
||||
//
|
||||
private final String token;
|
||||
|
||||
CommandBlockerRank(String token)
|
||||
{
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public static CommandBlockerRank fromSender(CommandSender sender)
|
||||
{
|
||||
Admin admin = TotalFreedomMod.getPlugin().al.getAdmin(sender);
|
||||
if (admin != null)
|
||||
{
|
||||
if (admin.getRank() == Rank.SENIOR_ADMIN)
|
||||
{
|
||||
return SENIOR_ADMIN;
|
||||
}
|
||||
return ADMIN;
|
||||
}
|
||||
|
||||
if (sender.isOp())
|
||||
{
|
||||
return OP;
|
||||
}
|
||||
|
||||
return EVERYONE;
|
||||
}
|
||||
|
||||
public static CommandBlockerRank fromToken(String token)
|
||||
{
|
||||
for (CommandBlockerRank rank : CommandBlockerRank.values())
|
||||
{
|
||||
if (rank.getToken().equalsIgnoreCase(token))
|
||||
{
|
||||
return rank;
|
||||
}
|
||||
}
|
||||
return EVERYONE;
|
||||
}
|
||||
|
||||
public String getToken()
|
||||
{
|
||||
return this.token;
|
||||
}
|
||||
|
||||
public boolean hasPermission(CommandSender sender)
|
||||
{
|
||||
return fromSender(sender).ordinal() >= ordinal();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.bukkittelnet.BukkitTelnet;
|
||||
import me.totalfreedom.bukkittelnet.api.TelnetCommandEvent;
|
||||
import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent;
|
||||
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
|
||||
import me.totalfreedom.bukkittelnet.session.ClientSession;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class BukkitTelnetBridge extends FreedomService
|
||||
{
|
||||
|
||||
private BukkitTelnet bukkitTelnetPlugin = null;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onTelnetPreLogin(TelnetPreLoginEvent event)
|
||||
{
|
||||
|
||||
final String ip = event.getIp();
|
||||
if (ip == null || ip.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
|
||||
|
||||
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
event.setBypassPassword(true);
|
||||
event.setName(admin.getName());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onTelnetCommand(TelnetCommandEvent event)
|
||||
{
|
||||
if (plugin.cb.isCommandBlocked(event.getCommand(), event.getSender()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onTelnetRequestDataTags(TelnetRequestDataTagsEvent event)
|
||||
{
|
||||
for (Map.Entry<Player, Map<String, Object>> entry : event.getDataTags().entrySet())
|
||||
{
|
||||
final Player player = entry.getKey();
|
||||
final Map<String, Object> playerTags = entry.getValue();
|
||||
|
||||
boolean isAdmin = false;
|
||||
boolean isTelnetAdmin = false;
|
||||
boolean isSeniorAdmin = false;
|
||||
|
||||
final Admin admin = plugin.al.getAdmin(player);
|
||||
if (admin != null)
|
||||
{
|
||||
boolean active = admin.isActive();
|
||||
|
||||
isAdmin = active;
|
||||
isSeniorAdmin = active && admin.getRank() == Rank.SENIOR_ADMIN;
|
||||
isTelnetAdmin = active && (isSeniorAdmin || admin.getRank() == Rank.ADMIN);
|
||||
}
|
||||
|
||||
playerTags.put("tfm.admin.isAdmin", isAdmin);
|
||||
playerTags.put("tfm.admin.isTelnetAdmin", isTelnetAdmin);
|
||||
playerTags.put("tfm.admin.isSeniorAdmin", isSeniorAdmin);
|
||||
|
||||
playerTags.put("tfm.playerdata.getTag", plugin.pl.getPlayer(player).getTag());
|
||||
|
||||
playerTags.put("tfm.essentialsBridge.getNickname", plugin.esb.getNickname(player.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
public BukkitTelnet getBukkitTelnetPlugin()
|
||||
{
|
||||
if (bukkitTelnetPlugin == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Plugin bukkitTelnet = server.getPluginManager().getPlugin("BukkitTelnet");
|
||||
if (bukkitTelnet != null)
|
||||
{
|
||||
if (bukkitTelnet instanceof BukkitTelnet)
|
||||
{
|
||||
bukkitTelnetPlugin = (BukkitTelnet)bukkitTelnet;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
return bukkitTelnetPlugin;
|
||||
}
|
||||
|
||||
public List<Admin> getConnectedAdmins()
|
||||
{
|
||||
List<Admin> admins = new ArrayList<>();
|
||||
final BukkitTelnet telnet = getBukkitTelnetPlugin();
|
||||
if (telnet != null)
|
||||
{
|
||||
for (ClientSession session : telnet.appender.getSessions())
|
||||
{
|
||||
Admin admin = plugin.al.getEntryByName(session.getUserName().toLowerCase());
|
||||
if (admin != null && !admins.contains(admin))
|
||||
{
|
||||
admins.add(admin);
|
||||
}
|
||||
}
|
||||
}
|
||||
return admins;
|
||||
}
|
||||
|
||||
public void killTelnetSessions(final String name)
|
||||
{
|
||||
try
|
||||
{
|
||||
final List<ClientSession> sessionsToRemove = new ArrayList<>();
|
||||
|
||||
final BukkitTelnet telnet = getBukkitTelnetPlugin();
|
||||
if (telnet != null)
|
||||
{
|
||||
for (ClientSession session : telnet.appender.getSessions())
|
||||
{
|
||||
if (name != null && name.equalsIgnoreCase(session.getUserName()))
|
||||
{
|
||||
sessionsToRemove.add(session);
|
||||
}
|
||||
}
|
||||
|
||||
for (final ClientSession session : sessionsToRemove)
|
||||
{
|
||||
try
|
||||
{
|
||||
telnet.appender.removeSession(session);
|
||||
session.syncTerminateSession();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Error removing single telnet session: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
FLog.info(sessionsToRemove.size() + " telnet session(s) removed.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Error removing telnet sessions: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,438 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.*;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.coreprotect.CoreProtect;
|
||||
import net.coreprotect.CoreProtectAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
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.player.PlayerInteractEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class CoreProtectBridge extends FreedomService
|
||||
{
|
||||
public static Map<Player, FUtil.PaginationList<String>> HISTORY_MAP = new HashMap<>();
|
||||
private final List<String> tables = Arrays.asList("co_sign", "co_session", "co_container", "co_block");
|
||||
|
||||
private final HashMap<String, Long> cooldown = new HashMap<>();
|
||||
private CoreProtectAPI coreProtectAPI = null;
|
||||
private BukkitTask wiper;
|
||||
|
||||
public static Long getSecondsLeft(long prevTime, int timeAdd)
|
||||
{
|
||||
return prevTime / 1000L + timeAdd - System.currentTimeMillis() / 1000L;
|
||||
}
|
||||
|
||||
// Unix timestamp converter taken from Functions class in CoreProtect, not my code
|
||||
public static String getTimeAgo(int logTime, int currentTime)
|
||||
{
|
||||
StringBuilder message = new StringBuilder();
|
||||
double timeSince = (double)currentTime - ((double)logTime + 0.0D);
|
||||
timeSince /= 60.0D;
|
||||
if (timeSince < 60.0D)
|
||||
{
|
||||
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/m ago");
|
||||
}
|
||||
|
||||
if (message.length() == 0)
|
||||
{
|
||||
timeSince /= 60.0D;
|
||||
if (timeSince < 24.0D)
|
||||
{
|
||||
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/h ago");
|
||||
}
|
||||
}
|
||||
|
||||
if (message.length() == 0)
|
||||
{
|
||||
timeSince /= 24.0D;
|
||||
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/d ago");
|
||||
}
|
||||
|
||||
return message.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public CoreProtect getCoreProtect()
|
||||
{
|
||||
CoreProtect coreProtect = null;
|
||||
try
|
||||
{
|
||||
final Plugin coreProtectPlugin = Bukkit.getServer().getPluginManager().getPlugin("CoreProtect");
|
||||
assert coreProtectPlugin != null;
|
||||
if (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, Collections.singletonList(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, Collections.singletonList(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);
|
||||
}
|
||||
|
||||
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;
|
||||
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 PreparedStatement statement = connection.prepareStatement("SELECT id FROM co_world WHERE world = ?");
|
||||
statement.setQueryTimeout(30);
|
||||
|
||||
// Obtain world ID from CoreProtect database
|
||||
statement.setString(1, world.getName());
|
||||
ResultSet resultSet = statement.executeQuery();
|
||||
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)
|
||||
{
|
||||
final PreparedStatement statement1 = connection.prepareStatement("DELETE FROM ? WHERE wid = ?");
|
||||
statement1.setString(1, table);
|
||||
statement1.setString(2, worldID);
|
||||
statement1.executeQuery();
|
||||
}
|
||||
|
||||
connection.close();
|
||||
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
PlayerData data = plugin.pl.getData(player);
|
||||
Block block = event.getClickedBlock();
|
||||
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||
|
||||
// TODO: Rewrite this
|
||||
if (data.hasInspection())
|
||||
{
|
||||
int cooldownTime = 3;
|
||||
|
||||
// Cooldown check
|
||||
if ((event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK)
|
||||
&& cooldown.containsKey(player.getName()))
|
||||
{
|
||||
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||
if (secondsLeft > 0L)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Actual lookup time
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
{
|
||||
if (block != null)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
List<String[]> lookup = coreProtect.blockLookup(block, -1);
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (lookup != null)
|
||||
{
|
||||
if (lookup.isEmpty())
|
||||
{
|
||||
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
||||
return;
|
||||
}
|
||||
|
||||
HISTORY_MAP.remove(event.getPlayer());
|
||||
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
||||
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
||||
|
||||
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
||||
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
||||
|
||||
for (String[] value : lookup)
|
||||
{
|
||||
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
||||
BlockData bl = result.getBlockData();
|
||||
|
||||
String s;
|
||||
String st = "";
|
||||
|
||||
if (result.getActionString().equals("Placement"))
|
||||
{
|
||||
s = " placed ";
|
||||
}
|
||||
else if (result.getActionString().equals("Removal"))
|
||||
{
|
||||
s = " broke ";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = " interacted with ";
|
||||
}
|
||||
|
||||
if (result.isRolledBack())
|
||||
{
|
||||
st += "§m";
|
||||
}
|
||||
|
||||
int time = (int)(System.currentTimeMillis() / 1000L);
|
||||
|
||||
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
||||
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
||||
}
|
||||
|
||||
List<String> page = paged.getPage(1);
|
||||
for (String entries : page)
|
||||
{
|
||||
player.sendMessage(entries);
|
||||
}
|
||||
|
||||
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
|
||||
{
|
||||
if (block != null)
|
||||
{
|
||||
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
|
||||
Block placedBlock = blockState.getBlock();
|
||||
event.setCancelled(true);
|
||||
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
|
||||
|
||||
if (lookup.isEmpty())
|
||||
{
|
||||
lookup = coreProtect.blockLookup(block, -1);
|
||||
}
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (lookup != null)
|
||||
{
|
||||
if (lookup.isEmpty())
|
||||
{
|
||||
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
||||
return;
|
||||
}
|
||||
|
||||
HISTORY_MAP.remove(event.getPlayer());
|
||||
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
||||
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
||||
|
||||
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
||||
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
||||
|
||||
for (String[] value : lookup)
|
||||
{
|
||||
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
||||
BlockData bl = result.getBlockData();
|
||||
|
||||
String s;
|
||||
String st = "";
|
||||
|
||||
if (result.getActionString().equals("Placement"))
|
||||
{
|
||||
s = " placed ";
|
||||
}
|
||||
else if (result.getActionString().equals("Removal"))
|
||||
{
|
||||
s = " broke ";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = " interacted with ";
|
||||
}
|
||||
|
||||
if (result.isRolledBack())
|
||||
{
|
||||
st += "§m";
|
||||
}
|
||||
|
||||
int time = (int)(System.currentTimeMillis() / 1000L);
|
||||
|
||||
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
||||
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
||||
}
|
||||
|
||||
List<String> page = paged.getPage(1);
|
||||
for (String entries : page)
|
||||
{
|
||||
player.sendMessage(entries);
|
||||
}
|
||||
|
||||
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,221 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import com.earth2me.essentials.Essentials;
|
||||
import com.earth2me.essentials.User;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
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.scheduler.BukkitRunnable;
|
||||
|
||||
public class EssentialsBridge extends FreedomService
|
||||
{
|
||||
|
||||
private Essentials essentialsPlugin = null;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public Essentials getEssentialsPlugin()
|
||||
{
|
||||
if (essentialsPlugin == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
|
||||
assert essentials != null;
|
||||
if (essentials instanceof Essentials)
|
||||
{
|
||||
essentialsPlugin = (Essentials)essentials;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
return essentialsPlugin;
|
||||
}
|
||||
|
||||
public User getEssentialsUser(String username)
|
||||
{
|
||||
try
|
||||
{
|
||||
Essentials essentials = getEssentialsPlugin();
|
||||
if (essentials != null)
|
||||
{
|
||||
return essentials.getUserMap().getUser(username);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setNickname(String username, String nickname)
|
||||
{
|
||||
try
|
||||
{
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
user.setNickname(nickname);
|
||||
user.setDisplayNick();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public String getNickname(String username)
|
||||
{
|
||||
try
|
||||
{
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
return user.getNickname();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public long getLastActivity(String username)
|
||||
{
|
||||
try
|
||||
{
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
Long l = FUtil.getField(user, "lastActivity");
|
||||
return (l != null) ? l : 0L;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public void setVanished(String username, boolean vanished)
|
||||
{
|
||||
try
|
||||
{
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
user.setVanished(vanished);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@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 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);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Actually use this for something or remove it.
|
||||
@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,101 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import me.libraryaddict.disguise.BlockedDisguises;
|
||||
import me.libraryaddict.disguise.DisguiseAPI;
|
||||
import me.libraryaddict.disguise.LibsDisguises;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class LibsDisguisesBridge extends FreedomService
|
||||
{
|
||||
private LibsDisguises libsDisguisesPlugin = null;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public LibsDisguises getLibsDisguisesPlugin()
|
||||
{
|
||||
if (libsDisguisesPlugin == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Plugin libsDisguises = server.getPluginManager().getPlugin("LibsDisguises");
|
||||
if (libsDisguises != null)
|
||||
{
|
||||
if (libsDisguises instanceof LibsDisguises)
|
||||
{
|
||||
libsDisguisesPlugin = (LibsDisguises)libsDisguises;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
return libsDisguisesPlugin;
|
||||
}
|
||||
|
||||
public void undisguiseAll(boolean admin)
|
||||
{
|
||||
try
|
||||
{
|
||||
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
||||
|
||||
if (libsDisguises == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (DisguiseAPI.isDisguised(player))
|
||||
{
|
||||
if (!admin && plugin.al.isAdmin(player))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
DisguiseAPI.undisguiseToAll(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isDisguisesEnabled()
|
||||
{
|
||||
return !BlockedDisguises.disabled;
|
||||
}
|
||||
|
||||
public void setDisguisesEnabled(boolean state)
|
||||
{
|
||||
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
||||
|
||||
if (libsDisguises == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedDisguises.disabled = !state;
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
{
|
||||
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
||||
|
||||
return libsDisguises != null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
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.GUILD_CHAT.contains(player);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,175 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import com.sk89q.worldedit.LocalSession;
|
||||
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class WorldEditBridge extends FreedomService
|
||||
{
|
||||
|
||||
//
|
||||
private WorldEditPlugin worldeditPlugin = null;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public WorldEditPlugin getWorldEditPlugin()
|
||||
{
|
||||
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)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void redo(Player player, int count)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.redo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimit(Player player, int limit)
|
||||
{
|
||||
try
|
||||
{
|
||||
final LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
session.setBlockChangeLimit(limit);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||
if (wep == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return wep.getSession(player);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private BukkitPlayer getBukkitPlayer(Player player)
|
||||
{
|
||||
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||
if (wep == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return wep.wrapPlayer(player);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.util.Location;
|
||||
import com.sk89q.worldguard.LocalPlayer;
|
||||
import com.sk89q.worldguard.WorldGuard;
|
||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||
import com.sk89q.worldguard.protection.flags.Flags;
|
||||
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 com.sk89q.worldguard.protection.regions.RegionQuery;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class WorldGuardBridge extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public boolean canEditCurrentWorld(Player player)
|
||||
{
|
||||
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
|
||||
|
||||
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||
RegionQuery query = container.createQuery();
|
||||
|
||||
return query.testBuild(localPlayer.getLocation(), localPlayer);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,288 @@
|
|||
package me.totalfreedom.totalfreedommod.caging;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Skull;
|
||||
|
||||
public class CageData
|
||||
{
|
||||
|
||||
private static String input = null;
|
||||
private final FPlayer fPlayer;
|
||||
//
|
||||
//
|
||||
private final List<BlockData> cageHistory = new ArrayList<>();
|
||||
private boolean caged = false;
|
||||
private Location location;
|
||||
private Material outerMaterial = Material.GLASS;
|
||||
private Material innerMaterial = Material.AIR;
|
||||
|
||||
public CageData(FPlayer player)
|
||||
{
|
||||
this.fPlayer = player;
|
||||
}
|
||||
|
||||
// Util methods
|
||||
public static void generateCube(Location location, int length, Material material)
|
||||
{
|
||||
final Block center = location.getBlock();
|
||||
for (int xOffset = -length; xOffset <= length; xOffset++)
|
||||
{
|
||||
for (int yOffset = -length; yOffset <= length; yOffset++)
|
||||
{
|
||||
for (int zOffset = -length; zOffset <= length; zOffset++)
|
||||
{
|
||||
final Block block = center.getRelative(xOffset, yOffset, zOffset);
|
||||
if (block.getType() != material)
|
||||
{
|
||||
block.setType(material);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void generateHollowCube(Location location, int length, Material material)
|
||||
{
|
||||
final Block center = location.getBlock();
|
||||
for (int xOffset = -length; xOffset <= length; xOffset++)
|
||||
{
|
||||
for (int yOffset = -length; yOffset <= length; yOffset++)
|
||||
{
|
||||
for (int zOffset = -length; zOffset <= length; zOffset++)
|
||||
{
|
||||
// Hollow
|
||||
if (Math.abs(xOffset) != length && Math.abs(yOffset) != length && Math.abs(zOffset) != length)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final Block block = center.getRelative(xOffset, yOffset, zOffset);
|
||||
|
||||
if (material != Material.PLAYER_HEAD)
|
||||
{
|
||||
// Glowstone light
|
||||
if (material != Material.GLASS && xOffset == 0 && yOffset == 2 && zOffset == 0)
|
||||
{
|
||||
block.setType(Material.GLOWSTONE);
|
||||
continue;
|
||||
}
|
||||
|
||||
block.setType(material);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Math.abs(xOffset) == length && Math.abs(yOffset) == length && Math.abs(zOffset) == length)
|
||||
{
|
||||
block.setType(Material.GLOWSTONE);
|
||||
continue;
|
||||
}
|
||||
|
||||
block.setType(Material.PLAYER_HEAD);
|
||||
if (input != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
Skull skull = (Skull)block.getState();
|
||||
skull.setOwningPlayer(Bukkit.getOfflinePlayer(input));
|
||||
skull.update();
|
||||
}
|
||||
catch (ClassCastException ignored)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String getInput()
|
||||
{
|
||||
return input;
|
||||
}
|
||||
|
||||
public static void setInput(String input)
|
||||
{
|
||||
CageData.input = input;
|
||||
}
|
||||
|
||||
public void cage(Location location, Material outer, Material inner)
|
||||
{
|
||||
if (isCaged())
|
||||
{
|
||||
setCaged(false);
|
||||
}
|
||||
|
||||
this.caged = true;
|
||||
this.location = location;
|
||||
this.outerMaterial = outer;
|
||||
this.innerMaterial = inner;
|
||||
input = null;
|
||||
|
||||
buildHistory(location);
|
||||
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;
|
||||
CageData.input = input;
|
||||
|
||||
buildHistory(location);
|
||||
regenerate();
|
||||
}
|
||||
|
||||
public void regenerate()
|
||||
{
|
||||
|
||||
if (!caged
|
||||
|| location == null
|
||||
|| outerMaterial == null
|
||||
|| innerMaterial == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
generateHollowCube(location, 2, outerMaterial);
|
||||
generateCube(location, 1, innerMaterial);
|
||||
}
|
||||
|
||||
// TODO: EventHandler this?
|
||||
public void playerJoin()
|
||||
{
|
||||
if (!isCaged())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
cage(fPlayer.getPlayer().getLocation(), outerMaterial, innerMaterial, input);
|
||||
}
|
||||
|
||||
public void playerQuit()
|
||||
{
|
||||
regenerateHistory();
|
||||
clearHistory();
|
||||
}
|
||||
|
||||
public void clearHistory()
|
||||
{
|
||||
cageHistory.clear();
|
||||
}
|
||||
|
||||
private void insertHistoryBlock(Location location, Material material)
|
||||
{
|
||||
cageHistory.add(new BlockData(location, material));
|
||||
}
|
||||
|
||||
private void regenerateHistory()
|
||||
{
|
||||
for (BlockData blockdata : this.cageHistory)
|
||||
{
|
||||
blockdata.location.getBlock().setType(blockdata.material);
|
||||
}
|
||||
}
|
||||
|
||||
private void buildHistory(Location location)
|
||||
{
|
||||
final Block center = location.getBlock();
|
||||
for (int xOffset = -2; xOffset <= 2; xOffset++)
|
||||
{
|
||||
for (int yOffset = -2; yOffset <= 2; yOffset++)
|
||||
{
|
||||
for (int zOffset = -2; zOffset <= 2; zOffset++)
|
||||
{
|
||||
final Block block = center.getRelative(xOffset, yOffset, zOffset);
|
||||
insertHistoryBlock(block.getLocation(), block.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public FPlayer getfPlayer()
|
||||
{
|
||||
return fPlayer;
|
||||
}
|
||||
|
||||
public List<BlockData> getCageHistory()
|
||||
{
|
||||
return cageHistory;
|
||||
}
|
||||
|
||||
public boolean isCaged()
|
||||
{
|
||||
return caged;
|
||||
}
|
||||
|
||||
public void setCaged(boolean cage)
|
||||
{
|
||||
if (cage)
|
||||
{
|
||||
cage(fPlayer.getPlayer().getLocation(), Material.GLASS, Material.GLASS);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.caged = false;
|
||||
regenerateHistory();
|
||||
clearHistory();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Location getLocation()
|
||||
{
|
||||
return location;
|
||||
}
|
||||
|
||||
public void setLocation(Location location)
|
||||
{
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
public Material getOuterMaterial()
|
||||
{
|
||||
return outerMaterial;
|
||||
}
|
||||
|
||||
public void setOuterMaterial(Material outerMaterial)
|
||||
{
|
||||
this.outerMaterial = outerMaterial;
|
||||
}
|
||||
|
||||
public Material getInnerMaterial()
|
||||
{
|
||||
return innerMaterial;
|
||||
}
|
||||
|
||||
public void setInnerMaterial(Material innerMaterial)
|
||||
{
|
||||
this.innerMaterial = innerMaterial;
|
||||
}
|
||||
|
||||
private static class BlockData
|
||||
{
|
||||
|
||||
public Material material;
|
||||
public Location location;
|
||||
|
||||
private BlockData(Location location, Material material)
|
||||
{
|
||||
this.location = location;
|
||||
this.material = material;
|
||||
}
|
||||
}
|
||||
}
|
116
src/main/java/me/totalfreedom/totalfreedommod/caging/Cager.java
Normal file
116
src/main/java/me/totalfreedom/totalfreedommod/caging/Cager.java
Normal file
|
@ -0,0 +1,116 @@
|
|||
package me.totalfreedom.totalfreedommod.caging;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
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.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerKickEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
public class Cager extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
public void onBreakBlock(BlockBreakEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(event.getPlayer());
|
||||
CageData cage = fPlayer.getCageData();
|
||||
|
||||
if (cage.isCaged())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
FPlayer player = plugin.pl.getPlayer(event.getPlayer());
|
||||
CageData cage = player.getCageData();
|
||||
|
||||
if (!cage.isCaged())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Location playerLoc = player.getPlayer().getLocation().add(0, 1, 0);
|
||||
Location cageLoc = cage.getLocation();
|
||||
|
||||
final boolean outOfCage;
|
||||
if (!Objects.equals(playerLoc.getWorld(), cageLoc.getWorld()))
|
||||
{
|
||||
outOfCage = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
outOfCage = playerLoc.distanceSquared(cageLoc) > (2.5D * 2.5D);
|
||||
}
|
||||
|
||||
if (outOfCage)
|
||||
{
|
||||
PaperLib.teleportAsync(player.getPlayer(), cageLoc.subtract(0, 0.1, 0));
|
||||
FUtil.playerMsg(player.getPlayer(), "You may not leave your cage.", ChatColor.RED);
|
||||
cage.regenerate();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerQuit(PlayerQuitEvent event)
|
||||
{
|
||||
FPlayer player = plugin.pl.getPlayer(event.getPlayer());
|
||||
CageData cage = player.getCageData();
|
||||
|
||||
if (cage.isCaged())
|
||||
{
|
||||
cage.playerQuit();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerKick(PlayerKickEvent event)
|
||||
{
|
||||
FPlayer player = plugin.pl.getPlayer(event.getPlayer());
|
||||
CageData cage = player.getCageData();
|
||||
|
||||
if (cage.isCaged())
|
||||
{
|
||||
cage.playerQuit();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
FPlayer player = plugin.pl.getPlayer(event.getPlayer());
|
||||
CageData cage = player.getCageData();
|
||||
|
||||
if (cage.isCaged())
|
||||
{
|
||||
cage.playerJoin();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
public class CommandFailException extends RuntimeException
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = -92333791173123L;
|
||||
|
||||
public CommandFailException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
public class CommandLoader extends FreedomService
|
||||
{
|
||||
private final List<FreedomCommand> commands;
|
||||
|
||||
public CommandLoader()
|
||||
{
|
||||
commands = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
public List<FreedomCommand> getCommands()
|
||||
{
|
||||
return commands;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package me.StevenLawson.TotalFreedomMod.Commands;
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
@ -6,9 +6,10 @@ import java.lang.annotation.RetentionPolicy;
|
|||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface CommandParameters
|
||||
{
|
||||
|
||||
String description();
|
||||
|
||||
String usage();
|
||||
|
||||
String aliases() default ""; // "alias1,alias2,alias3" - no spaces
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface CommandPermissions
|
||||
{
|
||||
|
||||
Rank level() default Rank.NON_OP;
|
||||
|
||||
SourceType source() default SourceType.BOTH;
|
||||
|
||||
boolean blockHostConsole() default false;
|
||||
|
||||
int cooldown() default 0;
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Talk privately with other admins on the server.", usage = "/<command> [message]", aliases = "o,sc,ac,staffchat")
|
||||
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("You must be in-game to toggle admin chat, it cannot be toggled via CONSOLE or Telnet.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FPlayer userinfo = plugin.pl.getPlayer(playerSender);
|
||||
userinfo.setAdminChat(!userinfo.inAdminChat());
|
||||
msg("Admin chat turned " + (userinfo.inAdminChat() ? "on" : "off") + ".");
|
||||
}
|
||||
else
|
||||
{
|
||||
plugin.cm.adminChat(sender, StringUtils.join(args, " "));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
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.OP, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Information on how to apply for admin.", usage = "/<command>", aliases = "si,ai,staffinfo")
|
||||
public class Command_admininfo extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
List<String> adminInfo = ConfigEntry.ADMIN_INFO.getStringList();
|
||||
|
||||
if (adminInfo.isEmpty())
|
||||
{
|
||||
msg("The admin information section of the config.yml file has not been configured.", ChatColor.RED);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(FUtil.colorize(StringUtils.join(adminInfo, "\n")));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
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.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Denies joining of operators and only allows admins to join.", usage = "/<command> [on | off]", aliases = "staffmode")
|
||||
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-admins", true);
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (!isAdmin(player))
|
||||
{
|
||||
player.kickPlayer("Server is now closed to non-admins.");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1 && plugin.al.isAdmin(sender) && !(sender instanceof Player))
|
||||
{
|
||||
return Arrays.asList("on", "off");
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,201 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldTime;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldWeather;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Allows for admins to configure time, and weather of the AdminWorld, and allows for admins and ops to go to the AdminWorld.",
|
||||
usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]",
|
||||
aliases = "sw,aw,staffworld")
|
||||
public class Command_adminworld extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
CommandMode commandMode = null;
|
||||
|
||||
if (args.length == 0)
|
||||
{
|
||||
commandMode = CommandMode.TELEPORT;
|
||||
}
|
||||
else if (args.length >= 2)
|
||||
{
|
||||
if ("time".equalsIgnoreCase(args[0]))
|
||||
{
|
||||
commandMode = CommandMode.TIME;
|
||||
}
|
||||
else if ("weather".equalsIgnoreCase(args[0]))
|
||||
{
|
||||
commandMode = CommandMode.WEATHER;
|
||||
}
|
||||
}
|
||||
|
||||
if (commandMode == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
switch (commandMode)
|
||||
{
|
||||
case TELEPORT:
|
||||
{
|
||||
if (!(sender instanceof Player) || playerSender == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
World adminWorld = null;
|
||||
try
|
||||
{
|
||||
adminWorld = plugin.wm.adminworld.getWorld();
|
||||
}
|
||||
catch (Exception ignored)
|
||||
{
|
||||
}
|
||||
|
||||
if (adminWorld == null || playerSender.getWorld() == adminWorld)
|
||||
{
|
||||
msg("Going to the main world.");
|
||||
PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation());
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Going to the AdminWorld.");
|
||||
plugin.wm.adminworld.sendToWorld(playerSender);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TIME:
|
||||
{
|
||||
assertCommandPerms(sender, playerSender);
|
||||
|
||||
if (args.length == 2)
|
||||
{
|
||||
WorldTime timeOfDay = WorldTime.getByAlias(args[1]);
|
||||
if (timeOfDay != null)
|
||||
{
|
||||
plugin.wm.adminworld.setTimeOfDay(timeOfDay);
|
||||
msg("AdminWorld time set to: " + timeOfDay.name());
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Invalid time of day. Can be: sunrise, noon, sunset, midnight");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case WEATHER:
|
||||
{
|
||||
assertCommandPerms(sender, playerSender);
|
||||
|
||||
if (args.length == 2)
|
||||
{
|
||||
WorldWeather weatherMode = WorldWeather.getByAlias(args[1]);
|
||||
if (weatherMode != null)
|
||||
{
|
||||
plugin.wm.adminworld.setWeatherMode(weatherMode);
|
||||
msg("AdminWorld weather set to: " + weatherMode.name());
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Invalid weather mode. Can be: off, rain, storm");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (PermissionDeniedException ex)
|
||||
{
|
||||
if (ex.getMessage().isEmpty())
|
||||
{
|
||||
return noPerms();
|
||||
}
|
||||
msg(ex.getMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: Redo this properly
|
||||
private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException
|
||||
{
|
||||
if (!(sender instanceof Player) || playerSender == null || !isAdmin(sender))
|
||||
{
|
||||
throw new PermissionDeniedException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (!plugin.al.isAdmin(sender))
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (args.length == 1)
|
||||
{
|
||||
return Arrays.asList("time", "weather");
|
||||
}
|
||||
else if (args.length == 2)
|
||||
{
|
||||
if (args[0].equals("time"))
|
||||
{
|
||||
return Arrays.asList("morning", "noon", "evening", "night");
|
||||
}
|
||||
else if (args[0].equals("weather"))
|
||||
{
|
||||
return Arrays.asList("off", "rain", "storm");
|
||||
}
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
private enum CommandMode
|
||||
{
|
||||
TELEPORT, TIME, WEATHER
|
||||
}
|
||||
|
||||
private static class PermissionDeniedException extends Exception
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private PermissionDeniedException()
|
||||
{
|
||||
super("");
|
||||
}
|
||||
|
||||
private PermissionDeniedException(String string)
|
||||
{
|
||||
super(string);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@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
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length == 0)
|
||||
{
|
||||
if (isConsole())
|
||||
{
|
||||
msg("When used from the console, you must define a target player.");
|
||||
return true;
|
||||
}
|
||||
|
||||
playerSender.setGameMode(GameMode.ADVENTURE);
|
||||
msg("Your gamemode has been set to adventure.");
|
||||
return true;
|
||||
}
|
||||
|
||||
checkRank(Rank.ADMIN);
|
||||
|
||||
if (args[0].equals("-a"))
|
||||
{
|
||||
for (Player targetPlayer : server.getOnlinePlayers())
|
||||
{
|
||||
targetPlayer.setGameMode(GameMode.ADVENTURE);
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to adventure", false);
|
||||
msg("Your gamemode has been set to adventure.");
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = getPlayer(args[0]);
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
msg("Setting " + player.getName() + " to game mode adventure.");
|
||||
msg(player, sender.getName() + " set your game mode to adventure.");
|
||||
player.setGameMode(GameMode.ADVENTURE);
|
||||
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.ADMIN, 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.adminAction(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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Make an announcement anonymously to operators.", usage = "/<command> <message>")
|
||||
public class Command_announce extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
plugin.an.announce(StringUtils.join(args, " "));
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
StringBuilder list = new StringBuilder("All possible attributes: ");
|
||||
|
||||
for (Attribute attribute : Attribute.values())
|
||||
{
|
||||
list.append(attribute.name()).append(", ");
|
||||
}
|
||||
|
||||
// Remove extra comma at the end of the list
|
||||
list = new StringBuilder(list.substring(0, list.length() - 2));
|
||||
|
||||
msg(list.toString());
|
||||
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.ADMIN, 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.ADMIN, 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,185 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
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.ADMIN, 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 String ip;
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
if (player == null)
|
||||
{
|
||||
// Gets the IP using Essentials data if available
|
||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
||||
{
|
||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
||||
//
|
||||
username = essUser.getName();
|
||||
ip = essUser.getLastLoginAddress();
|
||||
}
|
||||
// Last resort - Getting the first result from the username itself
|
||||
else
|
||||
{
|
||||
PlayerData entry = plugin.pl.getData(args[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
username = entry.getName();
|
||||
ip = entry.getIps().get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
username = player.getName();
|
||||
ip = 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);
|
||||
Objects.requireNonNull(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);
|
||||
}
|
||||
ban.addIp(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: " + ip);
|
||||
FUtil.adminAction(sender.getName(), 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, ip, 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.ADMIN, 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 = sender.getName() + " - Banned " + (plugin.al.isAdmin(player) ? "the IP " + ip : "an IP");
|
||||
msg(player, message, ChatColor.RED);
|
||||
}
|
||||
}
|
||||
|
||||
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.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@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
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("purge"))
|
||||
{
|
||||
checkRank(Rank.SENIOR_ADMIN);
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Purging the ban list", true);
|
||||
int amount = plugin.bm.purge();
|
||||
msg("Purged " + amount + " player bans.");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
msg(plugin.bm.getAllBans().size() + " player bans ("
|
||||
+ plugin.bm.getUsernameBans().size() + " usernames, "
|
||||
+ plugin.bm.getIpBans().size() + " IPs)");
|
||||
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.ADMIN, 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.adminAction(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.SplittableRandom;
|
||||
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);
|
||||
SplittableRandom random = new SplittableRandom();
|
||||
return fishTypes.get(random.nextInt(fishTypes.size()));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
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.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@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
|
||||
{
|
||||
|
||||
@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].equals("purge"))
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Unblocking commands for all players", true);
|
||||
int counter = 0;
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
if (playerdata.allCommandsBlocked())
|
||||
{
|
||||
counter += 1;
|
||||
playerdata.setCommandsBlocked(false);
|
||||
}
|
||||
}
|
||||
msg("Unblocked commands for " + counter + " players.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equals("-a"))
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Blocking commands for all non-admins", true);
|
||||
int counter = 0;
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (isAdmin(player))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
counter += 1;
|
||||
plugin.pl.getPlayer(player).setCommandsBlocked(true);
|
||||
msg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
|
||||
}
|
||||
|
||||
msg("Blocked commands for " + counter + " players.");
|
||||
return true;
|
||||
}
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isAdmin(player))
|
||||
{
|
||||
msg(player.getName() + " is an admin, and cannot have their commands blocked.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
if (!playerdata.allCommandsBlocked())
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
||||
playerdata.setCommandsBlocked(true);
|
||||
msg("Blocked commands for " + player.getName() + ".");
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("That players commands are already blocked.", ChatColor.RED);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue