9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-20 07:29:32 +00:00

Compare commits

...

410 Commits

Author SHA1 Message Date
Auxilor
060b981019 libreforge-updater 2022-07-09 12:11:45 +01:00
Auxilor
d559684d7b libreforge-updater 2022-07-05 18:33:18 +01:00
Auxilor
f40cd6f68f libreforge-updater 2022-07-04 18:46:16 +01:00
Auxilor
f185ab58ad libreforge-updater 2022-06-30 22:55:30 +01:00
Auxilor
bed87f4210 libreforge-updater 2022-06-30 22:35:30 +01:00
Auxilor
df9cecc2fd libreforge-updater 2022-06-26 13:02:05 +01:00
Auxilor
72d0e258f4 libreforge-updater 2022-06-25 22:23:55 +01:00
Auxilor
224c243449 libreforge-updater 2022-06-24 13:58:59 +01:00
Auxilor
b925a18ea0 libreforge-updater 2022-06-22 22:25:52 +01:00
Auxilor
801e61c66c libreforge-updater 2022-06-22 12:44:00 +01:00
Auxilor
0c58faf33e libreforge-updater 2022-06-21 08:28:24 +01:00
Auxilor
04cff9070b libreforge-updater 2022-06-20 21:38:28 +01:00
Auxilor
57aee104aa libreforge-updater 2022-06-20 14:18:01 +01:00
Auxilor
bbfeac1cde libreforge-updater 2022-06-19 12:19:03 +01:00
Auxilor
a5b9446afe libreforge-updater 2022-06-18 12:20:23 +01:00
Auxilor
a99e34014f libreforge-updater 2022-06-17 21:35:44 +01:00
Auxilor
3f9ddf08fb libreforge-updater 2022-06-17 15:27:11 +01:00
Auxilor
176b8cae9a libreforge-updater 2022-06-16 16:43:38 +01:00
Auxilor
3cca475d13 libreforge-updater 2022-06-15 15:13:07 +01:00
Auxilor
d4f2f1c7c8 libreforge-updater 2022-06-15 15:11:22 +01:00
Auxilor
87c6481701 libreforge-updater 2022-06-14 16:44:46 +01:00
Auxilor
b184c10f02 libreforge-updater 2022-06-14 09:10:06 +01:00
Auxilor
5428be88ea libreforge-updater 2022-06-13 11:45:21 +01:00
Auxilor
79b96193f1 Fixed softdepends 2022-06-12 19:13:28 +01:00
Auxilor
fc68463b5c Updated to 5.10.0 2022-06-11 11:17:06 +01:00
Auxilor
bc5b2dedd3 libreforge-updater 2022-06-11 11:13:58 +01:00
Auxilor
3128091722 libreforge-updater 2022-06-11 11:13:52 +01:00
Auxilor
0887d8af75 libreforge-updater 2022-06-08 21:06:44 +01:00
Auxilor
b879d87720 libreforge-updater 2022-06-06 13:30:11 +01:00
Auxilor
daf5e23b39 Fixed EcoBosses softdepend 2022-06-05 10:41:06 +01:00
Auxilor
850455e4c2 libreforge-updater 2022-06-04 13:45:01 +01:00
Auxilor
0e0e986906 libreforge-updater 2022-06-03 11:36:21 +01:00
Auxilor
3b2f77a83b libreforge-updater 2022-05-31 19:45:54 +01:00
Auxilor
5c429ee626 libreforge-updater 2022-05-30 17:05:26 +01:00
Auxilor
3749edc5c1 libreforge-updater 2022-05-30 11:11:27 +01:00
Auxilor
a0b3b62040 Updated libreforge 2022-05-28 18:23:00 +01:00
Auxilor
12b1b99466 Updated eco 2022-05-28 18:15:53 +01:00
Auxilor
b4c071fd53 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle
#	gradle.properties
2022-05-28 18:15:23 +01:00
Auxilor
93a8937222 libreforge-updater 2022-05-28 18:14:59 +01:00
Auxilor
a565e3d3e7 libreforge-updater 2022-05-27 19:25:44 +01:00
Auxilor
3c92da1998 libreforge-updater 2022-05-25 10:57:27 +01:00
Auxilor
87a240d5d3 libreforge-updater 2022-05-23 16:03:37 +01:00
Auxilor
22b0279057 libreforge-updater 2022-05-22 20:43:14 +01:00
Auxilor
3743d06cb3 More improvements and fixes 2022-05-22 19:55:19 +01:00
Auxilor
c008a17a27 Various rewrites, refinements, and improvements 2022-05-22 19:21:31 +01:00
Auxilor
9e0c76b840 GUI Improvements 2022-05-22 18:44:27 +01:00
Auxilor
f0891d5cdd Updated to 5.0.0 2022-05-22 18:34:17 +01:00
Auxilor
f884fe24f6 Fixed suppression 2022-05-22 18:34:03 +01:00
Auxilor
cf9cbef409 Removed last traces of java 2022-05-22 18:33:35 +01:00
Auxilor
73abe51241 Rename .java to .kt 2022-05-22 18:33:34 +01:00
Auxilor
d74bd7a281 libreforge-updater 2022-05-22 15:27:50 +01:00
Auxilor
62722972de libreforge-updater 2022-05-21 17:34:43 +01:00
Auxilor
94200719c7 libreforge-updater 2022-05-20 18:37:38 +01:00
Auxilor
44313e9411 libreforge-updater 2022-05-20 18:36:36 +01:00
Auxilor
aab008df45 libreforge-updater 2022-05-20 18:28:12 +01:00
Auxilor
31e063e156 libreforge-updater 2022-05-20 14:21:11 +01:00
Auxilor
c607233958 libreforge-updater 2022-05-19 20:41:30 +01:00
Auxilor
c4552588fe libreforge-updater 2022-05-18 15:32:11 +01:00
Auxilor
7a2a8b5c56 libreforge-updater 2022-05-17 18:53:48 +01:00
Auxilor
eff67cf2e7 libreforge-updater 2022-05-16 21:45:45 +01:00
Auxilor
f81bf62d98 Fixed not met line display 2022-05-16 13:39:36 +01:00
Auxilor
dc7a095eb9 Updated libreforge 2022-05-16 13:11:33 +01:00
Auxilor
0df4338aa3 libreforge-updater 2022-05-15 14:27:17 +01:00
Auxilor
957ed47806 libreforge-updater 2022-05-15 13:57:35 +01:00
Auxilor
6502e6d861 libreforge-updater 2022-05-15 13:36:25 +01:00
Auxilor
39f9b29164 "libreforge-updater" 2022-05-15 13:33:17 +01:00
Auxilor
f098b1e460 Updated libreforge 2022-05-14 21:05:26 +01:00
Auxilor
4f7d0b2d5f Updated libreforge 2022-05-14 12:13:33 +01:00
Auxilor
951a80cb8e Updated libreforge 2022-05-13 16:01:16 +01:00
Auxilor
2fb64eee53 Updated libreforge 2022-05-12 17:22:26 +01:00
Auxilor
cde47a792f Updated libreforge 2022-05-11 15:19:28 +01:00
Auxilor
82193f3678 Updated libreforge 2022-05-08 16:20:21 +01:00
Auxilor
abba90580e Updated libreforge 2022-05-05 21:25:32 +01:00
Auxilor
06787017e5 Updated to 4.66.1 2022-05-04 13:08:29 +01:00
Auxilor
67108a9898 Added no-reforgable-in-gui 2022-05-04 13:08:19 +01:00
Auxilor
a359e9ce59 Updated libreforge 2022-05-03 18:37:02 +01:00
Auxilor
f65ec9ed4d Updated libreforge 2022-05-01 17:41:40 +01:00
Auxilor
65864b19e2 Updated libreforge 2022-04-30 11:38:41 +01:00
Auxilor
6934d29368 Updated to 4.64.3 2022-04-29 15:12:03 +01:00
Auxilor
6e80509416 Removed ItemMeta from display 2022-04-29 15:11:55 +01:00
Auxilor
c53da12086 Updated libreforge 2022-04-29 10:21:25 +01:00
Auxilor
d380e0e7be Updated libreforge 2022-04-27 19:13:53 +01:00
Auxilor
4f47e4ade4 Updated libreforge 2022-04-27 10:39:14 +01:00
Auxilor
77beb2f1f1 Updated libreforge 2022-04-24 19:07:03 +01:00
Auxilor
832c508f76 Bumped version 2022-04-20 18:22:34 +01:00
Auxilor
fa0ba538ba Updated eco/kotlin/libreforge 2022-04-20 11:47:29 +01:00
Auxilor
1f4b7159ed Updated libreforge 2022-04-16 15:48:33 +01:00
Auxilor
29ba89deeb Improved performance with new FIS API 2022-04-13 13:38:08 +01:00
Auxilor
76025bc881 Updated to 4.61.1 2022-04-12 11:34:24 +01:00
Auxilor
25aff21177 Updated to 4.61.1 2022-04-09 14:41:50 +01:00
Auxilor
79c4270737 Updated to 4.61.1 2022-04-06 14:20:12 +01:00
Auxilor
ccc9837c51 Updated to 4.61.1 2022-04-05 16:35:36 +01:00
Auxilor
5d86b4161b Fixed closing the GUI dropping items on ground 2022-04-05 16:35:25 +01:00
Auxilor
b1604bcb32 Updated libreforge 2022-04-04 10:25:18 +01:00
Auxilor
86a6e73a8f Fixed maskmaterials 2022-04-02 14:07:12 +01:00
Auxilor
62c5555eb0 Updated libreforge 2022-04-02 14:06:20 +01:00
Auxilor
16b2d2eb28 Updated libreforge 2022-03-31 20:53:37 +01:00
Auxilor
4d2ab8d59b Updated libreforge 2022-03-30 20:39:45 +01:00
Auxilor
bdf297a6cb Updated libreforge 2022-03-28 19:08:05 +01:00
Auxilor
8835ffbed2 Updated to 4.56.1 2022-03-27 13:29:17 +01:00
Auxilor
5a74db19d1 Added serializeBack to reforge arg parser 2022-03-27 13:28:59 +01:00
Auxilor
f86fb4fd9d Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle
#	gradle.properties
2022-03-27 13:27:56 +01:00
Auxilor
b794bc9fa0 Updated libreforge 2022-03-25 09:34:54 +00:00
Auxilor
7667c6b992 Updated to 4.55.2 2022-03-22 16:37:01 +00:00
Auxilor
e469b725bc Fixed another deprecated method 2022-03-22 16:36:52 +00:00
Auxilor
07fcfdf375 Updated to 4.55.1 2022-03-22 16:34:38 +00:00
Auxilor
79e55173ac Fixed deprecated method use breaking eco compatibility 2022-03-22 16:34:29 +00:00
Auxilor
b27ebd78b9 Updated to 4.55.0 2022-03-21 10:49:35 +00:00
Auxilor
df23fcf4dd Updated libreforge to 3.27.1 2022-03-21 10:49:25 +00:00
Auxilor
07f5cd1d71 Added price multipliers 2022-03-21 10:48:51 +00:00
Auxilor
2245d9e50e Updated libreforge 2022-03-19 16:42:35 +00:00
Auxilor
9f2913e0a2 Updated libreforge 2022-03-17 09:00:24 +00:00
Auxilor
f16fcb6220 Updated libreforge 2022-03-15 22:37:54 +00:00
Auxilor
f99d05017d Updated to 4.52.2 2022-03-14 10:04:37 +00:00
Auxilor
eb65569c78 Reduced display priority 2022-03-14 10:04:14 +00:00
Auxilor
374aba5da6 Updated libreforge 2022-03-13 12:02:18 +00:00
Auxilor
ad40b2fc45 Updated libreforge 2022-03-12 12:30:07 +00:00
Auxilor
9827c839eb Updated libreforge 2022-03-10 19:53:03 +00:00
Auxilor
1cd9169ffc Updated libreforge 2022-03-09 12:51:55 +00:00
Will FP
a9ce849c78 Update README.md 2022-03-09 12:46:16 +00:00
Auxilor
8840944711 Updated libreforge 2022-03-08 20:27:30 +00:00
Auxilor
37c6ad2cf9 Updated libreforge 2022-03-07 14:03:00 +00:00
Auxilor
7368b7a204 Updated to 4.48.1 2022-03-06 20:53:10 +00:00
Auxilor
e96e5ca5c7 Updated talismans integration 2022-03-06 20:50:55 +00:00
Auxilor
aaa1513219 Updated talismans integration 2022-03-06 20:49:35 +00:00
Auxilor
c2f1ba06b5 Updated to 4.48.0 2022-03-06 12:43:10 +00:00
Auxilor
349b4fb7bd Added /reforges apply 2022-03-06 12:42:58 +00:00
Auxilor
bfd5736781 Updated libreforge 2022-03-04 13:33:33 +00:00
Auxilor
82e6f61469 Updated libreforge 2022-03-01 16:20:05 +00:00
Auxilor
208689f5db Updated libreforge 2022-02-28 10:32:54 +00:00
Auxilor
e504b53c8b Added no-offhand option 2022-02-25 11:48:12 +00:00
Auxilor
816ae80f45 Updated libreforge 2022-02-25 11:46:36 +00:00
Auxilor
ea575d7dab Updated libreforge 2022-02-20 17:24:40 +00:00
Auxilor
2e9878dfd0 Updated libreforge 2022-02-19 16:06:05 +00:00
Auxilor
ffbe0d4e6c Added messages to build.gradle 2022-02-18 15:09:33 +00:00
Auxilor
e73c3feb29 Updated libreforge 2022-02-18 14:34:54 +00:00
Auxilor
8f63e4b09e Updated libreforge 2022-02-15 16:47:24 +00:00
Auxilor
10b3b5c40c Updated libreforge 2022-02-14 17:16:10 +00:00
Auxilor
107a67dcab Updated libreforge 2022-02-13 15:39:35 +00:00
Auxilor
efd0b0d46d Updated libreforge 2022-02-12 10:50:55 +00:00
Auxilor
54f62474ec Updated libreforge 2022-02-10 11:01:19 +00:00
Auxilor
cec260b708 Updated libreforge 2022-02-09 20:26:30 +00:00
Auxilor
f8b508a7df Updated libreforge 2022-02-08 20:45:25 +00:00
Auxilor
daaf8c7170 Updated libreforge 2022-02-08 14:02:42 +00:00
Auxilor
e13a7531b2 Fixed dumbassery 2022-02-07 11:52:52 +00:00
Auxilor
ef5b811f22 Updated libreforge 2022-02-07 11:34:30 +00:00
Auxilor
ac2d4c61c2 Updated libreforge 2022-02-07 11:30:44 +00:00
Auxilor
ac6fe76559 Updated libreforge 2022-02-06 17:41:12 +00:00
Auxilor
2f9f08e182 Updated libreforge 2022-02-06 14:51:22 +00:00
Auxilor
97e1dbefed Updated libreforge 2022-02-05 14:16:47 +00:00
Auxilor
49dfaaa893 Updated libreforge 2022-02-05 13:40:01 +00:00
Auxilor
a03d0c8e4c Updated libreforge 2022-02-05 11:20:44 +00:00
Auxilor
866be27aef Updated libreforge 2022-02-04 18:47:28 +00:00
Auxilor
bdf0963120 Updated libreforge 2022-02-04 10:31:16 +00:00
Auxilor
f2cf0b5361 Updated to 4.38.1 2022-02-03 19:07:25 +00:00
Auxilor
a79a05ba08 Updated libreforge 2022-02-03 09:22:34 +00:00
Auxilor
b6e90e4927 Updated eco 2022-02-02 16:59:22 +00:00
Auxilor
2f8e81d984 Updated libreforge 2022-02-01 18:48:43 +00:00
Auxilor
48ebf3e42a Updated libreforge 2022-01-31 19:12:06 +00:00
Auxilor
840e4cce83 Updated libreforge 2022-01-31 17:53:46 +00:00
Auxilor
05750f9187 Updated libreforge 2022-01-30 18:10:21 +00:00
Auxilor
f99f6a7855 Updated libreforge 2022-01-29 21:50:37 +00:00
Auxilor
77ce758092 Updated libreforge 2022-01-29 11:23:14 +00:00
Auxilor
58b4f8c4a9 Updated libreforge 2022-01-28 19:01:46 +00:00
Auxilor
82067662b4 Updated libreforge 2022-01-28 11:09:12 +00:00
Auxilor
55313e2879 Updated libreforge 2022-01-27 18:48:17 +00:00
Auxilor
e21a4c7d9c Updated libreforge 2022-01-26 21:28:57 +00:00
Auxilor
7e4489c6af Updated libreforge 2022-01-26 11:46:30 +00:00
Will FP
06e8448aa6 Merge pull request #12
Item lookup system support and sound disabling options
2022-01-26 11:46:07 +00:00
Auxilor
6a7933e8d2 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle
#	gradle.properties
2022-01-26 11:21:44 +00:00
Auxilor
b36091008e Added issue templates 2022-01-26 11:21:35 +00:00
_OfTeN_
04f7a746b8 Fixed open command broken from previous commit 2022-01-25 20:26:15 +03:00
Auxilor
232e19ad8c Updated libreforge 2022-01-24 19:38:47 +00:00
_OfTeN_
d9f19aaf9c Added item lookup system support to all GUI items (except mask materials) 2022-01-23 22:56:21 +03:00
_OfTeN_
ad9b1573c2 Added enabled: true/false option to every sound in the config 2022-01-23 21:52:17 +03:00
Auxilor
f53f11d0c9 Updated libreforge 2022-01-23 16:59:51 +00:00
Auxilor
68934afd9b Updated libreforge 2022-01-22 17:27:07 +00:00
Auxilor
691b3d6006 Updated libreforge 2022-01-22 12:04:50 +00:00
Auxilor
0b1952f098 Updated libreforge 2022-01-21 18:58:01 +00:00
Auxilor
55ffe61298 Updated libreforge 2022-01-21 09:05:31 +00:00
Will FP
cf56dca01a Merge pull request #11
Some people don't like hardcode values.
2022-01-19 19:10:49 +00:00
Auxilor
5902c7da8d Updated libreforge 2022-01-19 19:09:20 +00:00
Auxilor
a83b07807e Updated libreforge 2022-01-18 16:38:24 +00:00
Auxilor
1f05ce50e2 Updated libreforge 2022-01-18 08:30:28 +00:00
Auxilor
303b52ff07 Updated libreforge 2022-01-17 19:22:45 +00:00
Auxilor
43744fc3dd Updated libreforge 2022-01-17 10:05:28 +00:00
NicoNekoDev
d1deb7322d Some people don't like hardcode values. 2022-01-15 19:51:08 +02:00
Auxilor
f60f6bf707 Updated libreforge 2022-01-15 14:34:18 +00:00
Auxilor
d254268e17 Updated libreforge 2022-01-14 17:50:42 +00:00
Auxilor
ca73d813f4 Updated to 4.27.0 2022-01-13 21:25:08 +00:00
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
93 changed files with 2215 additions and 3864 deletions

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Auxilor Community Discord
url: https://discord.gg/ZcwpSsE/
about: Join the Auxilor discord to get help from support staff and the general community!
- name: The most common issues people have
url: https://github.com/Auxilor/eco/issues/78
about: Check the list of known common issues to see if your issue has already been solved

