9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-21 16:09:20 +00:00

Compare commits

...

220 Commits

Author SHA1 Message Date
Auxilor
2525da99b5 Updated libreforge 2022-01-12 12:53:19 +00:00
Auxilor
e9c8ad71a4 Updated libreforge 2022-01-11 09:54:02 +00:00
Auxilor
efdc06bde5 Updated libreforge 2022-01-10 21:10:58 +00:00
Auxilor
078b49d46d Updated libreforge 2022-01-10 12:45:09 +00:00
Auxilor
3c4163c96c Updated libreforge 2022-01-10 10:53:11 +00:00
Auxilor
6fd0084f7c Updated libreforge 2022-01-09 18:36:15 +00:00
Auxilor
8d957e6812 Updated libreforge 2022-01-09 13:02:03 +00:00
Auxilor
0297c31a28 Updated to 4.22.0 2022-01-08 19:04:27 +00:00
Auxilor
8954558592 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	gradle.properties
2022-01-08 19:04:13 +00:00
Auxilor
16008ffae5 Updated libreforge 2022-01-08 12:11:42 +00:00
Auxilor
e82b155e58 Updated to 4.21.3 2022-01-08 11:25:57 +00:00
Auxilor
ba9b45ec97 Fixed target.yml readding targets 2022-01-08 11:25:35 +00:00
Auxilor
646b6579f6 Updated to 4.21.2 2022-01-07 14:06:23 +00:00
Auxilor
be2393794e Updated more string getters 2022-01-07 14:06:15 +00:00
Auxilor
faf7df1ba8 Updated eco and libreforge 2022-01-07 14:03:26 +00:00
Auxilor
b779057db8 Updated more config getters 2022-01-06 18:39:39 +00:00
Auxilor
7452ee41ad Updated to 4.21.1 2022-01-06 18:37:30 +00:00
Auxilor
f2bba66d6f Updated config string getters 2022-01-06 18:37:18 +00:00
Auxilor
58247f3182 Updated libreforge 2022-01-06 18:25:42 +00:00
Auxilor
e45bee3c09 Updated to 4.20.0 2022-01-06 10:27:03 +00:00
Auxilor
ea18996434 Updated libreforge 2022-01-04 21:16:56 +00:00
Auxilor
f77d721cf1 Fixed build.gradle 2022-01-04 12:17:18 +00:00
Auxilor
5999f6f32d Fixed build.gradle 2022-01-03 19:12:00 +00:00
Auxilor
dd373c08d1 Fixed script 2022-01-03 19:11:23 +00:00
Auxilor
c012a69405 Added missing config and lang options 2022-01-03 19:10:53 +00:00
Auxilor
1cedf79fc5 Updated libreforge 2022-01-03 19:08:19 +00:00
Auxilor
8dbe8236ae Updated libreforge 2022-01-03 13:36:52 +00:00
Auxilor
56aaec3819 Updated to 4.16.1 2022-01-02 16:14:42 +00:00
Auxilor
ff1094a801 Updated libreforge 2022-01-01 14:30:40 +00:00
Auxilor
f5c27b9a3d Updated libreforge 2021-12-29 18:43:26 +00:00
Auxilor
6181b89f0e Updated libreforge 2021-12-28 18:15:42 +00:00
Auxilor
3438687f84 Updated libreforge 2021-12-27 23:31:15 +00:00
Auxilor
6c94f4acf8 Updated to 4.13.1 2021-12-27 19:01:52 +00:00
Auxilor
14991dbe3b Updated libreforge to 2.4.1 2021-12-27 19:01:44 +00:00
Auxilor
bbd9c83244 Updated to 4.13.0 2021-12-26 13:15:50 +00:00
Auxilor
63f1b85055 Updated libreforge to 2.4.0 2021-12-26 13:15:37 +00:00
Auxilor
26f9d44cfc Updated to 4.12.1 2021-12-23 19:15:30 +00:00
Auxilor
28709967a8 Updated libreforge to 2.3.1 2021-12-23 19:15:23 +00:00
Auxilor
df0d1b9cd1 Updated to 4.12.0 2021-12-21 17:18:05 +00:00
Auxilor
83d7ec883a Updated libreforge to 2.3.0 2021-12-21 17:17:54 +00:00
Auxilor
59a852b241 Updated to 4.11.4 2021-12-20 12:15:25 +00:00
Auxilor
6b2235f744 Updated libreforge to 2.2.3 2021-12-20 12:15:15 +00:00
Auxilor
01a2df2db8 Updated to 4.11.3 2021-12-18 12:15:15 +00:00
Auxilor
cc3005105c Updated eco to 6.17.1 2021-12-18 12:15:07 +00:00
Auxilor
7ac31edc75 Updated libreforge to 2.2.2 2021-12-18 12:14:57 +00:00
Auxilor
f7c99bfe7f Updated to 4.11.2 2021-12-14 10:42:24 +00:00
Auxilor
a87fe47fea Migrated to eco 6.17.0 2021-12-14 10:42:12 +00:00
Auxilor
94b2c4c13b Updated minimum eco version 2021-12-14 10:39:18 +00:00
Auxilor
ed63ff2050 Updated to eco 6.17.0 2021-12-14 10:39:04 +00:00
Auxilor
30f5f801c9 Updated to 4.11.1 2021-12-13 22:08:39 +00:00
Auxilor
a31dd52c68 Updated libreforge to 2.2.1 2021-12-13 22:08:31 +00:00
Auxilor
4d5da2a427 Updated to 4.11.0 2021-12-09 15:54:39 +00:00
Auxilor
e772180c95 Updated libreforge to 2.2.0 2021-12-09 15:54:29 +00:00
Auxilor
99ca372c45 Updated to 4.10.3 2021-12-08 12:01:37 +00:00
Auxilor
92b0f25c64 Updated libreforge to 2.1.3 2021-12-08 12:01:30 +00:00
Auxilor
117ceac0e8 Updated to 4.10.2 2021-12-06 10:42:55 +00:00
Auxilor
5da4cdb492 Updated libreforge to 2.1.2 2021-12-06 10:42:44 +00:00
Auxilor
f0a3f67439 Updated to 4.10.1 2021-12-05 20:35:33 +00:00
Auxilor
6d8be022e2 Updated libreforge to 2.1.1 2021-12-05 20:35:18 +00:00
Auxilor
d7ce5d230c Updated libreforge to 2.1.0 2021-12-05 13:33:52 +00:00
Auxilor
38374d1e08 Updated to 4.10.0 2021-12-05 13:33:29 +00:00
Auxilor
37c84b15af Fixed yml parsing 2021-12-04 16:03:49 +00:00
Auxilor
86a479b20c Fixed yml parsing issue 2021-12-04 16:01:14 +00:00
Auxilor
9f39f10629 Updated to 4.9.0 2021-12-04 16:00:13 +00:00
Auxilor
92f964c5af Switched from json to yml 2021-12-04 15:59:13 +00:00
Auxilor
5b2d0c9b52 Updated eco version 2021-12-04 15:58:21 +00:00
Auxilor
0f5505c740 Updated to 4.8.0 2021-12-03 13:52:21 +00:00
Auxilor
b64817cd2a libreforge 2.0.2 changes 2021-12-03 13:52:11 +00:00
Auxilor
a55f890d7e Updated to libreforge 2.0.2 2021-12-03 13:50:00 +00:00
Auxilor
99ed5a2d08 Updated to 4.7.0 2021-12-03 10:41:27 +00:00
Auxilor
caa10ddbef Updated to libreforge 1.6.0 2021-12-03 10:41:08 +00:00
Auxilor
f408181240 Updated gradle to 7.3 2021-12-03 09:07:17 +00:00
Auxilor
54782c367f Updated to 4.6.1 2021-12-03 09:06:56 +00:00
Auxilor
ea0fc6cd1b Fixed caching errors and slow update times 2021-12-03 09:06:47 +00:00
Auxilor
778aa6b0c3 Updated to 4.6.0 2021-12-02 11:20:36 +00:00
Auxilor
8cd4f7f124 Updated libreforge to 1.5.0 2021-12-02 11:20:25 +00:00
Auxilor
233fe17ace Updated to 4.5.1 2021-11-30 19:13:27 +00:00
Auxilor
b866a11f54 Updated to Java 17 2021-11-30 19:13:19 +00:00
Auxilor
80842cabfe kotlincompile warnings 2021-11-30 10:40:16 +00:00
Auxilor
1892871d2a Updated kotlin 2021-11-30 10:37:18 +00:00
Auxilor
c349a81009 Updated to 4.5.0 2021-11-30 10:28:48 +00:00
Auxilor
3f4be5fdbd Updated to 1.4.0 2021-11-30 10:28:37 +00:00
Auxilor
e8f65179a9 Updated to 4.4.1 2021-11-29 11:12:15 +00:00
Auxilor
05406f6405 Updated libreforge to 1.3.1 2021-11-29 11:12:07 +00:00
Auxilor
6915cf78a7 Updated to 4.4.0 2021-11-27 15:02:16 +00:00
Auxilor
5a72806a6e Updated libreforge to 1.3.0 2021-11-27 15:01:58 +00:00
Auxilor
4b61b7a787 Updated to 4.3.1 2021-11-26 21:33:01 +00:00
Auxilor
31b1598467 Updated libreforge to 1.2.1 2021-11-26 21:32:52 +00:00
Auxilor
f240c94e6e Updated to 4.3.0 2021-11-26 09:15:22 +00:00
Auxilor
d50c643e68 Updated libreforge 2021-11-26 09:10:14 +00:00
Auxilor
7651501da7 Changed reloading 2021-11-25 14:45:55 +00:00
Auxilor
1fbe31c1df Updated to 4.2.0 2021-11-25 14:45:22 +00:00
Auxilor
e52cf5746d Updated libreforge to 1.1.0 2021-11-25 14:45:12 +00:00
Auxilor
0d281e1792 Updated to 4.1.4 2021-11-23 09:55:39 +00:00
Auxilor
4c9a003a28 Fixed default config 2021-11-23 09:55:30 +00:00
Auxilor
e4d5081ad9 Updated to 4.1.3 2021-11-23 08:31:45 +00:00
Auxilor
bfcadf710f Updated libreforge to 1.0.4 2021-11-23 08:31:36 +00:00
Auxilor
02958d879f Updated to 4.1.2 2021-11-22 10:52:47 +00:00
Auxilor
565040e7bb Fixed double compileOnly 2021-11-22 10:52:01 +00:00
Auxilor
733b065a45 Updated libreforge and removed /lib/ 2021-11-22 10:51:41 +00:00
Auxilor
9b90778233 Updated to 4.1.1 2021-11-21 17:20:46 +00:00
Auxilor
749d39290f Fixed bugs with potions 2021-11-21 17:20:37 +00:00
Auxilor
e92bdf8a81 Updated to 4.1.0 2021-11-21 12:56:33 +00:00
Auxilor
6f7f5f7fe6 Updated libreforge to 1.0.0 2021-11-21 12:56:25 +00:00
Auxilor
f80e1e5179 Updated to 4.0.0 2021-11-20 11:42:47 +00:00
Auxilor
ef581602c5 Fixed stone bugs 2021-11-20 11:38:49 +00:00
Auxilor
6f9d66d4cc Fixed config 2021-11-20 11:37:04 +00:00
Auxilor
998cbd7c19 Added cooldown support 2021-11-20 11:35:32 +00:00
Auxilor
53a8587de0 Added cooldown support 2021-11-20 11:35:07 +00:00
Auxilor
376a9ee7ae Updated to libreforge 0.3.0 2021-11-20 11:32:08 +00:00
Auxilor
f315251c5c Updated to libreforge 0.2.1 2021-11-19 18:08:39 +00:00
Auxilor
91c22640fe Updated to 4.0.0b1 2021-11-18 15:08:56 +00:00
Auxilor
3436c11972 Allowed specifying custom item for reforge stones altogether 2021-11-18 15:08:38 +00:00
Auxilor
cf58c5de49 Updated libreforge 2021-11-18 13:31:39 +00:00
Auxilor
372a842441 libreforge changes 2021-11-18 13:24:07 +00:00
Auxilor
cdd3fac432 Updated to 4.0.0 2021-11-18 13:22:08 +00:00
Auxilor
79c821af4e Rebuilt around libreforge 2021-11-18 13:21:57 +00:00
Auxilor
1929e2f94b Updated to 3.9.2 2021-11-16 19:10:11 +00:00
Auxilor
beb76ca9c1 Fixed any slot reforges not working (fixes talismans) 2021-11-16 19:10:02 +00:00
Auxilor
751191353e Updated to 3.9.1 2021-11-14 13:19:21 +00:00
Auxilor
bc5ce5cebb Fixed display 2021-11-14 13:18:26 +00:00
Auxilor
51a306e8c7 Updated to 3.9.0 2021-11-14 11:17:17 +00:00
Auxilor
19cacea870 Reforge stone names and lores are now done per-stone 2021-11-14 11:17:07 +00:00
Auxilor
b1f03fe214 Updated to 3.8.5 2021-11-10 17:55:05 +00:00
Auxilor
9fd7f2db90 Merge remote-tracking branch 'origin/master' 2021-11-10 17:54:41 +00:00
Auxilor
e350a3d49c Updated to 3.8.4 2021-11-10 17:54:37 +00:00
Auxilor
c9505899fb Fixed Slot.ANY bug 2021-11-10 17:54:21 +00:00
Auxilor
4279ca130f Updated to 3.8.4 2021-11-10 14:49:58 +00:00
Auxilor
e131099f12 Fixed reforging an item giving you the same reforge you started with 2021-11-10 14:49:48 +00:00
Auxilor
8fb79afe88 Updated to 3.8.3 2021-11-09 13:40:21 +00:00
Auxilor
4304878e5e Merge remote-tracking branch 'origin/master' 2021-11-09 13:39:26 +00:00
Auxilor
c4c8e5c94b Updated to 3.8.2 2021-11-09 13:39:02 +00:00
Auxilor
df72cd0e57 Added %time% placeholder to reload message 2021-11-09 13:38:53 +00:00
Auxilor
52b24baeef Updated to 3.8.2 2021-11-07 21:28:47 +00:00
Auxilor
6e27cd76e3 6.12.2 Migration 2021-11-07 21:28:37 +00:00
Auxilor
7bd0603eb6 Fixed lombok bug 2021-11-07 21:27:05 +00:00
Auxilor
4b3ef04763 More codestyle 2021-11-07 21:23:38 +00:00
Auxilor
0495e1bfeb Codestyle 2021-11-07 21:23:08 +00:00
Auxilor
57519b6d9e Updated to 3.8.1 2021-11-02 17:14:06 +00:00
Auxilor
ec8af43519 Fixed player heads showing as reforgable 2021-11-02 17:13:55 +00:00
Auxilor
24a7b21ee7 Updated to 3.8.0 2021-11-02 09:44:58 +00:00
Auxilor
80d2130fd0 Fixed RewardBlockBreak and RewardKill 2021-11-02 09:44:27 +00:00
Auxilor
bbbef0fb0c Updated to 3.7.3 and eco 6.12.2 2021-11-02 09:43:21 +00:00
Auxilor
ec847af2b7 Updated to 3.7.2 2021-11-01 10:06:09 +00:00
Will FP
dac78bf216 Merge pull request #7
Fixed UltimateSkills integration
2021-11-01 10:05:57 +00:00
_OfTeN_
f596b8aeba Fixed UltimateSkills integration 2021-10-31 22:37:58 +03:00
Auxilor
3af323588e Updated to 3.7.1 2021-10-31 13:00:42 +00:00
Auxilor
d9eacb7388 Fixed every item showing as reforgable 2021-10-31 13:00:35 +00:00
Auxilor
d45546bd1d Reworked getting a reforge for an item 2021-10-31 11:00:25 +00:00
Auxilor
5bf4dee034 Updated to 3.7.0 2021-10-31 10:55:23 +00:00
Auxilor
6c7059c49d Added EffectActivateEvent javadoc 2021-10-31 10:55:00 +00:00
Auxilor
fcbdd7d0c0 Merge remote-tracking branch 'origin/master' 2021-10-31 10:52:28 +00:00
Will FP
1633150c78 Merge pull request #6
Implemented EffectActivateEvent (enhancing external API usage a lot)
2021-10-31 10:52:23 +00:00
Auxilor
ca62afab10 Updated to 3.6.1 2021-10-31 10:51:48 +00:00
Auxilor
98d37d5262 Changed ReforgeTarget#getForItem 2021-10-31 10:51:34 +00:00
_OfTeN_
f603d76968 Fixed EffectActivateEvent 2021-10-29 12:57:58 +03:00
_OfTeN_
69cd2d161f Implemented EffectActivateEvent (enhancing external API usage a lot) 2021-10-29 12:03:10 +03:00
_OfTeN_
12bb19514e Merge remote-tracking branch 'origin/master' 2021-10-29 12:02:27 +03:00
_OfTeN_
14bf332145 Implemented EffectActivateEvent (enhancing external API usage a lot) 2021-10-29 12:02:18 +03:00
Auxilor
301e04e45b Updated to 3.6.0 2021-10-27 19:03:11 +01:00
Auxilor
42aa948d0b Minor internal changes 2021-10-27 19:02:53 +01:00
Will FP
dfdac65526 Merge pull request #5
UltimateSkills integration (2 effects) and PlayerPoints integration
2021-10-27 18:59:38 +01:00
_OfTeN_
99e34bc1ec Merge remote-tracking branch 'origin/master' 2021-10-27 19:27:09 +03:00
_OfTeN_
89dbbd8b64 Readded playerpoints config option 2021-10-27 19:27:00 +03:00
_OfTeN_
769b9612b2 Merge remote-tracking branch 'origin/master' 2021-10-27 19:25:17 +03:00
_OfTeN_
845c9d8013 Added UltimateSkills integration (2 effects) 2021-10-27 19:24:44 +03:00
0ft3n
bebbfcb0d8 Merge branch 'Auxilor:master' into master 2021-10-27 16:22:04 +03:00
_OfTeN_
cd08af8b3f Added PlayerPoints integration and "reforge.use-player-points: true/false" for people to use it 2021-10-27 15:35:05 +03:00
Auxilor
e4a6a9fe39 Updated to 3.5.6 2021-10-26 15:42:49 +01:00
Auxilor
60e93b2544 Merge remote-tracking branch 'origin/master' 2021-10-26 15:42:19 +01:00
Auxilor
8b331bd369 Updated to 3.5.5 2021-10-26 15:42:14 +01:00
Auxilor
174d2c89d5 Updated to 3.5.4 2021-10-26 15:41:58 +01:00
Auxilor
7a211da7fd Fixed insufficient exp withdrawing money while failing 2021-10-26 15:41:49 +01:00
Auxilor
e06885df90 Updated to 3.5.5 2021-10-25 10:54:49 +01:00
Auxilor
a212cebe0d Fixed kotlin update bug 2021-10-25 10:54:41 +01:00
Auxilor
8d8ad52563 Updated to 3.5.4 2021-10-25 10:35:09 +01:00
Auxilor
e529fd44fc Moved commands to kotlin 2021-10-25 10:34:57 +01:00
Auxilor
8c6240219d Updated to 3.5.3 2021-10-18 12:52:11 +01:00
Auxilor
f9931c37a2 Un-moved watcher to kt 2021-10-18 12:52:01 +01:00
Auxilor
a9be4aa66f Updated to 3.5.2 2021-10-17 11:39:35 +01:00
Auxilor
f0a6b85dd8 Internal changes 2021-10-17 11:39:21 +01:00
Auxilor
9796254f6a Rename .java to .kt 2021-10-17 11:39:21 +01:00
Auxilor
48b5a32615 Updated to 3.5.1 2021-10-15 09:42:01 +01:00
Auxilor
1f7866eba4 Fixed reward_kill after much pain 2021-10-15 09:41:32 +01:00
Auxilor
a2de449d39 Added extra safety checks 2021-10-14 13:01:36 +01:00
Auxilor
bfd29af3a8 Updated to 3.6.0 2021-10-14 12:38:53 +01:00
Auxilor
e721a0aa2c Fixed stone bug 2021-10-14 12:38:34 +01:00
Auxilor
d172160f97 Lots of under-the-hood work 2021-10-14 12:36:34 +01:00
Auxilor
7d6eba866f Recoded Reforge GUI 2021-10-14 10:52:07 +01:00
Auxilor
48a761df8c Updated to 3.4.0 2021-10-13 10:56:39 +01:00
Auxilor
8d8d6dd247 Added option to set stone cost 2021-10-13 10:56:31 +01:00
Auxilor
83762773e9 Fixed stone bug 2021-10-13 10:49:25 +01:00
Will FP
c5f47ac51d Update README.md 2021-10-12 20:12:25 +01:00
Auxilor
387eaff23d Updated to 3.3.2 2021-10-11 12:02:11 +01:00
Auxilor
3cefe5c095 Merge remote-tracking branch 'origin/master' 2021-10-11 12:02:02 +01:00
Auxilor
af6b981815 Updated to 3.3.1 2021-10-11 12:00:26 +01:00
Auxilor
9b77fa2d21 Fixed reforge name duplication 2021-10-11 12:00:15 +01:00
Auxilor
a40c0b86df Updated to 3.3.1 2021-10-08 19:15:48 +01:00
Auxilor
c9d26c47fa Fixed crafting not working 2021-10-08 19:15:31 +01:00
_OfTeN_
174bd85dc2 Added PlayerPoints integration and "reforge.use-player-points: true/false" for people to use it 2021-10-06 22:34:37 +03:00
Auxilor
86eb5ff216 Updated to 3.3.0 + Cleaned AureliumSkills integration 2021-10-06 15:32:53 +01:00
Will FP
d8d9aba84e Merge pull request #4
Added "add_aureliumskills_stat" effect for AureliumSkills integration
2021-10-06 15:29:52 +01:00
_OfTeN_
85adbf6838 Added "add_aureliumskills_stat" effect for AureliumSkills integration 2021-10-06 16:26:43 +03:00
Auxilor
6b2e7ea0e9 Fixed several bugs 2021-10-05 11:31:46 +01:00
Auxilor
c4cb75eb50 Fixed conditions 2021-10-05 10:56:51 +01:00
Auxilor
3990d918fd Updated to 3.2.0 2021-10-05 10:03:20 +01:00
Auxilor
19cf2e21f1 Added talismans integration 2021-10-05 10:03:11 +01:00
Auxilor
3c7581d859 Updated to 3.1.0 2021-10-05 09:39:33 +01:00
Auxilor
bee0e7e91c Added EcoSkills integration 2021-10-05 09:39:26 +01:00
Auxilor
b3815ade98 Fixed duplicate reforges not working 2021-10-04 15:55:42 +01:00
Auxilor
7ed6e59a44 Added support for multiple of same effect being activated at the same time 2021-10-04 11:08:55 +01:00
Auxilor
9c06f7013f Fixed Crit Multiplier activating when it shouldn't 2021-10-04 10:51:24 +01:00
Auxilor
d7244594a0 Updated ReforgesDisplay 2021-10-04 10:50:53 +01:00
Auxilor
d1ccd06d73 Added EconomyHandler#isEnabled checks 2021-10-04 10:50:18 +01:00
Auxilor
0af4113c38 Optimized conditions 2021-10-04 10:49:37 +01:00
Auxilor
3a40f203dc Added listener for slot change 2021-10-04 10:46:11 +01:00
Auxilor
ecf8374eec More recoding to move to player-based system 2021-10-04 10:41:22 +01:00
Auxilor
d244daca08 Fixed methods 2021-10-04 10:28:07 +01:00
Auxilor
dc5ca210eb Updated to 3.0.0 2021-10-04 10:23:12 +01:00
Auxilor
561e1ef428 Reworked most of the internals to stop using AttributeModifiers 2021-10-04 10:22:46 +01:00
74 changed files with 1487 additions and 3078 deletions

