Compare commits
865 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6f139c47e | ||
|
|
1bae159f94 | ||
|
|
43d2835087 | ||
|
|
cb2d4d6a34 | ||
|
|
9bb73d8e90 | ||
|
|
86c4867206 | ||
|
|
43e13248d6 | ||
|
|
f6ff45228a | ||
|
|
af1c20f5c5 | ||
|
|
9ac564c345 | ||
|
|
857d51a7a1 | ||
|
|
ab5f8cee5a | ||
|
|
bdd518b280 | ||
|
|
494c1a87b2 | ||
|
|
f78f92b5f6 | ||
|
|
048b56c58c | ||
|
|
75dec2bf49 | ||
|
|
7119da13b7 | ||
|
|
6a8637922b | ||
|
|
abce7b898c | ||
|
|
562d7f382c | ||
|
|
c72b15c3a6 | ||
|
|
54b7e99c82 | ||
|
|
4b6a0ee05d | ||
|
|
89e5d8898b | ||
|
|
08c14f4def | ||
|
|
0fa6f972c0 | ||
|
|
8837fecfa0 | ||
|
|
af1841770e | ||
|
|
1d85dbf08d | ||
|
|
ba9812534a | ||
|
|
1f95a33385 | ||
|
|
bc652a8154 | ||
|
|
0c2e1f0cae | ||
|
|
39d6eb7f9a | ||
|
|
61bae6de55 | ||
|
|
86f230c836 | ||
|
|
aa4ac4c6d1 | ||
|
|
7141b12e95 | ||
|
|
2382548629 | ||
|
|
0c4bd182f7 | ||
|
|
e90e053b45 | ||
|
|
742c1abb00 | ||
|
|
c0686ca386 | ||
|
|
db2ea7daa9 | ||
|
|
ed4f0b2ab6 | ||
|
|
6decc68d1b | ||
|
|
1e061313a4 | ||
|
|
4762004e94 | ||
|
|
0d9889ef43 | ||
|
|
b2a23e80a1 | ||
|
|
0e439db7b3 | ||
|
|
f615006b23 | ||
|
|
d952dbc61b | ||
|
|
d95a96f4c6 | ||
|
|
33940f5778 | ||
|
|
173d04595f | ||
|
|
c7c4ca3777 | ||
|
|
cbf7316db9 | ||
|
|
601cadd582 | ||
|
|
877647db03 | ||
|
|
81196bb132 | ||
|
|
ef701f1f86 | ||
|
|
58d8f72cf5 | ||
|
|
3abf916f18 | ||
|
|
b459a746e3 | ||
|
|
30c37078a2 | ||
|
|
36ccfb5fc6 | ||
|
|
c84f1a060a | ||
|
|
d8d5609f6b | ||
|
|
462abd46c6 | ||
|
|
e89008cf97 | ||
|
|
d34e43797d | ||
|
|
63ee83c795 | ||
|
|
2eec17698e | ||
|
|
ad52c2a086 | ||
|
|
6e482cccda | ||
|
|
899b4297f7 | ||
|
|
ceb95e20b5 | ||
|
|
bdfeb9a0ab | ||
|
|
e0707e2afa | ||
|
|
e8048f5a0a | ||
|
|
a36018e31a | ||
|
|
a34c63161d | ||
|
|
2eb350977c | ||
|
|
8a89a63c5f | ||
|
|
5c26e6e782 | ||
|
|
f88b914fa6 | ||
|
|
15ff6b3ea3 | ||
|
|
b14eed696c | ||
|
|
cffae33c87 | ||
|
|
adf6d1c800 | ||
|
|
2b7c8962e7 | ||
|
|
b60cbfce2c | ||
|
|
910ad18703 | ||
|
|
8a4a71ebc1 | ||
|
|
2e748b1723 | ||
|
|
cb28726bc3 | ||
|
|
c0c20d63bb | ||
|
|
3b11610c45 | ||
|
|
232048022e | ||
|
|
9abfe0ab01 | ||
|
|
e7ac05278c | ||
|
|
85ba40c279 | ||
|
|
1acf86492e | ||
|
|
4609d38389 | ||
|
|
2d6836cc93 | ||
|
|
8e21617345 | ||
|
|
2f99a17d02 | ||
|
|
34edf1d7b4 | ||
|
|
be85ba5706 | ||
|
|
b817b00ca4 | ||
|
|
ee02528abc | ||
|
|
794948c8f9 | ||
|
|
7c70dec2e7 | ||
|
|
d1f20b7111 | ||
|
|
595751a094 | ||
|
|
8231afdcbf | ||
|
|
4f55d66096 | ||
|
|
d350febbdc | ||
|
|
78755b0e9a | ||
|
|
63d7bdab6b | ||
|
|
344032b7e3 | ||
|
|
3ae5c8a72c | ||
|
|
e4f2bc2e39 | ||
|
|
90ba0a0391 | ||
|
|
801a3cd4f9 | ||
|
|
ce9cada75a | ||
|
|
ae551dd0f7 | ||
|
|
1b3dd53fb8 | ||
|
|
dda4224e6e | ||
|
|
6e14265655 | ||
|
|
77fd99d215 | ||
|
|
cf05efc2ff | ||
|
|
0e8c759a4c | ||
|
|
ba7bfb828b | ||
|
|
8dd1239b99 | ||
|
|
edada09966 | ||
|
|
19c300bbf3 | ||
|
|
4fc9c21034 | ||
|
|
2366dcd293 | ||
|
|
054e6a53c0 | ||
|
|
46f590fe3e | ||
|
|
b46aaf547f | ||
|
|
0f7125e1c8 | ||
|
|
6cb99819f3 | ||
|
|
a018a1fca5 | ||
|
|
8a7b8f2b03 | ||
|
|
abf3dc1e9e | ||
|
|
e92cc41be6 | ||
|
|
49570c841b | ||
|
|
9aa465844d | ||
|
|
a692fbee01 | ||
|
|
4223e8f17a | ||
|
|
5f26b23a53 | ||
|
|
c8c179981c | ||
|
|
4bb8bb62f9 | ||
|
|
c1b3bec67c | ||
|
|
f2535ce75c | ||
|
|
049d64821e | ||
|
|
bf5766e61c | ||
|
|
38da5fe6d1 | ||
|
|
e16649873b | ||
|
|
a3b0b4f847 | ||
|
|
d9f1ddd188 | ||
|
|
14a4d9291b | ||
|
|
6630044546 | ||
|
|
1043981fe4 | ||
|
|
fb0b7c52cf | ||
|
|
74e5464f7d | ||
|
|
2ad1ff4cdb | ||
|
|
2d47c18be6 | ||
|
|
69e67be436 | ||
|
|
c144723d5b | ||
|
|
108375f545 | ||
|
|
83d5b3e96e | ||
|
|
37e09a470e | ||
|
|
1f064110b7 | ||
|
|
94a0b4de5d | ||
|
|
8a68666f86 | ||
|
|
2c218d1088 | ||
|
|
3fa95d82a6 | ||
|
|
9648b42c4d | ||
|
|
66887f0a3a | ||
|
|
410cdfe7e3 | ||
|
|
bbffdc7e23 | ||
|
|
0d267e2bec | ||
|
|
578256f89b | ||
|
|
90ecbfce00 | ||
|
|
9945704338 | ||
|
|
5c7a7876d8 | ||
|
|
94df0e67a6 | ||
|
|
92c4e62709 | ||
|
|
e094a1e934 | ||
|
|
26c07a20e7 | ||
|
|
ad68e1efef | ||
|
|
d8c3a3befa | ||
|
|
aa52dcdf94 | ||
|
|
9d3ba7ea88 | ||
|
|
e2b417af74 | ||
|
|
77394d3038 | ||
|
|
fcc7f82b38 | ||
|
|
396f4dac44 | ||
|
|
3341093735 | ||
|
|
714d04e48f | ||
|
|
73b7ccea3a | ||
|
|
606bf8fcd2 | ||
|
|
fbbf893d64 | ||
|
|
36001373eb | ||
|
|
9ac34288eb | ||
|
|
6345d1fe92 | ||
|
|
a7fa0ecf26 | ||
|
|
a65f16cfac | ||
|
|
49965c091b | ||
|
|
f9bc2aba99 | ||
|
|
5627582bd5 | ||
|
|
ab8065d06e | ||
|
|
444764e481 | ||
|
|
c240e94a6b | ||
|
|
9da28a1dff | ||
|
|
cf3c1f8394 | ||
|
|
f98befbdce | ||
|
|
d0d8ea07e4 | ||
|
|
109347a601 | ||
|
|
43bef762bf | ||
|
|
69a2e0e247 | ||
|
|
874a9b4f32 | ||
|
|
5690221c27 | ||
|
|
f19b143804 | ||
|
|
10a313bef5 | ||
|
|
9ae40ae09e | ||
|
|
7b4e1d8d24 | ||
|
|
7035280731 | ||
|
|
a1e3d53cd2 | ||
|
|
d7885f05c3 | ||
|
|
415c425097 | ||
|
|
cb4d992e7d | ||
|
|
cb64d088d1 | ||
|
|
bbbf19c041 | ||
|
|
61ace5c8e5 | ||
|
|
94b73ef35c | ||
|
|
5cfc2068e7 | ||
|
|
0ce7d1dd6c | ||
|
|
19eefaf879 | ||
|
|
1ebf7fb875 | ||
|
|
e8afd15d80 | ||
|
|
d024c9238e | ||
|
|
1356bd1f26 | ||
|
|
407ccca5e0 | ||
|
|
82de602d47 | ||
|
|
b0873112af | ||
|
|
3a0b81b7de | ||
|
|
5142b9ce92 | ||
|
|
9403a1cbcb | ||
|
|
e4ebea354d | ||
|
|
d32b31f1e5 | ||
|
|
384657f1dc | ||
|
|
7c9d226bc3 | ||
|
|
031401bb8e | ||
|
|
1a5c429b67 | ||
|
|
d028cf5bf3 | ||
|
|
fdd1581ce3 | ||
|
|
3d07e10543 | ||
|
|
c851e35347 | ||
|
|
4cbb33b1fd | ||
|
|
2ff1458772 | ||
|
|
e71ad9f034 | ||
|
|
196a651ab3 | ||
|
|
253a8c24ad | ||
|
|
ac265d0260 | ||
|
|
ad861b10bb | ||
|
|
db5b7f89f6 | ||
|
|
2c33ce25c0 | ||
|
|
9c3ca429c9 | ||
|
|
70e294501a | ||
|
|
65a0a0ecc7 | ||
|
|
d4431e7569 | ||
|
|
a6191b0870 | ||
|
|
5eecef83ee | ||
|
|
82a02f3738 | ||
|
|
804142799b | ||
|
|
e1de9b9ab3 | ||
|
|
cc56343041 | ||
|
|
69d28e8bc2 | ||
|
|
6878a74724 | ||
|
|
ebc76bba76 | ||
|
|
378218b7da | ||
|
|
e053514b94 | ||
|
|
341a30e6da | ||
|
|
70eb6d4420 | ||
|
|
aa368909ae | ||
|
|
606a54bcf8 | ||
|
|
7f8fb3d87b | ||
|
|
e97d454ff6 | ||
|
|
109b9aa3f3 | ||
|
|
4a90385b27 | ||
|
|
0edd50832c | ||
|
|
46415268b7 | ||
|
|
b652dbad2d | ||
|
|
50550d077a | ||
|
|
60c3b58a33 | ||
|
|
7216d0b09f | ||
|
|
97eeea8d48 | ||
|
|
82061ee6a3 | ||
|
|
f274b9045e | ||
|
|
2241a5c90f | ||
|
|
bbc38ae801 | ||
|
|
e77346ed62 | ||
|
|
6117abca56 | ||
|
|
2e2a061ebe | ||
|
|
cdc89ac397 | ||
|
|
e758cebe77 | ||
|
|
a408e3436a | ||
|
|
3df977c1bc | ||
|
|
136f1841b4 | ||
|
|
1086a59a6a | ||
|
|
d9147f9918 | ||
|
|
d144df4048 | ||
|
|
061f77e911 | ||
|
|
5cebe2fce8 | ||
|
|
1e712dcae6 | ||
|
|
09d444da58 | ||
|
|
09f45c0ab5 | ||
|
|
f64d69f084 | ||
|
|
86a948738f | ||
|
|
8f9c5e7ed8 | ||
|
|
ae897b7493 | ||
|
|
f1a7c9d50e | ||
|
|
83ee8fe4cd | ||
|
|
465f885e22 | ||
|
|
d4141735a9 | ||
|
|
b9b4ce1937 | ||
|
|
56234e6c83 | ||
|
|
2dda34097e | ||
|
|
155a349569 | ||
|
|
ce231934a3 | ||
|
|
5cbb7bfe47 | ||
|
|
06e0ec0295 | ||
|
|
02ed583674 | ||
|
|
8e4cbdd1aa | ||
|
|
8828f8e45d | ||
|
|
d15524ee9e | ||
|
|
d45e66d71e | ||
|
|
6b1dde7540 | ||
|
|
abf2964c48 | ||
|
|
db51c4c761 | ||
|
|
cbb574acec | ||
|
|
93c044ef09 | ||
|
|
1cc39fe40a | ||
|
|
edfd561fcd | ||
|
|
bd7f22cb02 | ||
|
|
3233bad307 | ||
|
|
3cefcbe0bb | ||
|
|
49bce53724 | ||
|
|
2b86159b30 | ||
|
|
d028511a48 | ||
|
|
5ad1ef33b8 | ||
|
|
634d6194d6 | ||
|
|
7f7eb4f45a | ||
|
|
bd90ae996b | ||
|
|
1bc57dec08 | ||
|
|
ce44d40f0f | ||
|
|
68824fb4d0 | ||
|
|
fd96b0d2cf | ||
|
|
2669569e81 | ||
|
|
067f740bcc | ||
|
|
2ce96ab0b1 | ||
|
|
027f9be194 | ||
|
|
a09018d1f0 | ||
|
|
a1da83173d | ||
|
|
8ac30283f8 | ||
|
|
6099b5d64d | ||
|
|
19d2e0788b | ||
|
|
1b223b3736 | ||
|
|
d6d1f01704 | ||
|
|
51231939c0 | ||
|
|
72fb20ecd9 | ||
|
|
58a386922c | ||
|
|
12824c7f6c | ||
|
|
b5236b8db6 | ||
|
|
3ffbb861d1 | ||
|
|
f8fad15f0b | ||
|
|
a0e96fca35 | ||
|
|
6cf9a53a65 | ||
|
|
a4909453d7 | ||
|
|
a10666f792 | ||
|
|
a845cda9ed | ||
|
|
ed5f1ccb5e | ||
|
|
c6e59e1d62 | ||
|
|
ed24b6278e | ||
|
|
3aea7b4077 | ||
|
|
f53c29cd56 | ||
|
|
6845152a09 | ||
|
|
7eaf2dc8ed | ||
|
|
310485402f | ||
|
|
727dc25083 | ||
|
|
364f36d502 | ||
|
|
b6086bc4bd | ||
|
|
dd3beaa548 | ||
|
|
c36c0c247f | ||
|
|
6611a0f82c | ||
|
|
625b981b81 | ||
|
|
d8607917a1 | ||
|
|
30d5f54459 | ||
|
|
a59c05174f | ||
|
|
cf01abcf87 | ||
|
|
70a4a06d4f | ||
|
|
bbee18fd8a | ||
|
|
26ab9a327d | ||
|
|
0676f5fa33 | ||
|
|
051b95ad88 | ||
|
|
d786014cbc | ||
|
|
b62bb48bb6 | ||
|
|
b238a10209 | ||
|
|
251049f1f1 | ||
|
|
16d146dba0 | ||
|
|
214308da10 | ||
|
|
2c12f78aa6 | ||
|
|
800e83d24b | ||
|
|
0a1ee0679c | ||
|
|
898230040a | ||
|
|
6f01577165 | ||
|
|
1c8c95f292 | ||
|
|
8cda5be2f0 | ||
|
|
850bf5d642 | ||
|
|
af197db70a | ||
|
|
c11fedff4e | ||
|
|
4001af9b8c | ||
|
|
69a8acf39a | ||
|
|
7247b95cbe | ||
|
|
4b5657de91 | ||
|
|
11ab52be94 | ||
|
|
d47757cca4 | ||
|
|
411753859c | ||
|
|
bb188e5812 | ||
|
|
a1a477e7df | ||
|
|
3144c3a954 | ||
|
|
75412b98a4 | ||
|
|
3f7f1946dc | ||
|
|
d40fa7983d | ||
|
|
c7a7a8c48a | ||
|
|
cfd5cc4be2 | ||
|
|
c1e36eb2bc | ||
|
|
d6d6da520a | ||
|
|
b2fd23b13a | ||
|
|
d6e4346e4f | ||
|
|
b4e5735c51 | ||
|
|
ba8f861901 | ||
|
|
a40415a76f | ||
|
|
d85a7a4503 | ||
|
|
cab3cb9a9f | ||
|
|
9fb106c4de | ||
|
|
cce8e46634 | ||
|
|
bb595e340c | ||
|
|
b40c3a41c2 | ||
|
|
226ad14ede | ||
|
|
eadbb489a7 | ||
|
|
fb900a18ad | ||
|
|
395a5e1745 | ||
|
|
eeffa33918 | ||
|
|
617a91c41c | ||
|
|
fbfe11d275 | ||
|
|
a4e31ff5ca | ||
|
|
bf85785451 | ||
|
|
d830672795 | ||
|
|
255bb4b38e | ||
|
|
d73c665d20 | ||
|
|
39b95c7a34 | ||
|
|
bbcbc7f88b | ||
|
|
4787d0f389 | ||
|
|
641d479c6d | ||
|
|
a521a9c93a | ||
|
|
51f690c9cb | ||
|
|
a451732c1e | ||
|
|
d6d0e4d3b3 | ||
|
|
e6bdf192ed | ||
|
|
eccd4b4a6f | ||
|
|
8650e9bb2a | ||
|
|
8e5392084d | ||
|
|
5c39a557f2 | ||
|
|
75d13fafc1 | ||
|
|
c674518eb8 | ||
|
|
23e18cd0dd | ||
|
|
2644495bca | ||
|
|
130094a16e | ||
|
|
6c4bb2e6e8 | ||
|
|
c56d5d38c3 | ||
|
|
f0d44ccf02 | ||
|
|
83f9c27238 | ||
|
|
083f643ce2 | ||
|
|
76e808b8b1 | ||
|
|
beca53ca6a | ||
|
|
028c7c76da | ||
|
|
0e02e8f6db | ||
|
|
94984d993b | ||
|
|
741208d20c | ||
|
|
b92c55d3e7 | ||
|
|
b60fc49fd5 | ||
|
|
9fc5b78fa0 | ||
|
|
91ba7cc475 | ||
|
|
45fc05ca49 | ||
|
|
610081dab4 | ||
|
|
22c62e45be | ||
|
|
119b5742fb | ||
|
|
c143006c4b | ||
|
|
f88c9b7d42 | ||
|
|
775c562705 | ||
|
|
9b443f25cc | ||
|
|
ddeaa5c79c | ||
|
|
78093531f7 | ||
|
|
5ec293e9c9 | ||
|
|
d846f348ac | ||
|
|
30ce422349 | ||
|
|
9275b22f72 | ||
|
|
cc8392afd1 | ||
|
|
726f4a44c4 | ||
|
|
eafae209a6 | ||
|
|
04c450b46a | ||
|
|
d4e1f58f2a | ||
|
|
b0806b934b | ||
|
|
a21ecfbdde | ||
|
|
f3a6861bc6 | ||
|
|
eaa295e6a3 | ||
|
|
399387eca1 | ||
|
|
272f551aae | ||
|
|
d8c5fc0959 | ||
|
|
d1ca106d01 | ||
|
|
99f5174e28 | ||
|
|
d9f4aee384 | ||
|
|
c2aae8c2eb | ||
|
|
52061b7b51 | ||
|
|
762969c172 | ||
|
|
62d5cf885f | ||
|
|
1e70a9fdea | ||
|
|
ec8a65b4f8 | ||
|
|
a163219372 | ||
|
|
4d6e097f8f | ||
|
|
497adbe7b1 | ||
|
|
78907412b2 | ||
|
|
d6bec5d88b | ||
|
|
aab1f31ca0 | ||
|
|
5ea586eaae | ||
|
|
2ffc293211 | ||
|
|
88bedef420 | ||
|
|
dac5ffce9a | ||
|
|
d641adadea | ||
|
|
46269354c6 | ||
|
|
2d93465d1d | ||
|
|
484d4dde75 | ||
|
|
5e9a408704 | ||
|
|
f1b113f435 | ||
|
|
5d553d725c | ||
|
|
a3be846083 | ||
|
|
54e0b3f482 | ||
|
|
93794fe454 | ||
|
|
7f4a0c800e | ||
|
|
853864f6f0 | ||
|
|
0cb6e8f669 | ||
|
|
d30f657eec | ||
|
|
d60ecdd340 | ||
|
|
07310df68a | ||
|
|
5c91aa220a | ||
|
|
756a76057a | ||
|
|
b6f27ee232 | ||
|
|
74ca2e82ef | ||
|
|
4039439fda | ||
|
|
7dac671690 | ||
|
|
411d517a9a | ||
|
|
0d84141116 | ||
|
|
6bfd5bd153 | ||
|
|
b7d421e1a8 | ||
|
|
2e9d811d3f | ||
|
|
672b295917 | ||
|
|
60a83478e8 | ||
|
|
c880a476d4 | ||
|
|
692305d595 | ||
|
|
9d4cc2961c | ||
|
|
358b389875 | ||
|
|
7fa25c2500 | ||
|
|
91c58c4a53 | ||
|
|
4ccee91c64 | ||
|
|
eef87342a1 | ||
|
|
efc70ea7a8 | ||
|
|
de38299264 | ||
|
|
bc94f43299 | ||
|
|
ed705cc577 | ||
|
|
93410490c5 | ||
|
|
33914ac284 | ||
|
|
2acf2ee687 | ||
|
|
0470552168 | ||
|
|
3e724eea18 | ||
|
|
33ba5c9d31 | ||
|
|
94ab094952 | ||
|
|
58f5d3f352 | ||
|
|
912872e791 | ||
|
|
7a65e6e821 | ||
|
|
3f446f6072 | ||
|
|
50f57abd6c | ||
|
|
2c5eae6c6c | ||
|
|
1e3e54b8c5 | ||
|
|
0ce9119a94 | ||
|
|
bf76ba9f5a | ||
|
|
8a065bf7ca | ||
|
|
5f045d02a6 | ||
|
|
f07ef3045b | ||
|
|
007a579f5a | ||
|
|
9b19cd412a | ||
|
|
08b5cc1612 | ||
|
|
47aa61c7b3 | ||
|
|
ef1ee84358 | ||
|
|
49a36a4e81 | ||
|
|
bf76dec28e | ||
|
|
a0f51d79e8 | ||
|
|
9be516e511 | ||
|
|
a130935c62 | ||
|
|
4359bd17ae | ||
|
|
07726959e9 | ||
|
|
13c8187b3b | ||
|
|
be1267ef0c | ||
|
|
e61e9bc0a8 | ||
|
|
ec801cd776 | ||
|
|
a5b5bc6b46 | ||
|
|
f5efb50d71 | ||
|
|
d65c04aaa7 | ||
|
|
aa69d2a1a9 | ||
|
|
685cd5f998 | ||
|
|
bae4b567c8 | ||
|
|
0eb3315d61 | ||
|
|
0a42320b78 | ||
|
|
6ce0de8db7 | ||
|
|
345d4cd1b5 | ||
|
|
950c092025 | ||
|
|
0c6bb8c1b7 | ||
|
|
0f9cb7db7a | ||
|
|
7d4262e0ef | ||
|
|
e543be7a13 | ||
|
|
3d7027bf47 | ||
|
|
632b42ad65 | ||
|
|
bcd79e3886 | ||
|
|
8fbcf485b3 | ||
|
|
6a64be2e25 | ||
|
|
3f9f3991d8 | ||
|
|
54a8d942fa | ||
|
|
6aa14be577 | ||
|
|
d6db7673d8 | ||
|
|
d002073124 | ||
|
|
4bc98cae81 | ||
|
|
2696baf1d6 | ||
|
|
3c3cc36403 | ||
|
|
fd87683b6a | ||
|
|
83da1e7b95 | ||
|
|
9f9515675a | ||
|
|
1aa084cd90 | ||
|
|
525ec0260f | ||
|
|
ac15ffee6c | ||
|
|
83d68c5046 | ||
|
|
7d1186811f | ||
|
|
88bc01e5df | ||
|
|
78d2459c7a | ||
|
|
21f4bd79eb | ||
|
|
64147c6261 | ||
|
|
c67c486f2f | ||
|
|
ae419bacb3 | ||
|
|
17b0214f2f | ||
|
|
963f706018 | ||
|
|
74398cda62 | ||
|
|
8321af5af2 | ||
|
|
2524d86462 | ||
|
|
e050bf83df | ||
|
|
91c936a06f | ||
|
|
93dfd44410 | ||
|
|
304d0cdebf | ||
|
|
108d878939 | ||
|
|
e10e327c56 | ||
|
|
cabea9fba9 | ||
|
|
f9159cf245 | ||
|
|
2db011ae10 | ||
|
|
f96716966d | ||
|
|
7515efbde9 | ||
|
|
4ebd0d79d5 | ||
|
|
0c3b5d3c30 | ||
|
|
e0b06dedff | ||
|
|
187ac8163d | ||
|
|
ac2078957d | ||
|
|
352d495301 | ||
|
|
864456e61e | ||
|
|
bd7ce1cf3c | ||
|
|
9565ab0641 | ||
|
|
45c53b96dc | ||
|
|
861325ac3f | ||
|
|
70c015c1f0 | ||
|
|
8f3755b130 | ||
|
|
697ff0ccbb | ||
|
|
f117847fc3 | ||
|
|
bd88d40309 | ||
|
|
2fd8aab230 | ||
|
|
5ec10ec617 | ||
|
|
270270d015 | ||
|
|
3364b01c9d | ||
|
|
4beda35adf | ||
|
|
fd3e79378b | ||
|
|
4d0068e551 | ||
|
|
6933c0e5ef | ||
|
|
839b3724e7 | ||
|
|
6006865358 | ||
|
|
4907b4b6e6 | ||
|
|
29735cdf83 | ||
|
|
ae4b2ce0d0 | ||
|
|
786cbbcd7d | ||
|
|
6d3f2fc5dc | ||
|
|
6697cc412e | ||
|
|
17a877a89a | ||
|
|
9d4149c58f | ||
|
|
123ac79918 | ||
|
|
1670c8b3fb | ||
|
|
6125044e4c | ||
|
|
492439470c | ||
|
|
e9e39345ed | ||
|
|
cf29df7bce | ||
|
|
c259cb5a45 | ||
|
|
4148f55bb5 | ||
|
|
b63791c14b | ||
|
|
294dfabd54 | ||
|
|
d7f7cad863 | ||
|
|
afd8df5b48 | ||
|
|
b9d1f36604 | ||
|
|
403a7a7da8 | ||
|
|
f6fb5bcf66 | ||
|
|
194eb8b5f5 | ||
|
|
853aaca071 | ||
|
|
18dabd6bcf | ||
|
|
bb42505d66 | ||
|
|
b4d59077e3 | ||
|
|
104d55c11b | ||
|
|
b5af17cf08 | ||
|
|
78ae662ced | ||
|
|
32e48db3ce | ||
|
|
8a27e75c02 | ||
|
|
bf55e9b189 | ||
|
|
bfbaa3d033 | ||
|
|
64f87d5741 | ||
|
|
cb3441286c | ||
|
|
5e97a0f894 | ||
|
|
de2166dfdb | ||
|
|
abd361f4b5 | ||
|
|
422f8ead23 | ||
|
|
7c05dd7457 | ||
|
|
3ef7622c6f | ||
|
|
8207d62b1f | ||
|
|
75a0b1dd0d | ||
|
|
d1307e35db | ||
|
|
0a6b197a97 | ||
|
|
8d6512886c | ||
|
|
5c0c0f3e2a | ||
|
|
e2c2fc776a | ||
|
|
576050b31e | ||
|
|
f9a43bd336 | ||
|
|
203f2f599a | ||
|
|
baa5d37744 | ||
|
|
17f6af2a70 | ||
|
|
eae213f58e | ||
|
|
3a6a133560 | ||
|
|
57cf144c57 | ||
|
|
5c29859d49 | ||
|
|
02510127d1 | ||
|
|
f6b5c8f7e0 | ||
|
|
dbfef3094b | ||
|
|
b5c3af752c | ||
|
|
d0366b39e2 | ||
|
|
ed5390d2b5 | ||
|
|
e31857a15d | ||
|
|
32e119d187 | ||
|
|
5690eccd14 | ||
|
|
2faf3732df | ||
|
|
8670fb36e0 | ||
|
|
7c001c4809 | ||
|
|
bce1dd9fee | ||
|
|
412c2e1e3c | ||
|
|
dd7ffac974 | ||
|
|
7ad59e0166 | ||
|
|
2f2bdbb9f5 | ||
|
|
d23dc10bc5 | ||
|
|
46c2e3f90a | ||
|
|
1776b668a4 | ||
|
|
10dccd0f38 | ||
|
|
f1918eb1ec | ||
|
|
436b33fde2 | ||
|
|
cfa5cab1fa | ||
|
|
a8ba4dd812 | ||
|
|
94bf383d23 | ||
|
|
096207de82 | ||
|
|
3cb654f5df | ||
|
|
5552cc4fb0 | ||
|
|
94aacf8cca | ||
|
|
128d473b33 | ||
|
|
d5679dd58f | ||
|
|
b1e8165ecb | ||
|
|
d0a3d644f3 | ||
|
|
35b060af53 | ||
|
|
337dba23b4 | ||
|
|
433f9f53ab | ||
|
|
ba7a748efd | ||
|
|
1365fdae88 | ||
|
|
6a159bf049 | ||
|
|
31e0e93951 | ||
|
|
876343facb | ||
|
|
f0cd9ae16d | ||
|
|
b220428b8c | ||
|
|
8386aacfd8 | ||
|
|
3c54e24102 | ||
|
|
3dc0693b8c | ||
|
|
f087113ddf | ||
|
|
d5d1f5d8cc | ||
|
|
0d5bf901e2 | ||
|
|
ae0445f47b | ||
|
|
a6ba24b7a5 | ||
|
|
1b00831147 | ||
|
|
479cff60d5 | ||
|
|
d2499b1e27 | ||
|
|
4f65f33953 | ||
|
|
6d4a69c781 | ||
|
|
e90e58b50a | ||
|
|
826bdb63d0 | ||
|
|
4ecba69161 | ||
|
|
e64510ebf5 | ||
|
|
50a506af62 | ||
|
|
bdbbb7e40a | ||
|
|
f2503e989c | ||
|
|
11c54a0055 | ||
|
|
7cc24199fb | ||
|
|
068b2cca0c | ||
|
|
f67f01278e | ||
|
|
8be8e1dab2 | ||
|
|
6d3651aca1 | ||
|
|
3dd2c58595 | ||
|
|
255aa1dd54 | ||
|
|
f2c5b085e8 | ||
|
|
b8a5fe0031 | ||
|
|
5603890663 | ||
|
|
1a86cc4dbd | ||
|
|
734add6dbc | ||
|
|
5641c0def3 | ||
|
|
b74ab5349a | ||
|
|
b0971e5124 | ||
|
|
02d8c8c6b6 | ||
|
|
d9bd5257e3 | ||
|
|
c1a214f34e | ||
|
|
64d1fbb9b1 | ||
|
|
a5433fbb3f | ||
|
|
2a2aed52e0 | ||
|
|
b16266e22a | ||
|
|
2c886dc33b | ||
|
|
db9c60cf35 | ||
|
|
a34b36daec | ||
|
|
41a35e99fd | ||
|
|
8e12dad247 | ||
|
|
72afa1e5cc | ||
|
|
9904553325 | ||
|
|
ad069ab32f | ||
|
|
b83a3dd548 | ||
|
|
7f41eab5e4 | ||
|
|
0d1c2364da | ||
|
|
5bca33a9f5 | ||
|
|
1196fe8004 | ||
|
|
98ae416fa7 |
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "gradle" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
38
.github/workflows/publish-release.yml
vendored
Normal file
38
.github/workflows/publish-release.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
name: Publish release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
publish-release:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout latest code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: 'adopt'
|
||||
java-version: 16
|
||||
|
||||
- name: Setup build cache
|
||||
uses: actions/cache@v2.1.6
|
||||
with:
|
||||
path: ~/.gradle/caches
|
||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-gradle-
|
||||
- name: Publish artifact
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# The GITHUB_REF tag comes in the format 'refs/tags/xxx'.
|
||||
# So if we split on '/' and take the 3rd value, we can get the release name.
|
||||
run: |
|
||||
NEW_VERSION=$(echo "${GITHUB_REF}" | cut -d "/" -f3)
|
||||
echo "New version: ${NEW_VERSION}"
|
||||
echo "Github username: ${GITHUB_ACTOR}"
|
||||
./gradlew -Pversion=${NEW_VERSION} publish
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -14,7 +14,8 @@ bin/
|
||||
# Gradle
|
||||
.gradle
|
||||
**/build/
|
||||
!src/**/build/
|
||||
**/out/
|
||||
!eco-api/src/**/build/
|
||||
.gradletasknamecache
|
||||
!gradle-wrapper.jar
|
||||
gradle-app.setting
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
- Every method and field must have a javadoc attached.
|
||||
|
||||
2. Use lombok wherever possible.
|
||||
- @Getter, @Setter, @ToString, @EqualsAndHashCode, @UtilityClass are the most important.
|
||||
- @Getter, @Setter, @UtilityClass only.
|
||||
|
||||
3. Use JetBrains annotations
|
||||
- Every parameter should be annotated with @NotNull or @Nullable
|
||||
@@ -24,4 +24,4 @@
|
||||
|
||||
## Other
|
||||
- All drops **must** be sent through a DropQueue - calls to World#dropItem will get your PR rejected.
|
||||
- eco is built with java 8. Usage of J9+ will get your PR rejected.
|
||||
- eco is built with java 16.
|
||||
169
README.md
169
README.md
@@ -1 +1,168 @@
|
||||
## eco - Library for spigot plugin development.
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<img src="https://i.imgur.com/kU3ejCt.png" alt="eco logo" width="256">
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
<h4 align="center">eco - Simplify spigot development.</h4>
|
||||
|
||||
### Plugin Information
|
||||
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
|
||||
- Supports 1.16.5+
|
||||
|
||||
### bStats
|
||||
<img src="https://bstats.org/signatures/bukkit/eco.svg" width="512">
|
||||
|
||||
# Information for development
|
||||
|
||||
## Javadoc
|
||||
The 6.8.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.8.0/javadoc/)
|
||||
|
||||
## Plugin Information
|
||||
|
||||
eco is a standalone plugin, so you will need to install it on any servers that have plugins which depend on it,
|
||||
and specify it as a dependency in your plugin.yml:
|
||||
|
||||
```yaml
|
||||
depend:
|
||||
- eco
|
||||
```
|
||||
|
||||
eco is available from any of these places:
|
||||
|
||||
- [GitHub](https://github.com/Auxilor/eco/releases)
|
||||
- [Polymart](https://polymart.org/resource/eco.773)
|
||||
- [Build it locally](https://github.com/Auxilor/eco#build-locally).
|
||||
|
||||
## Get from JitPack:
|
||||
|
||||
Gradle:
|
||||
|
||||
```groovy
|
||||
repositories {
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
compileOnly 'com.willfp:eco:Tag'
|
||||
}
|
||||
```
|
||||
|
||||
Replace `Tag` with a release tag for eco, eg `6.0.0`.
|
||||
|
||||
Maven:
|
||||
|
||||
```xml
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
```
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.willfp</groupId>
|
||||
<artifactId>eco</artifactId>
|
||||
<version>Tag</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
Replace `Tag` with a release tag for eco, eg `6.8.0`.
|
||||
|
||||
## Build locally:
|
||||
|
||||
Run the following commands in your terminal of choice.
|
||||
|
||||
If you're on windows, you will need to have git bash installed.
|
||||
```
|
||||
git clone https://github.com/Auxilor/eco
|
||||
cd eco
|
||||
./gradlew build
|
||||
```
|
||||
|
||||
# Features
|
||||
|
||||
Here's a list of some (not all) of the features of eco:
|
||||
|
||||
- Command system with subcommands
|
||||
- Reworked config system
|
||||
- JSON Config Support
|
||||
- Client-Side item display
|
||||
- World drop system
|
||||
- Event manager
|
||||
- PlayerJumpEvent
|
||||
- ArmorEquipEvent
|
||||
- EntityDeathByEntityEvent
|
||||
- NaturalExpGainEvent
|
||||
- Plugin extensions (com.willfp.eco.internal.Plugins for plugins)
|
||||
- GUI System
|
||||
- Integration system for external plugins
|
||||
- Anticheat support
|
||||
- AAC
|
||||
- Matrix
|
||||
- NCP
|
||||
- Spartan
|
||||
- Vulcan
|
||||
- Antigrief/Combat support
|
||||
- CombatLogX (V10 + V11)
|
||||
- FactionsUUID
|
||||
- GriefPrevention
|
||||
- Kingdoms
|
||||
- Lands
|
||||
- Towny
|
||||
- WorldGuard
|
||||
- mcMMO support
|
||||
- Custom Items support
|
||||
- Oraxen
|
||||
- PlaceholderAPI support
|
||||
- NMS Proxy / Wrapper system built in
|
||||
- Custom Items system
|
||||
- Crafting Recipe handler
|
||||
- Tuples
|
||||
- Support uploading to / downloading from hastebin
|
||||
- Packet System (via ProtocolLib)
|
||||
- Dependency Injection systems
|
||||
- Prerequisite system
|
||||
- API additions (via utility classes)
|
||||
- Get bow from arrow
|
||||
- Break a block as a player
|
||||
- Get a vein of blocks
|
||||
- Create 2D lists
|
||||
- Create NamespacedKeys safely
|
||||
- Random number, distribution, roman numerals
|
||||
- Set skull texture
|
||||
- Format all strings
|
||||
- Hex Support
|
||||
- Gradient Support
|
||||
- Placeholder Support
|
||||
- Get a scoreboard team from any color
|
||||
- Telekinesis (Drops straight to inventory) system
|
||||
- More vector options
|
||||
- Update checker
|
||||
- bStats integration
|
||||
- Reworked systems for:
|
||||
- NamespacedKey
|
||||
- MetadataValue
|
||||
- Runnables / Scheduling
|
||||
|
||||
... and a lot more!
|
||||
|
||||
## License
|
||||
|
||||
*Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
|
||||
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://gamersupps.gg/discount/Auxilor?afmc=Auxilor" target="_blank">
|
||||
<img src="https://i.imgur.com/uFDpBAC.png" alt="supps banner">
|
||||
</a>
|
||||
<a href="https://dedimc.promo/Auxilor" target="_blank">
|
||||
<img src="https://i.imgur.com/zdDLhFA.png" alt="dedimc banner">
|
||||
</a>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
|
||||
179
build.gradle
179
build.gradle
@@ -1,102 +1,133 @@
|
||||
plugins {
|
||||
id 'java-library'
|
||||
id 'com.github.johnrengelman.shadow' version '5.2.0'
|
||||
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
||||
id 'maven-publish'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.apache.maven:maven-artifact:3.0.3'
|
||||
implementation 'org.bstats:bstats-bukkit:1.7'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.9'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.4-SNAPSHOT'
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.14.0'
|
||||
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
|
||||
compileOnly 'com.github.cryptomorin:kingdoms:1.10.3.1'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.96.2.0'
|
||||
compileOnly 'com.github.angeschossen:LandsAPI:4.7.3'
|
||||
compileOnly 'fr.neatmonster:nocheatplus:3.16.1-SNAPSHOT'
|
||||
compileOnly 'com.github.jiangdashao:matrix-api-repo:317d4635fd'
|
||||
compileOnly 'org.jetbrains:annotations:19.0.0'
|
||||
compileOnly fileTree(dir: '/lib', include: ['*.jar'])
|
||||
|
||||
// Lombok
|
||||
compileOnly 'org.projectlombok:lombok:1.18.16'
|
||||
annotationProcessor 'org.projectlombok:lombok:1.18.16'
|
||||
testCompileOnly 'org.projectlombok:lombok:1.18.16'
|
||||
testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
|
||||
implementation project(":eco-api")
|
||||
implementation project(":eco-core:core-plugin")
|
||||
implementation project(":eco-core:core-proxy")
|
||||
implementation project(":eco-core:core-backend")
|
||||
implementation project(":eco-core:core-nms:v1_16_R3")
|
||||
implementation project(path: ":eco-core:core-nms:v1_17_R1", configuration: 'mapped')
|
||||
}
|
||||
|
||||
allprojects {
|
||||
apply plugin: 'java'
|
||||
apply plugin: 'java-library'
|
||||
apply plugin: 'maven-publish'
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
mavenLocal()
|
||||
maven { url 'https://jitpack.io' }
|
||||
repositories {
|
||||
mavenCentral()
|
||||
mavenLocal()
|
||||
maven { url 'https://jitpack.io' }
|
||||
|
||||
// NMS (for jitpack compilation)
|
||||
maven { url 'https://repo.codemc.org/repository/nms/' }
|
||||
// SuperiorSkyblock2
|
||||
maven { url 'https://repo.bg-software.com/repository/api/' }
|
||||
|
||||
// bStats
|
||||
maven { url 'https://repo.codemc.org/repository/maven-public' }
|
||||
// NMS (for jitpack compilation)
|
||||
maven { url 'https://repo.codemc.org/repository/nms/' }
|
||||
|
||||
// Spigot API
|
||||
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
|
||||
// bStats, mcMMO, BentoBox
|
||||
maven { url 'https://repo.codemc.org/repository/maven-public/' }
|
||||
|
||||
// PlaceholderAPI
|
||||
maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
|
||||
// Spigot API, Bungee API
|
||||
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
|
||||
|
||||
// ProtocolLib
|
||||
maven { url 'https://repo.dmulloy2.net/nexus/repository/public/' }
|
||||
// PlaceholderAPI
|
||||
maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
|
||||
|
||||
// WorldGuard
|
||||
maven { url 'https://maven.enginehub.org/repo/' }
|
||||
// ProtocolLib
|
||||
maven { url 'https://repo.dmulloy2.net/nexus/repository/public/' }
|
||||
|
||||
// FactionsUUID
|
||||
maven { url 'https://ci.ender.zone/plugin/repository/everything/' }
|
||||
// WorldGuard
|
||||
maven { url 'https://maven.enginehub.org/repo/' }
|
||||
|
||||
// NoCheatPlus
|
||||
maven { url 'https://repo.md-5.net/content/repositories/snapshots/' }
|
||||
}
|
||||
// FactionsUUID
|
||||
maven { url 'https://ci.ender.zone/plugin/repository/everything/' }
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
options.deprecation = true
|
||||
options.encoding = 'UTF-8'
|
||||
}
|
||||
// NoCheatPlus
|
||||
maven { url 'https://repo.md-5.net/content/repositories/snapshots/' }
|
||||
|
||||
configurations.all {
|
||||
exclude group: "org.codehaus.plexus", module: "plexus-utils"
|
||||
exclude group: "com.mojang", module: "brigadier"
|
||||
exclude group: "org.kitteh", module: "paste-gg-api"
|
||||
exclude group: "org.spongepowered", module: "configurate-hocon"
|
||||
exclude group: "com.darkblade12", module: "particleeffect"
|
||||
}
|
||||
// CombatLogX
|
||||
maven { url 'https://nexus.sirblobman.xyz/repository/public/' }
|
||||
|
||||
shadowJar {
|
||||
relocate('org.bstats.bukkit', 'com.willfp.eco.util.shaded.bstats')
|
||||
relocate('org.apache.maven', 'com.willfp.eco.util.shaded.maven')
|
||||
}
|
||||
// IridiumSkyblock
|
||||
maven { url 'https://nexus.iridiumdevelopment.net/repository/maven-releases/' }
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
shadow(MavenPublication) {
|
||||
from components.java
|
||||
artifact shadowJar
|
||||
// Velocity
|
||||
maven { url 'https://repo.velocitypowered.com/snapshots/' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.jetbrains:annotations:19.0.0'
|
||||
|
||||
// Lombok
|
||||
compileOnly 'org.projectlombok:lombok:1.18.22'
|
||||
annotationProcessor 'org.projectlombok:lombok:1.18.20'
|
||||
testCompileOnly 'org.projectlombok:lombok:1.18.20'
|
||||
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
|
||||
|
||||
// Test
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
|
||||
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
options.deprecation = true
|
||||
options.encoding = 'UTF-8'
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
exclude group: "org.codehaus.plexus", module: "plexus-utils"
|
||||
exclude group: "com.mojang", module: "brigadier"
|
||||
exclude group: "org.kitteh", module: "paste-gg-api"
|
||||
exclude group: "org.kitteh", module: "pastegg"
|
||||
exclude group: "org.spongepowered", module: "configurate-hocon"
|
||||
exclude group: "com.darkblade12", module: "particleeffect"
|
||||
exclude group: "com.github.cryptomorin", module: "XSeries"
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
relocate('org.bstats', 'com.willfp.eco.shaded.bstats')
|
||||
relocate('net.kyori.adventure.text.minimessage', 'com.willfp.eco.shaded.minimessage')
|
||||
}
|
||||
|
||||
jar {
|
||||
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
|
||||
}
|
||||
|
||||
compileJava {
|
||||
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_16
|
||||
targetCompatibility = JavaVersion.VERSION_16
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
|
||||
// Always run tests, even when nothing changed.
|
||||
dependsOn cleanTest
|
||||
|
||||
// Show test results.
|
||||
testLogging {
|
||||
events "passed", "skipped", "failed"
|
||||
}
|
||||
}
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
compileJava.dependsOn clean
|
||||
|
||||
build.dependsOn shadowJar
|
||||
}
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
compileJava.dependsOn clean
|
||||
|
||||
publishToMavenLocal.dependsOn shadowJar
|
||||
|
||||
build.dependsOn shadowJar
|
||||
build.dependsOn publishToMavenLocal
|
||||
|
||||
group = 'com.willfp'
|
||||
archivesBaseName = project.name
|
||||
version = '1.0.1'
|
||||
java.sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
version = findProperty("version")
|
||||
@@ -45,7 +45,7 @@
|
||||
-->
|
||||
<property name="severity" value="error"/>
|
||||
|
||||
<property name="fileExtensions" value="java, properties, xml"/>
|
||||
<property name="fileExtensions" value="java, properties, xml, kt"/>
|
||||
|
||||
<!-- Excludes all 'module-info.java' files -->
|
||||
<!-- See https://checkstyle.org/config_filefilters.html -->
|
||||
@@ -66,6 +66,7 @@
|
||||
<module name="FileLength"/>
|
||||
<module name="LineLength">
|
||||
<property name="fileExtensions" value="java"/>
|
||||
<property name="fileExtensions" value="kt"/>
|
||||
<property name="max" value="200"/>
|
||||
</module>
|
||||
|
||||
@@ -115,7 +116,6 @@
|
||||
<!-- Checks for imports -->
|
||||
<!-- See https://checkstyle.org/config_imports.html -->
|
||||
<module name="AvoidStarImport"/>
|
||||
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
|
||||
<module name="RedundantImport"/>
|
||||
<module name="UnusedImports">
|
||||
<property name="processJavadoc" value="true"/>
|
||||
|
||||
@@ -5,6 +5,14 @@
|
||||
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
|
||||
|
||||
<suppressions>
|
||||
<!-- Internals don't need javadoc. -->
|
||||
<suppress files="[\\/]internal[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]internal[\\/]" checks="JavadocVariable"/>
|
||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="JavadocVariable"/>
|
||||
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="JavadocVariable"/>
|
||||
|
||||
<!-- Modified version of library -->
|
||||
<suppress files="ArmorEquipEvent.java" checks="JavadocVariable"/>
|
||||
<suppress files="ArmorEquipEvent.java" checks="MissingJavadocMethod"/>
|
||||
|
||||
48
eco-api/build.gradle
Normal file
48
eco-api/build.gradle
Normal file
@@ -0,0 +1,48 @@
|
||||
plugins {
|
||||
id 'com.github.johnrengelman.shadow'
|
||||
}
|
||||
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
// Adventure
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-api:4.9.2'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.9.2'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-legacy:4.9.2'
|
||||
|
||||
// Other
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.1-SNAPSHOT'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||
}
|
||||
|
||||
java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
|
||||
build.dependsOn publishToMavenLocal
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
shadow(MavenPublication) {
|
||||
from components.java
|
||||
artifactId 'eco'
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name = "GitHubPackages"
|
||||
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
||||
credentials {
|
||||
username = System.getenv("GITHUB_ACTOR")
|
||||
password = System.getenv("GITHUB_TOKEN")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.willfp.eco.util.protocollib;
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
@@ -6,12 +6,15 @@ import com.comphenix.protocol.events.ListenerPriority;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Wrapper class for ProtocolLib packets.
|
||||
*/
|
||||
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
/**
|
||||
* The packet type to listen for.
|
||||
@@ -34,7 +37,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
* @param priority The priority at which the adapter should be ran on packet send/receive.
|
||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
||||
*/
|
||||
protected AbstractPacketAdapter(@NotNull final AbstractEcoPlugin plugin,
|
||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final PacketType type,
|
||||
@NotNull final ListenerPriority priority,
|
||||
final boolean postLoad) {
|
||||
@@ -50,7 +53,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
* @param type The {@link PacketType} to listen for.
|
||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
||||
*/
|
||||
protected AbstractPacketAdapter(@NotNull final AbstractEcoPlugin plugin,
|
||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final PacketType type,
|
||||
final boolean postLoad) {
|
||||
this(plugin, type, ListenerPriority.NORMAL, postLoad);
|
||||
@@ -60,8 +63,12 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
* The code that should be executed once the packet has been received.
|
||||
*
|
||||
* @param packet The packet.
|
||||
* @param player The player.
|
||||
* @param event The event.
|
||||
*/
|
||||
public void onReceive(@NotNull final PacketContainer packet) {
|
||||
public void onReceive(@NotNull final PacketContainer packet,
|
||||
@NotNull final Player player,
|
||||
@NotNull final PacketEvent event) {
|
||||
// Empty rather than abstract as implementations don't need both
|
||||
}
|
||||
|
||||
@@ -69,8 +76,12 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
* THe code that should be executed once the packet has been sent.
|
||||
*
|
||||
* @param packet The packet.
|
||||
* @param player The player.
|
||||
* @param event The event.
|
||||
*/
|
||||
public void onSend(@NotNull final PacketContainer packet) {
|
||||
public void onSend(@NotNull final PacketContainer packet,
|
||||
@NotNull final Player player,
|
||||
@NotNull final PacketEvent event) {
|
||||
// Empty rather than abstract as implementations don't need both
|
||||
}
|
||||
|
||||
@@ -89,7 +100,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
return;
|
||||
}
|
||||
|
||||
onReceive(event.getPacket());
|
||||
onReceive(event.getPacket(), event.getPlayer(), event);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -107,7 +118,12 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
return;
|
||||
}
|
||||
|
||||
onSend(event.getPacket());
|
||||
onSend(event.getPacket(), event.getPlayer(), event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final EcoPlugin getPlugin() {
|
||||
return (EcoPlugin) super.getPlugin();
|
||||
}
|
||||
|
||||
/**
|
||||
52
eco-api/src/main/java/com/willfp/eco/core/Eco.java
Normal file
52
eco-api/src/main/java/com/willfp/eco/core/Eco.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Base class to hold the handler.
|
||||
*
|
||||
* @see Handler
|
||||
*/
|
||||
@UtilityClass
|
||||
public class Eco {
|
||||
/**
|
||||
* Instance of eco handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
private Handler handler;
|
||||
|
||||
/**
|
||||
* Set the handler.
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public void setHandler(@NotNull final Handler handler) {
|
||||
Validate.isTrue(Eco.handler == null, "Already initialized!");
|
||||
|
||||
Eco.handler = handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the instance of the eco handler.
|
||||
* <p>
|
||||
* The handler is, in essence, a way to interface between the eco-api
|
||||
* frontend module, and the eco-backend implementations.
|
||||
* <p>
|
||||
* There shouldn't really be any reason to ever use the handler
|
||||
* in your own plugins, and you are likely to break things. All parts of
|
||||
* the handler are abstracted into logically named parts of the API.
|
||||
* <p>
|
||||
* In versions of eco before 6.12.0, the handler was considered part of
|
||||
* the eco API, however it has since been moved into an internal component
|
||||
* that shouldn't be used in your plugins.
|
||||
*
|
||||
* @return The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public Handler getHandler() {
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
727
eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java
Normal file
727
eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java
Normal file
@@ -0,0 +1,727 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.command.impl.PluginCommand;
|
||||
import com.willfp.eco.core.config.base.ConfigYml;
|
||||
import com.willfp.eco.core.config.base.LangYml;
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
import com.willfp.eco.core.display.Display;
|
||||
import com.willfp.eco.core.display.DisplayModule;
|
||||
import com.willfp.eco.core.events.EventManager;
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||
import com.willfp.eco.core.factory.MetadataValueFactory;
|
||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||
import com.willfp.eco.core.factory.RunnableFactory;
|
||||
import com.willfp.eco.core.integrations.IntegrationLoader;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||
import com.willfp.eco.core.proxy.AbstractProxy;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import com.willfp.eco.core.web.UpdateChecker;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* EcoPlugin is the base plugin class for eco-based plugins.
|
||||
* <p>
|
||||
* It functions as a replacement for {@link JavaPlugin}.
|
||||
* <p>
|
||||
* EcoPlugin is a lot more powerful than {@link JavaPlugin} and
|
||||
* contains many methods to reduce boilerplate code and reduce
|
||||
* plugin complexity.
|
||||
* <p>
|
||||
* It is recommended to view the source code for this class to
|
||||
* gain a better understanding of how it works.
|
||||
* <p>
|
||||
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
||||
* be cancelled.</b>
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
/**
|
||||
* The polymart resource ID of the plugin.
|
||||
*/
|
||||
@Getter
|
||||
private final int resourceId;
|
||||
|
||||
/**
|
||||
* The bStats resource ID of the plugin.
|
||||
*/
|
||||
@Getter
|
||||
private final int bStatsId;
|
||||
|
||||
/**
|
||||
* The package where proxy implementations are.
|
||||
*/
|
||||
@Getter
|
||||
private final String proxyPackage;
|
||||
|
||||
/**
|
||||
* The color of the plugin, used in messages.
|
||||
*/
|
||||
@Getter
|
||||
private final String color;
|
||||
|
||||
/**
|
||||
* Loaded integrations.
|
||||
*/
|
||||
@Getter
|
||||
private final Set<String> loadedIntegrations = new HashSet<>();
|
||||
|
||||
/**
|
||||
* The internal plugin scheduler.
|
||||
*/
|
||||
@Getter
|
||||
private final Scheduler scheduler;
|
||||
|
||||
/**
|
||||
* The internal plugin Event Manager.
|
||||
*/
|
||||
@Getter
|
||||
private final EventManager eventManager;
|
||||
|
||||
/**
|
||||
* Config.yml.
|
||||
*/
|
||||
@Getter
|
||||
private final ConfigYml configYml;
|
||||
|
||||
/**
|
||||
* Lang.yml.
|
||||
*/
|
||||
@Getter
|
||||
private final LangYml langYml;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link org.bukkit.NamespacedKey}s.
|
||||
*/
|
||||
@Getter
|
||||
private final NamespacedKeyFactory namespacedKeyFactory;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s.
|
||||
*/
|
||||
@Getter
|
||||
private final MetadataValueFactory metadataValueFactory;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s.
|
||||
*/
|
||||
@Getter
|
||||
private final RunnableFactory runnableFactory;
|
||||
|
||||
/**
|
||||
* The loader for all plugin extensions.
|
||||
*
|
||||
* @see com.willfp.eco.core.extensions.Extension
|
||||
*/
|
||||
@Getter
|
||||
private final ExtensionLoader extensionLoader;
|
||||
|
||||
/**
|
||||
* The handler class for updatable classes.
|
||||
*/
|
||||
@Getter
|
||||
private final ConfigHandler configHandler;
|
||||
|
||||
/**
|
||||
* The display module for the plugin.
|
||||
*/
|
||||
@Getter
|
||||
private DisplayModule displayModule;
|
||||
|
||||
/**
|
||||
* The logger for the plugin.
|
||||
*/
|
||||
private final Logger logger;
|
||||
|
||||
/**
|
||||
* If the server is running an outdated version of the plugin.
|
||||
*/
|
||||
@Getter
|
||||
private boolean outdated = false;
|
||||
|
||||
/**
|
||||
* If the plugin supports extensions.
|
||||
*/
|
||||
@Getter
|
||||
private final boolean supportingExtensions;
|
||||
|
||||
/**
|
||||
* The proxy factory.
|
||||
*/
|
||||
@Getter
|
||||
private final ProxyFactory proxyFactory;
|
||||
|
||||
/**
|
||||
* Create a new plugin without a specified color, proxy support, polymart, or bStats.
|
||||
*/
|
||||
protected EcoPlugin() {
|
||||
this("&f");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin without proxy support, polymart, or bStats.
|
||||
*
|
||||
* @param color The color.
|
||||
*/
|
||||
protected EcoPlugin(@NotNull final String color) {
|
||||
this("", color);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new plugin unlinked to polymart and bStats.
|
||||
*
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
*/
|
||||
protected EcoPlugin(@NotNull final String proxyPackage,
|
||||
@NotNull final String color) {
|
||||
this(0, 0, proxyPackage, color);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin without proxy or extension support.
|
||||
*
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
*/
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String color) {
|
||||
this(resourceId, bStatsId, "", color);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin without proxy support.
|
||||
*
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
* @param supportingExtensions If the plugin supports extensions.
|
||||
*/
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String color,
|
||||
final boolean supportingExtensions) {
|
||||
this(resourceId, bStatsId, "", color, supportingExtensions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin without extension support.
|
||||
*
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
*/
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
@NotNull final String color) {
|
||||
this(resourceId, bStatsId, proxyPackage, color, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin.
|
||||
*
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
* @param supportingExtensions If the plugin supports extensions.
|
||||
*/
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
@NotNull final String color,
|
||||
final boolean supportingExtensions) {
|
||||
/*
|
||||
The handler must be initialized before any plugin's constructors
|
||||
are called, as the constructors call Eco#getHandler().
|
||||
|
||||
To fix this, EcoSpigotPlugin an abstract class and the 'actual'
|
||||
plugin class is EcoHandler - that way I can create the handler
|
||||
before any plugins are loaded while still having a separation between
|
||||
the plugin class and the handler class (for code clarity).
|
||||
|
||||
I don't really like the fact that the handler class *is* the
|
||||
spigot plugin, but it is what it is.
|
||||
|
||||
There is probably a better way of doing it - maybe with
|
||||
some sort of HandlerCreator interface in order to still have
|
||||
a standalone handler class, but then there would be an interface
|
||||
left in the API that doesn't really help anything.
|
||||
|
||||
The other alternative would be do use reflection to get a 'createHandler'
|
||||
method that only exists in EcoSpigotPlugin - but that feels really dirty
|
||||
and I'd rather only use reflection where necessary.
|
||||
*/
|
||||
|
||||
if (Eco.getHandler() == null && this instanceof Handler) {
|
||||
/*
|
||||
This code is only ever called by EcoSpigotPlugin (EcoHandler)
|
||||
as it's the first plugin to load and it is a handler.
|
||||
|
||||
Any other plugins will never call this code as the handler
|
||||
will have already been initialized.
|
||||
*/
|
||||
|
||||
Eco.setHandler((Handler) this);
|
||||
}
|
||||
|
||||
assert Eco.getHandler() != null;
|
||||
|
||||
this.resourceId = resourceId;
|
||||
this.bStatsId = bStatsId;
|
||||
this.proxyPackage = proxyPackage;
|
||||
this.color = color;
|
||||
this.supportingExtensions = supportingExtensions;
|
||||
|
||||
this.scheduler = Eco.getHandler().createScheduler(this);
|
||||
this.eventManager = Eco.getHandler().createEventManager(this);
|
||||
this.namespacedKeyFactory = Eco.getHandler().createNamespacedKeyFactory(this);
|
||||
this.metadataValueFactory = Eco.getHandler().createMetadataValueFactory(this);
|
||||
this.runnableFactory = Eco.getHandler().createRunnableFactory(this);
|
||||
this.extensionLoader = Eco.getHandler().createExtensionLoader(this);
|
||||
this.configHandler = Eco.getHandler().createConfigHandler(this);
|
||||
this.logger = Eco.getHandler().createLogger(this);
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.getHandler().createProxyFactory(this);
|
||||
|
||||
this.langYml = this.createLangYml();
|
||||
this.configYml = this.createConfigYml();
|
||||
|
||||
Eco.getHandler().addNewPlugin(this);
|
||||
|
||||
/*
|
||||
The minimum eco version check was moved here because it's very common
|
||||
to add a lot of code in the constructor of plugins; meaning that the plugin
|
||||
can throw errors without it being obvious to the user that the reason is
|
||||
because they have an outdated version of eco installed.
|
||||
*/
|
||||
|
||||
DefaultArtifactVersion runningVersion = new DefaultArtifactVersion(Eco.getHandler().getEcoPlugin().getDescription().getVersion());
|
||||
DefaultArtifactVersion requiredVersion = new DefaultArtifactVersion(this.getMinimumEcoVersion());
|
||||
if (!(runningVersion.compareTo(requiredVersion) > 0 || runningVersion.equals(requiredVersion))) {
|
||||
this.getLogger().severe("You are running an outdated version of eco!");
|
||||
this.getLogger().severe("You must be on at least" + this.getMinimumEcoVersion());
|
||||
this.getLogger().severe("Download the newest version here:");
|
||||
this.getLogger().severe("https://polymart.org/download/773/recent/JSpprMspkuyecf5y1wQ2Jn8OoLQSQ_IW");
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Default code to be executed on plugin enable.
|
||||
*/
|
||||
@Override
|
||||
public final void onEnable() {
|
||||
super.onEnable();
|
||||
|
||||
this.getLogger().info("");
|
||||
this.getLogger().info("Loading " + this.getColor() + this.getName());
|
||||
|
||||
if (this.getResourceId() != 0) {
|
||||
new UpdateChecker(this).getVersion(version -> {
|
||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(this.getDescription().getVersion());
|
||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||
this.outdated = true;
|
||||
this.getScheduler().runTimer(() -> {
|
||||
this.getLogger().info("&c " + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||
this.getLogger().info("&cThe newest version is &f" + version);
|
||||
this.getLogger().info("&cDownload the new version!");
|
||||
}, 0, 864000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (this.getBStatsId() != 0) {
|
||||
Eco.getHandler().registerBStats(this);
|
||||
}
|
||||
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
||||
.map(Plugin::getName)
|
||||
.map(String::toLowerCase)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||
this.loadedIntegrations.add("PlaceholderAPI");
|
||||
PlaceholderManager.addIntegration(Eco.getHandler().createPAPIIntegration(this));
|
||||
}
|
||||
|
||||
this.loadIntegrationLoaders().forEach((integrationLoader -> {
|
||||
if (enabledPlugins.contains(integrationLoader.getPluginName().toLowerCase())) {
|
||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||
integrationLoader.load();
|
||||
}
|
||||
}));
|
||||
|
||||
this.getLogger().info("Loaded integrations: " + String.join(", ", this.getLoadedIntegrations()));
|
||||
|
||||
Prerequisite.update();
|
||||
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (!abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
|
||||
this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
||||
|
||||
this.loadPluginCommands().forEach(PluginCommand::register);
|
||||
|
||||
this.getScheduler().runLater(this::afterLoad, 1);
|
||||
|
||||
if (this.isSupportingExtensions()) {
|
||||
this.getExtensionLoader().loadExtensions();
|
||||
|
||||
if (this.getExtensionLoader().getLoadedExtensions().isEmpty()) {
|
||||
this.getLogger().info("&cNo extensions found");
|
||||
} else {
|
||||
this.getLogger().info("Extensions Loaded:");
|
||||
this.getExtensionLoader().getLoadedExtensions().forEach(extension -> this.getLogger().info("- " + extension.getName() + " v" + extension.getVersion()));
|
||||
}
|
||||
}
|
||||
|
||||
this.handleEnable();
|
||||
|
||||
this.getLogger().info("");
|
||||
}
|
||||
|
||||
/**
|
||||
* Default code to be executed on plugin disable.
|
||||
*/
|
||||
@Override
|
||||
public final void onDisable() {
|
||||
super.onDisable();
|
||||
|
||||
this.getEventManager().unregisterAllListeners();
|
||||
this.getScheduler().cancelAll();
|
||||
|
||||
this.handleDisable();
|
||||
|
||||
if (this.isSupportingExtensions()) {
|
||||
this.getExtensionLoader().unloadExtensions();
|
||||
}
|
||||
|
||||
this.getLogger().info("Cleaning up...");
|
||||
Eco.getHandler().getCleaner().clean(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default code to be executed on plugin load.
|
||||
*/
|
||||
@Override
|
||||
public final void onLoad() {
|
||||
super.onLoad();
|
||||
|
||||
this.handleLoad();
|
||||
}
|
||||
|
||||
/**
|
||||
* Default code to be executed after the server is up.
|
||||
*/
|
||||
public final void afterLoad() {
|
||||
this.displayModule = createDisplayModule();
|
||||
|
||||
if (this.getDisplayModule() != null) {
|
||||
Display.registerDisplayModule(this.getDisplayModule());
|
||||
}
|
||||
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
|
||||
if (!Prerequisite.HAS_PAPER.isMet()) {
|
||||
this.getLogger().severe("");
|
||||
this.getLogger().severe("----------------------------");
|
||||
this.getLogger().severe("");
|
||||
this.getLogger().severe("You don't seem to be running paper!");
|
||||
this.getLogger().severe("Paper is strongly recommended for all servers,");
|
||||
this.getLogger().severe("and some things may not function properly without it");
|
||||
this.getLogger().severe("Download Paper from &fhttps://papermc.io");
|
||||
this.getLogger().severe("");
|
||||
this.getLogger().severe("----------------------------");
|
||||
this.getLogger().severe("");
|
||||
}
|
||||
|
||||
this.handleAfterLoad();
|
||||
|
||||
this.reload();
|
||||
|
||||
this.getLogger().info("Loaded " + this.color + this.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload the plugin.
|
||||
*/
|
||||
public final void reload() {
|
||||
this.getConfigHandler().updateConfigs();
|
||||
|
||||
this.getConfigHandler().callUpdate();
|
||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||
this.getScheduler().cancelAll();
|
||||
|
||||
this.handleReload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload the plugin and return the time taken to reload.
|
||||
*
|
||||
* @return The time.
|
||||
*/
|
||||
public final long reloadWithTime() {
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
this.reload();
|
||||
|
||||
return System.currentTimeMillis() - startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed on enable.
|
||||
* <p>
|
||||
* Override when needed.
|
||||
*/
|
||||
protected void handleEnable() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed on disable.
|
||||
* <p>
|
||||
* Override when needed.
|
||||
*/
|
||||
protected void handleDisable() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed on load.
|
||||
* <p>
|
||||
* This is executed before enabling.
|
||||
* <p>
|
||||
* Override when needed.
|
||||
*/
|
||||
protected void handleLoad() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed on reload.
|
||||
* <p>
|
||||
* Override when needed.
|
||||
*/
|
||||
protected void handleReload() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed after the server is up.
|
||||
* <p>
|
||||
* Override when needed.
|
||||
*/
|
||||
protected void handleAfterLoad() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific integrations to be tested and loaded.
|
||||
*
|
||||
* @return A list of integrations.
|
||||
*/
|
||||
protected List<IntegrationLoader> loadIntegrationLoaders() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* The commands to be registered.
|
||||
*
|
||||
* @return A list of commands.
|
||||
*/
|
||||
protected List<PluginCommand> loadPluginCommands() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* ProtocolLib packet adapters to be registered.
|
||||
* <p>
|
||||
* If the plugin does not require ProtocolLib this can be left empty.
|
||||
*
|
||||
* @return A list of packet adapters.
|
||||
*/
|
||||
protected List<AbstractPacketAdapter> loadPacketAdapters() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* All listeners to be registered.
|
||||
*
|
||||
* @return A list of all listeners.
|
||||
*/
|
||||
protected abstract List<Listener> loadListeners();
|
||||
|
||||
/**
|
||||
* Useful for custom LangYml implementations.
|
||||
* <p>
|
||||
* Override if needed.
|
||||
*
|
||||
* @return lang.yml.
|
||||
*/
|
||||
protected LangYml createLangYml() {
|
||||
return new LangYml(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Useful for custom ConfigYml implementations.
|
||||
* <p>
|
||||
* Override if needed.
|
||||
*
|
||||
* @return config.yml.
|
||||
*/
|
||||
protected ConfigYml createConfigYml() {
|
||||
return new ConfigYml(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the display module for the plugin.
|
||||
*
|
||||
* @return The display module, or null.
|
||||
*/
|
||||
@Nullable
|
||||
protected DisplayModule createDisplayModule() {
|
||||
Validate.isTrue(
|
||||
this.getDisplayModule() == null,
|
||||
"Display module exists!"
|
||||
);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the minimum version of eco to use the plugin.
|
||||
*
|
||||
* @return The version.
|
||||
*/
|
||||
public String getMinimumEcoVersion() {
|
||||
return "6.0.0";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin's logger.
|
||||
*
|
||||
* @return The logger.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a proxy.
|
||||
*
|
||||
* @param proxyClass The proxy class.
|
||||
* @param <T> The proxy type.
|
||||
* @return The proxy.
|
||||
*/
|
||||
public final <T extends AbstractProxy> T getProxy(@NotNull final Class<T> proxyClass) {
|
||||
Validate.notNull(proxyFactory, "Plugin does not support proxy!");
|
||||
|
||||
return proxyFactory.getProxy(proxyClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get unwrapped config.
|
||||
* Does not use eco config system, don't use.
|
||||
*
|
||||
* @return The bukkit config.
|
||||
* @deprecated Use getConfigYml() instead.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
@Deprecated
|
||||
public final FileConfiguration getConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
return this.getConfigYml().getBukkitHandle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Does not use eco config system, don't use.
|
||||
*
|
||||
* @deprecated Use eco config system.
|
||||
*/
|
||||
@Override
|
||||
@Deprecated
|
||||
public final void saveConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
super.saveConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Does not use eco config system, don't use.
|
||||
*
|
||||
* @deprecated Use eco config system.
|
||||
*/
|
||||
@Override
|
||||
@Deprecated
|
||||
public final void saveDefaultConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
super.saveDefaultConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Does not use eco config system, don't use.
|
||||
*
|
||||
* @deprecated Use eco config system.
|
||||
*/
|
||||
@Override
|
||||
@Deprecated
|
||||
public final void reloadConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
super.reloadConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an EcoPlugin by name.
|
||||
*
|
||||
* @param pluginName The name.
|
||||
* @return The plugin.
|
||||
*/
|
||||
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||
return Eco.getHandler().getPluginByName(pluginName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all EcoPlugin names.
|
||||
*
|
||||
* @return The set of names.
|
||||
*/
|
||||
public static Set<String> getPluginNames() {
|
||||
return new HashSet<>(Eco.getHandler().getLoadedPlugins());
|
||||
}
|
||||
}
|
||||
234
eco-api/src/main/java/com/willfp/eco/core/Handler.java
Normal file
234
eco-api/src/main/java/com/willfp/eco/core/Handler.java
Normal file
@@ -0,0 +1,234 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigFactory;
|
||||
import com.willfp.eco.core.data.keys.KeyRegistry;
|
||||
import com.willfp.eco.core.data.PlayerProfileHandler;
|
||||
import com.willfp.eco.core.drops.DropQueueFactory;
|
||||
import com.willfp.eco.core.events.EventManager;
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||
import com.willfp.eco.core.factory.MetadataValueFactory;
|
||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||
import com.willfp.eco.core.factory.RunnableFactory;
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.core.gui.GUIFactory;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||
import com.willfp.eco.core.proxy.Cleaner;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.requirement.RequirementFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* @see Eco#getHandler()
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public interface Handler {
|
||||
/**
|
||||
* Create a scheduler.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The scheduler.
|
||||
*/
|
||||
@NotNull
|
||||
Scheduler createScheduler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create an event manager.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The event manager.
|
||||
*/
|
||||
@NotNull
|
||||
EventManager createEventManager(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a NamespacedKey factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKeyFactory createNamespacedKeyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a MetadataValue factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
MetadataValueFactory createMetadataValueFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a Runnable factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RunnableFactory createRunnableFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create an ExtensionLoader.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ExtensionLoader createExtensionLoader(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a config handler.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The handler.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigHandler createConfigHandler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a logger.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The logger.
|
||||
*/
|
||||
@NotNull
|
||||
Logger createLogger(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a PAPI integration.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The integration.
|
||||
*/
|
||||
@NotNull
|
||||
PlaceholderIntegration createPAPIIntegration(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a proxy factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ProxyFactory createProxyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get eco Spigot plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@NotNull
|
||||
EcoPlugin getEcoPlugin();
|
||||
|
||||
/**
|
||||
* Get config factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigFactory getConfigFactory();
|
||||
|
||||
/**
|
||||
* Get drop queue factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
DropQueueFactory getDropQueueFactory();
|
||||
|
||||
/**
|
||||
* Get GUI factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
GUIFactory getGUIFactory();
|
||||
|
||||
/**
|
||||
* Get cleaner.
|
||||
*
|
||||
* @return The cleaner.
|
||||
*/
|
||||
@NotNull
|
||||
Cleaner getCleaner();
|
||||
|
||||
/**
|
||||
* Add new plugin.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void addNewPlugin(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get plugin by name.
|
||||
*
|
||||
* @param name The name.
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
EcoPlugin getPluginByName(@NotNull String name);
|
||||
|
||||
/**
|
||||
* Get all loaded eco plugins.
|
||||
*
|
||||
* @return A list of plugin names in lowercase.
|
||||
*/
|
||||
@NotNull
|
||||
List<String> getLoadedPlugins();
|
||||
|
||||
/**
|
||||
* Create a FastItemStack.
|
||||
*
|
||||
* @param itemStack The base ItemStack.
|
||||
* @return The FastItemStack.
|
||||
*/
|
||||
@NotNull
|
||||
FastItemStack createFastItemStack(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Register bStats metrics.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void registerBStats(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get the requirement factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RequirementFactory getRequirementFactory();
|
||||
|
||||
/**
|
||||
* Get Adventure audiences.
|
||||
*
|
||||
* @return The audiences.
|
||||
*/
|
||||
@Nullable
|
||||
BukkitAudiences getAdventure();
|
||||
|
||||
/**
|
||||
* Get the key registry.
|
||||
*
|
||||
* @return The registry.
|
||||
*/
|
||||
@NotNull
|
||||
KeyRegistry getKeyRegistry();
|
||||
|
||||
/**
|
||||
* Get the PlayerProfile handler.
|
||||
*
|
||||
* @return The handler.
|
||||
*/
|
||||
PlayerProfileHandler getPlayerProfileHandler();
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Quick DI class to manage passing eco plugins.
|
||||
*
|
||||
* @param <T> The eco plugin type.
|
||||
*/
|
||||
public abstract class PluginDependent<T extends EcoPlugin> {
|
||||
/**
|
||||
* The {@link EcoPlugin} that is stored.
|
||||
*/
|
||||
@Getter(AccessLevel.PROTECTED)
|
||||
@NotNull
|
||||
private final T plugin;
|
||||
|
||||
/**
|
||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
||||
*
|
||||
* @param plugin The plugin to manage.
|
||||
*/
|
||||
protected PluginDependent(@NotNull final T plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
}
|
||||
29
eco-api/src/main/java/com/willfp/eco/core/PluginLike.java
Normal file
29
eco-api/src/main/java/com/willfp/eco/core/PluginLike.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Represents any class that acts like a plugin, for example {@link EcoPlugin}
|
||||
* or {@link com.willfp.eco.core.extensions.Extension}. This exists to create
|
||||
* things such as extension base configs rather than needing to pass an instance
|
||||
* of the owning plugin.
|
||||
*/
|
||||
public interface PluginLike {
|
||||
/**
|
||||
* Get the data folder of the object.
|
||||
* <p>
|
||||
* Returns the plugin data folder for a plugin, or the extension's parent plugin's folder
|
||||
*
|
||||
* @return The data folder.
|
||||
*/
|
||||
File getDataFolder();
|
||||
|
||||
/**
|
||||
* Get the handler class for updatable classes.
|
||||
*
|
||||
* @return The config handler.
|
||||
*/
|
||||
ConfigHandler getConfigHandler();
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
package com.willfp.eco.util.optional;
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.integrations.economy.EconomyManager;
|
||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||
import com.willfp.eco.util.ClassUtils;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -10,20 +11,18 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* A prerequisite is a requirement for something.
|
||||
* <p>
|
||||
* For example, you can require the server to have paper or be a specific version,
|
||||
* or have some other dependency.
|
||||
*/
|
||||
public class Prerequisite {
|
||||
/**
|
||||
* All existing prerequisites are registered on creation.
|
||||
*/
|
||||
private static final List<Prerequisite> VALUES = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Requires the server to be running minecraft version 1.16 or higher.
|
||||
*/
|
||||
public static final Prerequisite MINIMUM_1_16 = new Prerequisite(
|
||||
() -> !Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].contains("15"),
|
||||
"Requires minimum server version of 1.16"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running an implementation of paper.
|
||||
*/
|
||||
@@ -32,6 +31,41 @@ public class Prerequisite {
|
||||
"Requires server to be running paper (or a fork)"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to have vault installed.
|
||||
*
|
||||
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final Prerequisite HAS_VAULT = new Prerequisite(
|
||||
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
|
||||
"Requires server to have vault"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.17.
|
||||
*/
|
||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("17"),
|
||||
"Requires server to be running 1.17+"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running an implementation of BungeeCord.
|
||||
*/
|
||||
public static final Prerequisite HAS_BUNGEECORD = new Prerequisite(
|
||||
() -> ClassUtils.exists("net.md_5.bungee.api.event.ServerConnectedEvent"),
|
||||
"Requires server to be running BungeeCord (or a fork)"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running an implementation of Velocity.
|
||||
*/
|
||||
public static final Prerequisite HAS_VELOCITY = new Prerequisite(
|
||||
() -> ClassUtils.exists("com.velocitypowered.api.event.player.ServerConnectedEvent"),
|
||||
"Requires server to be running Velocity (or a fork)"
|
||||
);
|
||||
|
||||
/**
|
||||
* If the necessary prerequisite condition has been met.
|
||||
*/
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.willfp.eco.core.command;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface for all command implementations.
|
||||
*/
|
||||
public interface CommandBase {
|
||||
/**
|
||||
* Get command name.
|
||||
*
|
||||
* @return The name.
|
||||
*/
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* Get command permission.
|
||||
*
|
||||
* @return The permission.
|
||||
*/
|
||||
String getPermission();
|
||||
|
||||
/**
|
||||
* If only players can execute the command.
|
||||
*
|
||||
* @return If true.
|
||||
*/
|
||||
boolean isPlayersOnly();
|
||||
|
||||
/**
|
||||
* Add a subcommand to the command.
|
||||
*
|
||||
* @param command The subcommand.
|
||||
* @return The parent command.
|
||||
*/
|
||||
CommandBase addSubcommand(@NotNull CommandBase command);
|
||||
|
||||
/**
|
||||
* Get the handler.
|
||||
*
|
||||
* @return The handler.
|
||||
*/
|
||||
CommandHandler getHandler();
|
||||
|
||||
/**
|
||||
* Set the handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
void setHandler(@NotNull CommandHandler handler);
|
||||
|
||||
/**
|
||||
* Get the tab completer.
|
||||
*
|
||||
* @return The tab completer.
|
||||
*/
|
||||
TabCompleteHandler getTabCompleter();
|
||||
|
||||
/**
|
||||
* Set the tab completer.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
void setTabCompleter(@NotNull TabCompleteHandler handler);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.willfp.eco.core.command;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A command handler handles the actual code for a command.
|
||||
* <p>
|
||||
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
|
||||
* @see CommandBase
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface CommandHandler {
|
||||
/**
|
||||
* The code to be called on execution.
|
||||
*
|
||||
* @param sender The sender.
|
||||
* @param args The arguments.
|
||||
*/
|
||||
void onExecute(@NotNull CommandSender sender,
|
||||
@NotNull List<String> args);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.willfp.eco.core.command;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A Tab Complete handler handles the actual tab-completion code.
|
||||
* <p>
|
||||
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
|
||||
* @see CommandBase
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface TabCompleteHandler {
|
||||
/**
|
||||
* Handle Tab Completion.
|
||||
*
|
||||
* @param sender The sender.
|
||||
* @param args The arguments.
|
||||
* @return The tab completion results.
|
||||
*/
|
||||
List<String> tabComplete(@NotNull CommandSender sender,
|
||||
@NotNull List<String> args);
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
package com.willfp.eco.core.command.impl;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import com.willfp.eco.core.command.CommandBase;
|
||||
import com.willfp.eco.core.command.CommandHandler;
|
||||
import com.willfp.eco.core.command.TabCompleteHandler;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.StringUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Abstract class for commands that can be handled.
|
||||
* <p>
|
||||
* Handled commands have a method to pass in raw input from bukkit commands
|
||||
* in order to execute the command-specific code. It's essentially an internal
|
||||
* layer, hence why it's a package-private class.
|
||||
*/
|
||||
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
||||
/**
|
||||
* The name of the command.
|
||||
*/
|
||||
@Getter
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* The permission required to execute the command.
|
||||
* <p>
|
||||
* Written out as a string for flexibility with subclasses.
|
||||
*/
|
||||
@Getter
|
||||
private final String permission;
|
||||
|
||||
/**
|
||||
* Should the command only be allowed to be executed by players?
|
||||
* <p>
|
||||
* In other worlds, only allowed to be executed by console.
|
||||
*/
|
||||
@Getter
|
||||
private final boolean playersOnly;
|
||||
|
||||
/**
|
||||
* The actual code to be executed in the command.
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private CommandHandler handler = (sender, args) -> { };
|
||||
|
||||
/**
|
||||
* The tab completion code to be executed in the command.
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>();
|
||||
|
||||
/**
|
||||
* All subcommands for the command.
|
||||
*/
|
||||
@Getter(AccessLevel.PROTECTED)
|
||||
private final List<CommandBase> subcommands;
|
||||
|
||||
/**
|
||||
* Create a new command.
|
||||
* <p>
|
||||
* The name cannot be the same as an existing command as this will conflict.
|
||||
*
|
||||
* @param plugin Instance of a plugin.
|
||||
* @param name The name used in execution.
|
||||
* @param permission The permission required to execute the command.
|
||||
* @param playersOnly If only players should be able to execute this command.
|
||||
*/
|
||||
HandledCommand(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String name,
|
||||
@NotNull final String permission,
|
||||
final boolean playersOnly) {
|
||||
super(plugin);
|
||||
this.name = name;
|
||||
this.permission = permission;
|
||||
this.playersOnly = playersOnly;
|
||||
this.subcommands = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a subcommand to the command.
|
||||
*
|
||||
* @param subcommand The subcommand.
|
||||
* @return The parent command.
|
||||
*/
|
||||
@Override
|
||||
public final CommandBase addSubcommand(@NotNull final CommandBase subcommand) {
|
||||
subcommands.add(subcommand);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the command.
|
||||
*
|
||||
* @param sender The sender.
|
||||
* @param args The arguments.
|
||||
*/
|
||||
protected final void handle(@NotNull final CommandSender sender,
|
||||
@NotNull final String[] args) {
|
||||
if (!canExecute(sender, this, this.getPlugin())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length > 0) {
|
||||
for (CommandBase subcommand : this.getSubcommands()) {
|
||||
if (subcommand.getName().equalsIgnoreCase(args[0])) {
|
||||
if (!canExecute(sender, subcommand, this.getPlugin())) {
|
||||
return;
|
||||
}
|
||||
|
||||
((HandledCommand) subcommand).handle(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.getHandler().onExecute(sender, Arrays.asList(args));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the tab completion.
|
||||
*
|
||||
* @param sender The sender.
|
||||
* @param args The arguments.
|
||||
* @return The tab completion results.
|
||||
*/
|
||||
protected final List<String> handleTabCompletion(@NotNull final CommandSender sender,
|
||||
@NotNull final String[] args) {
|
||||
|
||||
if (!sender.hasPermission(this.getPermission())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (args.length == 1) {
|
||||
List<String> completions = new ArrayList<>();
|
||||
|
||||
StringUtil.copyPartialMatches(
|
||||
args[0],
|
||||
this.getSubcommands().stream().map(CommandBase::getName).collect(Collectors.toList()),
|
||||
completions
|
||||
);
|
||||
|
||||
Collections.sort(completions);
|
||||
|
||||
if (!completions.isEmpty()) {
|
||||
return completions;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length >= 2) {
|
||||
HandledCommand command = null;
|
||||
|
||||
for (CommandBase subcommand : this.getSubcommands()) {
|
||||
if (args[0].equalsIgnoreCase(subcommand.getName())) {
|
||||
command = (HandledCommand) subcommand;
|
||||
}
|
||||
}
|
||||
|
||||
if (command != null) {
|
||||
return command.handleTabCompletion(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||
}
|
||||
}
|
||||
|
||||
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
|
||||
}
|
||||
|
||||
/**
|
||||
* If a sender can execute the command.
|
||||
*
|
||||
* @param sender The sender.
|
||||
* @param command The command.
|
||||
* @param plugin The plugin.
|
||||
* @return If the sender can execute.
|
||||
*/
|
||||
public static boolean canExecute(@NotNull final CommandSender sender,
|
||||
@NotNull final CommandBase command,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
if (command.isPlayersOnly() && !(sender instanceof Player)) {
|
||||
sender.sendMessage(plugin.getLangYml().getMessage("not-player"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!sender.hasPermission(command.getPermission()) && sender instanceof Player) {
|
||||
sender.sendMessage(plugin.getLangYml().getNoPermission());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.willfp.eco.core.command.impl;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* PluginCommands are the class to be used instead of CommandExecutor.
|
||||
* <p>
|
||||
* The command will not be registered until register() is called.
|
||||
* <p>
|
||||
* The name cannot be the same as an existing command as this will conflict.
|
||||
*/
|
||||
public abstract class PluginCommand extends HandledCommand implements CommandExecutor, TabCompleter {
|
||||
/**
|
||||
* Create a new command.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The name used in execution.
|
||||
* @param permission The permission required to execute the command.
|
||||
* @param playersOnly If only players should be able to execute this command.
|
||||
*/
|
||||
protected PluginCommand(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String name,
|
||||
@NotNull final String permission,
|
||||
final boolean playersOnly) {
|
||||
super(plugin, name, permission, playersOnly);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the command with the server,
|
||||
* <p>
|
||||
* Requires the command name to exist, defined in plugin.yml.
|
||||
*/
|
||||
public final void register() {
|
||||
org.bukkit.command.PluginCommand command = Bukkit.getPluginCommand(this.getName());
|
||||
assert command != null;
|
||||
command.setExecutor(this);
|
||||
command.setTabCompleter(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal implementation used to clean up boilerplate.
|
||||
* Used for parity with {@link CommandExecutor#onCommand(CommandSender, Command, String, String[])}.
|
||||
*
|
||||
* @param sender The executor of the command.
|
||||
* @param command The bukkit command.
|
||||
* @param label The name of the executed command.
|
||||
* @param args The arguments of the command (anything after the physical command name)
|
||||
* @return If the command was processed by the linked {@link EcoPlugin}
|
||||
*/
|
||||
@Override
|
||||
public final boolean onCommand(@NotNull final CommandSender sender,
|
||||
@NotNull final Command command,
|
||||
@NotNull final String label,
|
||||
@NotNull final String[] args) {
|
||||
if (!command.getName().equalsIgnoreCase(this.getName())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.handle(sender, args);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal implementation used to clean up boilerplate.
|
||||
* Used for parity with {@link TabCompleter#onTabComplete(CommandSender, Command, String, String[])}.
|
||||
*
|
||||
* @param sender The executor of the command.
|
||||
* @param command The bukkit command.
|
||||
* @param label The name of the executed command.
|
||||
* @param args The arguments of the command (anything after the physical command name).
|
||||
* @return The list of tab-completions.
|
||||
*/
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull final CommandSender sender,
|
||||
@NotNull final Command command,
|
||||
@NotNull final String label,
|
||||
@NotNull final String[] args) {
|
||||
if (!command.getName().equalsIgnoreCase(this.getName())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return this.handleTabCompletion(sender, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.willfp.eco.core.command.impl;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.command.CommandBase;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Subcommands can be added to PluginCommands or to other Subcommands.
|
||||
*/
|
||||
public abstract class Subcommand extends HandledCommand {
|
||||
/**
|
||||
* Create subcommand.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The subcommand name.
|
||||
* @param permission The subcommand permission.
|
||||
* @param playersOnly If the subcommand only works on players.
|
||||
*/
|
||||
protected Subcommand(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String name,
|
||||
@NotNull final String permission,
|
||||
final boolean playersOnly) {
|
||||
super(plugin, name, permission, playersOnly);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create subcommand.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The name of the subcommand.
|
||||
* @param parent The parent command.
|
||||
*/
|
||||
protected Subcommand(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String name,
|
||||
@NotNull final CommandBase parent) {
|
||||
super(plugin, name, parent.getPermission(), parent.isPlayersOnly());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.willfp.eco.core.config.base;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Default plugin config.yml.
|
||||
*/
|
||||
public class ConfigYml extends YamlBaseConfig {
|
||||
/**
|
||||
* Config.yml.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
public ConfigYml(@NotNull final EcoPlugin plugin) {
|
||||
super("config", true, plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.config.base;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Default plugin lang.yml.
|
||||
*/
|
||||
public class LangYml extends YamlBaseConfig {
|
||||
/**
|
||||
* Lang.yml.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
public LangYml(@NotNull final EcoPlugin plugin) {
|
||||
super("lang", false, plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the prefix for messages in chat.
|
||||
*
|
||||
* @return The prefix.
|
||||
*/
|
||||
public String getPrefix() {
|
||||
return this.getString("messages.prefix");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the no permission message.
|
||||
*
|
||||
* @return The message.
|
||||
*/
|
||||
public String getNoPermission() {
|
||||
return getPrefix() + this.getString("messages.no-permission");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a chat message.
|
||||
*
|
||||
* @param message The key of the message.
|
||||
* @return The message with a prefix appended.
|
||||
*/
|
||||
public String getMessage(@NotNull final String message) {
|
||||
return getMessage(message, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a chat message.
|
||||
*
|
||||
* @param message The key of the message.
|
||||
* @param option The format options.
|
||||
* @return The message with a prefix appended.
|
||||
*/
|
||||
public String getMessage(@NotNull final String message,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return getPrefix() + this.getString("messages." + message, option);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* All canfigs implement this interface.
|
||||
* <p>
|
||||
* Contains all methods that must exist in yaml and json configurations.
|
||||
*/
|
||||
public interface Config extends Cloneable {
|
||||
/**
|
||||
* Clears cache.
|
||||
*/
|
||||
void clearCache();
|
||||
|
||||
/**
|
||||
* Convert the config into readable text.
|
||||
*
|
||||
* @return The plaintext.
|
||||
*/
|
||||
String toPlaintext();
|
||||
|
||||
/**
|
||||
* Get if the config contains a key.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return If contained.
|
||||
*/
|
||||
boolean has(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get config keys.
|
||||
*
|
||||
* @param deep If keys from subsections should be fetched too.
|
||||
* @return A list of keys.
|
||||
*/
|
||||
@NotNull
|
||||
List<String> getKeys(boolean deep);
|
||||
|
||||
/**
|
||||
* Get an object from config.
|
||||
* Default implementations call {@link org.bukkit.configuration.file.YamlConfiguration#get(String)}.
|
||||
*
|
||||
* @param path The path.
|
||||
* @return The object.
|
||||
*/
|
||||
@Nullable
|
||||
Object get(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Set an object in config.
|
||||
* Default implementations call {@link org.bukkit.configuration.file.YamlConfiguration#set(String, Object)}
|
||||
*
|
||||
* @param path The path.
|
||||
* @param object The object.
|
||||
*/
|
||||
void set(@NotNull String path,
|
||||
@Nullable Object object);
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection. Throws NPE if not found.
|
||||
*/
|
||||
@NotNull
|
||||
Config getSubsection(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
Config getSubsectionOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get an integer from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or 0 if not found.
|
||||
*/
|
||||
int getInt(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get an integer from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
Integer getIntOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get an integer from config with a specified default (not found) value.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param def The value to default to if not found.
|
||||
* @return The found value, or the default.
|
||||
*/
|
||||
int getInt(@NotNull String path,
|
||||
int def);
|
||||
|
||||
/**
|
||||
* Get a list of integers from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
List<Integer> getInts(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of integers from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<Integer> getIntsOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a boolean from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or false if not found.
|
||||
*/
|
||||
boolean getBool(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a boolean from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
Boolean getBoolOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of booleans from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
List<Boolean> getBools(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of booleans from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<Boolean> getBoolsOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or an empty string if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default String getString(@NotNull String path) {
|
||||
return getString(path, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @return The found value, or an empty string if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default String getString(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or an empty string if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default String getString(@NotNull String path,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return this.getString(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @param option The format option.
|
||||
* @return The found value, or an empty string if not found.
|
||||
*/
|
||||
@NotNull
|
||||
String getString(@NotNull String path,
|
||||
boolean format,
|
||||
@NotNull StringUtils.FormatOption option);
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default String getStringOrNull(@NotNull String path) {
|
||||
return getStringOrNull(path, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default String getStringOrNull(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getStringOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default String getStringOrNull(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return this.getStringOrNull(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
String getStringOrNull(@NotNull String path,
|
||||
boolean format,
|
||||
@NotNull StringUtils.FormatOption option);
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
* <p>
|
||||
* Formatted by default.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default List<String> getStrings(@NotNull String path) {
|
||||
return getStrings(path, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default List<String> getStrings(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getStrings(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default List<String> getStrings(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return getStrings(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @param option The option.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
List<String> getStrings(@NotNull String path,
|
||||
boolean format,
|
||||
@NotNull StringUtils.FormatOption option);
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default List<String> getStringsOrNull(@NotNull String path) {
|
||||
return getStringsOrNull(path, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default List<String> getStringsOrNull(@NotNull String path,
|
||||
boolean format) {
|
||||
return getStringsOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
default List<String> getStringsOrNull(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return getStringsOrNull(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<String> getStringsOrNull(@NotNull String path,
|
||||
boolean format,
|
||||
@NotNull StringUtils.FormatOption option);
|
||||
|
||||
/**
|
||||
* Get a decimal from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or 0 if not found.
|
||||
*/
|
||||
double getDouble(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a decimal from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
Double getDoubleOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of decimals from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
List<Double> getDoubles(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of decimals from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<Double> getDoublesOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Clone the config.
|
||||
*
|
||||
* @return The clone.
|
||||
*/
|
||||
Config clone();
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* JSON configs have extra methods compared to yaml configs.
|
||||
* <p>
|
||||
* If you need to use them, then use JSONConfig instead.
|
||||
*/
|
||||
public interface JSONConfig extends Config {
|
||||
/**
|
||||
* Get a list of subsections from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
List<JSONConfig> getSubsections(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get a list of subsections from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<JSONConfig> getSubsectionsOrNull(@NotNull String path);
|
||||
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection. Throws NPE if not found.
|
||||
*/
|
||||
@Override
|
||||
@NotNull
|
||||
JSONConfig getSubsection(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection, or null if not found.
|
||||
*/
|
||||
@Override
|
||||
@Nullable
|
||||
JSONConfig getSubsectionOrNull(@NotNull String path);
|
||||
|
||||
@Override
|
||||
JSONConfig clone();
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Interface for configs that physically exist as files in plugins.
|
||||
*/
|
||||
public interface LoadableConfig {
|
||||
/**
|
||||
* Create the file.
|
||||
*/
|
||||
void createFile();
|
||||
|
||||
/**
|
||||
* Get resource path as relative to base directory.
|
||||
*
|
||||
* @return The resource path.
|
||||
*/
|
||||
String getResourcePath();
|
||||
|
||||
/**
|
||||
* Save the config.
|
||||
*
|
||||
* @throws IOException If error in saving.
|
||||
*/
|
||||
void save() throws IOException;
|
||||
|
||||
/**
|
||||
* Get the config file.
|
||||
*
|
||||
* @return The file.
|
||||
*/
|
||||
File getConfigFile();
|
||||
|
||||
/**
|
||||
* Get the config name (including extension).
|
||||
*
|
||||
* @return The name.
|
||||
*/
|
||||
String getName();
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
/**
|
||||
* Interface for configs that wrap an {@link YamlConfiguration}.
|
||||
*
|
||||
* @see com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper
|
||||
*/
|
||||
public interface WrappedYamlConfiguration {
|
||||
/**
|
||||
* Get the ConfigurationSection handle.
|
||||
*
|
||||
* @return The handle.
|
||||
*/
|
||||
YamlConfiguration getBukkitHandle();
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused, updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, updateBlacklist);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, removeUnused, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in one of two places:
|
||||
* <ul>
|
||||
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||
* <li>Other extension's configs</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected JSONExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected JSONExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, source, subDirectoryPath, updateBlacklist);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable JSON config that exists within a plugin jar.
|
||||
*/
|
||||
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(Eco.getHandler().getConfigFactory().createLoadableJSONConfig(configName, plugin, "", plugin.getClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Raw JSON config with a map of values at its core.
|
||||
*/
|
||||
public class JSONTransientConfig extends JSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for passing maps.
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param values The map of values.
|
||||
*/
|
||||
public JSONTransientConfig(@NotNull final Map<String, Object> values) {
|
||||
super(Eco.getHandler().getConfigFactory().createJSONConfig(values));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.willfp.eco.core.config.json.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend JSON config implementations.
|
||||
*/
|
||||
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected JSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public @NotNull List<JSONConfig> getSubsections(@NotNull final String path) {
|
||||
return this.getHandle().getSubsections(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<JSONConfig> getSubsectionsOrNull(@NotNull final String path) {
|
||||
return this.getHandle().getSubsectionsOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull JSONConfig getSubsection(@NotNull final String path) {
|
||||
return this.getHandle().getSubsection(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable JSONConfig getSubsectionOrNull(@NotNull final String path) {
|
||||
return this.getHandle().getSubsectionOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONConfig clone() {
|
||||
return this.getHandle().clone();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.willfp.eco.core.config.json.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable JSON config implementations.
|
||||
*/
|
||||
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected LoadableJSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||
super(handle);
|
||||
|
||||
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void createFile() {
|
||||
((LoadableConfig) this.getHandle()).createFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourcePath() {
|
||||
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() throws IOException {
|
||||
((LoadableConfig) this.getHandle()).save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getConfigFile() {
|
||||
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return ((LoadableConfig) this.getHandle()).getName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.willfp.eco.core.config.updating;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Every {@link com.willfp.eco.core.PluginLike} has a config handler.
|
||||
* <p>
|
||||
* Handles updating and saving configs.
|
||||
*/
|
||||
public interface ConfigHandler {
|
||||
/**
|
||||
* Invoke all update methods.
|
||||
*/
|
||||
void callUpdate();
|
||||
|
||||
/**
|
||||
* Save all configs.
|
||||
*/
|
||||
void saveAllConfigs();
|
||||
|
||||
/**
|
||||
* Update all updatable configs.
|
||||
*/
|
||||
void updateConfigs();
|
||||
|
||||
/**
|
||||
* Add new config to be saved.
|
||||
*
|
||||
* @param config The config.
|
||||
*/
|
||||
void addConfig(@NotNull LoadableConfig config);
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.willfp.eco.core.config.updating;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Annotation to put on update methods.
|
||||
* <p>
|
||||
* All update methods must be public and static,
|
||||
* and can accept an EcoPlugin as a parameter.
|
||||
* <p>
|
||||
* As such, there are only 2 valid update methods:
|
||||
* <p>
|
||||
* The first:
|
||||
* <pre>{@code
|
||||
* @ConfigUpdater
|
||||
* public static void update() {
|
||||
* // Update code
|
||||
* }
|
||||
* }</pre>
|
||||
* <p>
|
||||
* The second:
|
||||
* <pre>{@code
|
||||
* public static void update(EcoPlugin plugin) {}
|
||||
* // Update code
|
||||
* }</pre>
|
||||
* <p>
|
||||
* Config update methods in all classes in a plugin jar will be called
|
||||
* on reload.
|
||||
* <p>
|
||||
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
||||
* calls in your code.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface ConfigUpdater {
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.willfp.eco.core.config.wrapper;
|
||||
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Internal component to create backend config implementations.
|
||||
*/
|
||||
public interface ConfigFactory {
|
||||
/**
|
||||
* Updatable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createUpdatableYamlConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* Updatable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
JSONConfig createUpdatableJSONConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* JSON loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
JSONConfig createLoadableJSONConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source);
|
||||
|
||||
/**
|
||||
* Yaml loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createLoadableYamlConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source);
|
||||
|
||||
/**
|
||||
* Yaml config.
|
||||
*
|
||||
* @param config The handle.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createYamlConfig(@NotNull YamlConfiguration config);
|
||||
|
||||
/**
|
||||
* JSON config.
|
||||
*
|
||||
* @param values The values.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
JSONConfig createJSONConfig(@NotNull Map<String, Object> values);
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
package com.willfp.eco.core.config.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
* which is the handle.
|
||||
* <p>
|
||||
* This class handles them.
|
||||
*
|
||||
* @param <T> The type of the handle.
|
||||
*/
|
||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
* which is the handle.
|
||||
* <p>
|
||||
* The handle should only ever be used if you want to
|
||||
* do something <i>interesting</i> config-wise with some
|
||||
* internals.
|
||||
* <p>
|
||||
* In general use, though, the handle isn't necessary.
|
||||
*/
|
||||
@Getter
|
||||
private final T handle;
|
||||
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The config that is being wrapped.
|
||||
*/
|
||||
protected ConfigWrapper(@NotNull final T handle) {
|
||||
this.handle = handle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearCache() {
|
||||
handle.clearCache();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toPlaintext() {
|
||||
return handle.toPlaintext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean has(@NotNull final String path) {
|
||||
return handle.has(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<String> getKeys(final boolean deep) {
|
||||
return handle.getKeys(deep);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object get(@NotNull final String path) {
|
||||
return handle.get(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(@NotNull final String path,
|
||||
@Nullable final Object object) {
|
||||
handle.set(path, object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Config getSubsection(@NotNull final String path) {
|
||||
return handle.getSubsection(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Config getSubsectionOrNull(@NotNull final String path) {
|
||||
return handle.getSubsectionOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(@NotNull final String path) {
|
||||
return handle.getInt(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Integer getIntOrNull(@NotNull final String path) {
|
||||
return handle.getIntOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(@NotNull final String path,
|
||||
final int def) {
|
||||
return handle.getInt(path, def);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<Integer> getInts(@NotNull final String path) {
|
||||
return handle.getInts(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<Integer> getIntsOrNull(@NotNull final String path) {
|
||||
return handle.getIntsOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBool(@NotNull final String path) {
|
||||
return handle.getBool(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Boolean getBoolOrNull(@NotNull final String path) {
|
||||
return handle.getBoolOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<Boolean> getBools(@NotNull final String path) {
|
||||
return handle.getBools(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<Boolean> getBoolsOrNull(@NotNull final String path) {
|
||||
return handle.getBoolsOrNull(path);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public @NotNull String getString(@NotNull final String path,
|
||||
final boolean format,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return handle.getString(path, format, option);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String getStringOrNull(@NotNull final String path,
|
||||
final boolean format,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return handle.getStringOrNull(path, format, option);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<String> getStrings(@NotNull final String path,
|
||||
final boolean format,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return handle.getStrings(path, format, option);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> getStringsOrNull(@NotNull final String path,
|
||||
final boolean format,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return handle.getStringsOrNull(path, format, option);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble(@NotNull final String path) {
|
||||
return handle.getDouble(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Double getDoubleOrNull(@NotNull final String path) {
|
||||
return handle.getDoubleOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<Double> getDoubles(@NotNull final String path) {
|
||||
return handle.getDoubles(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<Double> getDoublesOrNull(@NotNull final String path) {
|
||||
return handle.getDoublesOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Config clone() {
|
||||
return handle.clone();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused, updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, updateBlacklist);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, removeUnused, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in one of two places:
|
||||
* <ul>
|
||||
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||
* <li>Other extension's configs</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected YamlExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected YamlExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, source, subDirectoryPath, updateBlacklist);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable yaml config that exists within a plugin jar.
|
||||
*/
|
||||
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(Eco.getHandler().getConfigFactory().createLoadableYamlConfig(configName, plugin, "", plugin.getClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.StringReader;
|
||||
|
||||
/**
|
||||
* Config implementation for passing YamlConfigurations.
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*/
|
||||
public class YamlTransientConfig extends YamlConfigWrapper {
|
||||
/**
|
||||
* @param config The YamlConfiguration handle.
|
||||
*/
|
||||
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(config));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param contents The contents of the config.
|
||||
*/
|
||||
public YamlTransientConfig(@NotNull final String contents) {
|
||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader(contents))));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.willfp.eco.core.config.yaml.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable yaml config implementations.
|
||||
*/
|
||||
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected LoadableYamlConfigWrapper(@NotNull final Config handle) {
|
||||
super(handle);
|
||||
|
||||
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void createFile() {
|
||||
((LoadableConfig) this.getHandle()).createFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourcePath() {
|
||||
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() throws IOException {
|
||||
((LoadableConfig) this.getHandle()).save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getConfigFile() {
|
||||
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return ((LoadableConfig) this.getHandle()).getName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.willfp.eco.core.config.yaml.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.WrappedYamlConfiguration;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend yaml config implementations.
|
||||
*/
|
||||
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected YamlConfigWrapper(@NotNull final Config handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public YamlConfiguration getBukkitHandle() {
|
||||
return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.willfp.eco.core.data;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Persistent data storage interface for players.
|
||||
* <p>
|
||||
* Profiles save automatically, so there is no need to save after changes.
|
||||
*/
|
||||
public interface PlayerProfile {
|
||||
/**
|
||||
* Write a key to a player's persistent data.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param value The value.
|
||||
* @param <T> The type of the key.
|
||||
*/
|
||||
<T> void write(@NotNull PersistentDataKey<T> key,
|
||||
@NotNull T value);
|
||||
|
||||
/**
|
||||
* Read a key from a player's persistent data.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param <T> The type of the key.
|
||||
* @return The value, or the default value if not found.
|
||||
*/
|
||||
<T> @NotNull T read(@NotNull PersistentDataKey<T> key);
|
||||
|
||||
/**
|
||||
* Load a player profile.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The profile.
|
||||
*/
|
||||
@NotNull
|
||||
static PlayerProfile load(@NotNull final OfflinePlayer player) {
|
||||
return load(player.getUniqueId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a player profile.
|
||||
*
|
||||
* @param uuid The player's UUID.
|
||||
* @return The profile.
|
||||
*/
|
||||
@NotNull
|
||||
static PlayerProfile load(@NotNull final UUID uuid) {
|
||||
return Eco.getHandler().getPlayerProfileHandler().load(uuid);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.willfp.eco.core.data;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* API to handle player profiles.
|
||||
*/
|
||||
public interface PlayerProfileHandler {
|
||||
/**
|
||||
* Load a player profile.
|
||||
*
|
||||
* @param uuid The UUID.
|
||||
* @return The profile.
|
||||
*/
|
||||
PlayerProfile load(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Save a player profile.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
*/
|
||||
void savePlayer(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Save all player data.
|
||||
*
|
||||
* @param async If the saving should be done asynchronously.
|
||||
* @deprecated async is now handled automatically depending on implementation.
|
||||
*/
|
||||
@Deprecated
|
||||
default void saveAll(boolean async) {
|
||||
saveAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save all player data.
|
||||
*/
|
||||
void saveAll();
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* API to register persistent data keys.
|
||||
*/
|
||||
public interface KeyRegistry {
|
||||
/**
|
||||
* Register a persistent data key to be stored.
|
||||
*
|
||||
* @param key The key.
|
||||
*/
|
||||
void registerKey(@NotNull PersistentDataKey<?> key);
|
||||
|
||||
/**
|
||||
* Get all registered keys.
|
||||
*
|
||||
* @return The keys.
|
||||
*/
|
||||
Set<PersistentDataKey<?>> getRegisteredKeys();
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* A persistent data key is a key with a type that can be stored about an offline player.
|
||||
*
|
||||
* @param <T> The type of the data.
|
||||
*/
|
||||
public class PersistentDataKey<T> {
|
||||
/**
|
||||
* The key of the persistent data value.
|
||||
*/
|
||||
@Getter
|
||||
private final NamespacedKey key;
|
||||
|
||||
/**
|
||||
* The default value for the key.
|
||||
*/
|
||||
@Getter
|
||||
private final T defaultValue;
|
||||
|
||||
/**
|
||||
* The persistent data key type.
|
||||
*/
|
||||
@Getter
|
||||
private final PersistentDataKeyType type;
|
||||
|
||||
/**
|
||||
* Create a new Persistent Data Key.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param type The data type.
|
||||
* @param defaultValue The default value.
|
||||
*/
|
||||
public PersistentDataKey(@NotNull final NamespacedKey key,
|
||||
@NotNull final PersistentDataKeyType type,
|
||||
@NotNull final T defaultValue) {
|
||||
this.key = key;
|
||||
this.defaultValue = defaultValue;
|
||||
this.type = type;
|
||||
|
||||
Eco.getHandler().getKeyRegistry().registerKey(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PersistentDataKey{"
|
||||
+ "key=" + key
|
||||
+ ", defaultValue=" + defaultValue
|
||||
+ ", type=" + type
|
||||
+ '}';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all persistent data keys.
|
||||
*
|
||||
* @return The keys.
|
||||
*/
|
||||
public static Set<PersistentDataKey<?>> values() {
|
||||
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
/**
|
||||
* All storable data key types.
|
||||
*/
|
||||
public enum PersistentDataKeyType {
|
||||
/**
|
||||
* String.
|
||||
*/
|
||||
STRING,
|
||||
|
||||
/**
|
||||
* Boolean.
|
||||
*/
|
||||
BOOLEAN,
|
||||
|
||||
/**
|
||||
* Integer.
|
||||
*/
|
||||
INT,
|
||||
|
||||
/**
|
||||
* Double.
|
||||
*/
|
||||
DOUBLE
|
||||
}
|
||||
179
eco-api/src/main/java/com/willfp/eco/core/display/Display.java
Normal file
179
eco-api/src/main/java/com/willfp/eco/core/display/Display.java
Normal file
@@ -0,0 +1,179 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Utility class to manage client-side item display.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class Display {
|
||||
/**
|
||||
* The prefix for client-side lore lines.
|
||||
*/
|
||||
public static final String PREFIX = "§z";
|
||||
|
||||
/**
|
||||
* The display handler.
|
||||
*/
|
||||
private static DisplayHandler handler = null;
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack display(@NotNull final ItemStack itemStack) {
|
||||
return display(itemStack, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
return handler.display(itemStack, player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display on ItemStacks and then finalize.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
|
||||
return finalize(display(itemStack, null));
|
||||
}
|
||||
|
||||
/**
|
||||
* Display on ItemStacks and then finalize.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
return finalize(display(itemStack, player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Revert on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack revert(@NotNull final ItemStack itemStack) {
|
||||
return handler.revert(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack finalize(@NotNull final ItemStack itemStack) {
|
||||
return handler.finalize(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unfinalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack unfinalize(@NotNull final ItemStack itemStack) {
|
||||
return handler.unfinalize(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* If an item is finalized.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return If finalized.
|
||||
*/
|
||||
public boolean isFinalized(@NotNull final ItemStack itemStack) {
|
||||
return handler.isFinalized(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new display module.
|
||||
*
|
||||
* @param module The module.
|
||||
*/
|
||||
public void registerDisplayModule(@NotNull final DisplayModule module) {
|
||||
handler.registerDisplayModule(module);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the display system.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void init(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalArgumentException("Already Initialized!");
|
||||
}
|
||||
Display.handler = handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extremely janky method - also internal, so don't use it. <b>This method is
|
||||
* NOT part of the API and may be removed at any time!</b>
|
||||
* <p>
|
||||
* This calls a display module with the specified parameters, now
|
||||
* you might ask why I need a static java method when the DisplayHandler
|
||||
* implementation could just call it itself? Well, kotlin doesn't really
|
||||
* like dealing with vararg ambiguity, and so while kotlin can't figure out
|
||||
* what is and isn't a vararg when I call display with a player, java can.
|
||||
* <p>
|
||||
* Because of this, I need to have this part of the code in java.
|
||||
*
|
||||
* <b>Don't call this method as part of your plugins!</b>
|
||||
* <p>
|
||||
* No, seriously - don't. This skips a bunch of checks and you'll almost
|
||||
* definitely break something.
|
||||
*
|
||||
* @param module The display module.
|
||||
* @param itemStack The ItemStack.
|
||||
* @param player The player.
|
||||
* @param args The args.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void callDisplayModule(@NotNull final DisplayModule module,
|
||||
@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
module.display(itemStack, args);
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the display handler.
|
||||
* <p>
|
||||
* Internal API component, you will cause bugs if you create your own handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void setHandler(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalStateException("Display already initialized!");
|
||||
}
|
||||
|
||||
Display.handler = handler;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Interface for display implementations.
|
||||
*/
|
||||
public interface DisplayHandler {
|
||||
/**
|
||||
* Register display module.
|
||||
*
|
||||
* @param module The module.
|
||||
*/
|
||||
void registerDisplayModule(@NotNull DisplayModule module);
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack display(@NotNull ItemStack itemStack,
|
||||
@Nullable Player player);
|
||||
|
||||
/**
|
||||
* Revert on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack revert(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Finalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack finalize(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Unfinalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack unfinalize(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* If an item is finalized.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return If finalized.
|
||||
*/
|
||||
boolean isFinalized(@NotNull ItemStack itemStack);
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Class for all plugin-specific client-side item display modules.
|
||||
*/
|
||||
public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
/**
|
||||
* The priority of the module.
|
||||
*/
|
||||
@Getter
|
||||
private final DisplayPriority priority;
|
||||
|
||||
/**
|
||||
* Create a new display module.
|
||||
*
|
||||
* @param plugin The plugin that the display is for.
|
||||
* @param priority The priority of the module.
|
||||
*/
|
||||
protected DisplayModule(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final DisplayPriority priority) {
|
||||
super(plugin);
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param args Optional args for display.
|
||||
*/
|
||||
public void display(@NotNull final ItemStack itemStack,
|
||||
@NotNull final Object... args) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
/**
|
||||
* Display an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @param args Optional args for display.
|
||||
*/
|
||||
public void display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
/**
|
||||
* Revert an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
*/
|
||||
public void revert(@NotNull final ItemStack itemStack) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
/**
|
||||
* Create varargs to pass back to ItemStack after reverting, but before display.
|
||||
*
|
||||
* @param itemStack The itemStack.
|
||||
* @return The plugin-specific varargs.
|
||||
*/
|
||||
public Object[] generateVarArgs(@NotNull final ItemStack itemStack) {
|
||||
return new Object[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get name of plugin.
|
||||
*
|
||||
* @return The plugin name.
|
||||
*/
|
||||
public final String getPluginName() {
|
||||
return super.getPlugin().getName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
/**
|
||||
* The priority (order) of display modules.
|
||||
*/
|
||||
public enum DisplayPriority {
|
||||
/**
|
||||
* Ran first.
|
||||
*/
|
||||
LOWEST,
|
||||
|
||||
/**
|
||||
* Ran second.
|
||||
*/
|
||||
LOW,
|
||||
|
||||
/**
|
||||
* Ran third.
|
||||
*/
|
||||
HIGH,
|
||||
|
||||
/**
|
||||
* Ran last.
|
||||
*/
|
||||
HIGHEST
|
||||
}
|
||||
@@ -1,10 +1,6 @@
|
||||
package com.willfp.eco.util.drops;
|
||||
package com.willfp.eco.core.drops;
|
||||
|
||||
import com.willfp.eco.util.drops.internal.AbstractDropQueue;
|
||||
import com.willfp.eco.util.drops.internal.DropManager;
|
||||
import com.willfp.eco.util.drops.internal.DropQueueType;
|
||||
import com.willfp.eco.util.drops.internal.FastCollatedDropQueue;
|
||||
import com.willfp.eco.util.drops.internal.InternalDropQueue;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -12,21 +8,26 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* A {@link DropQueue} is a set of drops linked to player.
|
||||
* <p>
|
||||
* All drops should be passed through a drop queue for telekinesis integration.
|
||||
* <p>
|
||||
* It functions essentially as a builder class, and runs very quickly.
|
||||
*
|
||||
* @see com.willfp.eco.util.TelekinesisUtils
|
||||
*/
|
||||
public class DropQueue {
|
||||
/**
|
||||
* The internally used {@link AbstractDropQueue}.
|
||||
* The internally used {@link DropQueue}.
|
||||
*/
|
||||
private final AbstractDropQueue handle;
|
||||
private final InternalDropQueue handle;
|
||||
|
||||
/**
|
||||
* Create {@link DropQueue} linked to player.
|
||||
* <p>
|
||||
* All drops should be passed through a drop queue for telekinesis integration.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
public DropQueue(@NotNull final Player player) {
|
||||
handle = DropManager.getType() == DropQueueType.COLLATED ? new FastCollatedDropQueue(player) : new InternalDropQueue(player);
|
||||
handle = Eco.getHandler().getDropQueueFactory().create(player);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.core.drops;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Internal component to create backend DropQueue implementations.
|
||||
*/
|
||||
public interface DropQueueFactory {
|
||||
/**
|
||||
* Create a DropQueue.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The Queue.
|
||||
*/
|
||||
InternalDropQueue create(@NotNull Player player);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.willfp.eco.util.drops.internal;
|
||||
package com.willfp.eco.core.drops;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -6,14 +6,17 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface AbstractDropQueue {
|
||||
/**
|
||||
* Internal interface for backend DropQueue implementations.
|
||||
*/
|
||||
public interface InternalDropQueue {
|
||||
/**
|
||||
* Add item to queue.
|
||||
*
|
||||
* @param item The item to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
AbstractDropQueue addItem(@NotNull ItemStack item);
|
||||
InternalDropQueue addItem(@NotNull ItemStack item);
|
||||
|
||||
/**
|
||||
* Add multiple items to queue.
|
||||
@@ -21,7 +24,7 @@ public interface AbstractDropQueue {
|
||||
* @param itemStacks The items to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
AbstractDropQueue addItems(@NotNull Collection<ItemStack> itemStacks);
|
||||
InternalDropQueue addItems(@NotNull Collection<ItemStack> itemStacks);
|
||||
|
||||
/**
|
||||
* Add xp to queue.
|
||||
@@ -29,7 +32,7 @@ public interface AbstractDropQueue {
|
||||
* @param amount The amount to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
AbstractDropQueue addXP(int amount);
|
||||
InternalDropQueue addXP(int amount);
|
||||
|
||||
/**
|
||||
* Set location of the origin of the drops.
|
||||
@@ -37,14 +40,14 @@ public interface AbstractDropQueue {
|
||||
* @param location The location.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
AbstractDropQueue setLocation(@NotNull Location location);
|
||||
InternalDropQueue setLocation(@NotNull Location location);
|
||||
|
||||
/**
|
||||
* Force the queue to act as if player is telekinetic.
|
||||
*
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
AbstractDropQueue forceTelekinesis();
|
||||
InternalDropQueue forceTelekinesis();
|
||||
|
||||
/**
|
||||
* Push the queue.
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The armor change event <b>does</b> contain information about the event.
|
||||
* <p>
|
||||
* Unlike {@link ArmorEquipEvent}, it is called the next tick and contains previous and current armor contents.
|
||||
*/
|
||||
public class ArmorChangeEvent extends PlayerEvent {
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*/
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
/**
|
||||
* The armor contents before. 0 is helmet, 3 is boots.
|
||||
*/
|
||||
@Getter
|
||||
private final List<ItemStack> before;
|
||||
|
||||
/**
|
||||
* The armor contents after. 0 is helmet, 3 is boots.
|
||||
*/
|
||||
@Getter
|
||||
private final List<ItemStack> after;
|
||||
|
||||
/**
|
||||
* Create a new ArmorChangeEvent.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param before The armor contents before.
|
||||
* @param after The armor contents after.
|
||||
*/
|
||||
public ArmorChangeEvent(@NotNull final Player player,
|
||||
@NotNull final List<ItemStack> before,
|
||||
@NotNull final List<ItemStack> after) {
|
||||
super(player);
|
||||
this.before = before;
|
||||
this.after = after;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of handlers handling this event.
|
||||
*
|
||||
* @return A list of handlers handling this event.
|
||||
*/
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*
|
||||
* @return The handler list.
|
||||
*/
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The armor equip event <b>does not contain information about the event.</b>
|
||||
* <p>
|
||||
* It is purely a trigger called whenever a player changes armor, you have to run
|
||||
* your own checks.
|
||||
* <p>
|
||||
* The event is called before the player's inventory actually updates,
|
||||
* so you can check a tick later to see the new contents.
|
||||
*
|
||||
* @see ArmorChangeEvent
|
||||
*/
|
||||
public class ArmorEquipEvent extends PlayerEvent {
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*/
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
/**
|
||||
* Create a new ArmorEquipEvent.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
public ArmorEquipEvent(@NotNull final Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of handlers handling this event.
|
||||
*
|
||||
* @return A list of handlers handling this event.
|
||||
*/
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*
|
||||
* @return The handler list.
|
||||
*/
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.willfp.eco.util.events.entitydeathbyentity;
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Entity;
|
||||
@@ -12,7 +12,9 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Event triggered when entity is killed by entity.
|
||||
* Event called when an entity is killed by another entity.
|
||||
* <p>
|
||||
* Not sure why spigot doesn't have this event normally.
|
||||
*/
|
||||
public class EntityDeathByEntityEvent extends Event {
|
||||
/**
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.willfp.eco.util.bukkit.events;
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
/**
|
||||
* Manages listeners for a plugin.
|
||||
*/
|
||||
public interface EventManager {
|
||||
/**
|
||||
* Register a listener with bukkit.
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.willfp.eco.util.events.naturalexpgainevent;
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.bukkit.event.Event;
|
||||
@@ -6,6 +6,10 @@ import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerExpChangeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Event similar to {@link PlayerExpChangeEvent}, except it
|
||||
* isn't called if the exp is from a bottle.
|
||||
*/
|
||||
public class NaturalExpGainEvent extends Event {
|
||||
/**
|
||||
* Internal bukkit.
|
||||
@@ -0,0 +1,84 @@
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Event called when a player jumps.
|
||||
*/
|
||||
public class PlayerJumpEvent extends PlayerMoveEvent {
|
||||
/**
|
||||
* Internal bukkit.
|
||||
*/
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
/**
|
||||
* The handled event.
|
||||
*/
|
||||
private final PlayerMoveEvent handle;
|
||||
|
||||
/**
|
||||
* Create a new PlayerJumpEvent.
|
||||
*
|
||||
* @param event The PlayerMoveEvent.
|
||||
*/
|
||||
public PlayerJumpEvent(@NotNull final PlayerMoveEvent event) {
|
||||
super(event.getPlayer(), event.getFrom(), event.getTo());
|
||||
|
||||
this.handle = event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal bukkit.
|
||||
*
|
||||
* @return The handlers.
|
||||
*/
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal bukkit.
|
||||
*
|
||||
* @return The handlers.
|
||||
*/
|
||||
public static @NotNull HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return handle.isCancelled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(final boolean cancel) {
|
||||
handle.setCancelled(cancel);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Location getFrom() {
|
||||
return handle.getFrom();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFrom(@NotNull final Location from) {
|
||||
handle.setFrom(from);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Location getTo() {
|
||||
return handle.getTo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTo(@NotNull final Location to) {
|
||||
handle.setTo(to);
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,41 @@
|
||||
package com.willfp.eco.util.extensions;
|
||||
package com.willfp.eco.core.extensions;
|
||||
|
||||
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public abstract class Extension {
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* An extension is a separate jar file that hooks into the base plugin jar.
|
||||
* <p>
|
||||
* If you take PlaceholderAPI as an example, the PAPI expansions are identical to
|
||||
* extensions.
|
||||
* <p>
|
||||
* Syntactically, extensions are very similar to plugins in their own right, except that
|
||||
* they are loaded by another plugin.
|
||||
*
|
||||
* @see <a href="https://auxilor.polymart.org">Extension examples.</a>
|
||||
*/
|
||||
public abstract class Extension implements PluginLike {
|
||||
/**
|
||||
* The {@link AbstractEcoPlugin} that this extension is for.
|
||||
* The {@link EcoPlugin} that this extension is for.
|
||||
*/
|
||||
@Getter(AccessLevel.PROTECTED)
|
||||
private final AbstractEcoPlugin plugin = AbstractEcoPlugin.getInstance();
|
||||
private final EcoPlugin plugin;
|
||||
|
||||
/**
|
||||
* Create a new extension for a plugin.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected Extension(@NotNull final EcoPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Metadata containing version and name.
|
||||
@@ -62,7 +85,17 @@ public abstract class Extension {
|
||||
*/
|
||||
public final String getName() {
|
||||
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||
return this.metadata.name;
|
||||
return this.metadata.name();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the author of the extension.
|
||||
*
|
||||
* @return The author of the metadata attached to the extension.
|
||||
*/
|
||||
public final String getAuthor() {
|
||||
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||
return this.metadata.author();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,36 +105,16 @@ public abstract class Extension {
|
||||
*/
|
||||
public final String getVersion() {
|
||||
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||
return this.metadata.version;
|
||||
return this.metadata.version();
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for the string and version of the extension.
|
||||
* Contains versions and name.
|
||||
* Designed for internal use.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static final class ExtensionMetadata {
|
||||
/**
|
||||
* The version of the extension.
|
||||
*/
|
||||
private final @NotNull String version;
|
||||
@Override
|
||||
public File getDataFolder() {
|
||||
return this.plugin.getDataFolder();
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension's name.
|
||||
*/
|
||||
private final @NotNull String name;
|
||||
|
||||
/**
|
||||
* Create a new extension metadata.
|
||||
*
|
||||
* @param version The version for the extension to be.
|
||||
* @param name The name of the extension.
|
||||
*/
|
||||
public ExtensionMetadata(@NotNull final String version,
|
||||
@NotNull final String name) {
|
||||
this.version = version;
|
||||
this.name = name;
|
||||
}
|
||||
@Override
|
||||
public ConfigHandler getConfigHandler() {
|
||||
return this.plugin.getConfigHandler();
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,11 @@
|
||||
package com.willfp.eco.util.extensions.loader;
|
||||
|
||||
import com.willfp.eco.util.extensions.Extension;
|
||||
package com.willfp.eco.core.extensions;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Interface for extension loader.
|
||||
* Some external plugins may modify extension loading for internal server purposes.
|
||||
* Internal component to manage loading and unloading extensions.
|
||||
*/
|
||||
public interface ExtensionLoader {
|
||||
|
||||
/**
|
||||
* Load all extensions.
|
||||
*/
|
||||
@@ -20,11 +16,6 @@ public interface ExtensionLoader {
|
||||
*/
|
||||
void unloadExtensions();
|
||||
|
||||
/**
|
||||
* Reload all extensions.
|
||||
*/
|
||||
void reloadExtensions();
|
||||
|
||||
/**
|
||||
* Retrieve a set of all loaded extensions.
|
||||
*
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.core.extensions;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The extension's metadata.
|
||||
* <p>
|
||||
* Stored as a record internally.
|
||||
*
|
||||
* @param version The extension version.
|
||||
* @param name The extension name.
|
||||
* @param author The extension's author.
|
||||
*/
|
||||
public record ExtensionMetadata(@NotNull String version,
|
||||
@NotNull String name,
|
||||
@NotNull String author) {
|
||||
|
||||
}
|
||||
@@ -1,18 +1,15 @@
|
||||
package com.willfp.eco.util.extensions;
|
||||
package com.willfp.eco.core.extensions;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called when the extension is made incorrectly.
|
||||
* Potential causes include:
|
||||
* Missing or invalid extension.yml.
|
||||
* Invalid filetype.
|
||||
*/
|
||||
public class MalformedExtensionException extends RuntimeException {
|
||||
|
||||
/**
|
||||
* Create a new MalformedExtensionException.
|
||||
* <p>
|
||||
* Potential causes include:
|
||||
* Missing or invalid extension.yml.
|
||||
* Invalid filetype.
|
||||
*
|
||||
* @param errorMessage The error message to show.
|
||||
*/
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.core.factory;
|
||||
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Factory to create metadata values for a specific plugin.
|
||||
*/
|
||||
public interface MetadataValueFactory {
|
||||
/**
|
||||
* Create a metadata value for a given plugin and object.
|
||||
*
|
||||
* @param value The object to store in metadata.
|
||||
* @return The metadata value.
|
||||
*/
|
||||
FixedMetadataValue create(@NotNull Object value);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.core.factory;
|
||||
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Factory to create {@link NamespacedKey}s for a plugin.
|
||||
*/
|
||||
public interface NamespacedKeyFactory {
|
||||
/**
|
||||
* Create an {@link NamespacedKey} associated with an {@link com.willfp.eco.core.EcoPlugin}.
|
||||
*
|
||||
* @param key The key in the {@link NamespacedKey}.
|
||||
* @return The created {@link NamespacedKey}.
|
||||
*/
|
||||
NamespacedKey create(@NotNull String key);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.willfp.eco.core.factory;
|
||||
|
||||
import com.willfp.eco.core.scheduling.RunnableTask;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Factory to create runnables. Much cleaner syntax than instantiating
|
||||
* {@link org.bukkit.scheduler.BukkitRunnable}s.
|
||||
*/
|
||||
public interface RunnableFactory {
|
||||
/**
|
||||
* Create a {@link RunnableTask}.
|
||||
*
|
||||
* @param consumer Lambda of the code to run, where the parameter represents the instance of the runnable.
|
||||
* @return The created {@link RunnableTask}.
|
||||
*/
|
||||
RunnableTask create(@NotNull Consumer<RunnableTask> consumer);
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
package com.willfp.eco.core.fast;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
||||
*/
|
||||
public interface FastItemStack {
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
*
|
||||
* @param checkStored If stored NBT should also be checked.
|
||||
* @return A map of all enchantments.
|
||||
*/
|
||||
Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored);
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @param checkStored If the stored NBT should also be checked.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
*/
|
||||
int getLevelOnItem(@NotNull Enchantment enchantment,
|
||||
boolean checkStored);
|
||||
|
||||
/**
|
||||
* Set the item lore.
|
||||
*
|
||||
* @param lore The lore.
|
||||
*/
|
||||
void setLore(@Nullable List<String> lore);
|
||||
|
||||
/**
|
||||
* Get the item lore.
|
||||
*
|
||||
* @return The lore.
|
||||
*/
|
||||
List<String> getLore();
|
||||
|
||||
|
||||
/**
|
||||
* Set the rework penalty.
|
||||
*
|
||||
* @param cost The rework penalty to set.
|
||||
*/
|
||||
void setRepairCost(int cost);
|
||||
|
||||
/**
|
||||
* Get the rework penalty.
|
||||
* .
|
||||
*
|
||||
* @return The rework penalty found on the item.
|
||||
*/
|
||||
int getRepairCost();
|
||||
|
||||
/**
|
||||
* Add ItemFlags.
|
||||
*
|
||||
* @param hideFlags The flags.
|
||||
*/
|
||||
void addItemFlags(ItemFlag... hideFlags);
|
||||
|
||||
/**
|
||||
* Remove ItemFlags.
|
||||
*
|
||||
* @param hideFlags The flags.
|
||||
*/
|
||||
void removeItemFlags(ItemFlag... hideFlags);
|
||||
|
||||
/**
|
||||
* Get the ItemFlags.
|
||||
*
|
||||
* @return The flags.
|
||||
*/
|
||||
Set<ItemFlag> getItemFlags();
|
||||
|
||||
/**
|
||||
* Test the item for a flag.
|
||||
*
|
||||
* @param flag The flag.
|
||||
* @return If the flag is present.
|
||||
*/
|
||||
boolean hasItemFlag(ItemFlag flag);
|
||||
|
||||
/**
|
||||
* Get the Bukkit ItemStack again.
|
||||
*
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack unwrap();
|
||||
|
||||
/**
|
||||
* Wrap an ItemStack to create a FastItemStack.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
* @return The FastItemStack.
|
||||
*/
|
||||
static FastItemStack wrap(@Nullable final ItemStack itemStack) {
|
||||
return Eco.getHandler().createFastItemStack(Objects.requireNonNullElseGet(itemStack, () -> new ItemStack(Material.AIR)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.willfp.eco.core.gui;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder;
|
||||
import com.willfp.eco.core.gui.slot.SlotBuilder;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Internal component used by {@link com.willfp.eco.core.gui.menu.Menu#builder(int)}
|
||||
* and {@link com.willfp.eco.core.gui.slot.Slot#builder(ItemStack)}.
|
||||
*/
|
||||
public interface GUIFactory {
|
||||
/**
|
||||
* Create slot builder.
|
||||
*
|
||||
* @param provider The provider.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder createSlotBuilder(@NotNull SlotProvider provider);
|
||||
|
||||
/**
|
||||
* Create menu builder.
|
||||
*
|
||||
* @param rows The amount of rows.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder createMenuBuilder(int rows);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on menu close.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface CloseHandler {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param event The close event.
|
||||
* @param menu The menu.
|
||||
*/
|
||||
void handle(@NotNull InventoryCloseEvent event,
|
||||
@NotNull Menu menu);
|
||||
}
|
||||
108
eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java
Normal file
108
eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java
Normal file
@@ -0,0 +1,108 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* GUI version of {@link Inventory}.
|
||||
* <p>
|
||||
* A menu contains slots and is 1-indexed. (Top row has index 1, bottom row has index 6).
|
||||
*/
|
||||
public interface Menu {
|
||||
/**
|
||||
* Get the amount of rows.
|
||||
*
|
||||
* @return The amount of rows.
|
||||
*/
|
||||
int getRows();
|
||||
|
||||
/**
|
||||
* Get slot at given row and column.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @return The row.
|
||||
*/
|
||||
Slot getSlot(int row,
|
||||
int column);
|
||||
|
||||
/**
|
||||
* Get the menu title.
|
||||
*
|
||||
* @return The title.
|
||||
*/
|
||||
String getTitle();
|
||||
|
||||
/**
|
||||
* Open the inventory for the player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The inventory.
|
||||
*/
|
||||
Inventory open(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Get captive items.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The items.
|
||||
*/
|
||||
List<ItemStack> getCaptiveItems(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Write data.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param type The type.
|
||||
* @param value The value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
*/
|
||||
<T, Z> void writeData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type,
|
||||
@NotNull Z value);
|
||||
|
||||
/**
|
||||
* Read data.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param type The type.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The data.
|
||||
*/
|
||||
@Nullable <T, Z> T readData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type);
|
||||
|
||||
/**
|
||||
* Get all data keys for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The keys.
|
||||
*/
|
||||
Set<NamespacedKey> getKeys(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Create a builder with a given amount of rows.
|
||||
*
|
||||
* @param rows The rows.
|
||||
* @return The builder.
|
||||
*/
|
||||
static MenuBuilder builder(final int rows) {
|
||||
return Eco.getHandler().getGUIFactory().createMenuBuilder(rows);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import com.willfp.eco.core.gui.slot.FillerMask;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Builder to create menus.
|
||||
*/
|
||||
public interface MenuBuilder {
|
||||
/**
|
||||
* Set the menu title.
|
||||
*
|
||||
* @param title The title.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder setTitle(@NotNull String title);
|
||||
|
||||
/**
|
||||
* Set a slot.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @param slot The slot.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder setSlot(int row,
|
||||
int column,
|
||||
@NotNull Slot slot);
|
||||
|
||||
/**
|
||||
* Run function to modify the builder.
|
||||
*
|
||||
* @param modifier The modifier.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder modfiy(@NotNull Consumer<MenuBuilder> modifier);
|
||||
|
||||
/**
|
||||
* Set the menu mask.
|
||||
*
|
||||
* @param mask The mask.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder setMask(@NotNull FillerMask mask);
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder onClose(@NotNull Consumer<InventoryCloseEvent> action) {
|
||||
onClose((event, menu) -> action.accept(event));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onClose(@NotNull CloseHandler action);
|
||||
|
||||
/**
|
||||
* Build the menu.
|
||||
*
|
||||
* @return The menu.
|
||||
*/
|
||||
Menu build();
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.items.builder.ItemStackBuilder;
|
||||
import com.willfp.eco.util.ListUtils;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Mask of filler slots.
|
||||
* <p>
|
||||
* A pattern consists of 1s and 0s, where a 1 is a filler slot,
|
||||
* and a 0 isn't.
|
||||
* <p>
|
||||
* For example, creating a filler mask for a single-chest sized menu would look like this:
|
||||
* <p>
|
||||
* new FillerMask(
|
||||
* material,
|
||||
* "11111111"
|
||||
* "10000001"
|
||||
* "11111111"
|
||||
* );
|
||||
*/
|
||||
public class FillerMask {
|
||||
/**
|
||||
* Mask.
|
||||
*/
|
||||
@Getter
|
||||
private final List<List<Slot>> mask;
|
||||
|
||||
/**
|
||||
* Create a new filler mask.
|
||||
*
|
||||
* @param material The mask material.
|
||||
* @param pattern The pattern.
|
||||
*/
|
||||
public FillerMask(@NotNull final Material material,
|
||||
@NotNull final String... pattern) {
|
||||
this(new MaskMaterials(material), pattern);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new filler mask.
|
||||
*
|
||||
* @param materials The mask materials.
|
||||
* @param pattern The pattern.
|
||||
*/
|
||||
public FillerMask(@NotNull final MaskMaterials materials,
|
||||
@NotNull final String... pattern) {
|
||||
if (Arrays.stream(materials.materials()).anyMatch(material -> material == Material.AIR)) {
|
||||
throw new IllegalArgumentException("Materials cannot be air!");
|
||||
}
|
||||
|
||||
mask = ListUtils.create2DList(6, 9);
|
||||
|
||||
for (int i = 0; i < materials.materials().length; i++) {
|
||||
ItemStack itemStack = new ItemStackBuilder(materials.materials()[i])
|
||||
.setDisplayName("&r")
|
||||
.build();
|
||||
|
||||
int row = 0;
|
||||
|
||||
for (String patternRow : pattern) {
|
||||
int column = 0;
|
||||
if (patternRow.length() != 9) {
|
||||
throw new IllegalArgumentException("Invalid amount of columns in pattern!");
|
||||
}
|
||||
for (char c : patternRow.toCharArray()) {
|
||||
if (c == '0') {
|
||||
mask.get(row).set(column, null);
|
||||
} else if (c == Character.forDigit(i + 1, 10)) {
|
||||
mask.get(row).set(column, new FillerSlot(itemStack));
|
||||
}
|
||||
|
||||
column++;
|
||||
}
|
||||
row++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* A filler slot is a slot that does nothing when clicked.
|
||||
* <p>
|
||||
* Useful for backgrounds.
|
||||
*/
|
||||
public class FillerSlot implements Slot {
|
||||
/**
|
||||
* The ItemStack.
|
||||
*/
|
||||
@Getter
|
||||
private final ItemStack itemStack;
|
||||
|
||||
/**
|
||||
* Create new filler slot.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
*/
|
||||
public FillerSlot(@NotNull final ItemStack itemStack) {
|
||||
this.itemStack = itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemStack(@NotNull final Player player) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCaptive() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Mask materials store a set of materials which can be accessed by
|
||||
* a filler mask.
|
||||
*
|
||||
* @param materials The materials.
|
||||
*/
|
||||
public record MaskMaterials(@NotNull Material... materials) {
|
||||
|
||||
}
|
||||
69
eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java
Normal file
69
eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java
Normal file
@@ -0,0 +1,69 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* A slot is an item in a GUI that can handle clicks.
|
||||
*/
|
||||
public interface Slot {
|
||||
/**
|
||||
* Get the ItemStack that would be shown to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack getItemStack(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* If the slot is captive. (Can items be placed in it).
|
||||
*
|
||||
* @return If captive.
|
||||
*/
|
||||
boolean isCaptive();
|
||||
|
||||
/**
|
||||
* Create a builder for an ItemStack.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder() {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> new ItemStack(Material.AIR));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for an ItemStack.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final ItemStack itemStack) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for a player-specific ItemStack.
|
||||
*
|
||||
* @param provider The provider.
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final Function<Player, ItemStack> provider) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> provider.apply(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for a player-specific ItemStack.
|
||||
*
|
||||
* @param provider The provider.
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder(provider);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* Builder to create slots.
|
||||
*/
|
||||
public interface SlotBuilder {
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onLeftClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onLeftClick((event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onLeftClick(@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onRightClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onRightClick((event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onRightClick(@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onShiftLeftClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onShiftLeftClick((event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onShiftLeftClick(@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onShiftRightClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onShiftRightClick((event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onShiftRightClick(@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onMiddleClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onMiddleClick((event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onMiddleClick(@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Modify the ItemStack.
|
||||
*
|
||||
* @param modifier The modifier.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setModifier(@NotNull SlotModifier modifier);
|
||||
|
||||
/**
|
||||
* Set slot to be a captive slot.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setCaptive();
|
||||
|
||||
/**
|
||||
* Build the slot.
|
||||
*
|
||||
* @return The slot.
|
||||
*/
|
||||
Slot build();
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.willfp.eco.core.gui.slot.functional;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on slot click.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface SlotHandler {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param event The click event.
|
||||
* @param slot The slot
|
||||
* @param menu The menu.
|
||||
*/
|
||||
void handle(@NotNull InventoryClickEvent event,
|
||||
@NotNull Slot slot,
|
||||
@NotNull Menu menu);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.willfp.eco.core.gui.slot.functional;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on slot modify.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface SlotModifier {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @param previous The previous ItemStack.
|
||||
*/
|
||||
void modify(@NotNull Player player,
|
||||
@NotNull Menu menu,
|
||||
@NotNull ItemStack previous);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.willfp.eco.core.gui.slot.functional;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on slot display.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface SlotProvider {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack provide(@NotNull Player player,
|
||||
@NotNull Menu menu);
|
||||
}
|
||||
@@ -1,8 +1,12 @@
|
||||
package com.willfp.eco.util.integrations;
|
||||
package com.willfp.eco.core.integrations;
|
||||
|
||||
/**
|
||||
* Abstract class for integrations.
|
||||
*/
|
||||
public interface Integration {
|
||||
/**
|
||||
* Get the name of integration.
|
||||
*
|
||||
* @return The name.
|
||||
*/
|
||||
String getPluginName();
|
||||
@@ -1,8 +1,13 @@
|
||||
package com.willfp.eco.util.integrations;
|
||||
package com.willfp.eco.core.integrations;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* An integration loader runs a runnable only if a specific plugin is present on the server.
|
||||
* <p>
|
||||
* Used by {@link com.willfp.eco.core.EcoPlugin} to load integrations.
|
||||
*/
|
||||
public class IntegrationLoader {
|
||||
/**
|
||||
* The lambda to be ran if the plugin is present.
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.willfp.eco.core.integrations.afk;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle afk integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class AFKManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private final Set<AFKWrapper> registered = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public void register(@NotNull final AFKWrapper integration) {
|
||||
registered.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a player is afk.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If afk.
|
||||
*/
|
||||
public boolean isAfk(@NotNull final Player player) {
|
||||
for (AFKWrapper afkWrapper : registered) {
|
||||
if (afkWrapper.isAfk(player)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.core.integrations.afk;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for afk integrations.
|
||||
*/
|
||||
public interface AFKWrapper extends Integration {
|
||||
/**
|
||||
* Get if a player is afk.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If afk.
|
||||
*/
|
||||
boolean isAfk(@NotNull Player player);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.willfp.eco.util.integrations.anticheat;
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
@@ -9,13 +9,11 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle anticheat integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class AnticheatManager {
|
||||
/**
|
||||
* The linked {@link AbstractEcoPlugin} to register anticheat listeners to.
|
||||
*/
|
||||
private final AbstractEcoPlugin plugin = AbstractEcoPlugin.getInstance();
|
||||
|
||||
/**
|
||||
* A set of all registered anticheats.
|
||||
*/
|
||||
@@ -24,9 +22,11 @@ public class AnticheatManager {
|
||||
/**
|
||||
* Register a new anticheat.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param anticheat The anticheat to register.
|
||||
*/
|
||||
public void register(@NotNull final AnticheatWrapper anticheat) {
|
||||
public void register(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final AnticheatWrapper anticheat) {
|
||||
if (anticheat instanceof Listener) {
|
||||
plugin.getEventManager().registerListener((Listener) anticheat);
|
||||
}
|
||||
@@ -49,8 +49,6 @@ public class AnticheatManager {
|
||||
* @param player The player to remove the exemption.
|
||||
*/
|
||||
public void unexemptPlayer(@NotNull final Player player) {
|
||||
plugin.getScheduler().runLater(() -> {
|
||||
anticheats.forEach(anticheat -> anticheat.unexempt(player));
|
||||
}, 1);
|
||||
anticheats.forEach(anticheat -> anticheat.unexempt(player));
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.willfp.eco.util.integrations.anticheat;
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.util.integrations.Integration;
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for anticheat integrations.
|
||||
*/
|
||||
public interface AnticheatWrapper extends Integration {
|
||||
/**
|
||||
* Exempt a player from checks.
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.willfp.eco.util.integrations.antigrief;
|
||||
package com.willfp.eco.core.integrations.antigrief;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Location;
|
||||
@@ -10,6 +10,9 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle antigrief integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class AntigriefManager {
|
||||
/**
|
||||
@@ -26,6 +29,16 @@ public class AntigriefManager {
|
||||
registered.add(antigrief);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister an AntiGrief/Land Management integration.
|
||||
*
|
||||
* @param antigrief The integration to unregister.
|
||||
*/
|
||||
public void unregister(@NotNull final AntigriefWrapper antigrief) {
|
||||
registered.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
|
||||
registered.remove(antigrief);
|
||||
}
|
||||
|
||||
/**
|
||||
* Can player break block.
|
||||
*
|
||||
@@ -1,18 +1,21 @@
|
||||
package com.willfp.eco.util.integrations.antigrief;
|
||||
package com.willfp.eco.core.integrations.antigrief;
|
||||
|
||||
import com.willfp.eco.util.integrations.Integration;
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* Wrapper class for antigrief integrations.
|
||||
*/
|
||||
public interface AntigriefWrapper extends Integration {
|
||||
/**
|
||||
* Can player break block.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param block The block.
|
||||
* @return If player cna break block.
|
||||
* @return If player can break block.
|
||||
*/
|
||||
boolean canBreakBlock(Player player, Block block);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.willfp.eco.core.integrations.customitems;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle custom item integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class CustomItemsManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private final Set<CustomItemsWrapper> registered = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public void register(@NotNull final CustomItemsWrapper integration) {
|
||||
registered.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register all the custom items for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
public void registerAllItems() {
|
||||
for (CustomItemsWrapper customItemsWrapper : registered) {
|
||||
customItemsWrapper.registerAllItems();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.willfp.eco.core.integrations.customitems;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*/
|
||||
public interface CustomItemsWrapper extends Integration {
|
||||
/**
|
||||
* Register all the custom items for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
void registerAllItems();
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle economy.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class EconomyManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private final Set<EconomyWrapper> registered = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public void register(@NotNull final EconomyWrapper integration) {
|
||||
registered.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if any economy registrations are registered.
|
||||
*
|
||||
* @return If any economy.
|
||||
*/
|
||||
public boolean hasRegistrations() {
|
||||
return !registered.isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount.
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
public boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : registered) {
|
||||
return wrapper.hasAmount(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : registered) {
|
||||
return wrapper.giveMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : registered) {
|
||||
return wrapper.removeMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
public double getBalance(@NotNull final OfflinePlayer player) {
|
||||
for (EconomyWrapper wrapper : registered) {
|
||||
return wrapper.getBalance(player);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
*/
|
||||
public interface EconomyWrapper extends Integration {
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount.
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
boolean hasAmount(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean giveMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean removeMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
double getBalance(@NotNull OfflinePlayer player);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Dummy hologram, created if no integrations are present on the server.
|
||||
*/
|
||||
class DummyHologram implements Hologram {
|
||||
@Override
|
||||
public void remove() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContents(@NotNull final List<String> contents) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper class for plugin-specific holograms.
|
||||
*/
|
||||
public interface Hologram {
|
||||
/**
|
||||
* Remove the hologram.
|
||||
*/
|
||||
void remove();
|
||||
|
||||
/**
|
||||
* Set the hologram contents.
|
||||
*
|
||||
* @param contents The contents.
|
||||
*/
|
||||
void setContents(@NotNull List<String> contents);
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Location;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle hologram integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class HologramManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private final Set<HologramWrapper> registered = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public void register(@NotNull final HologramWrapper integration) {
|
||||
registered.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create hologram.
|
||||
*
|
||||
* @param location The location.
|
||||
* @param contents The contents for the hologram.
|
||||
* @return The hologram.
|
||||
*/
|
||||
public Hologram createHologram(@NotNull final Location location,
|
||||
@NotNull final List<String> contents) {
|
||||
for (HologramWrapper wrapper : registered) {
|
||||
return wrapper.createHologram(location, contents);
|
||||
}
|
||||
|
||||
return new DummyHologram();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper class for hologram integrations.
|
||||
*/
|
||||
public interface HologramWrapper extends Integration {
|
||||
/**
|
||||
* Create hologram.
|
||||
*
|
||||
* @param location The location.
|
||||
* @param contents The contents for the hologram.
|
||||
* @return The hologram.
|
||||
*/
|
||||
Hologram createHologram(@NotNull Location location,
|
||||
@NotNull List<String> contents);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.willfp.eco.core.integrations.mcmmo;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.Event;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle mcmmo integrations.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class McmmoManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private final Set<McmmoWrapper> registered = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public void register(@NotNull final McmmoWrapper integration) {
|
||||
registered.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bonus drop count from block.
|
||||
*
|
||||
* @param block The block.
|
||||
* @return The bonus drop count.
|
||||
*/
|
||||
public int getBonusDropCount(@NotNull final Block block) {
|
||||
for (McmmoWrapper mcmmoWrapper : registered) {
|
||||
return mcmmoWrapper.getBonusDropCount(block);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if event is fake.
|
||||
*
|
||||
* @param event The event to check.
|
||||
* @return If the event is fake.
|
||||
*/
|
||||
public boolean isFake(@NotNull final Event event) {
|
||||
for (McmmoWrapper mcmmoWrapper : registered) {
|
||||
return mcmmoWrapper.isFake(event);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.willfp.eco.core.integrations.mcmmo;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.Event;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for mcmmo integrations.
|
||||
*/
|
||||
public interface McmmoWrapper extends Integration {
|
||||
/**
|
||||
* Get bonus drop count of block.
|
||||
*
|
||||
* @param block The block.
|
||||
* @return The drop multiplier.
|
||||
*/
|
||||
int getBonusDropCount(@NotNull Block block);
|
||||
|
||||
/**
|
||||
* Get if event is fake.
|
||||
*
|
||||
* @param event The event.
|
||||
* @return If is fake.
|
||||
*/
|
||||
boolean isFake(@NotNull Event event);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user