31
.github/ISSUE_TEMPLATE/report-a-bug.md vendored Normal file
View File

@@ -0,0 +1,31 @@
---
name: Report a Bug
about: Report an issue with the plugin
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Server Information (please complete the following information):**
- Version: (output of `/ver` command)
- Version of plugin and eco (`/ver eco`, `/ver <plugin>`)
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Request a Feature
about: Suggest an idea for this plugin
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

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

View File

@@ -4,7 +4,7 @@ buildscript {
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21"
}
}
@@ -27,28 +27,31 @@ allprojects {
repositories {
mavenCentral()
mavenLocal()
maven { url 'https://jitpack.io' }
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 {
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
}
shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.reforges.libreforge')
relocate('org.joml', 'com.willfp.reforges.libreforge.joml')
}
dependencies {
compileOnly 'com.willfp:eco:6.9.0'
compileOnly 'com.willfp:eco:6.36.0'
implementation 'com.willfp:libreforge:3.73.0'
implementation 'org.joml:joml:1.10.4'
compileOnly 'org.jetbrains:annotations:19.0.0'
compileOnly 'org.jetbrains:annotations:23.0.0'
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
testCompileOnly '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.5.21'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.21'
}
tasks.withType(JavaCompile) {
@@ -57,11 +60,20 @@ allprojects {
}
processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**"]) {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**reforges.yml", "**lang.yml"]) {
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.dependsOn clean
@@ -87,8 +99,17 @@ jar {
group = 'com.willfp'
archivesBaseName = project.name
version = findProperty("version")
java.sourceCompatibility = JavaVersion.VERSION_16
compileJava.options.encoding = 'UTF-8'
build.dependsOn shadowJar
task buyThePlugins {
dependsOn subprojects.build
doLast {
println 'If you like the plugin, please consider buying it on Spigot or Polymart!'
println 'Spigot: https://www.spigotmc.org/resources/authors/auxilor.507394/'
println 'Polymart: https://polymart.org/user/auxilor.1107/'
println 'Buying gives you access to support and the plugin auto-updater, and it allows me to keep developing plugins.'
}
}
build.finalizedBy buyThePlugins

View File

@@ -1,2 +1,2 @@
group 'com.willfp'
version rootProject.version
version rootProject.version

View File

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

View File

@@ -1,116 +0,0 @@
package com.willfp.reforges;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.items.Items;
import com.willfp.reforges.commands.CommandReforge;
import com.willfp.reforges.commands.CommandReforges;
import com.willfp.reforges.conditions.Conditions;
import com.willfp.reforges.config.ReforgesJson;
import com.willfp.reforges.config.TargetYml;
import com.willfp.reforges.display.ReforgesDisplay;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.effects.Effects;
import com.willfp.reforges.reforges.Reforges;
import com.willfp.reforges.reforges.util.ReforgeArgParser;
import com.willfp.reforges.reforges.util.WatcherTriggers;
import com.willfp.reforges.util.AntiPlaceListener;
import com.willfp.reforges.util.DiscoverRecipeListener;
import com.willfp.reforges.vault.EconomyHandler;
import lombok.Getter;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
public class ReforgesPlugin extends EcoPlugin {
/**
* Instance of Reforges.
*/
private static ReforgesPlugin instance;
/**
* target.yml.
*/
@Getter
private final TargetYml targetYml;
/**
* reforges.json.
*/
@Getter
private final ReforgesJson reforgesJson;
/**
* Internal constructor called by bukkit on plugin load.
*/
public ReforgesPlugin() {
super(1330, 12412, "&3", true);
this.targetYml = new TargetYml(this);
this.reforgesJson = new ReforgesJson(this);
instance = this;
}
@Override
protected void handleEnable() {
Items.registerArgParser(new ReforgeArgParser());
}
@Override
protected void handleAfterLoad() {
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.getScheduler().runTimer((Runnable) Conditions.HAS_PERMISSION, 103, 100);
}
@Override
protected List<Listener> loadListeners() {
return Arrays.asList(
new DiscoverRecipeListener(this),
new AntiPlaceListener(),
new WatcherTriggers(this)
);
}
@Override
protected List<PluginCommand> loadPluginCommands() {
return Arrays.asList(
new CommandReforge(this),
new CommandReforges(this)
);
}
@Override
protected @Nullable DisplayModule createDisplayModule() {
return new ReforgesDisplay(this);
}
@Override
public String getMinimumEcoVersion() {
return "6.8.0";
}
/**
* Get an instance of Reforges.
*
* @return The instance.
*/
public static ReforgesPlugin getInstance() {
return instance;
}
}

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

@@ -1,43 +0,0 @@
package com.willfp.reforges.config;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
import com.willfp.eco.core.items.Items;
import com.willfp.eco.core.items.TestableItem;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TargetYml extends YamlBaseConfig {
/**
* Instantiate target.yml.
*
* @param plugin Instance of EcoEnchants.
*/
public TargetYml(@NotNull final EcoPlugin plugin) {
super("target", false, plugin);
}
/**
* Get all target names.
*
* @return Set of all names.
*/
public List<String> getTargets() {
return this.getKeys(false);
}
/**
* Get all materials from a target name.
*
* @param target The name of the target.
* @return All materials.
*/
public Set<TestableItem> getTargetItems(@NotNull final String target) {
Set<TestableItem> items = new HashSet<>();
this.getStrings(target, false).forEach(s -> items.add(Items.lookup(s.toUpperCase())));
return items;
}
}

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

@@ -1,87 +0,0 @@
package com.willfp.reforges.reforges;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableSet;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.reforges.ReforgesPlugin;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
@UtilityClass
@SuppressWarnings("unused")
public class Reforges {
private static final BiMap<String, Reforge> BY_KEY = HashBiMap.create();
/**
* Get all registered {@link Reforge}s.
*
* @return A list of all {@link Reforge}s.
*/
public static Set<Reforge> values() {
return ImmutableSet.copyOf(BY_KEY.values());
}
/**
* Get {@link String}s for all registered {@link Reforge}s.
*
* @return A list of all {@link Reforge}s.
*/
public static Set<String> keySet() {
return ImmutableSet.copyOf(BY_KEY.keySet());
}
/**
* Get {@link Reforge} matching key.
*
* @param key The key to search for.
* @return The matching {@link Reforge}, or null if not found.
*/
public static Reforge getByKey(@Nullable final String key) {
if (key == null) {
return null;
}
return BY_KEY.get(key);
}
/**
* Update all {@link Reforge}s.
*
* @param plugin Instance of Reforges.
*/
@ConfigUpdater
public static void update(@NotNull final ReforgesPlugin plugin) {
for (Reforge reforge : values()) {
removeReforge(reforge);
}
for (JSONConfig config : plugin.getReforgesJson().getSubsections("reforges")) {
addNewReforge(new Reforge(config, plugin));
}
}
/**
* Add new {@link Reforge} to Reforges.
* <p>
* Only for internal use, reforges are automatically added in the constructor.
*
* @param reforge The {@link Reforge} to add.
*/
public static void addNewReforge(@NotNull final Reforge reforge) {
BY_KEY.remove(reforge.getId());
BY_KEY.put(reforge.getId(), reforge);
}
/**
* Remove {@link Reforge} from Reforges.
*
* @param reforge The {@link Reforge} to remove.
*/
public static void removeReforge(@NotNull final Reforge reforge) {
BY_KEY.remove(reforge.getId());
}
}

View File

@@ -1,132 +0,0 @@
package com.willfp.reforges.reforges.meta;
import com.google.common.collect.ImmutableSet;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.eco.core.items.TestableItem;
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
import com.willfp.reforges.ReforgesPlugin;
import lombok.Getter;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
public class ReforgeTarget {
/**
* Target containing the materials from all other targets.
*/
public static final ReforgeTarget ALL = new ReforgeTarget("all", new HashSet<>());
/**
* All registered targets.
*/
private static final Map<String, ReforgeTarget> REGISTERED = new HashMap<>();
static {
REGISTERED.put("all", ALL);
update(ReforgesPlugin.getInstance());
}
/**
* The name of the target.
*/
@Getter
private final String name;
/**
* The materials of the target.
*/
@Getter
private final Set<TestableItem> items;
/**
* Create new target.
*
* @param name The name of the target.
* @param items The items for the target.
*/
public ReforgeTarget(@NotNull final String name,
@NotNull final Set<TestableItem> items) {
this.name = name;
items.removeIf(item -> item instanceof EmptyTestableItem);
this.items = items;
}
/**
* If an item matches the target.
*
* @param itemStack The ItemStack.
* @return If matches.
*/
public boolean matches(@NotNull final ItemStack itemStack) {
for (TestableItem item : this.items) {
if (item.matches(itemStack)) {
return true;
}
}
return false;
}
/**
* Get ReforgeTarget matching name.
*
* @param name The name to search for.
* @return The matching ReforgeTarget, or null if not found.
*/
public static ReforgeTarget getByName(@NotNull final String name) {
return REGISTERED.get(name);
}
/**
* Get target from item.
*
* @param item The item.
* @return The target.
*/
@Nullable
public static ReforgeTarget getForItem(@NotNull final ItemStack item) {
Optional<ReforgeTarget> matching = REGISTERED.values().stream()
.filter(target -> !target.getName().equalsIgnoreCase("all"))
.filter(target -> target.matches(item))
.findFirst();
return matching.orElse(null);
}
/**
* Update all targets.
*
* @param plugin Instance of Reforges.
*/
@ConfigUpdater
public static void update(@NotNull final ReforgesPlugin plugin) {
ALL.items.clear();
for (String id : new ArrayList<>(REGISTERED.keySet())) {
if (id.equalsIgnoreCase("all")) {
continue;
}
REGISTERED.remove(id);
}
for (String id : plugin.getTargetYml().getTargets()) {
ReforgeTarget target = new ReforgeTarget(id, plugin.getTargetYml().getTargetItems(id));
REGISTERED.put(id, target);
ALL.items.addAll(target.items);
}
}
/**
* Get all targets.
*
* @return A set of all targets.
*/
public static Set<ReforgeTarget> values() {
return ImmutableSet.copyOf(REGISTERED.values());
}
}

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

@@ -1,125 +0,0 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.slot.Slot;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import com.willfp.reforges.vault.EconomyHandler;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
public class ReforgeHandler extends PluginDependent<EcoPlugin> {
/**
* Pass an {@link EcoPlugin} in order to interface with it.
*
* @param plugin The plugin to manage.
*/
public ReforgeHandler(@NotNull EcoPlugin plugin) {
super(plugin);
}
public void handleReforgeClick(@NotNull final InventoryClickEvent event,
@NotNull final Slot slot,
@NotNull final Menu menu) {
Player player = (Player) event.getWhoClicked();
ItemStack toReforge = menu.getCaptiveItems(player).isEmpty() ? null : menu.getCaptiveItems(player).get(0);
if (toReforge == null) {
return;
}
ReforgeTarget target = ReforgeTarget.getForItem(toReforge);
assert target != null;
Reforge reforge = null;
boolean usedStone = false;
if (menu.getCaptiveItems(player).size() == 2) {
Reforge stone = ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1));
if (stone != null) {
if (stone.getTargets().stream().anyMatch(reforgeTarget -> reforgeTarget.matches(toReforge))) {
reforge = stone;
usedStone = true;
}
}
}
if (reforge == null) {
reforge = ReforgeUtils.getRandomReforge(target);
}
if (reforge == null) {
return;
}
if (EconomyHandler.isEnabled()) {
double cost = this.getPlugin().getConfigYml().getDouble("reforge.cost");
int reforges = ReforgeUtils.getReforges(toReforge);
cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges);
if (!EconomyHandler.getInstance().has(player, cost)) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money"));
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.insufficient-money-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.insufficient-money-sound.pitch")
);
return;
}
EconomyHandler.getInstance().withdrawPlayer(player, cost);
}
int xpCost = this.getPlugin().getConfigYml().getInt("reforge.xp-cost");
int reforges = ReforgeUtils.getReforges(toReforge);
xpCost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges);
if (player.getLevel() < xpCost) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-xp"));
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.insufficient-money-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.insufficient-money-sound.pitch")
);
return;
}
player.setLevel(player.getLevel() - xpCost);
player.sendMessage(this.getPlugin().getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName()));
ReforgeUtils.incrementReforges(toReforge);
ReforgeUtils.setReforge(toReforge, reforge);
if (usedStone) {
ItemStack stone = menu.getCaptiveItems(player).get(1);
stone.setItemMeta(null);
stone.setAmount(0);
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.stone-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.stone-sound.pitch")
);
}
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.sound.pitch")
);
}
}