View File

@@ -1,6 +1,6 @@
<h1 align="center"> <h1 align="center">
<br> <br>
<img src="https://i.imgur.com/LoZExNf.png" alt="Reforges logo" width="256"> <img src="https://i.imgur.com/co0zeyJ.png" alt="Reforges logo" width="256">
<br> <br>
</h1> </h1>

View File

@@ -4,7 +4,7 @@ buildscript {
} }
dependencies { dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
} }
} }
@@ -27,19 +27,26 @@ allprojects {
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal()
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://repo.codemc.org/repository/nms/' } maven { url 'https://papermc.io/repo/repository/maven-public/' }
maven { url 'https://repo.rosewooddev.io/repository/public/' }
} }
jar { jar {
onlyIf { !sourceSets.main.allSource.files.isEmpty() } onlyIf { !sourceSets.main.allSource.files.isEmpty() }
} }
dependencies { shadowJar {
compileOnly 'com.willfp:eco:6.9.0' relocate('com.willfp.libreforge', 'com.willfp.reforges.libreforge')
}
compileOnly 'org.jetbrains:annotations:19.0.0' dependencies {
compileOnly 'com.willfp:eco:6.18.1'
implementation 'com.willfp:libreforge:3.0.0'
compileOnly 'org.jetbrains:annotations:23.0.0'
compileOnly 'org.projectlombok:lombok:1.18.20' compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20'
@@ -47,8 +54,7 @@ allprojects {
testCompileOnly 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
compileOnly 'org.jetbrains:annotations:19.0.0' compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.0'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'
} }
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
@@ -57,11 +63,20 @@ allprojects {
} }
processResources { processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**"]) { filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**reforges.yml", "**lang.yml"]) {
expand projectVersion: project.version expand projectVersion: project.version
} }
} }
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = "17"
}
}
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
compileJava.options.encoding = 'UTF-8' compileJava.options.encoding = 'UTF-8'
compileJava.dependsOn clean compileJava.dependsOn clean
@@ -87,8 +102,5 @@ jar {
group = 'com.willfp' group = 'com.willfp'
archivesBaseName = project.name archivesBaseName = project.name
version = findProperty("version") version = findProperty("version")
java.sourceCompatibility = JavaVersion.VERSION_16
compileJava.options.encoding = 'UTF-8'
build.dependsOn shadowJar build.dependsOn shadowJar

View File

@@ -2,8 +2,12 @@ group 'com.willfp'
version rootProject.version version rootProject.version
dependencies { dependencies {
compileOnly fileTree(dir: '../../lib', include: ['*.jar'])
compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT' compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.github.MilkBowl:VaultAPI:1.7' compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
compileOnly 'com.willfp:EcoSkills:1.4.0'
compileOnly 'com.willfp:Talismans:4.6.0'
compileOnly 'com.github.Archy-X:AureliumSkills:Beta1.2.4'
} }
build.dependsOn publishToMavenLocal build.dependsOn publishToMavenLocal

View File

@@ -1,32 +1,31 @@
package com.willfp.reforges; package com.willfp.reforges;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.impl.PluginCommand; import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.display.DisplayModule; import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.integrations.IntegrationLoader;
import com.willfp.eco.core.items.Items; import com.willfp.eco.core.items.Items;
import com.willfp.libreforge.LibReforgePlugin;
import com.willfp.reforges.commands.CommandReforge; import com.willfp.reforges.commands.CommandReforge;
import com.willfp.reforges.commands.CommandReforges; import com.willfp.reforges.commands.CommandReforges;
import com.willfp.reforges.conditions.Conditions; import com.willfp.reforges.config.ReforgesYml;
import com.willfp.reforges.config.ReforgesJson;
import com.willfp.reforges.config.TargetYml; import com.willfp.reforges.config.TargetYml;
import com.willfp.reforges.display.ReforgesDisplay; import com.willfp.reforges.display.ReforgesDisplay;
import com.willfp.reforges.effects.Effect; import com.willfp.reforges.integrations.talismans.TalismansIntegration;
import com.willfp.reforges.effects.Effects;
import com.willfp.reforges.reforges.Reforges; import com.willfp.reforges.reforges.Reforges;
import com.willfp.reforges.reforges.util.ReforgeArgParser; import com.willfp.reforges.reforges.util.ReforgeArgParser;
import com.willfp.reforges.reforges.util.WatcherTriggers; import com.willfp.reforges.reforges.util.ReforgeEnableListeners;
import com.willfp.reforges.reforges.util.ReforgeLookup;
import com.willfp.reforges.util.AntiPlaceListener; import com.willfp.reforges.util.AntiPlaceListener;
import com.willfp.reforges.util.DiscoverRecipeListener; import com.willfp.reforges.util.DiscoverRecipeListener;
import com.willfp.reforges.vault.EconomyHandler;
import lombok.Getter; import lombok.Getter;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
public class ReforgesPlugin extends EcoPlugin { public class ReforgesPlugin extends LibReforgePlugin {
/** /**
* Instance of Reforges. * Instance of Reforges.
*/ */
@@ -39,51 +38,40 @@ public class ReforgesPlugin extends EcoPlugin {
private final TargetYml targetYml; private final TargetYml targetYml;
/** /**
* reforges.json. * reforges.yml.
*/ */
@Getter @Getter
private final ReforgesJson reforgesJson; private final ReforgesYml reforgesYml;
/** /**
* Internal constructor called by bukkit on plugin load. * Internal constructor called by bukkit on plugin load.
*/ */
public ReforgesPlugin() { public ReforgesPlugin() {
super(1330, 12412, "&3", true); super(1330, 12412, "&3", "");
this.targetYml = new TargetYml(this); this.targetYml = new TargetYml(this);
this.reforgesJson = new ReforgesJson(this); this.reforgesYml = new ReforgesYml(this);
instance = this; instance = this;
registerHolderProvider(ReforgeLookup::provideReforges);
} }
@Override @Override
protected void handleEnable() { public void handleEnableAdditional() {
Items.registerArgParser(new ReforgeArgParser()); Items.registerArgParser(new ReforgeArgParser());
} }
@Override @Override
protected void handleAfterLoad() { public void handleReloadAdditional() {
EconomyHandler.setEnabled(EconomyHandler.init());
if (!EconomyHandler.isEnabled()) {
this.getLogger().severe("Vault economy support not enabled");
}
}
@Override
protected void handleReload() {
for (Effect effect : Effects.values()) {
HandlerList.unregisterAll(effect);
this.getScheduler().run(() -> this.getEventManager().registerListener(effect));
}
this.getLogger().info(Reforges.values().size() + " Reforges Loaded"); this.getLogger().info(Reforges.values().size() + " Reforges Loaded");
this.getScheduler().runTimer((Runnable) Conditions.HAS_PERMISSION, 103, 100);
} }
@Override @Override
protected List<Listener> loadListeners() { protected List<Listener> loadListeners() {
return Arrays.asList( return Arrays.asList(
new DiscoverRecipeListener(this), new DiscoverRecipeListener(this),
new AntiPlaceListener(), new AntiPlaceListener(),
new WatcherTriggers(this) new ReforgeEnableListeners(this)
); );
} }
@@ -100,9 +88,17 @@ public class ReforgesPlugin extends EcoPlugin {
return new ReforgesDisplay(this); return new ReforgesDisplay(this);
} }
@NotNull
@Override
public List<IntegrationLoader> loadAdditionalIntegrations() {
return Arrays.asList(
new IntegrationLoader("Talismans", TalismansIntegration::registerProvider)
);
}
@Override @Override
public String getMinimumEcoVersion() { public String getMinimumEcoVersion() {
return "6.8.0"; return "6.19.0";
} }
/** /**

View File

@@ -1,151 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import com.willfp.eco.core.command.impl.Subcommand;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
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;
public class CommandGive extends Subcommand {
/**
* The cached names.
*/
private static final List<String> STONE_NAMES = new ArrayList<>();
/**
* The cached numbers.
*/
private static final List<String> NUMBERS = Arrays.asList(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
);
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandGive(@NotNull final EcoPlugin plugin) {
super(plugin, "give", "reforges.command.give", false);
}
/**
* Called on reload.
*/
@ConfigUpdater
public static void reload() {
STONE_NAMES.clear();
STONE_NAMES.addAll(Reforges.values().stream()
.filter(Reforge::getRequiresStone)
.map(Reforge::getId)
.collect(Collectors.toList()));
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
if (args.isEmpty()) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player"));
return;
}
if (args.size() == 1) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-stone"));
return;
}
int amount = 1;
if (args.size() > 2) {
try {
amount = Integer.parseInt(args.get(2));
} catch (NumberFormatException ignored) {
// do nothing
}
}
String recieverName = args.get(0);
Player reciever = Bukkit.getPlayer(recieverName);
if (reciever == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player"));
return;
}
String key = args.get(1);
Reforge reforge = Reforges.getByKey(key);
if (reforge == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-stone"));
return;
}
String message = this.getPlugin().getLangYml().getMessage("give-success");
message = message.replace("%reforge%", reforge.getName()).replace("%recipient%", reciever.getName());
sender.sendMessage(message);
ItemStack itemStack = reforge.getStone();
itemStack.setAmount(amount);
reciever.getInventory().addItem(itemStack);
};
}
@Override
public TabCompleteHandler getTabCompleter() {
return (sender, args) -> {
List<String> completions = new ArrayList<>();
if (args.isEmpty()) {
// Currently, this case is not ever reached
return STONE_NAMES;
}
if (args.size() == 1) {
StringUtil.copyPartialMatches(args.get(0), Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()), completions);
return completions;
}
if (args.size() == 2) {
StringUtil.copyPartialMatches(args.get(1), STONE_NAMES, completions);
Collections.sort(completions);
return completions;
}
if (args.size() == 3) {
StringUtil.copyPartialMatches(args.get(2), NUMBERS, completions);
completions.sort((s1, s2) -> {
int t1 = Integer.parseInt(s1);
int t2 = Integer.parseInt(s2);
return t1 - t2;
});
return completions;
}
return new ArrayList<>(0);
};
}
}

View File

@@ -1,67 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.reforges.gui.ReforgeGUI;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CommandOpen extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandOpen(@NotNull final EcoPlugin plugin) {
super(plugin, "open", "reforges.command.open", false);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
if (args.isEmpty()) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player"));
return;
}
Player player = Bukkit.getPlayer(args.get(0));
if (player == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player"));
return;
}
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.open-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.open-sound.pitch")
);
ReforgeGUI.getMenu().open(player);
};
}
@Override
public TabCompleteHandler getTabCompleter() {
return (sender, args) -> {
List<String> completions = new ArrayList<>();
if (args.size() == 1) {
StringUtil.copyPartialMatches(args.get(0), Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()), completions);
return completions;
}
return new ArrayList<>(0);
};
}
}

View File

@@ -1,36 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.reforges.gui.ReforgeGUI;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class CommandReforge extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReforge(@NotNull final EcoPlugin plugin) {
super(plugin, "reforge", "reforges.command.reforge", true);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
Player player = (Player) sender;
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.open-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.open-sound.pitch")
);
ReforgeGUI.getMenu().open(player);
};
}
}

View File

@@ -1,29 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import org.jetbrains.annotations.NotNull;
public class CommandReforges extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReforges(@NotNull final EcoPlugin plugin) {
super(plugin, "reforges", "reforges.command.reforges", false);
this.addSubcommand(new CommandReload(plugin))
.addSubcommand(new CommandGive(plugin))
.addSubcommand(new CommandOpen(plugin));
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-command"));
};
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.Subcommand;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommandReload extends Subcommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReload(@NotNull final EcoPlugin plugin) {
super(plugin, "reload", "reforges.command.reload", false);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
this.getPlugin().reload();
sender.sendMessage(this.getPlugin().getLangYml().getMessage("reloaded"));
};
}
}

View File

@@ -1,62 +0,0 @@
package com.willfp.reforges.conditions;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.ReforgesPlugin;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public abstract class Condition implements Listener {
/**
* Instance of Reforges.
*/
@Getter(AccessLevel.PROTECTED)
private final ReforgesPlugin plugin = ReforgesPlugin.getInstance();
/**
* The name of the condition.
*/
@Getter
private final String id;
/**
* Create a new condition.
*
* @param id The condition id.
*/
protected Condition(@NotNull final String id) {
this.id = id;
Conditions.addNewCondition(this);
}
/**
* Get if condition is met for a player.
*
* @param player The player.
* @param config The config of the condition.
* @return If met.
*/
public abstract boolean isConditionMet(@NotNull Player player,
@NotNull JSONConfig config);
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Condition condition)) {
return false;
}
return getId().equals(condition.getId());
}
@Override
public int hashCode() {
return Objects.hash(this.getId());
}
}

View File

@@ -1,76 +0,0 @@
package com.willfp.reforges.conditions;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableList;
import com.willfp.reforges.conditions.conditions.ConditionAboveHealthPercent;
import com.willfp.reforges.conditions.conditions.ConditionAboveHungerPercent;
import com.willfp.reforges.conditions.conditions.ConditionAboveXPLevel;
import com.willfp.reforges.conditions.conditions.ConditionAboveY;
import com.willfp.reforges.conditions.conditions.ConditionBelowHealthPercent;
import com.willfp.reforges.conditions.conditions.ConditionBelowHungerPercent;
import com.willfp.reforges.conditions.conditions.ConditionBelowXPLevel;
import com.willfp.reforges.conditions.conditions.ConditionBelowY;
import com.willfp.reforges.conditions.conditions.ConditionHasPermission;
import com.willfp.reforges.conditions.conditions.ConditionInAir;
import com.willfp.reforges.conditions.conditions.ConditionInBiome;
import com.willfp.reforges.conditions.conditions.ConditionInWater;
import com.willfp.reforges.conditions.conditions.ConditionInWorld;
import com.willfp.reforges.conditions.conditions.ConditionIsSneaking;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@UtilityClass
@SuppressWarnings("unused")
public class Conditions {
/**
* All registered conditions.
*/
private static final BiMap<String, Condition> BY_ID = HashBiMap.create();
public static final Condition BELOW_Y = new ConditionBelowY();
public static final Condition ABOVE_Y = new ConditionAboveY();
public static final Condition ABOVE_HEALTH_PERCENT = new ConditionAboveHealthPercent();
public static final Condition BELOW_HEALTH_PERCENT = new ConditionBelowHealthPercent();
public static final Condition IN_WATER = new ConditionInWater();
public static final Condition IN_WORLD = new ConditionInWorld();
public static final Condition ABOVE_XP_LEVEL = new ConditionAboveXPLevel();
public static final Condition BELOW_XP_LEVEL = new ConditionBelowXPLevel();
public static final Condition ABOVE_HUNGER_PERCENT = new ConditionAboveHungerPercent();
public static final Condition BELOW_HUNGER_PERCENT = new ConditionBelowHungerPercent();
public static final Condition IN_BIOME = new ConditionInBiome();
public static final Condition HAS_PERMISSION = new ConditionHasPermission();
public static final Condition IS_SNEAKING = new ConditionIsSneaking();
public static final Condition IN_AIR = new ConditionInAir();
/**
* Get condition matching name.s
*
* @param name The name to query.
* @return The matching condition, or null if not found.
*/
public static Condition getByID(@NotNull final String name) {
return BY_ID.get(name);
}
/**
* List of all registered conditions.
*
* @return The conditions.
*/
public static List<Condition> values() {
return ImmutableList.copyOf(BY_ID.values());
}
/**
* Add new condition to EcoArmor.
*
* @param condition The condition to add.
*/
public static void addNewCondition(@NotNull final Condition condition) {
BY_ID.remove(condition.getId());
BY_ID.put(condition.getId(), condition);
}
}

View File

@@ -1,16 +0,0 @@
package com.willfp.reforges.config;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.json.JSONBaseConfig;
import org.jetbrains.annotations.NotNull;
public class ReforgesJson extends JSONBaseConfig {
/**
* Instantiate reforges.json.
*
* @param plugin Instance of reforges.
*/
public ReforgesJson(@NotNull final EcoPlugin plugin) {
super("reforges", true, plugin);
}
}

View File

@@ -0,0 +1,17 @@
package com.willfp.reforges.config;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.BaseConfig;
import com.willfp.eco.core.config.ConfigType;
import org.jetbrains.annotations.NotNull;
public class ReforgesYml extends BaseConfig {
/**
* Instantiate reforges.yml.
*
* @param plugin Instance of reforges.
*/
public ReforgesYml(@NotNull final EcoPlugin plugin) {
super("reforges", plugin, true, ConfigType.YAML);
}
}

View File

@@ -1,23 +1,25 @@
package com.willfp.reforges.config; package com.willfp.reforges.config;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.yaml.YamlBaseConfig; import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.StaticBaseConfig;
import com.willfp.eco.core.items.Items; import com.willfp.eco.core.items.Items;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
public class TargetYml extends YamlBaseConfig { public class TargetYml extends StaticBaseConfig {
/** /**
* Instantiate target.yml. * Instantiate target.yml.
* *
* @param plugin Instance of EcoEnchants. * @param plugin Instance of EcoEnchants.
*/ */
public TargetYml(@NotNull final EcoPlugin plugin) { public TargetYml(@NotNull final EcoPlugin plugin) {
super("target", false, plugin); super("target", plugin, ConfigType.YAML);
} }
/** /**
@@ -37,7 +39,17 @@ public class TargetYml extends YamlBaseConfig {
*/ */
public Set<TestableItem> getTargetItems(@NotNull final String target) { public Set<TestableItem> getTargetItems(@NotNull final String target) {
Set<TestableItem> items = new HashSet<>(); Set<TestableItem> items = new HashSet<>();
this.getStrings(target, false).forEach(s -> items.add(Items.lookup(s.toUpperCase()))); this.getStrings(target + ".items").forEach(s -> items.add(Items.lookup(s.toUpperCase())));
return items; return items;
} }
/**
* Get all materials from a target name.
*
* @param target The name of the target.
* @return All materials.
*/
public ReforgeTarget.Slot getSlot(@NotNull final String target) {
return ReforgeTarget.Slot.valueOf(this.getString(target + ".slot").toUpperCase());
}
} }

View File

@@ -1,94 +0,0 @@
package com.willfp.reforges.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.Watcher;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.event.Listener;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Objects;
import java.util.UUID;
public abstract class Effect implements Listener, Watcher {
/**
* Instance of reforges.
*/
@Getter(AccessLevel.PROTECTED)
private final ReforgesPlugin plugin = ReforgesPlugin.getInstance();
/**
* The effect ID.
*/
private final String id;
/**
* Create a new effect.
*
* @param id The id.
*/
protected Effect(@NotNull final String id) {
this.id = id;
Effects.addNewEffect(this);
}
/**
* Get the effect ID.
*
* @return The ID.
*/
public String getId() {
return id;
}
/**
* Generate a UUID with a specified index.
*
* @param index The index.
* @param extra The extra
* @return The UUID.
*/
protected UUID getUUID(final int index,
@NotNull final Object... extra) {
return UUID.nameUUIDFromBytes((this.id + index + Arrays.hashCode(extra)).getBytes());
}
/**
* Handle application of a reforge containing this effect.
*
* @param meta The ItemMeta.
* @param config The config.
*/
public void handleEnabling(@NotNull final ItemMeta meta,
@NotNull final JSONConfig config) {
// Override when needed
}
/**
* Handle removal of a reforge containing this effect.
*
* @param meta The ItemMeta.
*/
public void handleDisabling(@NotNull final ItemMeta meta) {
// Override when needed
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Effect effect)) {
return false;
}
return this.getId().equals(effect.getId());
}
@Override
public int hashCode() {
return Objects.hash(this.getId());
}
}

View File

@@ -1,68 +0,0 @@
package com.willfp.reforges.effects;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableList;
import com.willfp.reforges.effects.effects.EffectAttackSpeedMultiplier;
import com.willfp.reforges.effects.effects.EffectCritMultiplier;
import com.willfp.reforges.effects.effects.EffectDamageMultiplier;
import com.willfp.reforges.effects.effects.EffectDurabilityMultiplier;
import com.willfp.reforges.effects.effects.EffectIncomingDamageMultiplier;
import com.willfp.reforges.effects.effects.EffectKnockbackMultiplier;
import com.willfp.reforges.effects.effects.EffectMovementSpeedMultiplier;
import com.willfp.reforges.effects.effects.EffectRewardBlockBreak;
import com.willfp.reforges.effects.effects.EffectRewardKill;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@UtilityClass
@SuppressWarnings("unused")
public class Effects {
/**
* All registered effects.
*/
private static final BiMap<String, Effect> BY_ID = HashBiMap.create();
public static final Effect DAMAGE_MULTIPLIER = new EffectDamageMultiplier();
public static final Effect CRIT_MULTIPLIER = new EffectCritMultiplier();
public static final Effect REWARD_KILL = new EffectRewardKill();
public static final Effect KNOCKBACK_MULTIPLIER = new EffectKnockbackMultiplier();
public static final Effect REWARD_BLOCK_BREAK = new EffectRewardBlockBreak();
public static final Effect INCOMING_DAMAGE_MULTIPLIER = new EffectIncomingDamageMultiplier();
public static final Effect ATTACK_SPEED_MULTIPLIER = new EffectAttackSpeedMultiplier();
public static final Effect DURABILITY_MULTIPLIER = new EffectDurabilityMultiplier();
public static final Effect MOVEMENT_SPEED_MULTIPLIER = new EffectMovementSpeedMultiplier();
/**
* Get effect matching id.
*
* @param id The id to query.
* @return The matching effect, or null if not found.
*/
@Nullable
public static Effect getByID(@NotNull final String id) {
return BY_ID.get(id);
}
/**
* List of all registered effects.
*
* @return The effects.
*/
public static List<Effect> values() {
return ImmutableList.copyOf(BY_ID.values());
}
/**
* Add new effect to EcoWeapons.
*
* @param effect The effect to add.
*/
public static void addNewEffect(@NotNull final Effect effect) {
BY_ID.remove(effect.getId());
BY_ID.put(effect.getId(), effect);
}
}

View File