View File

@@ -1,23 +0,0 @@
package com.willfp.reforges.reforges.util;
public enum ReforgeStatus {
/**
* Allow the reforge.
*/
ALLOW,
/**
* Allow the reforge with a stone.
*/
ALLOW_STONE,
/**
* Invalid item to reforge.
*/
INVALID_ITEM,
/**
* No item at all.
*/
NO_ITEM
}

View File

@@ -1,288 +0,0 @@
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.Reforges;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import lombok.experimental.UtilityClass;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@UtilityClass
public class ReforgeUtils {
/**
* Instance of StatTrackers.
*/
private static final EcoPlugin PLUGIN = ReforgesPlugin.getInstance();
/**
* The key for storing reforges.
*/
private static final NamespacedKey REFORGE_KEY = PLUGIN.getNamespacedKeyFactory().create("reforge");
/**
* The key for storing reforge amounts.
*/
private static final NamespacedKey REFORGE_AMOUNT = PLUGIN.getNamespacedKeyFactory().create("reforge_amount");
/**
* The key for storing reforge stones.
*/
private static final NamespacedKey REFORGE_STONE_KEY = PLUGIN.getNamespacedKeyFactory().create("reforge_stone");
/**
* Get a random reforge for a target.
*
* @param target The target.
*/
public static Reforge getRandomReforge(@NotNull final ReforgeTarget target) {
List<Reforge> applicable = new ArrayList<>();
for (Reforge reforge : Reforges.values()) {
if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) {
applicable.add(reforge);
}
}
Collections.shuffle(applicable);
if (applicable.isEmpty()) {
return null;
}
return applicable.get(0);
}
public static ReforgeStatus getStatus(@NotNull final List<ItemStack> captive) {
ItemStack toReforge = captive.isEmpty() ? null : captive.get(0);
ItemStack stone = captive.size() == 2 ? captive.get(1) : null;
ReforgeStatus status = null;
ReforgeTarget target = null;
if (toReforge == null || toReforge.getType() == Material.AIR) {
status = ReforgeStatus.NO_ITEM;
} else {
target = ReforgeTarget.getForItem(toReforge);
if (target == null) {
status = ReforgeStatus.INVALID_ITEM;
}
}
if (target != null) {
status = ReforgeStatus.ALLOW;
}
if (status == ReforgeStatus.ALLOW) {
Reforge reforgeStone = getReforgeStone(stone);
if (reforgeStone != null && reforgeStone.getTargets().stream()
.anyMatch(reforgeTarget -> reforgeTarget.getItems().stream()
.anyMatch(item -> item.matches(toReforge)))) {
status = ReforgeStatus.ALLOW_STONE;
}
}
return status;
}
/**
* Get reforge on an item.
*
* @param item The item to query.
* @return The found reforge, or null if none active.
*/
public static Reforge getReforge(@Nullable final ItemStack item) {
if (item == null) {
return null;
}
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return null;
}
return getReforge(meta);
}
/**
* Get reforge on an item.
*
* @param meta The item to query.
* @return The found reforge, or null if none active.
*/
public static Reforge getReforge(@Nullable final ItemMeta meta) {
if (meta == null) {
return null;
}
PersistentDataContainer container = meta.getPersistentDataContainer();
if (!container.has(REFORGE_KEY, PersistentDataType.STRING)) {
return null;
}
String active = container.get(REFORGE_KEY, PersistentDataType.STRING);
return Reforges.getByKey(active);
}
/**
* Set reforge on an item.
*
* @param item The item.
* @param reforge The reforge.
*/
public static void setReforge(@NotNull final ItemStack item,
@NotNull final Reforge reforge) {
if (item.getItemMeta() == null) {
return;
}
Reforge previous = getReforge(item);
if (previous != null) {
previous.handleRemoval(item);
}
ItemMeta meta = item.getItemMeta();
setReforge(meta, reforge);
item.setItemMeta(meta);
}
/**
* Set reforge on an item.
*
* @param meta The meta.
* @param reforge The reforge.
*/
public static void setReforge(@NotNull final ItemMeta meta,
@NotNull final Reforge reforge) {
PersistentDataContainer container = meta.getPersistentDataContainer();
container.set(REFORGE_KEY, PersistentDataType.STRING, reforge.getId());
reforge.handleApplication(meta);
}
/**
* Get reforge stone on an item.
*
* @param item The item to query.
* @return The found reforge, or null if none active.
*/
public static Reforge getReforgeStone(@Nullable final ItemStack item) {
if (item == null) {
return null;
}
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return null;
}
return getReforgeStone(meta);
}
/**
* Get reforge stone on an item.
*
* @param meta The item to query.
* @return The found reforge, or null if none active.
*/
public static Reforge getReforgeStone(@Nullable final ItemMeta meta) {
if (meta == null) {
return null;
}
PersistentDataContainer container = meta.getPersistentDataContainer();
if (!container.has(REFORGE_STONE_KEY, PersistentDataType.STRING)) {
return null;
}
String active = container.get(REFORGE_STONE_KEY, PersistentDataType.STRING);
return Reforges.getByKey(active);
}
/**
* Set an item to be a reforge stone.
*
* @param item The item.
* @param reforge The reforge.
*/
public static void setReforgeStone(@NotNull final ItemStack item,
@NotNull final Reforge reforge) {
if (item.getItemMeta() == null) {
return;
}
ItemMeta meta = item.getItemMeta();
PersistentDataContainer container = meta.getPersistentDataContainer();
container.set(REFORGE_STONE_KEY, PersistentDataType.STRING, reforge.getId());
item.setItemMeta(meta);
}
/**
* Get the amount of reforges done to an item.
*
* @param item The item.
*/
public static int getReforges(@NotNull final ItemStack item) {
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return 0;
}
PersistentDataContainer container = meta.getPersistentDataContainer();
if (!container.has(REFORGE_AMOUNT, PersistentDataType.INTEGER)) {
container.set(REFORGE_AMOUNT, PersistentDataType.INTEGER, 0);
item.setItemMeta(meta);
}
Integer amount = container.get(REFORGE_AMOUNT, PersistentDataType.INTEGER);
return amount == null ? 0 : amount;
}
/**
* Get the amount of reforges done to an item.
*
* @param item The item.
*/
public static void incrementReforges(@NotNull final ItemStack item) {
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return;
}
int amount = getReforges(item);
amount++;
PersistentDataContainer container = meta.getPersistentDataContainer();
container.set(REFORGE_AMOUNT, PersistentDataType.INTEGER, amount);
item.setItemMeta(meta);
}
}

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,78 @@
package com.willfp.reforges
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.integrations.IntegrationLoader
import com.willfp.eco.core.items.Items
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.reforges.commands.CommandReforge
import com.willfp.reforges.commands.CommandReforges
import com.willfp.reforges.config.ReforgesYml
import com.willfp.reforges.config.TargetYml
import com.willfp.reforges.display.ReforgesDisplay
import com.willfp.reforges.integrations.talismans.TalismansIntegration
import com.willfp.reforges.reforges.Reforges
import com.willfp.reforges.reforges.util.ReforgeArgParser
import com.willfp.reforges.util.ReforgeEnableListeners
import com.willfp.reforges.util.ReforgeLookup
import com.willfp.reforges.util.AntiPlaceListener
import com.willfp.reforges.util.DiscoverRecipeListener
import org.bukkit.event.Listener
class ReforgesPlugin : LibReforgePlugin() {
val targetYml: TargetYml =
TargetYml(this)
val reforgesYml: ReforgesYml =
ReforgesYml(this)
init {
instance = this
}
override fun handleEnableAdditional() {
Items.registerArgParser(ReforgeArgParser())
registerHolderProvider { ReforgeLookup.provideReforges(it) }
}
override fun handleReloadAdditional() {
logger.info(Reforges.values().size.toString() + " Reforges Loaded")
}
override fun loadListeners(): List<Listener> {
return listOf(
DiscoverRecipeListener(this),
AntiPlaceListener(),
ReforgeEnableListeners(this)
)
}
override fun loadPluginCommands(): List<PluginCommand> {
return listOf(
CommandReforge(this),
CommandReforges(this)
)
}
override fun createDisplayModule(): DisplayModule {
return ReforgesDisplay(this)
}
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
return listOf(
IntegrationLoader("Talismans") { TalismansIntegration.registerProvider() }
)
}
override fun getMinimumEcoVersion(): String {
return "6.35.1"
}
companion object {
/**
* Instance of Reforges.
*/
@JvmStatic
lateinit var instance: ReforgesPlugin
private set
}
}