@@ -1,202 +0,0 @@
package com.willfp.reforges.gui;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.eco.core.drops.DropQueue;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.slot.FillerMask;
import com.willfp.eco.core.gui.slot.MaskMaterials;
import com.willfp.eco.core.gui.slot.Slot;
import com.willfp.eco.core.items.builder.ItemStackBuilder;
import com.willfp.eco.util.NumberUtils;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.ReforgeHandler;
import com.willfp.reforges.reforges.util.ReforgeStatus;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import lombok.Getter;
import lombok.experimental.UtilityClass;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@SuppressWarnings("deprecation")
@UtilityClass
public class ReforgeGUI {
/**
* The reforge GUI.
*/
@Getter
private static Menu menu;
/**
* Update the GUI.
*
* @param plugin The plugin.
*/
@ConfigUpdater
public static void update(@NotNull final EcoPlugin plugin) {
ReforgeHandler handler = new ReforgeHandler(plugin);
Slot activatorSlot = Slot.builder(new ItemStack(Material.ANVIL))
.setModifier((player, menu, previous) -> {
ItemMeta meta = previous.getItemMeta();
if (meta == null) {
return;
}
ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player));
double cost = plugin.getConfigYml().getDouble("reforge.cost");
if (status == ReforgeStatus.ALLOW) {
ItemStack item = menu.getCaptiveItems(player).get(0);
int reforges = ReforgeUtils.getReforges(item);
cost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges);
}
int xpcost = plugin.getConfigYml().getInt("reforge.xp-cost");
if (status == ReforgeStatus.ALLOW) {
ItemStack item = menu.getCaptiveItems(player).get(0);
int reforges = ReforgeUtils.getReforges(item);
xpcost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges);
}
switch (status) {
case INVALID_ITEM -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.invalid-item.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.invalid-item.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.invalid-item.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
case ALLOW -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.allow.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.allow.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
case ALLOW_STONE -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow-stone.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.allow-stone.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.allow-stone.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost))
.replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)).getName()));
}
meta.setLore(lore);
}
default -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.no-item.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.no-item.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.no-item.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
}
previous.setItemMeta(meta);
})
.onLeftClick(handler::handleReforgeClick)
.build();
String[] maskPattern = plugin.getConfigYml().getStrings("gui.mask.pattern", false).toArray(new String[0]);
Material[] maskMaterials = plugin.getConfigYml()
.getStrings("gui.mask.materials", false)
.stream()
.map(string -> Material.getMaterial(string.toUpperCase()))
.filter(Objects::nonNull)
.toArray(Material[]::new);
Material allowMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.allow-material", false).toUpperCase());
Material denyMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.deny-material", false).toUpperCase());
assert allowMaterial != null;
assert denyMaterial != null;
Material closeMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.close.material", false).toUpperCase());
assert closeMaterial != null;
menu = Menu.builder(plugin.getConfigYml().getInt("gui.rows"))
.setTitle(plugin.getLangYml().getString("menu.title"))
.setMask(
new FillerMask(
new MaskMaterials(
maskMaterials
),
maskPattern
)
)
.modfiy(builder -> {
Slot slot = Slot.builder(
new ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
).setModifier((player, menu, previous) -> {
ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player));
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
previous.setType(allowMaterial);
} else {
previous.setType(denyMaterial);
}
}).build();
List<String> allowedPattern = plugin.getConfigYml().getStrings("gui.show-allowed.pattern");
for (int i = 1; i <= allowedPattern.size(); i++) {
String row = allowedPattern.get(i - 1);
for (int j = 1; j <= 9; j++) {
if (row.charAt(j - 1) != '0') {
builder.setSlot(i, j, slot);
}
}
}
})
.setSlot(plugin.getConfigYml().getInt("gui.item-slot.row"),
plugin.getConfigYml().getInt("gui.item-slot.column"),
Slot.builder()
.setCaptive()
.build()
)
.setSlot(plugin.getConfigYml().getInt("gui.stone-slot.row"),
plugin.getConfigYml().getInt("gui.stone-slot.column"),
Slot.builder()
.setCaptive()
.build()
)
.setSlot(2, 5, activatorSlot)
.setSlot(plugin.getConfigYml().getInt("gui.close.location.row"),
plugin.getConfigYml().getInt("gui.close.location.column"),
Slot.builder(
new ItemStackBuilder(closeMaterial)
.setDisplayName(plugin.getLangYml().getString("menu.close"))
.build()
).onLeftClick((event, slot, menu) -> {
event.getWhoClicked().closeInventory();
}).build()
).onClose((event, menu) -> {
new DropQueue((Player) event.getPlayer())
.addItems(menu.getCaptiveItems((Player) event.getPlayer()))
.setLocation(event.getPlayer().getEyeLocation())
.push();
})
.build();
}
static {
update(ReforgesPlugin.getInstance());
}
}

View File

@@ -1,112 +0,0 @@
package com.willfp.reforges.reforges;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.function.Function;
public class ReforgeLookup {
/**
* All registered providers.
*/
private static final Set<Function<Player, Collection<ItemStack>>> PROVIDERS = new HashSet<>();
/**
* Cached items.
*/
private static final Map<UUID, Collection<ItemStack>> ITEM_CACHE = new WeakHashMap<>();
/**
* Cached reforges.
*/
private static final Map<UUID, Collection<Reforge>> REFORGE_CACHE = new WeakHashMap<>();
/**
* Instance of Reforges.
*/
private static final EcoPlugin PLUGIN = ReforgesPlugin.getInstance();
/**
* Register provider.
*
* @param provider The provider.
*/
public static void registerProvider(@NotNull final Function<Player, Collection<ItemStack>> provider) {
PROVIDERS.add(provider);
}
/**
* Provide ItemStacks.
*
* @param player The player.
* @return The ItemStacks.
*/
public static Set<ItemStack> provide(@NotNull final Player player) {
if (ITEM_CACHE.containsKey(player.getUniqueId())) {
return new HashSet<>(ITEM_CACHE.get(player.getUniqueId()));
}
Set<ItemStack> found = new HashSet<>();
for (Function<Player, Collection<ItemStack>> provider : PROVIDERS) {
found.addAll(provider.apply(player));
}
found.removeIf(Objects::isNull);
ITEM_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> ITEM_CACHE.remove(player.getUniqueId()), 40);
return found;
}
/**
* Provide Reforges.
*
* @param player The player.
* @return The Reforges.
*/
public static Set<Reforge> provideReforges(@NotNull final Player player) {
if (REFORGE_CACHE.containsKey(player.getUniqueId())) {
return new HashSet<>(REFORGE_CACHE.get(player.getUniqueId()));
}
Set<Reforge> found = new HashSet<>();
for (ItemStack itemStack : provide(player)) {
if (itemStack == null) {
continue;
}
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
continue;
}
found.add(reforge);
}
REFORGE_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> REFORGE_CACHE.remove(player.getUniqueId()), 40);
return found;
}
static {
registerProvider(player -> Collections.singletonList(player.getInventory().getItemInMainHand()));
registerProvider(player -> Collections.singletonList(player.getInventory().getItemInOffHand()));
registerProvider(player -> Arrays.asList(player.getInventory().getArmorContents()));
}
}

View File

@@ -3,7 +3,7 @@ package com.willfp.reforges.reforges;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.willfp.eco.core.config.interfaces.JSONConfig; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.core.config.updating.ConfigUpdater; import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.reforges.ReforgesPlugin; import com.willfp.reforges.ReforgesPlugin;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
@@ -59,8 +59,8 @@ public class Reforges {
removeReforge(reforge); removeReforge(reforge);
} }
for (JSONConfig config : plugin.getReforgesJson().getSubsections("reforges")) { for (Config config : plugin.getReforgesYml().getSubsections("reforges")) {
addNewReforge(new Reforge(config, plugin)); new Reforge(config, plugin);
} }
} }

View File

@@ -8,20 +8,20 @@ import com.willfp.reforges.ReforgesPlugin;
import lombok.Getter; import lombok.Getter;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
public class ReforgeTarget { public class ReforgeTarget {
/** /**
* Target containing the materials from all other targets. * Target containing the materials from all other targets.
*/ */
public static final ReforgeTarget ALL = new ReforgeTarget("all", new HashSet<>()); public static final ReforgeTarget ALL = new ReforgeTarget("all", Slot.ANY, new HashSet<>());
/** /**
* All registered targets. * All registered targets.
@@ -38,12 +38,19 @@ public class ReforgeTarget {
*/ */
@Getter @Getter
private final String name; private final String name;
/** /**
* The materials of the target. * The materials of the target.
*/ */
@Getter @Getter
private final Set<TestableItem> items; private final Set<TestableItem> items;
/**
* The slot for the target.
*/
@Getter
private final Slot slot;
/** /**
* Create new target. * Create new target.
* *
@@ -51,10 +58,12 @@ public class ReforgeTarget {
* @param items The items for the target. * @param items The items for the target.
*/ */
public ReforgeTarget(@NotNull final String name, public ReforgeTarget(@NotNull final String name,
@NotNull final Slot slot,
@NotNull final Set<TestableItem> items) { @NotNull final Set<TestableItem> items) {
this.name = name; this.name = name;
items.removeIf(item -> item instanceof EmptyTestableItem); items.removeIf(item -> item instanceof EmptyTestableItem);
this.items = items; this.items = items;
this.slot = slot;
} }
/** /**
@@ -89,13 +98,11 @@ public class ReforgeTarget {
* @param item The item. * @param item The item.
* @return The target. * @return The target.
*/ */
@Nullable public static List<ReforgeTarget> getForItem(@NotNull final ItemStack item) {
public static ReforgeTarget getForItem(@NotNull final ItemStack item) { return REGISTERED.values().stream()
Optional<ReforgeTarget> matching = REGISTERED.values().stream()
.filter(target -> !target.getName().equalsIgnoreCase("all")) .filter(target -> !target.getName().equalsIgnoreCase("all"))
.filter(target -> target.matches(item)) .filter(target -> target.matches(item))
.findFirst(); .collect(Collectors.toList());
return matching.orElse(null);
} }
/** /**
@@ -115,7 +122,11 @@ public class ReforgeTarget {
} }
for (String id : plugin.getTargetYml().getTargets()) { for (String id : plugin.getTargetYml().getTargets()) {
ReforgeTarget target = new ReforgeTarget(id, plugin.getTargetYml().getTargetItems(id)); ReforgeTarget target = new ReforgeTarget(
id,
plugin.getTargetYml().getSlot(id),
plugin.getTargetYml().getTargetItems(id)
);
REGISTERED.put(id, target); REGISTERED.put(id, target);
ALL.items.addAll(target.items); ALL.items.addAll(target.items);
} }
@@ -129,4 +140,13 @@ public class ReforgeTarget {
public static Set<ReforgeTarget> values() { public static Set<ReforgeTarget> values() {
return ImmutableSet.copyOf(REGISTERED.values()); return ImmutableSet.copyOf(REGISTERED.values());
} }
/**
* Reforge slots.
*/
public enum Slot {
HANDS,
ARMOR,
ANY
}
} }

View File

@@ -1,49 +0,0 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.items.args.LookupArgParser;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.function.Predicate;
public class ReforgeArgParser implements LookupArgParser {
@Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) {
Reforge reforge = null;
for (String arg : args) {
String[] split = arg.split(":");
if (split.length == 1 || !split[0].equalsIgnoreCase("reforge")) {
continue;
}
Reforge match = Reforges.getByKey(split[1].toLowerCase());
if (match == null) {
continue;
}
reforge = match;
break;
}
if (reforge == null) {
return null;
}
ReforgeUtils.setReforge(meta, reforge);
Reforge finalReforge = reforge;
return test -> {
ItemMeta testMeta = test.getItemMeta();
if (testMeta == null) {
return false;
}
return finalReforge.equals(ReforgeUtils.getReforge(testMeta));
};
}
}

View File

@@ -0,0 +1,141 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.events.ArmorChangeEvent;
import com.willfp.libreforge.LibReforgeUtils;
import com.willfp.libreforge.effects.ConfiguredEffect;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.jetbrains.annotations.NotNull;
public class ReforgeEnableListeners extends PluginDependent<EcoPlugin> implements Listener {
/**
* Initialize new listeners and link them to a plugin.
*
* @param plugin The plugin to link to.
*/
public ReforgeEnableListeners(@NotNull final EcoPlugin plugin) {
super(plugin);
}
/**
* Called on item pickup.
*
* @param event The event to listen for.
*/
@EventHandler
public void onItemPickup(@NotNull final EntityPickupItemEvent event) {
if (!(event.getEntity() instanceof Player player)) {
return;
}
if (!ReforgeTarget.ALL.matches(event.getItem().getItemStack())) {
return;
}
refreshPlayer(player);
}
/**
* Called on player join.
*
* @param event The event to listen for.
*/
@EventHandler
public void onPlayerJoin(@NotNull final PlayerJoinEvent event) {
refresh();
}
/**
* Called on player leave.
*
* @param event The event to listen for.
*/
@EventHandler
public void onPlayerLeave(@NotNull final PlayerQuitEvent event) {
refresh();
Player player = event.getPlayer();
for (Reforge value : Reforges.values()) {
for (ConfiguredEffect effect : value.getEffects()) {
effect.getEffect().disableForPlayer(player);
}
}
}
/**
* Called on item drop.
*
* @param event The event to listen for.
*/
@EventHandler
public void onInventoryDrop(@NotNull final PlayerDropItemEvent event) {
if (!ReforgeTarget.ALL.matches(event.getItemDrop().getItemStack())) {
return;
}
refreshPlayer(event.getPlayer());
}
/**
* Called on slot change.
*
* @param event The event to listen for.
*/
@EventHandler
public void onChangeSlot(@NotNull final PlayerItemHeldEvent event) {
refreshPlayer(event.getPlayer());
this.getPlugin().getScheduler().run(() -> refreshPlayer(event.getPlayer()));
}
/**
* Called on armor change.
*
* @param event The event to listen for.
*/
@EventHandler
public void onArmorChange(@NotNull final ArmorChangeEvent event) {
refreshPlayer(event.getPlayer());
}
/**
* Called on inventory click.
*
* @param event The event to listen for.
*/
@EventHandler
public void onInventoryClick(@NotNull final InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player)) {
return;
}
refreshPlayer((Player) event.getWhoClicked());
}
/**
* Force refresh all online players.
* <p>
* This is a very expensive method.
*/
public void refresh() {
this.getPlugin().getServer().getOnlinePlayers().forEach(this::refreshPlayer);
}
private void refreshPlayer(@NotNull final Player player) {
ReforgeLookup.clearCache(player);
LibReforgeUtils.updateEffects(player);
}
}

View File