View File

@@ -0,0 +1,82 @@
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 com.willfp.reforges.util.reforge
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandApply(
plugin: EcoPlugin
) : Subcommand(plugin, "apply", "reforges.command.apply", false) {
override fun onExecute(sender: CommandSender, args: MutableList<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-reforge"))
return
}
val reforge = Reforges.getByKey(args[0].lowercase())
if (reforge == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-reforge"))
return
}
if (sender is Player) {
val item = sender.inventory.itemInMainHand
item.reforge = reforge
sender.sendMessage(
plugin.langYml.getMessage("applied-reforge")
.replace("%reforge%", reforge.name)
)
} else {
if (args.size < 2) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
val player = Bukkit.getPlayer(args[1])
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
player.inventory.itemInMainHand.reforge = reforge
sender.sendMessage(
plugin.langYml.getMessage("applied-reforge")
.replace("%reforge%", reforge.name)
)
}
}
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().map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Reforges.values().map { it.id },
completions
)
completions.sort()
return completions
}
if (args.size == 2) {
StringUtil.copyPartialMatches(
args[1],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
completions.sort()
return completions
}
return emptyList()
}
}

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,48 @@
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
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
}
if (plugin.configYml.getBool("gui.open-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
}
ReforgeGUI.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,26 @@
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
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
if (plugin.configYml.getBool("gui.open-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
}
ReforgeGUI.open(player)
}
}