@@ -4,15 +4,18 @@ import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent; import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.gui.menu.Menu; import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.slot.Slot; import com.willfp.eco.core.gui.slot.Slot;
import com.willfp.eco.core.integrations.economy.EconomyManager;
import com.willfp.reforges.reforges.Reforge; import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget; import com.willfp.reforges.reforges.meta.ReforgeTarget;
import com.willfp.reforges.vault.EconomyHandler;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class ReforgeHandler extends PluginDependent<EcoPlugin> { public class ReforgeHandler extends PluginDependent<EcoPlugin> {
/** /**
* Pass an {@link EcoPlugin} in order to interface with it. * Pass an {@link EcoPlugin} in order to interface with it.
@@ -32,8 +35,9 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return; return;
} }
ReforgeTarget target = ReforgeTarget.getForItem(toReforge); Reforge existingReforge = ReforgeUtils.getReforge(toReforge);
assert target != null;
List<ReforgeTarget> target = ReforgeTarget.getForItem(toReforge);
Reforge reforge = null; Reforge reforge = null;
boolean usedStone = false; boolean usedStone = false;
@@ -49,19 +53,27 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
} }
if (reforge == null) { if (reforge == null) {
reforge = ReforgeUtils.getRandomReforge(target); List<Reforge> existing = new ArrayList<>();
if (existingReforge != null) {
existing.add(existingReforge);
}
reforge = ReforgeUtils.getRandomReforge(target, existing);
} }
if (reforge == null) { if (reforge == null) {
return; return;
} }
double cost = 0;
if (EconomyHandler.isEnabled()) { if (EconomyManager.hasRegistrations()) {
double cost = this.getPlugin().getConfigYml().getDouble("reforge.cost"); cost = this.getPlugin().getConfigYml().getDouble("reforge.cost");
int reforges = ReforgeUtils.getReforges(toReforge); int reforges = ReforgeUtils.getReforges(toReforge);
cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges); cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges);
if (!EconomyHandler.getInstance().has(player, cost)) { if (reforge.getRequiresStone() && reforge.getStonePrice() != -1) {
cost = reforge.getStonePrice();
}
if (!EconomyManager.hasAmount(player, cost)) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money")); player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money"));
player.playSound( player.playSound(
@@ -73,9 +85,6 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return; return;
} }
EconomyHandler.getInstance().withdrawPlayer(player, cost);
} }
int xpCost = this.getPlugin().getConfigYml().getInt("reforge.xp-cost"); int xpCost = this.getPlugin().getConfigYml().getInt("reforge.xp-cost");
@@ -94,6 +103,10 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return; return;
} }
if (EconomyManager.hasRegistrations()) {
EconomyManager.removeMoney(player, cost);
}
player.setLevel(player.getLevel() - xpCost); player.setLevel(player.getLevel() - xpCost);
player.sendMessage(this.getPlugin().getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName())); player.sendMessage(this.getPlugin().getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName()));

View File

@@ -0,0 +1,148 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ReforgeLookup {
/**
* All registered providers.
*/
private static final Set<Function<Player, Map<ItemStack, ReforgeTarget.Slot>>> PROVIDERS = new HashSet<>();
/**
* Cached items.
*/
private static final Map<UUID, Map<ItemStack, ReforgeTarget.Slot>> ITEM_CACHE = new WeakHashMap<>();
/**
* Cached reforges.
*/
private static final Map<UUID, Collection<Reforge>> REFORGE_CACHE = new WeakHashMap<>();
/**
* Instance of Reforges.
*/
private static final EcoPlugin PLUGIN = ReforgesPlugin.getInstance();
/**
* Register provider.
*
* @param provider The provider.
*/
public static void registerProvider(@NotNull final Function<Player, Map<ItemStack, ReforgeTarget.Slot>> provider) {
PROVIDERS.add(provider);
}
/**
* Provide ItemStacks.
*
* @param player The player.
* @return The ItemStacks.
*/
public static Map<ItemStack, ReforgeTarget.Slot> provide(@NotNull final Player player) {
if (ITEM_CACHE.containsKey(player.getUniqueId())) {
return new HashMap<>(ITEM_CACHE.get(player.getUniqueId()));
}
Map<ItemStack, ReforgeTarget.Slot> found = new HashMap<>();
for (Function<Player, Map<ItemStack, ReforgeTarget.Slot>> provider : PROVIDERS) {
found.putAll(provider.apply(player));
}
found.keySet().removeIf(Objects::isNull);
ITEM_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> ITEM_CACHE.remove(player.getUniqueId()), 40);
return found;
}
/**
* Provide Reforges.
*
* @param player The player.
* @return The Reforges.
*/
public static List<Reforge> provideReforges(@NotNull final Player player) {
if (REFORGE_CACHE.containsKey(player.getUniqueId())) {
return new ArrayList<>(REFORGE_CACHE.get(player.getUniqueId()));
}
List<Reforge> found = new ArrayList<>();
for (Map.Entry<ItemStack, ReforgeTarget.Slot> entry : provide(player).entrySet()) {
ItemStack itemStack = entry.getKey();
ReforgeTarget.Slot slot = entry.getValue();
if (itemStack == null) {
continue;
}
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
continue;
}
if (slot != ReforgeTarget.Slot.ANY) {
if (!reforge.getTargets().stream()
.map(ReforgeTarget::getSlot)
.collect(Collectors.toList())
.contains(slot)) {
continue;
}
}
found.add(reforge);
}
REFORGE_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> REFORGE_CACHE.remove(player.getUniqueId()), 40);
return found;
}
/**
* Clear cache.
*
* @param player The player.
*/
public static void clearCache(@NotNull final Player player) {
ITEM_CACHE.remove(player.getUniqueId());
REFORGE_CACHE.remove(player.getUniqueId());
}
static {
registerProvider(player -> Map.of(
player.getInventory().getItemInMainHand(),
ReforgeTarget.Slot.HANDS
));
registerProvider(player -> Map.of(
player.getInventory().getItemInOffHand(),
ReforgeTarget.Slot.HANDS
));
registerProvider(player -> {
Map<ItemStack, ReforgeTarget.Slot> items = new HashMap<>();
for (ItemStack stack : player.getInventory().getArmorContents()) {
items.put(stack, ReforgeTarget.Slot.ARMOR);
}
return items;
});
}
}

View File