View File

@@ -0,0 +1,20 @@
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))
.addSubcommand(CommandApply(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

@@ -0,0 +1,7 @@
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
class ReforgesYml(plugin: EcoPlugin) : BaseConfig("reforges", plugin, true, ConfigType.YAML)

View File

@@ -0,0 +1,43 @@
package com.willfp.reforges.config
import com.willfp.eco.core.EcoPlugin
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.TestableItem
import com.willfp.reforges.reforges.ReforgeTarget
import java.util.*
import java.util.function.Consumer
class TargetYml(plugin: EcoPlugin) : StaticBaseConfig("target", plugin, ConfigType.YAML) {
/**
* Get all target names.
*
* @return Set of all names.
*/
val targets: List<String>
get() = getKeys(false)
/**
* Get all materials from a target name.
*
* @param target The name of the target.
* @return All materials.
*/
fun getTargetItems(target: String): Set<TestableItem> {
val items: MutableSet<TestableItem> = HashSet()
this.getStrings("$target.items")
.forEach(Consumer { s: String -> items.add(Items.lookup(s.uppercase(Locale.getDefault()))) })
return items
}
/**
* Get all materials from a target name.
*
* @param target The name of the target.
* @return All materials.
*/
fun getSlot(target: String): ReforgeTarget.Slot {
return ReforgeTarget.Slot.valueOf(this.getString("$target.slot").uppercase(Locale.getDefault()))
}
}

View File

@@ -1,53 +1,58 @@
package com.willfp.reforges.display
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.display.DisplayPriority
import com.willfp.eco.core.fast.FastItemStack
import com.willfp.eco.core.fast.fast
import com.willfp.eco.util.SkullUtils
import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.toJSON
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeUtils
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.TextReplacementConfig
import net.kyori.adventure.text.format.TextDecoration
import org.bukkit.Material
import com.willfp.reforges.reforges.ReforgeTargets
import com.willfp.reforges.util.reforge
import com.willfp.reforges.util.reforgeStone
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta
import org.bukkit.persistence.PersistentDataType
@Suppress("DEPRECATION")
class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) {
private val replacement = TextReplacementConfig.builder()
.match("§w(.+)§w")
.replacement("")
.build()
class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGH) {
private val tempKey = plugin.namespacedKeyFactory.create("temp")
override fun display(
itemStack: ItemStack,
player: Player?,
vararg args: Any
) {
val target = ReforgeTarget.getForItem(itemStack)
val targets = ReforgeTargets.getForItem(itemStack)
if (target == null && itemStack.type != Material.PLAYER_HEAD) {
val fast = itemStack.fast()
val stone = fast.persistentDataContainer.reforgeStone
if (targets.isEmpty() && stone == null) {
return
}
val meta = itemStack.itemMeta ?: return
val fastItemStack = FastItemStack.wrap(itemStack)
val lore = fastItemStack.lore
val reforge = ReforgeUtils.getReforge(meta)
val reforge = fast.persistentDataContainer.reforge
val stone = ReforgeUtils.getReforgeStone(meta)
if (reforge == null && stone == null && target != null) {
if (reforge == null && stone == null) {
if (plugin.configYml.getBool("reforge.show-reforgable")) {
if (player != null && plugin.configYml.getBool("reforge.no-reforgable-in-gui")) {
val inventory = player.openInventory.topInventory
if (inventory.contents.contains(itemStack) && inventory.holder == null) {
return
}
}
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)
}
lore.addAll(addLore)
@@ -55,59 +60,87 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
}
if (stone != null) {
meta.setDisplayName(plugin.configYml.getString("reforge.stone.name").replace("%reforge%", stone.name))
SkullUtils.setSkullTexture(
meta as SkullMeta,
stone.config.getString("stone.texture")
)
val meta = itemStack.itemMeta
meta.setDisplayName(stone.config.getFormattedString("stone.name"))
val stoneMeta = stone.stone.itemMeta
if (stoneMeta is SkullMeta) {
val stoneTexture = SkullUtils.getSkullTexture(stoneMeta)
if (stoneTexture != null) {
try {
SkullUtils.setSkullTexture(meta as SkullMeta, stoneTexture)
} catch (e: StringIndexOutOfBoundsException) {
// Do nothing
}
}
}
itemStack.itemMeta = meta
val stoneLore = plugin.configYml.getStrings("reforge.stone.lore").map {
"${Display.PREFIX}${it.replace("%reforge%", stone.name)}"
val stoneLore = stone.config.getFormattedStrings("stone.lore").map {
"${Display.PREFIX}$it"
}.toList()
lore.addAll(0, stoneLore)
}
if (reforge != null) {
if (plugin.configYml.getBool("reforge.display-in-lore")) {
val addLore: MutableList<String> = ArrayList()
addLore.add(" ")
addLore.add(reforge.name)
for (string in plugin.configYml.getFormattedStrings("reforge.reforged-prefix")) {
addLore.add(Display.PREFIX + string.replace("%reforge%", reforge.name))
}
addLore.addAll(reforge.description)
addLore.replaceAll { "${Display.PREFIX}$it" }
lore.addAll(addLore)
}
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName =
(if (meta.hasDisplayName()) meta.displayName()!! else Component.translatable(itemStack))
.replaceText(
replacement
)
val newName = StringUtils.toComponent("§w${reforge.name} §w")
.decoration(TextDecoration.ITALIC, false).append(displayName)
meta.displayName(newName)
if (plugin.configYml.getBool("reforge.display-in-name")) {
val displayName = fastItemStack.displayNameComponent
if (!fastItemStack.displayName.contains(reforge.name)) {
fastItemStack.persistentDataContainer.set(
tempKey,
PersistentDataType.STRING,
displayName.toJSON()
)
val newName = reforge.namePrefixComponent.append(displayName)
fastItemStack.setDisplayName(newName)
}
}
if (player != null) {
val lines = reforge.getNotMetLines(player).map { Display.PREFIX + it }
if (lines.isNotEmpty()) {
lore.add(Display.PREFIX)
lore.addAll(lines)
}
}
}
itemStack.itemMeta = meta
fastItemStack.lore = lore
}
override fun revert(itemStack: ItemStack) {
val target = ReforgeTarget.getForItem(itemStack)
itemStack.reforge ?: return
if (target == null && itemStack.type != Material.PLAYER_HEAD) {
val fis = FastItemStack.wrap(itemStack)
if (!plugin.configYml.getBool("reforge.display-in-name")) {
return
}
val meta = itemStack.itemMeta ?: return
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName = meta.displayName() ?: return
meta.displayName(
displayName.replaceText(
replacement
if (fis.persistentDataContainer.has(tempKey, PersistentDataType.STRING)) {
fis.setDisplayName(
StringUtils.jsonToComponent(
fis.persistentDataContainer.get(
tempKey,
PersistentDataType.STRING
)
)
)
}
itemStack.itemMeta = meta
fis.persistentDataContainer.remove(tempKey)
}
}
}
}

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,300 @@
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.fast.fast
import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.FillerMask
import com.willfp.eco.core.gui.slot.MaskItems
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.core.integrations.economy.EconomyManager
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.reforges.PriceMultipliers
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.reforges.reforges.ReforgeTargets
import com.willfp.reforges.reforges.util.MetadatedReforgeStatus
import com.willfp.reforges.util.ReforgeStatus
import com.willfp.reforges.util.getRandomReforge
import com.willfp.reforges.util.reforge
import com.willfp.reforges.util.reforgeStone
import com.willfp.reforges.util.timesReforged
import org.bukkit.Material
import org.bukkit.Sound
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.*
import kotlin.math.pow
@Suppress("DEPRECATION")
object ReforgeGUI {
private lateinit var menu: Menu
private fun Menu.getReforgeStatus(player: Player): MetadatedReforgeStatus {
val captive = this.getCaptiveItems(player)
val item = captive.getOrNull(0)
val stone = captive.getOrNull(1)
val targets = mutableListOf<ReforgeTarget>()
var cost = 0.0
val status = if (item == null || item.type == Material.AIR) {
ReforgeStatus.NO_ITEM
} else {
targets.addAll(ReforgeTargets.getForItem(item))
if (targets.isEmpty()) {
ReforgeStatus.INVALID_ITEM
} else {
val reforgeStone = stone.reforgeStone
if (reforgeStone != null && reforgeStone.canBeAppliedTo(item)) {
cost = reforgeStone.stonePrice.toDouble()
ReforgeStatus.ALLOW_STONE
} else {
ReforgeStatus.ALLOW
}
}
}
return MetadatedReforgeStatus(status, cost)
}
@JvmStatic
fun open(player: Player) {
menu.open(player)
}
@JvmStatic
@ConfigUpdater
fun update(plugin: EcoPlugin) {
val activatorSlot = slot(ItemStack(Material.ANVIL)) {
setUpdater { player, menu, _ ->
val (status, specialCost) = menu.getReforgeStatus(player)
val cost = when {
status == ReforgeStatus.ALLOW || (status == ReforgeStatus.ALLOW_STONE && specialCost < 0) -> {
val amountOfReforges = menu.getCaptiveItems(player)[0].timesReforged
plugin.configYml.getDouble("reforge.cost") *
plugin.configYml.getDouble("reforge.cost-exponent").pow(amountOfReforges) *
PriceMultipliers.getForPlayer(player).multiplier
}
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 = item.timesReforged
xpCost *= PriceMultipliers.getForPlayer(player).multiplier.toInt()
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
}
val configKey = status.configKey
Items.lookup(plugin.configYml.getString("gui.$configKey.material")).item.apply {
this.fast().displayName = plugin.configYml.getFormattedString("gui.$configKey.name")
this.fast().lore = plugin.configYml.getFormattedStrings("gui.$configKey.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
.replace(
"%stone%",
menu.getCaptiveItems(player).getOrNull(1).reforgeStone?.name ?: ""
)
}
}
}
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
val captive = menu.getCaptiveItems(player)
val item = captive.getOrNull(0) ?: return@onLeftClick
val currentReforge = item.reforge
val targets = ReforgeTargets.getForItem(item)
var usedStone = false
val stoneInMenu = menu.getCaptiveItems(player).getOrNull(1).reforgeStone
val reforge = if (stoneInMenu != null && stoneInMenu.canBeAppliedTo(item)) {
usedStone = true
stoneInMenu
} else {
val disallowed = mutableListOf<Reforge>()
if (currentReforge != null) {
disallowed.add(currentReforge)
}
targets.getRandomReforge(disallowed = disallowed)
}
if (reforge == null) {
return@onLeftClick
}
var cost = 0.0
val reforges = item.timesReforged
if (EconomyManager.hasRegistrations()) {
cost = plugin.configYml.getDouble("reforge.cost")
cost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble())
if (reforge.requiresStone && reforge.stonePrice != -1) {
cost = reforge.stonePrice.toDouble()
}
cost *= PriceMultipliers.getForPlayer(player).multiplier
if (!EconomyManager.hasAmount(player, cost)) {
player.sendMessage(plugin.langYml.getMessage("insufficient-money"))
if (plugin.configYml.getBool("gui.insufficient-money-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(
plugin.configYml.getString("gui.insufficient-money-sound.id")
.uppercase(Locale.getDefault())
),
1f, plugin.configYml.getDouble("gui.insufficient-money-sound.pitch").toFloat()
)
}
return@onLeftClick
}
}
var xpCost = plugin.configYml.getInt("reforge.xp-cost")
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
xpCost *= PriceMultipliers.getForPlayer(player).multiplier.toInt()
if (player.level < xpCost) {
player.sendMessage(plugin.langYml.getMessage("insufficient-xp"))
if (plugin.configYml.getBool("gui.insufficient-money-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(
plugin.configYml.getString("gui.insufficient-money-sound.id")
.uppercase(Locale.getDefault())
),
1f, plugin.configYml.getDouble("gui.insufficient-money-sound.pitch").toFloat()
)
}
return@onLeftClick
}
if (EconomyManager.hasRegistrations()) {
EconomyManager.removeMoney(player, cost)
}
player.level = player.level - xpCost
player.sendMessage(plugin.langYml.getMessage("applied-reforge").replace("%reforge%", reforge.name))
item.timesReforged++
item.reforge = reforge
if (usedStone) {
val stone = menu.getCaptiveItems(player)[1]
stone.itemMeta = null
stone.amount = 0
if (plugin.configYml.getBool("gui.stone-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(
plugin.configYml.getString("gui.stone-sound.id").uppercase(Locale.getDefault())
),
1f, plugin.configYml.getDouble("gui.stone-sound.pitch").toFloat()
)
}
}
if (plugin.configYml.getBool("gui.sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.sound.id").uppercase(Locale.getDefault())),
1f, plugin.configYml.getDouble("gui.sound.pitch").toFloat()
)
}
}
}
val maskPattern = plugin.configYml.getStrings("gui.mask.pattern").toTypedArray()
val maskItems = plugin.configYml.getStrings("gui.mask.materials")
.mapNotNull { Items.lookup(it) }
.toTypedArray()
menu = menu(plugin.configYml.getInt("gui.rows")) {
setTitle(plugin.langYml.getFormattedString("menu.title"))
setMask(FillerMask(MaskItems(*maskItems), *maskPattern))
val slot = slot(
ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
) {
setUpdater { player, menu, _ ->
val status = menu.getReforgeStatus(player).status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
Items.lookup(plugin.configYml.getString("gui.show-allowed.allow-material")).item
} else {
Items.lookup(plugin.configYml.getString("gui.show-allowed.deny-material")).item
}
}
}
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') {
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(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.close.material")))
.setDisplayName(plugin.langYml.getFormattedString("menu.close"))
.build()
) {
onLeftClick { event, _, _ -> event.whoClicked.closeInventory() }
}
)
onClose { event, menu ->
DropQueue(event.player as Player)
.addItems(menu.getCaptiveItems(event.player as Player))
.setLocation(event.player.eyeLocation)
.forceTelekinesis()
.push()
}
}
}
}

View File

@@ -0,0 +1,25 @@
package com.willfp.reforges.integrations.talismans
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.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)) {
provided[itemStack] = ReforgeTarget.Slot.ANY
}
provided
}
}
override fun getPluginName(): String {
return "Talismans"
}
}

View File

@@ -0,0 +1,23 @@
package com.willfp.reforges.reforges
import org.bukkit.Bukkit
import org.bukkit.permissions.Permission
import org.bukkit.permissions.PermissionDefault
data class PriceMultiplier(
val permission: String,
val multiplier: Double,
val priority: Int
) {
init {
if (Bukkit.getPluginManager().getPermission(permission) == null) {
Bukkit.getPluginManager().addPermission(
Permission(
permission,
"Gives a ${multiplier}x price multiplier when reforging",
PermissionDefault.FALSE
)
)
}
}
}

View File

@@ -0,0 +1,61 @@
package com.willfp.reforges.reforges
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.updating.ConfigUpdater
import org.bukkit.entity.Player
@Suppress("UNUSED")
object PriceMultipliers {
private val REGISTRY = mutableListOf<PriceMultiplier>()
private val NO_MULTIPLIER = PriceMultiplier("none", 1.0, 0)
/**
* Get the permission multiplier for a given player.
*
* @param player The player.
* @return The multiplier.
*/
@JvmStatic
fun getForPlayer(player: Player): PriceMultiplier {
var current = NO_MULTIPLIER
for (multiplier in REGISTRY) {
if (multiplier.priority < current.priority) {
continue
}
if (!player.hasPermission(multiplier.permission)) {
continue
}
current = multiplier
}
return current
}
/**
* List of all registered multipliers.
*
* @return The multipliers.
*/
@JvmStatic
fun values(): List<PriceMultiplier> {
return REGISTRY.toList()
}
@ConfigUpdater
@JvmStatic
fun update(plugin: EcoPlugin) {
REGISTRY.clear()
for (config in plugin.configYml.getSubsections("price-multipliers")) {
val multiplier = PriceMultiplier(
config.getString("permission"),
config.getDouble("multiplier"),
config.getInt("priority")
)
REGISTRY.add(multiplier)
}
}
}

View File