@@ -16,6 +16,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -44,19 +45,36 @@ public class ReforgeUtils {
/** /**
* Get a random reforge for a target. * Get a random reforge for a target.
* *
* @param target The target. * @param targets The targets.
*/ */
public static Reforge getRandomReforge(@NotNull final ReforgeTarget target) { @Nullable
public static Reforge getRandomReforge(@NotNull final Collection<ReforgeTarget> targets) {
return getRandomReforge(targets, Collections.emptyList());
}
/**
* Get a random reforge for a target.
*
* @param targets The targets.
* @param disallowed The disallowed reforges.
*/
@Nullable
public static Reforge getRandomReforge(@NotNull final Collection<ReforgeTarget> targets,
@NotNull final Collection<Reforge> disallowed) {
List<Reforge> applicable = new ArrayList<>(); List<Reforge> applicable = new ArrayList<>();
for (Reforge reforge : Reforges.values()) { for (Reforge reforge : Reforges.values()) {
for (ReforgeTarget target : targets) {
if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) { if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) {
applicable.add(reforge); applicable.add(reforge);
} }
} }
}
Collections.shuffle(applicable); Collections.shuffle(applicable);
applicable.removeAll(disallowed);
if (applicable.isEmpty()) { if (applicable.isEmpty()) {
return null; return null;
} }
@@ -64,43 +82,45 @@ public class ReforgeUtils {
return applicable.get(0); return applicable.get(0);
} }
public static ReforgeStatus getStatus(@NotNull final List<ItemStack> captive) { public static MetadatedReforgeStatus getStatus(@NotNull final List<ItemStack> captive) {
ItemStack toReforge = captive.isEmpty() ? null : captive.get(0); ItemStack toReforge = captive.isEmpty() ? null : captive.get(0);
ItemStack stone = captive.size() == 2 ? captive.get(1) : null; ItemStack stone = captive.size() == 2 ? captive.get(1) : null;
ReforgeStatus status = null; ReforgeStatus status = null;
ReforgeTarget target = null; List<ReforgeTarget> target = new ArrayList<>();
if (toReforge == null || toReforge.getType() == Material.AIR) { if (toReforge == null || toReforge.getType() == Material.AIR) {
status = ReforgeStatus.NO_ITEM; status = ReforgeStatus.NO_ITEM;
} else { } else {
target = ReforgeTarget.getForItem(toReforge); target.addAll(ReforgeTarget.getForItem(toReforge));
if (target == null) { if (target.isEmpty()) {
status = ReforgeStatus.INVALID_ITEM; status = ReforgeStatus.INVALID_ITEM;
} }
} }
if (target != null) { if (!target.isEmpty()) {
status = ReforgeStatus.ALLOW; status = ReforgeStatus.ALLOW;
} }
double cost = 0;
if (status == ReforgeStatus.ALLOW) { if (status == ReforgeStatus.ALLOW) {
Reforge reforgeStone = getReforgeStone(stone); Reforge reforgeStone = getReforgeStone(stone);
if (reforgeStone != null && reforgeStone.getTargets().stream() if (reforgeStone != null && reforgeStone.getTargets().stream()
.anyMatch(reforgeTarget -> reforgeTarget.getItems().stream() .anyMatch(reforgeTarget -> reforgeTarget.getItems().stream()
.anyMatch(item -> item.matches(toReforge)))) { .anyMatch(item -> item.matches(toReforge)))) {
cost = reforgeStone.getStonePrice();
status = ReforgeStatus.ALLOW_STONE; status = ReforgeStatus.ALLOW_STONE;
} }
} }
return status; return new MetadatedReforgeStatus(status, cost);
} }
/** /**
* Get reforge on an item. * Get reforge on an item.
* *
* @param item The item to query. * @param item The item to query.
* @return The found reforge, or null if none active. * @return The found reforge, or null.
*/ */
public static Reforge getReforge(@Nullable final ItemStack item) { public static Reforge getReforge(@Nullable final ItemStack item) {
if (item == null) { if (item == null) {
@@ -120,7 +140,7 @@ public class ReforgeUtils {
* Get reforge on an item. * Get reforge on an item.
* *
* @param meta The item to query. * @param meta The item to query.
* @return The found reforge, or null if none active. * @return The found reforge, or null.
*/ */
public static Reforge getReforge(@Nullable final ItemMeta meta) { public static Reforge getReforge(@Nullable final ItemMeta meta) {
if (meta == null) { if (meta == null) {
@@ -151,12 +171,6 @@ public class ReforgeUtils {
return; return;
} }
Reforge previous = getReforge(item);
if (previous != null) {
previous.handleRemoval(item);
}
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
setReforge(meta, reforge); setReforge(meta, reforge);
@@ -175,15 +189,13 @@ public class ReforgeUtils {
PersistentDataContainer container = meta.getPersistentDataContainer(); PersistentDataContainer container = meta.getPersistentDataContainer();
container.set(REFORGE_KEY, PersistentDataType.STRING, reforge.getId()); container.set(REFORGE_KEY, PersistentDataType.STRING, reforge.getId());
reforge.handleApplication(meta);
} }
/** /**
* Get reforge stone on an item. * Get reforge stone on an item.
* *
* @param item The item to query. * @param item The item to query.
* @return The found reforge, or null if none active. * @return The found reforge, or null.
*/ */
public static Reforge getReforgeStone(@Nullable final ItemStack item) { public static Reforge getReforgeStone(@Nullable final ItemStack item) {
if (item == null) { if (item == null) {
@@ -203,7 +215,7 @@ public class ReforgeUtils {
* Get reforge stone on an item. * Get reforge stone on an item.
* *
* @param meta The item to query. * @param meta The item to query.
* @return The found reforge, or null if none active. * @return The found reforge, or null.
*/ */
public static Reforge getReforgeStone(@Nullable final ItemMeta meta) { public static Reforge getReforgeStone(@Nullable final ItemMeta meta) {
if (meta == null) { if (meta == null) {

View File

@@ -1,209 +0,0 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.events.EntityDeathByEntityEvent;
import org.bukkit.block.Block;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Trident;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerItemDamageEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused")
public interface Watcher {
/**
* Called when a player breaks a block.
*
* @param player The player.
* @param block The block that was broken.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onBlockBreak(@NotNull final Player player,
@NotNull final Block block,
@NotNull final BlockBreakEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity attacks another entity via any mean.
*
* @param attacker The attacker.
* @param victim The victim.
* @param event The event.
* @param config The effect config.
*/
default void onAnyDamage(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity shoots another entity with an arrow.
*
* @param attacker The shooter.
* @param victim The victim.
* @param arrow The arrow entity.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onArrowDamage(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final Arrow arrow,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity damages another entity with a trident throw.
*
* @param attacker The shooter.
* @param victim The victim.
* @param trident The trident entity.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onTridentDamage(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final Trident trident,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when a player jumps.
*
* @param player The player.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onJump(@NotNull final Player player,
@NotNull final PlayerMoveEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity attacks another entity with a melee attack.
*
* @param attacker The attacker.
* @param victim The victim.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onMeleeAttack(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity shoots a projectile.
*
* @param shooter The entity that shot the bow.
* @param projectile The projectile that was shot.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onProjectileLaunch(@NotNull final LivingEntity shooter,
@NotNull final Projectile projectile,
@NotNull final ProjectileLaunchEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity takes fall damage.
*
* @param faller The entity that took the fall damage.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onFallDamage(@NotNull final LivingEntity faller,
@NotNull final EntityDamageEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when a projectile hits a block or entity.
*
* @param shooter The entity that shot the arrow.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onProjectileHit(@NotNull final LivingEntity shooter,
@NotNull final ProjectileHitEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity kills another entity.
*
* @param killer The killer.
* @param victim The victim.
* @param event The event.
* @param config The effect config.
*/
default void onKill(@NotNull final LivingEntity killer,
@NotNull final LivingEntity victim,
@NotNull final EntityDeathByEntityEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity takes damage wearing armor.
*
* @param victim The entity that took damage.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onDamageWearingArmor(@NotNull final LivingEntity victim,
@NotNull final EntityDamageEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an entity throws a trident.
*
* @param shooter The entity that threw the trident.
* @param trident The trident that was thrown.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onTridentLaunch(@NotNull final LivingEntity shooter,
@NotNull final Trident trident,
@NotNull final ProjectileLaunchEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/**
* Called when an item takes durability damage.
*
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onDurabilityDamage(@NotNull final PlayerItemDamageEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
}

View File

@@ -1,40 +0,0 @@
package com.willfp.reforges.vault;
import lombok.Setter;
import lombok.experimental.UtilityClass;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
@UtilityClass
public final class EconomyHandler {
/**
* The instance.
*/
private static Economy instance = null;
@Setter
private static boolean enabled = false;
/**
* Initialize the economy manager.
*
* @return If was successful.
*/
public static boolean init() {
RegisteredServiceProvider<Economy> rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) {
return false;
}
instance = rsp.getProvider();
return true;
}
public static Economy getInstance() {
return EconomyHandler.instance;
}
public static boolean isEnabled() {
return EconomyHandler.enabled;
}
}

View File

@@ -0,0 +1,91 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.reforges.reforges.Reforges
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.util.StringUtil
class CommandGive(
plugin: EcoPlugin
) : Subcommand(plugin, "give", "reforges.command.give", false) {
private val numbers = listOf(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
)
override fun onExecute(sender: CommandSender, args: MutableList<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-stone"))
return
}
val amount = if (args.size > 2) args[2].toIntOrNull() ?: 1 else 1
val recieverName = args[0]
val reciever = Bukkit.getPlayer(recieverName)
if (reciever == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
val key = args[1]
val reforge = Reforges.getByKey(key)
if (reforge == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-stone"))
return
}
var message = plugin.langYml.getMessage("give-success")
message = message.replace("%reforge%", reforge.name).replace("%recipient%", reciever.name)
sender.sendMessage(message)
val itemStack = reforge.stone
itemStack.amount = amount
reciever.inventory.addItem(itemStack)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
val completions = mutableListOf<String>()
if (args.isEmpty()) {
// Currently, this case is not ever reached
return Reforges.values().filter { it.requiresStone }.map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
return completions
}
if (args.size == 2) {
StringUtil.copyPartialMatches(
args[1],
Reforges.values().filter { it.requiresStone }.map { it.id },
completions
)
completions.sort()
return completions
}
if (args.size == 3) {
StringUtil.copyPartialMatches(args[2], numbers, completions)
completions.sortWith { s1, s2 ->
val t1 = s1.toInt()
val t2 = s2.toInt()
t1 - t2
}
return completions
}
return emptyList()
}
}

View File

@@ -0,0 +1,45 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import org.bukkit.Bukkit
import org.bukkit.Sound
import org.bukkit.command.CommandSender
import org.bukkit.util.StringUtil
class CommandOpen(
plugin: EcoPlugin
) : PluginCommand(plugin, "open", "reforges.command.open", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
val player = Bukkit.getPlayer(args[0])
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
menu.open(player)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
val completions = mutableListOf<String>()
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
return completions
}
return emptyList()
}
}

View File

@@ -0,0 +1,23 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import org.bukkit.Sound
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
class CommandReforge(
plugin: EcoPlugin
) : PluginCommand(plugin, "reforge", "reforges.command.reforge", true) {
override fun onExecute(player: CommandSender, args: List<String>) {
player as Player
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
menu.open(player)
}
}

View File

@@ -0,0 +1,19 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import org.bukkit.command.CommandSender
class CommandReforges(plugin: EcoPlugin) : PluginCommand(plugin, "reforges", "reforges.command.reforges", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
sender.sendMessage(
plugin.langYml.getMessage("invalid-command")
)
}
init {
addSubcommand(CommandReload(plugin))
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandOpen(plugin))
}
}

View File

@@ -0,0 +1,15 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import org.bukkit.command.CommandSender
class CommandReload(plugin: EcoPlugin) : Subcommand(plugin, "reload", "reforges.command.reload", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
sender.sendMessage(
plugin.langYml.getMessage("reloaded", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%time%", plugin.reloadWithTime().toString())
)
}
}

View File

@@ -1,37 +0,0 @@
package com.willfp.reforges.conditions
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
private val plugin = ReforgesPlugin.getInstance()
fun ItemStack.updateReforge(player: Player, condition: Condition) {
plugin.scheduler.run {
val meta = this.itemMeta ?: return@run
val reforge = ReforgeUtils.getReforge(meta) ?: return@run
var allow = true
for ((cond, cfg) in reforge.conditions) {
if (cond != condition) {
continue
}
if (!cond.isConditionMet(player, cfg)) {
allow = false
break
}
}
if (allow) {
reforge.handleApplication(meta)
} else {
reforge.handleRemoval(meta)
}
this.itemMeta = meta
}
}

View File

@@ -1,5 +0,0 @@
package com.willfp.reforges.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
data class ConfiguredCondition(val condition: Condition, val config: JSONConfig)

View File

@@ -1,57 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.attribute.Attribute
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.entity.EntityRegainHealthEvent
class ConditionAboveHealthPercent: Condition("above_health_percent") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: EntityRegainHealthEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: EntityDamageEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
val maxHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH)?.value ?: return false
val health = player.health
return health / maxHealth * 100 >= config.getDouble("percent")
}
}

View File

@@ -1,35 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.entity.FoodLevelChangeEvent
class ConditionAboveHungerPercent : Condition("above_hunger_percent") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: FoodLevelChangeEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return (player.foodLevel / 20) * 100 >= config.getDouble("percent")
}
}

View File

@@ -1,31 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerExpChangeEvent
class ConditionAboveXPLevel : Condition("above_xp_level") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerExpChangeEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.level >= config.getInt("level")
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionAboveY: Condition("above_y") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.location.y >= config.getDouble("y")
}
}

View File

@@ -1,57 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.attribute.Attribute
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.entity.EntityRegainHealthEvent
class ConditionBelowHealthPercent: Condition("below_health_percent") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: EntityRegainHealthEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: EntityDamageEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
val maxHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH)?.value ?: return false
val health = player.health
return health / maxHealth * 100 <= config.getDouble("percent")
}
}

View File

@@ -1,35 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.entity.FoodLevelChangeEvent
class ConditionBelowHungerPercent : Condition("below_hunger_percent") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: FoodLevelChangeEvent) {
val player = event.entity
if (player !is Player) {
return
}
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return (player.foodLevel / 20) * 100 <= config.getDouble("percent")
}
}

View File

@@ -1,31 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerExpChangeEvent
class ConditionBelowXPLevel: Condition("below_xp_level") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerExpChangeEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.level < config.getInt("level")
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionBelowY: Condition("below_y") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.location.y < config.getDouble("y")
}
}

View File

@@ -1,24 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.Bukkit
import org.bukkit.entity.Player
class ConditionHasPermission : Condition("is_sneaking"), Runnable {
override fun run() {
for (player in Bukkit.getOnlinePlayers()) {
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.hasPermission(config.getString("permission"))
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionInAir: Condition("in_air") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.location.block.isEmpty
}
}

View File

@@ -1,34 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionInBiome: Condition("in_biome") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return config.getStrings("biomes").contains(player.world.getBiome(
player.location.blockX,
player.location.blockY,
player.location.blockZ
).name.lowercase())
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionInWater: Condition("in_water") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.isInWater
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerMoveEvent
class ConditionInWorld: Condition("in_world") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerMoveEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.world.name.equals(config.getString("world"), ignoreCase = true)
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.conditions.conditions
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.conditions.Condition
import com.willfp.reforges.conditions.updateReforge
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.player.PlayerToggleSneakEvent
class ConditionIsSneaking: Condition("is_sneaking") {
@EventHandler(
priority = EventPriority.MONITOR,
ignoreCancelled = true
)
fun handle(event: PlayerToggleSneakEvent) {
val player = event.player
val items = ReforgeLookup.provide(player)
for (item in items) {
item.updateReforge(player, this)
}
}
override fun isConditionMet(player: Player, config: JSONConfig): Boolean {
return player.isSprinting
}
}

View File

@@ -13,41 +13,49 @@ import com.willfp.reforges.reforges.util.ReforgeUtils
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.kyori.adventure.text.TextReplacementConfig import net.kyori.adventure.text.TextReplacementConfig
import net.kyori.adventure.text.format.TextDecoration import net.kyori.adventure.text.format.TextDecoration
import org.bukkit.Material import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta import org.bukkit.inventory.meta.SkullMeta
import org.bukkit.persistence.PersistentDataType
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) { class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) {
/**
* Deprecated
*/
@Deprecated("Use PDC components!")
private val replacement = TextReplacementConfig.builder() private val replacement = TextReplacementConfig.builder()
.match("§w(.+)§w") .match("§w(.+)§w")
.replacement("") .replacement("")
.build() .build()
private val originalComponentKey = plugin.namespacedKeyFactory.create("real_name")
private val serializer = GsonComponentSerializer.gson()
override fun display( override fun display(
itemStack: ItemStack, itemStack: ItemStack,
vararg args: Any vararg args: Any
) { ) {
val target = ReforgeTarget.getForItem(itemStack) val target = ReforgeTarget.getForItem(itemStack)
if (target == null && itemStack.type != Material.PLAYER_HEAD) { val meta = itemStack.itemMeta ?: return
val stone = ReforgeUtils.getReforgeStone(meta)
if (target.isEmpty() && stone == null) {
return return
} }
val meta = itemStack.itemMeta ?: return
val fastItemStack = FastItemStack.wrap(itemStack) val fastItemStack = FastItemStack.wrap(itemStack)
val lore = fastItemStack.lore val lore = fastItemStack.lore
val reforge = ReforgeUtils.getReforge(meta) val reforge = ReforgeUtils.getReforge(meta)
val stone = ReforgeUtils.getReforgeStone(meta)
if (reforge == null && stone == null && target != null) { if (reforge == null && stone == null && target != null) {
if (plugin.configYml.getBool("reforge.show-reforgable")) { if (plugin.configYml.getBool("reforge.show-reforgable")) {
val addLore: MutableList<String> = ArrayList() val addLore: MutableList<String> = ArrayList()
for (string in plugin.configYml.getStrings("reforge.reforgable-suffix")) { for (string in plugin.configYml.getFormattedStrings("reforge.reforgable-suffix")) {
addLore.add(Display.PREFIX + string) addLore.add(Display.PREFIX + string)
} }
lore.addAll(addLore) lore.addAll(addLore)
@@ -55,14 +63,22 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
} }
if (stone != null) { if (stone != null) {
meta.setDisplayName(plugin.configYml.getString("reforge.stone.name").replace("%reforge%", stone.name)) meta.setDisplayName(stone.config.getFormattedString("stone.name"))
SkullUtils.setSkullTexture( val stoneMeta = stone.stone.itemMeta
meta as SkullMeta, if (stoneMeta is SkullMeta) {
stone.config.getString("stone.texture") val stoneTexture = SkullUtils.getSkullTexture(stoneMeta)
)
if (stoneTexture != null) {
try {
SkullUtils.setSkullTexture(meta as SkullMeta, stoneTexture)
} catch (e: StringIndexOutOfBoundsException) {
// Do nothing
}
}
}
itemStack.itemMeta = meta itemStack.itemMeta = meta
val stoneLore = plugin.configYml.getStrings("reforge.stone.lore").map { val stoneLore = stone.config.getFormattedStrings("stone.lore").map {
"${Display.PREFIX}${it.replace("%reforge%", stone.name)}" "${Display.PREFIX}$it"
}.toList() }.toList()
lore.addAll(0, stoneLore) lore.addAll(0, stoneLore)
} }
@@ -76,12 +92,13 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
lore.addAll(addLore) lore.addAll(addLore)
} }
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) { if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName = val displayName = (meta.displayName() ?: Component.translatable(itemStack)).replaceText(replacement)
(if (meta.hasDisplayName()) meta.displayName()!! else Component.translatable(itemStack)) meta.persistentDataContainer.set(
.replaceText( originalComponentKey,
replacement PersistentDataType.STRING,
serializer.serialize(displayName)
) )
val newName = StringUtils.toComponent("§w${reforge.name} §w") val newName = StringUtils.toComponent("${reforge.name} ")
.decoration(TextDecoration.ITALIC, false).append(displayName) .decoration(TextDecoration.ITALIC, false).append(displayName)
meta.displayName(newName) meta.displayName(newName)
} }
@@ -91,21 +108,15 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
} }
override fun revert(itemStack: ItemStack) { override fun revert(itemStack: ItemStack) {
val target = ReforgeTarget.getForItem(itemStack) ReforgeTarget.getForItem(itemStack) ?: return
if (target == null && itemStack.type != Material.PLAYER_HEAD) {
return
}
val meta = itemStack.itemMeta ?: return val meta = itemStack.itemMeta ?: return
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) { if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName = meta.displayName() ?: return val originalName =
meta.displayName( meta.persistentDataContainer.get(originalComponentKey, PersistentDataType.STRING) ?: return
displayName.replaceText( meta.persistentDataContainer.remove(originalComponentKey)
replacement meta.displayName(serializer.deserialize(originalName).replaceText(replacement))
)
)
} }
itemStack.itemMeta = meta itemStack.itemMeta = meta

View File

@@ -1,5 +0,0 @@
package com.willfp.reforges.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
data class ConfiguredEffect(val effect: Effect, val config: JSONConfig)

View File

@@ -1,39 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.attribute.Attribute
import org.bukkit.attribute.AttributeModifier
import org.bukkit.inventory.ItemFlag
import org.bukkit.inventory.meta.ItemMeta
class EffectAttackSpeedMultiplier : Effect("attack_speed_multiplier") {
override fun handleEnabling(
meta: ItemMeta,
config: JSONConfig
) {
meta.addAttributeModifier(
Attribute.GENERIC_ATTACK_SPEED,
AttributeModifier(
this.getUUID(1),
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES)
}
override fun handleDisabling(meta: ItemMeta) {
meta.removeAttributeModifier(
Attribute.GENERIC_ATTACK_SPEED,
AttributeModifier(
this.getUUID(1),
this.id,
0.0,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
}
}

View File

@@ -1,20 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageByEntityEvent
class EffectCritMultiplier : Effect("crit_multiplier") {
override fun onAnyDamage(
attacker: LivingEntity,
victim: LivingEntity,
event: EntityDamageByEntityEvent,
config: JSONConfig
) {
if (attacker.velocity.y > 0) {
return
}
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -1,17 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageByEntityEvent
class EffectDamageMultiplier : Effect("damage_multiplier") {
override fun onAnyDamage(
attacker: LivingEntity,
victim: LivingEntity,
event: EntityDamageByEntityEvent,
config: JSONConfig
) {
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.effects.Effect
import org.bukkit.event.player.PlayerItemDamageEvent
import kotlin.math.ceil
class EffectDurabilityMultiplier : Effect("durability_multiplier") {
override fun onDurabilityDamage(
event: PlayerItemDamageEvent,
config: JSONConfig
) {
val multiplier = config.getDouble("multiplier")
if (multiplier == 0.0) {
event.isCancelled = true
return
}
if (multiplier < 1) {
event.damage *= ceil(1 / multiplier).toInt()
return
}
val chance = 1 - (1 / multiplier)
if (NumberUtils.randFloat(0.0, 1.0) < chance) {
event.isCancelled = true
}
}
}

View File

@@ -1,16 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageEvent
class EffectIncomingDamageMultiplier : Effect("incoming_damage_multiplier") {
override fun onDamageWearingArmor(
victim: LivingEntity,
event: EntityDamageEvent,
config: JSONConfig
) {
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -1,39 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.attribute.Attribute
import org.bukkit.attribute.AttributeModifier
import org.bukkit.inventory.ItemFlag
import org.bukkit.inventory.meta.ItemMeta
class EffectKnockbackMultiplier : Effect("knockback_multiplier") {
override fun handleEnabling(
meta: ItemMeta,
config: JSONConfig
) {
meta.addAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
AttributeModifier(
this.getUUID(1),
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES)
}
override fun handleDisabling(meta: ItemMeta) {
meta.removeAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
AttributeModifier(
this.getUUID(1),
this.id,
0.0,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
}
}

View File

@@ -1,39 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.attribute.Attribute
import org.bukkit.attribute.AttributeModifier
import org.bukkit.inventory.ItemFlag
import org.bukkit.inventory.meta.ItemMeta
class EffectMovementSpeedMultiplier : Effect("movement_speed_multiplier") {
override fun handleEnabling(
meta: ItemMeta,
config: JSONConfig
) {
meta.addAttributeModifier(
Attribute.GENERIC_MOVEMENT_SPEED,
AttributeModifier(
this.getUUID(1),
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES)
}
override fun handleDisabling(meta: ItemMeta) {
meta.removeAttributeModifier(
Attribute.GENERIC_MOVEMENT_SPEED,
AttributeModifier(
this.getUUID(1),
this.id,
0.0,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
}
}

View File

@@ -1,19 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.vault.EconomyHandler
import org.bukkit.block.Block
import org.bukkit.entity.Player
import org.bukkit.event.block.BlockBreakEvent
class EffectRewardBlockBreak : Effect("reward_kill") {
override fun onBlockBreak(
player: Player,
block: Block,
event: BlockBreakEvent,
config: JSONConfig
) {
EconomyHandler.getInstance().depositPlayer(player, config.getDouble("amount"))
}
}

View File

@@ -1,23 +0,0 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.core.events.EntityDeathByEntityEvent
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.vault.EconomyHandler
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
class EffectRewardKill : Effect("reward_kill") {
override fun onKill(
killer: LivingEntity,
victim: LivingEntity,
event: EntityDeathByEntityEvent,
config: JSONConfig
) {
if (killer !is Player) {
return
}
EconomyHandler.getInstance().depositPlayer(killer, config.getDouble("amount"))
}
}

View File

@@ -0,0 +1,190 @@
package com.willfp.reforges.gui
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.FillerMask
import com.willfp.eco.core.gui.slot.MaskMaterials
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.util.ReforgeHandler
import com.willfp.reforges.reforges.util.ReforgeStatus
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import kotlin.math.pow
@Suppress("DEPRECATION")
object ReforgeGUI {
@JvmStatic
lateinit var menu: Menu
init {
update(ReforgesPlugin.getInstance())
}
@JvmStatic
@ConfigUpdater
fun update(plugin: EcoPlugin) {
val handler = ReforgeHandler(plugin)
val activatorSlot = Slot.builder(
ItemStack(Material.ANVIL)
).apply {
setModifier { player, menu, previous ->
val meta = previous.itemMeta ?: return@setModifier
val (status, specialCost) = ReforgeUtils.getStatus(menu.getCaptiveItems(player))
val cost: Double = when {
status == ReforgeStatus.ALLOW || (status == ReforgeStatus.ALLOW_STONE && specialCost < 0) -> {
val amountOfReforges = ReforgeUtils.getReforges(menu.getCaptiveItems(player)[0])
plugin.configYml.getDouble("reforge.cost") *
plugin.configYml.getDouble("reforge.cost-exponent").pow(amountOfReforges)
}
status == ReforgeStatus.ALLOW_STONE -> {
specialCost
}
else -> 0.0 // Never used, but at least kotlin can shut up
}
var xpCost = plugin.configYml.getInt("reforge.xp-cost")
if (status == ReforgeStatus.ALLOW) {
val item = menu.getCaptiveItems(player)[0]
val reforges = ReforgeUtils.getReforges(item)
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
}
when (status) {
ReforgeStatus.INVALID_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.invalid-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.invalid-item.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.invalid-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.allow.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.allow.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW_STONE -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow-stone.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.allow-stone.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.allow-stone.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
.replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player)[1]).name)
}
}
ReforgeStatus.NO_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.no-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.no-item.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.no-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
}
previous.itemMeta = meta
}
onLeftClick(handler::handleReforgeClick)
}.build()
val maskPattern = plugin.configYml.getStrings("gui.mask.pattern", false).toTypedArray()
val maskMaterials = plugin.configYml.getStrings("gui.mask.materials", false)
.mapNotNull { Material.getMaterial(it.uppercase()) }
.toTypedArray()
val allowMaterial =
Material.getMaterial(plugin.configYml.getString("gui.show-allowed.allow-material", false).uppercase())!!
val denyMaterial =
Material.getMaterial(plugin.configYml.getString("gui.show-allowed.deny-material", false).uppercase())!!
val closeMaterial =
Material.getMaterial(plugin.configYml.getString("gui.close.material", false).toUpperCase())!!
menu = Menu.builder(plugin.configYml.getInt("gui.rows")).apply {
setTitle(plugin.langYml.getFormattedString("menu.title"))
setMask(FillerMask(MaskMaterials(*maskMaterials), *maskPattern))
modfiy { builder ->
val slot = Slot.builder(
ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
).apply {
setModifier { player, menu, previous ->
val status = ReforgeUtils.getStatus(
menu.getCaptiveItems(player)
).status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
previous.type = allowMaterial
} else {
previous.type = denyMaterial
}
}
}.build()
val allowedPattern = plugin.configYml.getStrings("gui.show-allowed.pattern")
for (i in 1..allowedPattern.size) {
val row = allowedPattern[i - 1]
for (j in 1..9) {
if (row[j - 1] != '0') {
builder.setSlot(i, j, slot)
}
}
}
}
setSlot(
plugin.configYml.getInt("gui.item-slot.row"),
plugin.configYml.getInt("gui.item-slot.column"),
Slot.builder().setCaptive().build()
)
setSlot(
plugin.configYml.getInt("gui.stone-slot.row"),
plugin.configYml.getInt("gui.stone-slot.column"),
Slot.builder().setCaptive().build()
)
setSlot(
plugin.configYml.getInt("gui.activator-slot.row"),
plugin.configYml.getInt("gui.activator-slot.column"),
activatorSlot
)
setSlot(
plugin.configYml.getInt("gui.close.location.row"),
plugin.configYml.getInt("gui.close.location.column"),
Slot.builder(
ItemStackBuilder(closeMaterial)
.setDisplayName(plugin.langYml.getFormattedString("menu.close"))
.build()
).onLeftClick { event, _, _ ->
event.whoClicked.closeInventory()
}.build()
)
onClose { event, menu ->
DropQueue(event.player as Player)
.addItems(menu.getCaptiveItems(event.player as Player))
.setLocation(event.player.eyeLocation)
.push()
}
}.build()
}
}

View File

@@ -0,0 +1,25 @@
package com.willfp.reforges.integrations.talismans
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeLookup
import com.willfp.talismans.talismans.util.TalismanChecks
import org.bukkit.inventory.ItemStack
object TalismansIntegration : Integration {
@JvmStatic
fun registerProvider() {
ReforgeLookup.registerProvider { player ->
val provided = mutableMapOf<ItemStack, ReforgeTarget.Slot>()
for (itemStack in TalismanChecks.getTalismanItemsOnPlayer(player, true)) {
provided[itemStack] = ReforgeTarget.Slot.ANY
}
provided
}
}
override fun getPluginName(): String {
return "Talismans"
}
}

View File

@@ -1,94 +1,76 @@
package com.willfp.reforges.reforges package com.willfp.reforges.reforges
import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.core.items.CustomItem import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.builder.SkullBuilder import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.recipe.Recipes import com.willfp.eco.core.recipe.Recipes
import com.willfp.libreforge.Holder
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.reforges.ReforgesPlugin import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.conditions.Conditions
import com.willfp.reforges.conditions.ConfiguredCondition
import com.willfp.reforges.effects.ConfiguredEffect
import com.willfp.reforges.effects.Effects
import com.willfp.reforges.reforges.meta.ReforgeTarget import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeUtils import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import java.util.* import java.util.*
@Suppress("DEPRECATION")
class Reforge( class Reforge(
internal val config: JSONConfig, internal val config: Config,
private val plugin: ReforgesPlugin plugin: ReforgesPlugin
) { ) : Holder {
val id = config.getString("id") val id = config.getString("id")
val name = config.getString("name") val name = config.getFormattedString("name")
val description: List<String> = config.getStrings("description") val description: List<String> = config.getFormattedStrings("description")
val targets = config.getStrings("targets").map { ReforgeTarget.getByName(it) }.toSet() val targets = config.getStrings("targets").map { ReforgeTarget.getByName(it) }.toSet()
val effects = config.getSubsections("effects").map { override val effects = config.getSubsections("effects").mapNotNull {
val effect = Effects.getByID(it.getString("id")) ?: return@map null Effects.compile(it, "Reforge ID $id")
ConfiguredEffect(effect, it) }.toSet()
}.filterNotNull().toSet()
val conditions = config.getSubsections("conditions").map { override val conditions = config.getSubsections("conditions").mapNotNull {
val condition = Conditions.getByID(it.getString("id")) ?: return@map null Conditions.compile(it, "Reforge ID $id")
ConfiguredCondition(condition, it) }.toSet()
}.filterNotNull().toSet()
val requiresStone = config.getBool("stone.enabled") val requiresStone = config.getBool("stone.enabled")
val stone: ItemStack = SkullBuilder().apply { val stone: ItemStack = ItemStackBuilder(Items.lookup(config.getString("stone.item")).item).apply {
if (config.getBool("stone.enabled")) { if (config.getBool("stone.enabled")) {
setSkullTexture(config.getString("stone.texture")) setDisplayName(config.getFormattedString("stone.name").replace("%reforge%", name))
setDisplayName(plugin.configYml.getString("stone.name").replace("%reforge%", name))
addLoreLines( addLoreLines(
plugin.configYml.getStrings("stone.lore").map { "${Display.PREFIX}${it.replace("%reforge%", name)}" }) config.getFormattedStrings("stone.lore").map { "${Display.PREFIX}${it.replace("%reforge%", name)}" })
} }
}.build() }.build()
val stonePrice = config.getIntOrNull("stone.price") ?: -1
init { init {
Reforges.addNewReforge(this)
ReforgeUtils.setReforgeStone(stone, this) ReforgeUtils.setReforgeStone(stone, this)
Display.display(stone)
if (config.getBool("stone.enabled")) {
CustomItem( CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id), plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> ReforgeUtils.getReforgeStone(test) == this }, { test -> ReforgeUtils.getReforgeStone(test) == this },
stone stone
).register() ).register()
if (config.getBool("craftable")) { if (config.getBool("stone.craftable")) {
Recipes.createAndRegisterRecipe( Recipes.createAndRegisterRecipe(
plugin, plugin,
"stone_" + this.id, "stone_" + this.id,
stone, stone,
config.getStrings("recipe", false) config.getStrings("stone.recipe", false)
) )
} }
} }
fun handleApplication(itemStack: ItemStack) {
itemStack.itemMeta = this.handleApplication(itemStack.itemMeta ?: return)
}
fun handleApplication(meta: ItemMeta): ItemMeta {
handleRemoval(meta)
for ((effect, config) in this.effects) {
effect.handleEnabling(meta, config)
}
return meta
}
fun handleRemoval(itemStack: ItemStack) {
itemStack.itemMeta = this.handleRemoval(itemStack.itemMeta ?: return)
}
fun handleRemoval(meta: ItemMeta): ItemMeta {
for ((effect, _) in this.effects) {
effect.handleDisabling(meta)
}
return meta
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

View File

@@ -0,0 +1,3 @@
package com.willfp.reforges.reforges.util
data class MetadatedReforgeStatus(val status: ReforgeStatus, val cost: Double)

View File

@@ -0,0 +1,36 @@
package com.willfp.reforges.reforges.util
import com.willfp.eco.core.items.args.LookupArgParser
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.Reforges
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import java.util.function.Predicate
class ReforgeArgParser : LookupArgParser {
override fun parseArguments(
args: Array<String>,
meta: ItemMeta
): Predicate<ItemStack>? {
var reforge: Reforge? = null
for (arg in args) {
val split = arg.split(":").toTypedArray()
if (split.size == 1 || !split[0].equals("reforge", ignoreCase = true)) {
continue
}
val match = Reforges.getByKey(split[1].lowercase()) ?: continue
reforge = match
break
}
reforge ?: return null
ReforgeUtils.setReforge(meta, reforge)
return Predicate { test ->
val testMeta = test.itemMeta ?: return@Predicate false
reforge == ReforgeUtils.getReforge(testMeta)
}
}
}

View File

@@ -1,344 +0,0 @@
package com.willfp.reforges.reforges.util
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.events.EntityDeathByEntityEvent
import com.willfp.eco.core.events.PlayerJumpEvent
import com.willfp.eco.core.integrations.antigrief.AntigriefManager
import com.willfp.eco.core.integrations.mcmmo.McmmoManager
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.reforges.ReforgeLookup
import org.bukkit.entity.*
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.entity.ProjectileHitEvent
import org.bukkit.event.entity.ProjectileLaunchEvent
import org.bukkit.event.player.PlayerItemDamageEvent
class WatcherTriggers(
private val plugin: EcoPlugin
) : Listener {
@EventHandler(ignoreCancelled = true)
fun onBlockBreak(event: BlockBreakEvent) {
if (McmmoManager.isFake(event)) {
return
}
val player = event.player
val block = event.block
if (!AntigriefManager.canBreakBlock(player, block)) {
return
}
for (reforge in ReforgeLookup.provideReforges(player)) {
for ((key, value) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > value.getDoubleOrNull("chance") ?: 100.0) {
continue
}
key.onBlockBreak(player, block, event, value)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onArrowDamage(event: EntityDamageByEntityEvent) {
if (McmmoManager.isFake(event)) {
return
}
val arrow = event.damager
val victim = event.entity
if (arrow !is Arrow) {
return
}
if (victim !is LivingEntity) {
return
}
val shooter = arrow.shooter
if (shooter !is Player) {
return
}
if (!AntigriefManager.canInjure(shooter, victim)) {
return
}
if (event.isCancelled) {
return
}
for (reforge in ReforgeLookup.provideReforges(shooter)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onArrowDamage(shooter, victim, arrow, event, config)
effect.onAnyDamage(shooter, victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onTridentDamage(event: EntityDamageByEntityEvent) {
if (McmmoManager.isFake(event)) {
return
}
val trident = event.damager
val victim = event.entity
if (trident !is Trident) {
return
}
if (victim !is LivingEntity) {
return
}
val shooter = trident.shooter
if (shooter !is Player) {
return
}
val item = trident.item
if (!AntigriefManager.canInjure(shooter, victim)) {
return
}
if (event.isCancelled) {
return
}
val tridentReforge = ReforgeUtils.getReforge(item)
val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge)
for (reforge in ReforgeLookup.provideReforges(shooter) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onTridentDamage(shooter, victim, trident, event, config)
effect.onAnyDamage(shooter, victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onJump(event: PlayerJumpEvent) {
if (McmmoManager.isFake(event)) {
return
}
val player = event.player
for (reforge in ReforgeLookup.provideReforges(player)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onJump(player, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onMeleeAttack(event: EntityDamageByEntityEvent) {
if (McmmoManager.isFake(event)) {
return
}
val attacker = event.damager
if (attacker !is Player) {
return
}
val victim = event.entity
if (victim !is LivingEntity) {
return
}
if (event.isCancelled) {
return
}
if (event.cause == EntityDamageEvent.DamageCause.THORNS) {
return
}
if (!AntigriefManager.canInjure(attacker, victim)) {
return
}
for (reforge in ReforgeLookup.provideReforges(attacker)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onMeleeAttack(attacker, victim, event, config)
effect.onAnyDamage(attacker, victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onKill(event: EntityDeathByEntityEvent) {
if (McmmoManager.isFake(event)) {
return
}
var killer: Any? = null
if (event.killer is Player) {
killer = event.killer
} else if (event.killer is Projectile) {
if ((event.killer as Projectile).shooter is Player) {
killer = (event.killer as Projectile).shooter
}
}
if (killer !is Player) {
return
}
val victim = event.victim
if (!AntigriefManager.canInjure(killer, victim)) {
return
}
val trident = if (event.killer is Trident) (event.killer as Trident).item else null
val tridentReforge = if (trident == null) null else ReforgeUtils.getReforge(trident)
val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge)
for (reforge in ReforgeLookup.provideReforges(killer) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onKill(killer, victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onProjectileLaunch(event: ProjectileLaunchEvent) {
if (McmmoManager.isFake(event)) {
return
}
val shooter = event.entity.shooter
if (shooter !is Player) {
return
}
for (reforge in ReforgeLookup.provideReforges(shooter)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onProjectileLaunch(shooter, event.entity, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onFallDamage(event: EntityDamageEvent) {
if (McmmoManager.isFake(event)) {
return
}
if (event.cause != EntityDamageEvent.DamageCause.FALL) {
return
}
val victim = event.entity
if (victim !is Player) {
return
}
for (reforge in ReforgeLookup.provideReforges(victim)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onFallDamage(victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onProjectileHit(event: ProjectileHitEvent) {
if (McmmoManager.isFake(event)) {
return
}
val projectile = event.entity
val shooter = projectile.shooter
if (shooter !is Player) {
return
}
val trident = if (projectile is Trident) projectile.item else null
val tridentReforge = if (trident == null) null else ReforgeUtils.getReforge(trident)
val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge)
for (reforge in ReforgeLookup.provideReforges(shooter) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onProjectileHit(shooter, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onDurabilityDamage(event: PlayerItemDamageEvent) {
if (McmmoManager.isFake(event)) {
return
}
val item = event.item
val reforge = ReforgeUtils.getReforge(item) ?: return
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onDurabilityDamage(event, config)
}
}
@EventHandler(ignoreCancelled = true)
fun onDamageWearingArmor(event: EntityDamageEvent) {
if (McmmoManager.isFake(event)) {
return
}
val victim = event.entity
if (victim !is Player) {
return
}
for (reforge in ReforgeLookup.provideReforges(victim)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onDamageWearingArmor(victim, event, config)
}
}
}
}

View File

@@ -43,6 +43,10 @@ gui:
- "100000001" - "100000001"
- "100000001" - "100000001"
activator-slot:
row: 2
column: 5
stone-slot: stone-slot:
row: 4 row: 4
column: 7 column: 7
@@ -119,6 +123,7 @@ gui:
reforge: reforge:
cost: 7500 cost: 7500
xp-cost: 0 # In levels xp-cost: 0 # In levels
use-player-points: false
cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost
@@ -130,9 +135,16 @@ reforge:
display-in-lore: true display-in-lore: true
display-in-name: true # Requires paper to be installed on the server display-in-name: true # Requires paper to be installed on the server
stone: cooldown:
name: "%reforge%&f Reforge Stone" in-actionbar: true
lore: sound:
- "&7Place on the right of the" enabled: true
- "&7reforge menu to apply the" sound: "BLOCK_NOTE_BLOCK_PLING"
- "%reforge%&7 reforge!" pitch: 0.5
cannot-afford:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5

View File

@@ -3,7 +3,7 @@ messages:
no-permission: "&cYou don't have permission to do this!" no-permission: "&cYou don't have permission to do this!"
not-player: "&cThis command must be run by a player" not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!" invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded! (Restart if you're removed reforges!)" reloaded: "Reloaded! (Restart if you're removed reforges!) Took %time%ms"
insufficient-money: "&cYou don't have enough money for this!" insufficient-money: "&cYou don't have enough money for this!"
insufficient-xp: "&cYou don't have enough xp levels for this!" insufficient-xp: "&cYou don't have enough xp levels for this!"
applied-reforge: "Applied %reforge%&r reforge!" applied-reforge: "Applied %reforge%&r reforge!"
@@ -12,6 +12,8 @@ messages:
needs-stone: "&cYou must specify a reforge stone" needs-stone: "&cYou must specify a reforge stone"
invalid-stone: "&cInvalid reforge!" invalid-stone: "&cInvalid reforge!"
give-success: "Gave &a%reforge%&r reforge stone to &a%recipient%" give-success: "Gave &a%reforge%&r reforge stone to &a%recipient%"
on-cooldown: "&cThis reforge is on cooldown! &fTime left: &a%seconds% seconds"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
menu: menu:
title: "Reforge Item" title: "Reforge Item"

View File

@@ -10,8 +10,13 @@ depend:
- ProtocolLib - ProtocolLib
softdepend: softdepend:
- Vault - Vault
- EcoSkills
- Talismans
- AureliumSkills
- PlayerPoints
- Jobs
libraries: libraries:
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21' - 'org.jetbrains.kotlin:kotlin-stdlib:1.6.0'
commands: commands:
reforges: reforges:

View File

@@ -1,473 +0,0 @@
{
"reforges": [
{
"id": "acute",
"name": "<gradient:#4776E6>Acute</gradient:#8E54E9>",
"description": [
"&a+2% &fTriple Damage Chance"
],
"targets": [
"axe"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 3,
"chance": 2
}
],
"conditions": []
},
{
"id": "aerobic",
"name": "<gradient:#B993D6>Aerobic</gradient:#8CA6DB>",
"description": [
"&a+9% &fDamage when shot in air"
],
"targets": [
"bow"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.09
}
],
"conditions": [
{
"id": "in_air"
}
]
},
{
"id": "durable",
"name": "<gradient:#0EA3C3>Durable</gradient:#0BCBC8>",
"description": [
"&a+15% &fMore durability"
],
"targets": [
"all"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "durability_multiplier",
"multiplier": 1.15
}
],
"conditions": [
]
},
{
"id": "dynamic",
"name": "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>",
"description": [
"&a+5% &fDamage",
"&a+10% &fCrit Damage"
],
"targets": [
"melee"
],
"stone": {
"enabled": true,
"texture": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0=",
"craftable": true,
"recipe": [
"air",
"ecoitems:blank_reforge_stone ? air",
"air",
"iron_block",
"daylight_sensor",
"iron_block",
"air",
"phantom_membrane",
"air"
]
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.05
},
{
"id": "crit_multiplier",
"multiplier": 1.10
}
],
"conditions": [
]
},
{
"id": "evasive",
"name": "<gradient:#EFEFBB>Evasive</gradient:#D4D3DD>",
"description": [
"&a+2% &fIgnore Damage Chance"
],
"targets": [
"armor"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "incoming_damage_multiplier",
"multiplier": 0,
"chance": 2
}
],
"conditions": [
]
},
{
"id": "gravitated",
"name": "<gradient:#1e3c72>Gravitated</gradient:#2a5298>",
"description": [
"&a+8% &fCritical Damage"
],
"targets": [
"melee"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "crit_multiplier",
"multiplier": 1.08
}
],
"conditions": [
]
},
{
"id": "light",
"name": "<gradient:#1c92d2>Light</gradient:#f2fcfe>",
"description": [
"&c-5% &fDamage",
"&c-5% &fKnockback",
"&a+10% &fAttack Speed"
],
"targets": [
"melee"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 0.95
},
{
"id": "knockback_multiplier",
"multiplier": 0.95
},
{
"id": "attack_speed_multiplier",
"multiplier": 1.1
}
],
"conditions": [
]
},
{
"id": "nautical",
"name": "<gradient:#373B44>Nautical</gradient:#4286f4>",
"description": [
"&a+20% &fDamage in water"
],
"targets": [
"melee",
"bow",
"trident"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.2
}
],
"conditions": [
{
"id": "in_water"
}
]
},
{
"id": "pointy",
"name": "<gradient:#076585>Pointy</gradient:#ffffff>",
"description": [
"&a+10% &fDamage"
],
"targets": [
"trident"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.1
}
],
"conditions": [
]
},
{
"id": "prospecting",
"name": "<gradient:#00B4DB>Prospecting</gradient:#0083B0>",
"description": [
"&a+5% &fChance to get &e\u00242&f for mining a block"
],
"targets": [
"pickaxe"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "reward_block_break",
"amount": 2,
"chance": 5
}
],
"conditions": [
]
},
{
"id": "reinforced",
"name": "<gradient:#FBD786>Reinforced</gradient:#f7797d>",
"description": [
"&a+4% &fDamage Resistance"
],
"targets": [
"armor"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "incoming_damage_multiplier",
"multiplier": 0.96
}
],
"conditions": [
]
},
{
"id": "rich",
"name": "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>",
"description": [
"&a+\u002450 &fFor each mob kill"
],
"targets": [
"trident",
"bow"
],
"stone": {
"enabled": true,
"texture": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2RjNTdjNzVhZGYzOWVjNmYwZTA5MTYwNDlkZDk2NzFlOThhOGExZTYwMDEwNGU4NGU2NDVjOTg4OTUwYmQ3In19fQ==",
"craftable": true,
"recipe": [
"gold_block",
"trident",
"gold_block",
"air",
"ecoitems:blank_reforge_stone ? obsidian",
"air",
"gold_block",
"bow",
"gold_block"
]
},
"effects": [
{
"id": "reward_kill",
"amount": 50
}
],
"conditions": [
]
},
{
"id": "sharp",
"name": "<gradient:#f12711>Sharp</gradient:#f5af19>",
"description": [
"&a+3% &fDamage"
],
"targets": [
"melee"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.03
}
],
"conditions": [
]
},
{
"id": "streamlined",
"name": "<gradient:#74ebd5>Streamlined</gradient:#ACB6E5>",
"description": [
"&a+4% &fDamage"
],
"targets": [
"bow"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.04
}
],
"conditions": [
]
},
{
"id": "strong",
"name": "<gradient:#ED213A>Strong</gradient:#93291E>",
"description": [
"&a+2% &fDamage",
"&a+10% &fKnockback"
],
"targets": [
"melee"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "damage_multiplier",
"multiplier": 1.02
},
{
"id": "knockback_multiplier",
"multiplier": 1.1
}
],
"conditions": [
]
},
{
"id": "thin",
"name": "<gradient:#D1913C>Thin</gradient:#FFD194>",
"description": [
"&c-5% &fDamage Resistance",
"&a+2.5% &fMovement Speed"
],
"targets": [
"armor"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "incoming_damage_multiplier",
"multiplier": 1.05
},
{
"id": "movement_speed_multiplier",
"multiplier": 1.025
}
],
"conditions": [
]
},
{
"id": "tough",
"name": "<gradient:#a73737>Tough</gradient:#7a2828>",
"description": [
"&c+8% &fDamage Resistance",
"&a-5% &fMovement Speed"
],
"targets": [
"armor"
],
"stone": {
"enabled": false,
"texture": "",
"craftable": false,
"recipe": []
},
"effects": [
{
"id": "incoming_damage_multiplier",
"multiplier": 0.92
},
{
"id": "movement_speed_multiplier",
"multiplier": 0.95
}
],
"conditions": [
]
}
]
}

View File

@@ -0,0 +1,385 @@
reforges:
- id: acute
name: "<gradient:#4776E6>Acute</gradient:#8E54E9>"
description:
- "&a+2% &fTriple Damage Chance"
targets:
- axe
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 3
chance: 2
triggers:
- melee_attack
conditions: []
- id: aerobic
name: "<gradient:#B993D6>Aerobic</gradient:#8CA6DB>"
description:
- "&a+9% &fDamage when shot in air"
targets:
- bow
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.09
triggers:
- bow_attack
conditions:
- id: in_air
args:
in_air: true
- id: dynamic
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>"
description:
- "&a+5% &fDamage"
- "&a+10% &fCrit Damage"
targets:
- melee
stone:
enabled: true
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&f Reforge Stone"
lore:
- "&7Place on the right of the"
- "&7reforge menu to apply the"
- "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&7 reforge!"
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0=
craftable: true
recipe:
- air
- ecoitems:blank_reforge_stone ? air
- air
- iron_block
- daylight_sensor
- iron_block
- air
- phantom_membrane
- air
effects:
- id: damage_multiplier
args:
multiplier: 1.05
triggers:
- melee_attack
- id: crit_multiplier
args:
multiplier: 1.1
triggers:
- melee_attack
conditions: []
- id: evasive
name: "<gradient:#EFEFBB>Evasive</gradient:#D4D3DD>"
description:
- "&a+2% &fIgnore Damage Chance"
targets:
- armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 0
chance: 2
triggers:
- take_damage
conditions: []
- id: gravitated
name: "<gradient:#1e3c72>Gravitated</gradient:#2a5298>"
description:
- "&a+8% &fCritical Damage"
targets:
- melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: crit_multiplier
args:
multiplier: 1.08
triggers:
- melee_attack
conditions: []
- id: light
name: "<gradient:#1c92d2>Light</gradient:#f2fcfe>"
description:
- "&c-5% &fDamage"
- "&c-5% &fKnockback"
- "&a+10% &fAttack Speed"
targets:
- melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 0.95
triggers:
- melee_attack
- id: knockback_multiplier
args:
multiplier: 0.95
- id: attack_speed_multiplier
args:
multiplier: 1.1
conditions: []
- id: nautical
name: "<gradient:#373B44>Nautical</gradient:#4286f4>"
description:
- "&a+20% &fDamage in water"
targets:
- melee
- bow
- trident
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.2
triggers:
- melee_attack
- bow_attack
- trident_attack
conditions:
- id: in_water
args:
in_water: true
- id: pointy
name: "<gradient:#076585>Pointy</gradient:#ffffff>"
description:
- "&a+10% &fDamage"
targets:
- trident
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.1
triggers:
- trident_attack
conditions: []
- id: prospecting
name: "<gradient:#00B4DB>Prospecting</gradient:#0083B0>"
description:
- "&a+5% &fChance to get &e$$2&f for mining a block"
targets:
- pickaxe
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: give_money
args:
amount: 2
chance: 5
triggers:
- mine_block
conditions: []
- id: reinforced
name: "<gradient:#FBD786>Reinforced</gradient:#f7797d>"
description:
- "&a+4% &fDamage Resistance"
targets:
- armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 0.96
triggers:
- take_damage
conditions: []
- id: rich
name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>"
description:
- "&a+$$50 &fFor each mob kill"
targets:
- trident
- bow
stone:
enabled: true
name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>&f Reforge Stone"
lore:
- "&7Place on the right of the"
- "&7reforge menu to apply the"
- "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>&7 reforge!"
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2RjNTdjNzVhZGYzOWVjNmYwZTA5MTYwNDlkZDk2NzFlOThhOGExZTYwMDEwNGU4NGU2NDVjOTg4OTUwYmQ3In19fQ==
craftable: true
recipe:
- gold_block
- trident
- gold_block
- air
- ecoitems:blank_reforge_stone ? obsidian
- air
- gold_block
- bow
- gold_block
effects:
- id: give_money
args:
amount: 50
triggers:
- kill
conditions: []
- id: sharp
name: "<gradient:#f12711>Sharp</gradient:#f5af19>"
description:
- "&a+3% &fDamage"
targets:
- melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.03
triggers:
- melee_attack
conditions: []
- id: streamlined
name: "<gradient:#74ebd5>Streamlined</gradient:#ACB6E5>"
description:
- "&a+4% &fDamage"
targets:
- bow
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.04
triggers:
- bow_attack
conditions: []
- id: strong
name: "<gradient:#ED213A>Strong</gradient:#93291E>"
description:
- "&a+2% &fDamage"
- "&a+10% &fKnockback"
targets:
- melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.02
triggers:
- melee_attack
- id: knockback_multiplier
args:
multiplier: 1.1
conditions: []
- id: thin
name: "<gradient:#D1913C>Thin</gradient:#FFD194>"
description:
- "&c-5% &fDamage Resistance"
- "&a+2.5% &fMovement Speed"
targets:
- armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 1.05
triggers:
- take_damage
- id: movement_speed_multiplier
args:
multiplier: 1.025
conditions: []
- id: tough
name: "<gradient:#a73737>Tough</gradient:#7a2828>"
description:
- "&c+8% &fDamage Resistance"
- "&a-5% &fMovement Speed"
targets:
- armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects:
- id: damage_multiplier
args:
multiplier: 0.92
triggers:
- take_damage
- id: movement_speed_multiplier
args:
multiplier: 0.95
conditions: []

View File

@@ -1,4 +1,15 @@
#
# A target consists of items and a slot.
# The slot is either hands, armor, or any.
# Hands means the reforge will activate on hands, armor
# means it will only work on armor, and any
# means it will activate whenever its on the player.
#
pickaxe: pickaxe:
slot: hands
items:
- wooden_pickaxe - wooden_pickaxe
- stone_pickaxe - stone_pickaxe
- iron_pickaxe - iron_pickaxe
@@ -6,6 +17,8 @@ pickaxe:
- diamond_pickaxe - diamond_pickaxe
- netherite_pickaxe - netherite_pickaxe
axe: axe:
slot: hands
items:
- wooden_axe - wooden_axe
- stone_axe - stone_axe
- iron_axe - iron_axe
@@ -13,6 +26,8 @@ axe:
- diamond_axe - diamond_axe
- netherite_axe - netherite_axe
melee: melee:
slot: hands
items:
- wooden_axe - wooden_axe
- stone_axe - stone_axe
- iron_axe - iron_axe
@@ -26,11 +41,17 @@ melee:
- diamond_sword - diamond_sword
- netherite_sword - netherite_sword
trident: trident:
slot: hands
items:
- trident - trident
bow: bow:
slot: hands
items:
- bow - bow
- crossbow - crossbow
armor: armor:
slot: armor
items:
- turtle_helmet - turtle_helmet
- leather_helmet - leather_helmet
- chainmail_helmet - chainmail_helmet

View File

@@ -1,2 +1,2 @@
version = 2.0.0 version = 4.26.0
plugin-name = Reforges plugin-name = Reforges

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -1,6 +1,6 @@
jdk: openjdk16 jdk: openjdk17
before_install: before_install:
- source "$HOME/.sdkman/bin/sdkman-init.sh" - source "$HOME/.sdkman/bin/sdkman-init.sh"
- sdk update - sdk update
- sdk install java 16.0.1-open - sdk install java 17.0.1-tem
- sdk use java 16.0.1-open - sdk use java 17.0.1-tem