@@ -1,94 +1,82 @@
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.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.util.StringUtils
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.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.util.ReforgeUtils
import com.willfp.reforges.util.reforgeStone
import net.kyori.adventure.text.format.TextDecoration
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import java.util.*
@Suppress("DEPRECATION")
class Reforge(
internal val config: JSONConfig,
private val plugin: ReforgesPlugin
) {
val id = config.getString("id")
internal val config: Config,
plugin: ReforgesPlugin
) : Holder {
override val id = config.getString("id")
val name = config.getString("name")
val name = config.getFormattedString("name")
val description: List<String> = config.getStrings("description")
val namePrefixComponent = StringUtils.toComponent("$name ").decoration(TextDecoration.ITALIC, false)
val targets = config.getStrings("targets").map { ReforgeTarget.getByName(it) }.toSet()
val description: List<String> = config.getFormattedStrings("description")
val effects = config.getSubsections("effects").map {
val effect = Effects.getByID(it.getString("id")) ?: return@map null
ConfiguredEffect(effect, it)
}.filterNotNull().toSet()
val targets = config.getStrings("targets").mapNotNull { ReforgeTargets.getByName(it) }.toSet()
val conditions = config.getSubsections("conditions").map {
val condition = Conditions.getByID(it.getString("id")) ?: return@map null
ConfiguredCondition(condition, it)
}.filterNotNull().toSet()
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Reforge ID $id")
}.toSet()
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Reforge ID $id")
}.toSet()
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")) {
setSkullTexture(config.getString("stone.texture"))
setDisplayName(plugin.configYml.getString("stone.name").replace("%reforge%", name))
setDisplayName(config.getFormattedString("stone.name").replace("%reforge%", name))
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()
val stonePrice = config.getIntOrNull("stone.price") ?: -1
init {
ReforgeUtils.setReforgeStone(stone, this)
Reforges.addNewReforge(this)
CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> ReforgeUtils.getReforgeStone(test) == this },
stone
).register()
stone.reforgeStone = this
Display.display(stone)
if (config.getBool("craftable")) {
Recipes.createAndRegisterRecipe(
plugin,
"stone_" + this.id,
stone,
config.getStrings("recipe", false)
)
if (config.getBool("stone.enabled")) {
CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> test.reforgeStone == this },
stone
).register()
if (config.getBool("stone.craftable")) {
Recipes.createAndRegisterRecipe(
plugin,
"stone_" + this.id,
stone,
config.getStrings("stone.recipe")
)
}
}
}
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
fun canBeAppliedTo(item: ItemStack?): Boolean {
return targets.any { target -> target.items.any { it.matches(item) } }
}
override fun equals(other: Any?): Boolean {

View File

@@ -0,0 +1,43 @@
package com.willfp.reforges.reforges
import com.willfp.eco.core.items.TestableItem
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import org.bukkit.inventory.ItemStack
import java.util.*
class ReforgeTarget(
val id: String,
val slot: Slot,
val items: MutableSet<TestableItem>
) {
init {
items.removeIf { it is EmptyTestableItem }
}
fun matches(itemStack: ItemStack): Boolean {
for (item in items) {
if (item.matches(itemStack)) {
return true
}
}
return false
}
override fun equals(other: Any?): Boolean {
if (other !is ReforgeTarget) {
return false
}
return this.id == other.id
}
override fun hashCode(): Int {
return Objects.hash(this.id)
}
enum class Slot {
HANDS,
ARMOR,
ANY
}
}

View File

@@ -0,0 +1,77 @@
package com.willfp.reforges.reforges
import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.reforges.ReforgesPlugin
import org.bukkit.inventory.ItemStack
object ReforgeTargets {
private val registered = mutableMapOf<String, ReforgeTarget>()
val ALL = ReforgeTarget("all", ReforgeTarget.Slot.ANY, HashSet())
init {
registered["all"] = ALL
update(ReforgesPlugin.instance)
}
/**
* Get ReforgeTarget matching name.
*
* @param name The name to search for.
* @return The matching ReforgeTarget, or null if not found.
*/
@JvmStatic
fun getByName(name: String): ReforgeTarget? {
return registered[name]
}
/**
* Get target from item.
*
* @param item The item.
* @return The target.
*/
@JvmStatic
fun getForItem(item: ItemStack): List<ReforgeTarget> {
return registered.values
.filter { !it.id.equals("all", ignoreCase = true) }
.filter { it.matches(item) }
}
/**
* Update all targets.
*
* @param plugin Instance of Reforges.
*/
@ConfigUpdater
@JvmStatic
fun update(plugin: ReforgesPlugin) {
ALL.items.clear()
for (id in ArrayList(registered.keys)) {
if (id.equals("all", ignoreCase = true)) {
continue
}
registered.remove(id)
}
for (id in plugin.targetYml.targets) {
val target = ReforgeTarget(
id,
plugin.targetYml.getSlot(id),
plugin.targetYml.getTargetItems(id).toMutableSet()
)
registered[id] = target
ALL.items.addAll(target.items)
}
}
/**
* Get all targets.
*
* @return A set of all targets.
*/
@JvmStatic
fun values(): Set<ReforgeTarget> {
return ImmutableSet.copyOf(registered.values)
}
}

View File

@@ -0,0 +1,86 @@
package com.willfp.reforges.reforges
import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.libreforge.chains.EffectChains
import com.willfp.reforges.ReforgesPlugin
@Suppress("UNUSED")
object Reforges {
private val BY_KEY = HashBiMap.create<String, Reforge>()
/**
* Get all registered [Reforge]s.
*
* @return A list of all [Reforge]s.
*/
@JvmStatic
fun values(): Set<Reforge> {
return ImmutableSet.copyOf(BY_KEY.values)
}
/**
* Get [String]s for all registered [Reforge]s.
*
* @return A list of all [Reforge]s.
*/
@JvmStatic
fun keySet(): Set<String> {
return ImmutableSet.copyOf(BY_KEY.keys)
}
/**
* Get [Reforge] matching key.
*
* @param key The key to search for.
* @return The matching [Reforge], or null if not found.
*/
@JvmStatic
fun getByKey(key: String?): Reforge? {
return if (key == null) {
null
} else BY_KEY[key]
}
/**
* Update all [Reforge]s.
*
* @param plugin Instance of Reforges.
*/
@ConfigUpdater
@JvmStatic
fun update(plugin: ReforgesPlugin) {
for (config in plugin.reforgesYml.getSubsections("chains")) {
EffectChains.compile(config, "Chains")
}
for (reforge in values()) {
removeReforge(reforge)
}
for (config in plugin.reforgesYml.getSubsections("reforges")) {
Reforge(config, plugin)
}
}
/**
* Remove [Reforge] from Reforges.
*
* @param reforge The [Reforge] to remove.
*/
@JvmStatic
fun removeReforge(reforge: Reforge) {
BY_KEY.remove(reforge.id)
}
/**
* Add new [Reforge] to Reforges.
*
* Only for internal use, reforges are automatically added in the constructor.
*
* @param reforge The [Reforge] to add.
*/
internal fun addNewReforge(reforge: Reforge) {
BY_KEY.remove(reforge.id)
BY_KEY[reforge.id] = reforge
}
}

View File

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

View File

@@ -0,0 +1,43 @@
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 com.willfp.reforges.util.reforge
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
meta.reforge = reforge
return Predicate { test ->
val testMeta = test.itemMeta ?: return@Predicate false
reforge == testMeta.reforge
}
}
override fun serializeBack(meta: ItemMeta): String? {
val reforge = meta.reforge ?: return null
return "reforge:${reforge.id}"
}
}

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

@@ -1,6 +1,5 @@
package com.willfp.reforges.util
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.BlockPlaceEvent
@@ -8,7 +7,7 @@ import org.bukkit.event.block.BlockPlaceEvent
class AntiPlaceListener : Listener {
@EventHandler
fun onBlockPlace(event: BlockPlaceEvent) {
if (ReforgeUtils.getReforgeStone(event.itemInHand) != null) {
if (event.itemInHand.reforgeStone != null) {
event.isCancelled = true
event.setBuild(false)
}

View File

@@ -2,29 +2,23 @@ package com.willfp.reforges.util
import com.willfp.eco.core.EcoPlugin
import org.bukkit.Bukkit
import org.bukkit.Keyed
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.inventory.Recipe
import org.bukkit.inventory.ShapedRecipe
class DiscoverRecipeListener(
private val plugin: EcoPlugin
) : Listener {
class DiscoverRecipeListener(private val plugin: EcoPlugin) : Listener {
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
val player = event.player
if (plugin.configYml.getBool("discover-recipes")) {
Bukkit.getServer().recipeIterator().forEachRemaining { recipe: Recipe ->
if (recipe is ShapedRecipe) {
val key = recipe.key
if (key.namespace == "reforges") {
if (!key.key.contains("displayed")) {
player.discoverRecipe(key)
}
}
}
}
if (!plugin.configYml.getBool("discover-recipes")) {
return
}
mutableListOf<Recipe>()
.apply { Bukkit.getServer().recipeIterator().forEachRemaining(this::add) }
.filterIsInstance<Keyed>().map { it.key }
.filter { it.namespace == plugin.name.lowercase() }
.filter { !it.key.contains("displayed") }
.forEach { event.player.discoverRecipe(it) }
}
}
}

View File

@@ -0,0 +1,84 @@
package com.willfp.reforges.util
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.events.ArmorChangeEvent
import com.willfp.libreforge.updateEffects
import com.willfp.reforges.reforges.ReforgeTargets
import com.willfp.reforges.reforges.Reforges.values
import com.willfp.reforges.util.ReforgeLookup.clearCache
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
@Suppress("UNUSED", "UNUSED_PARAMETER")
class ReforgeEnableListeners(private val plugin: EcoPlugin) : Listener {
@EventHandler
fun onItemPickup(event: EntityPickupItemEvent) {
if (event.entity !is Player) {
return
}
val player = event.entity as Player
if (!ReforgeTargets.ALL.matches(event.item.itemStack)) {
return
}
refreshPlayer(player)
}
@EventHandler
fun onPlayerJoin(event: PlayerJoinEvent) {
refresh()
}
@EventHandler
fun onPlayerLeave(event: PlayerQuitEvent) {
refresh()
val player = event.player
for (value in values()) {
for ((effect) in value.effects) {
effect.disableForPlayer(player)
}
}
}
@EventHandler
fun onInventoryDrop(event: PlayerDropItemEvent) {
if (!ReforgeTargets.ALL.matches(event.itemDrop.itemStack)) {
return
}
refreshPlayer(event.player)
}
@EventHandler
fun onChangeSlot(event: PlayerItemHeldEvent) {
refreshPlayer(event.player)
plugin.scheduler.run { refreshPlayer(event.player) }
}
@EventHandler
fun onArmorChange(event: ArmorChangeEvent) {
refreshPlayer(event.player)
}
@EventHandler
fun onInventoryClick(event: InventoryClickEvent) {
if (event.whoClicked !is Player) {
return
}
refreshPlayer(event.whoClicked as Player)
}
private fun refresh() {
plugin.server.onlinePlayers.forEach { player: Player -> refreshPlayer(player) }
}
private fun refreshPlayer(player: Player) {
clearCache(player)
player.updateEffects()
}
}

View File

@@ -0,0 +1,106 @@
package com.willfp.reforges.util
import com.github.benmanes.caffeine.cache.Caffeine
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.ReforgeTarget
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.concurrent.TimeUnit
typealias SlotProvider = (Player) -> Map<ItemStack?, ReforgeTarget.Slot?>
object ReforgeLookup {
private val plugin = ReforgesPlugin.instance
private val slotProviders = mutableSetOf<(Player) -> Map<ItemStack, ReforgeTarget.Slot>>()
private val itemCache = Caffeine.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build<Player, Map<ItemStack, ReforgeTarget.Slot>>()
private val reforgeCache = Caffeine.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build<Player, Collection<Reforge>>()
@JvmStatic
fun registerProvider(provider: SlotProvider) {
slotProviders.add {
val found = mutableMapOf<ItemStack, ReforgeTarget.Slot>()
for ((item, slot) in provider(it)) {
if (item != null && slot != null) {
found[item] = slot
}
}
found
}
}
private fun provide(player: Player): Map<ItemStack, ReforgeTarget.Slot> {
return itemCache.get(player) {
val found = mutableMapOf<ItemStack, ReforgeTarget.Slot>()
for (provider in slotProviders) {
found.putAll(provider(player))
}
found
}
}
fun provideReforges(player: Player): List<Reforge> {
return reforgeCache.get(player) {
val found = mutableListOf<Reforge>()
for ((itemStack, slot) in provide(player)) {
val reforge = itemStack.reforge ?: continue
if (slot != ReforgeTarget.Slot.ANY) {
if (!reforge.targets.map { it.slot }.contains(slot)) {
continue
}
}
found.add(reforge)
}
found
}.toList()
}
/**
* Clear cache.
*
* @param player The player.
*/
@JvmStatic
fun clearCache(player: Player) {
itemCache.invalidate(player)
reforgeCache.invalidate(player)
}
init {
registerProvider {
mapOf(
Pair(
it.inventory.itemInMainHand,
ReforgeTarget.Slot.HANDS
)
)
}
if (!plugin.configYml.getBool("no-offhand")) {
registerProvider {
mapOf(
Pair(
it.inventory.itemInOffHand,
ReforgeTarget.Slot.HANDS
)
)
}
}
registerProvider {
val items = mutableMapOf<ItemStack?, ReforgeTarget.Slot?>()
for (stack in it.inventory.armorContents) {
items[stack] = ReforgeTarget.Slot.ARMOR
}
items
}
}
}

View File

@@ -0,0 +1,10 @@
package com.willfp.reforges.util
enum class ReforgeStatus(
val configKey: String
) {
ALLOW("allow"),
ALLOW_STONE("allow-stone"),
INVALID_ITEM("invalid-item"),
NO_ITEM("no-item")
}

View File

@@ -0,0 +1,115 @@
package com.willfp.reforges.util
import com.willfp.eco.core.fast.fast
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.reforges.reforges.Reforges
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType
private val plugin = ReforgesPlugin.instance
private val reforgeKey = plugin.namespacedKeyFactory.create("reforge")
private val reforgeAmountKey = plugin.namespacedKeyFactory.create("reforge_amount")
private val reforgeStoneKey = plugin.namespacedKeyFactory.create("reforge_stone")
var ItemStack?.reforge: Reforge?
get() {
this ?: return null
return this.fast().persistentDataContainer.reforge
}
set(value) {
this ?: return
this.fast().persistentDataContainer.reforge = value
}
var ItemMeta?.reforge: Reforge?
get() {
this ?: return null
return this.persistentDataContainer.reforge
}
set(value) {
this ?: return
this.persistentDataContainer.reforge = value
}
var PersistentDataContainer?.reforge: Reforge?
get() {
this ?: return null
if (!this.has(reforgeKey, PersistentDataType.STRING)) {
return null
}
val active = this.get(reforgeKey, PersistentDataType.STRING)
return Reforges.getByKey(active)
}
set(value) {
this ?: return
if (value == null) {
this.remove(reforgeKey)
} else {
this.set(reforgeKey, PersistentDataType.STRING, value.id)
}
}
var ItemStack?.reforgeStone: Reforge?
get() {
this ?: return null
return this.fast().persistentDataContainer.reforgeStone
}
set(value) {
this ?: return
this.fast().persistentDataContainer.reforgeStone = value
}
var ItemMeta?.reforgeStone: Reforge?
get() {
this ?: return null
return this.persistentDataContainer.reforgeStone
}
set(value) {
this ?: return
this.persistentDataContainer.reforgeStone = value
}
var PersistentDataContainer?.reforgeStone: Reforge?
get() {
this ?: return null
if (!this.has(reforgeStoneKey, PersistentDataType.STRING)) {
return null
}
val active = this.get(reforgeStoneKey, PersistentDataType.STRING)
return Reforges.getByKey(active)
}
set(value) {
this ?: return
if (value == null) {
this.remove(reforgeStoneKey)
} else {
this.set(reforgeStoneKey, PersistentDataType.STRING, value.id)
}
}
var ItemStack.timesReforged: Int
get() = this.fast().persistentDataContainer.get(reforgeAmountKey, PersistentDataType.INTEGER) ?: 0
set(value) = this.fast().persistentDataContainer.set(reforgeAmountKey, PersistentDataType.INTEGER, value)
fun Collection<ReforgeTarget>.getRandomReforge(
disallowed: Collection<Reforge> = emptyList()
): Reforge? {
val applicable = mutableListOf<Reforge>()
for (reforge in Reforges.values()) {
if (reforge.targets.intersect(this.toSet()).isNotEmpty() && !reforge.requiresStone) {
applicable.add(reforge)
}
}
applicable.removeAll(disallowed)
return applicable.randomOrNull()
}

View File

@@ -4,6 +4,19 @@
#
discover-recipes: true
no-offhand: false # Restart your server after this option, doesn't work with /reforges reload
# If a reward allows permission multipliers, the weights
# will be multiplied by highest-priority multiplier that a player
# has permission for - i.e. if a player has both vip and mvp permissions,
# than they'll have the mvp one applied as it has a higher priority.
price-multipliers:
- permission: reforges.mutliplier.vip
multiplier: 0.8
priority: 1
- permission: reforges.mutliplier.mvp
multiplier: 0.7
priority: 2
gui:
rows: 6
@@ -43,6 +56,10 @@ gui:
- "100000001"
- "100000001"
activator-slot:
row: 2
column: 5
stone-slot:
row: 4
column: 7
@@ -101,24 +118,29 @@ gui:
- '&7You cannot reforge this item!'
sound:
enabled: true
id: BLOCK_ANVIL_USE
pitch: 1
open-sound:
enabled: true
id: BLOCK_ANVIL_PLACE
pitch: 0.8
stone-sound:
enabled: true
id: ENTITY_ENDER_DRAGON_HURT
pitch: 0.5
insufficient-money-sound:
enabled: true
id: ENTITY_VILLAGER_NO
pitch: 0.8
reforge:
cost: 7500
xp-cost: 0 # In levels
use-player-points: false
cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost
@@ -126,13 +148,51 @@ reforge:
reforgable-suffix:
- ""
- "&8This item can be reforged!"
no-reforgable-in-gui: true # Not perfect, won't work 100% of the time
# due to how GUIs are handled differently in different plugins, but should help.
display-in-lore: true
display-in-name: true # Requires paper to be installed on the server
display-in-name: true
stone:
name: "%reforge%&f Reforge Stone"
lore:
- "&7Place on the right of the"
- "&7reforge menu to apply the"
- "%reforge%&7 reforge!"
reforged-prefix:
- ""
- "%reforge%"
cooldown:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford-type:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players.
example_point: "Nicely Formatted Point"
use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements
raytrace-distance: 80 # The distance that alt_click should check for a location
block-item-drop-place-check: true # If the block_item_drop trigger should only fire on naturally placed blocks (prevents dupes)
potions:
icon:
permanent: true
triggered: true
ambient:
permanent: false
triggered: true
particles:
permanent: false
triggered: true

View File

@@ -0,0 +1,3 @@
resource-id: 1330
bstats-id: 12412
color: "&3"

View File

@@ -3,7 +3,7 @@ messages:
no-permission: "&cYou don't have permission to do this!"
not-player: "&cThis command must be run by a player"
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-xp: "&cYou don't have enough xp levels for this!"
applied-reforge: "Applied %reforge%&r reforge!"
@@ -12,6 +12,12 @@ messages:
needs-stone: "&cYou must specify a reforge stone"
invalid-stone: "&cInvalid reforge!"
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%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
invalid-reforge: "&cInvalid reforge!"
needs-reforge: "&cYou must specify a reforge"
cannot-transmit: "&cYou can't transmit here!"
menu:
title: "Reforge Item"

View File

@@ -10,8 +10,17 @@ depend:
- ProtocolLib
softdepend:
- Vault
libraries:
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'
- AureliumSkills
- PlayerPoints
- Jobs
- TMMobcoins
- EcoEnchants
- EcoBosses
- Talismans
- EcoArmor
- EcoItems
- EcoSkills
- Boosters
commands:
reforges:
@@ -35,6 +44,7 @@ permissions:
reforges.command.reforges: true
reforges.command.reforge: true
reforges.command.give: true
reforges.command.apply: true
reforges.command.open: true
reforges.command.reload:
@@ -52,3 +62,6 @@ permissions:
reforges.command.open:
description: Allows the user of /reforges open.
default: op
reforges.command.apply:
description: Allows the user of /reforges apply.
default: op

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,405 @@
chains:
- id: example_chain
effects:
- id: teleport
- id: potion_effect
args:
effect: blindness
level: 3
duration: 30
apply_to_player: true
- id: send_message
args:
message: "&fYou have been teleported!"
action_bar: true
- id: play_sound
args:
sound: entity_dragon_fireball_explode
pitch: 1.5
volume: 4
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,61 +1,82 @@
#
# 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:
- wooden_pickaxe
- stone_pickaxe
- iron_pickaxe
- golden_pickaxe
- diamond_pickaxe
- netherite_pickaxe
slot: hands
items:
- wooden_pickaxe
- stone_pickaxe
- iron_pickaxe
- golden_pickaxe
- diamond_pickaxe
- netherite_pickaxe
axe:
- wooden_axe
- stone_axe
- iron_axe
- golden_axe
- diamond_axe
- netherite_axe
slot: hands
items:
- wooden_axe
- stone_axe
- iron_axe
- golden_axe
- diamond_axe
- netherite_axe
melee:
- wooden_axe
- stone_axe
- iron_axe
- golden_axe
- diamond_axe
- netherite_axe
- wooden_sword
- stone_sword
- iron_sword
- golden_sword
- diamond_sword
- netherite_sword
slot: hands
items:
- wooden_axe
- stone_axe
- iron_axe
- golden_axe
- diamond_axe
- netherite_axe
- wooden_sword
- stone_sword
- iron_sword
- golden_sword
- diamond_sword
- netherite_sword
trident:
- trident
slot: hands
items:
- trident
bow:
- bow
- crossbow
slot: hands
items:
- bow
- crossbow
armor:
- turtle_helmet
- leather_helmet
- chainmail_helmet
- iron_helmet
- golden_helmet
- diamond_helmet
- netherite_helmet
slot: armor
items:
- turtle_helmet
- leather_helmet
- chainmail_helmet
- iron_helmet
- golden_helmet
- diamond_helmet
- netherite_helmet
- leather_chestplate
- chainmail_chestplate
- iron_chestplate
- golden_chestplate
- diamond_chestplate
- netherite_chestplate
- leather_chestplate
- chainmail_chestplate
- iron_chestplate
- golden_chestplate
- diamond_chestplate
- netherite_chestplate
- leather_leggings
- chainmail_leggings
- iron_leggings
- golden_leggings
- diamond_leggings
- netherite_leggings
- leather_leggings
- chainmail_leggings
- iron_leggings
- golden_leggings
- diamond_leggings
- netherite_leggings
- leather_boots
- chainmail_boots
- iron_boots
- golden_boots
- diamond_boots
- netherite_boots
- leather_boots
- chainmail_boots
- iron_boots
- golden_boots
- diamond_boots
- netherite_boots

View File

@@ -1,2 +1,4 @@
version = 2.0.0
plugin-name = Reforges
#libreforge-updater
#Sat Jul 09 12:11:44 BST 2022
version=5.24.0
plugin-name=Reforges

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
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
zipStorePath=wrapper/dists

0
gradlew vendored Normal file → Executable file
View File

View File

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