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

Compare commits

...

196 Commits

Author SHA1 Message Date
Auxilor
fdd95f005f libreforge-updater 2022-11-23 17:24:59 +00:00
Auxilor
aec6639725 libreforge-updater 2022-11-21 16:02:42 +00:00
Auxilor
b3f98e2b6e libreforge-updater 2022-11-17 08:38:19 +00:00
Auxilor
8b2c96dc53 libreforge-updater 2022-11-12 17:34:16 +00:00
Auxilor
192bb138ff Final touches to GUI 2022-11-09 15:23:57 +00:00
Auxilor
1dc15fcb53 Updated to ecomponent 1.3.0 2022-11-09 15:07:18 +00:00
Auxilor
94394ecaec Updated to ecomponent 1.2.0 2022-11-09 14:37:47 +00:00
Auxilor
0cf2d4c810 Fix 2022-11-09 12:56:15 +00:00
Auxilor
dfed5b996a Cleaned up default configs 2022-11-09 12:46:23 +00:00
Auxilor
5adf8832a8 Oops 2022-11-09 11:46:01 +00:00
Auxilor
4335833b7b Cleanup 2022-11-09 11:35:37 +00:00
Auxilor
1d1a84991e Improvements to config 2022-11-09 11:20:07 +00:00
Auxilor
a2752daa07 Added %price% support to reforge stone 2022-11-08 17:33:25 +00:00
Auxilor
fb5926453c Cleanup 2022-11-08 17:31:34 +00:00
Auxilor
252e9472de Updated to 5.70.0 2022-11-08 17:30:54 +00:00
Auxilor
ebde54cb87 Added price support to reforges, added ecomponent 2022-11-08 17:30:47 +00:00
Auxilor
98aff77ab3 libreforge-updater 2022-11-06 19:52:00 +00:00
Auxilor
3ddf466f2d libreforge-updater 2022-11-01 16:23:07 +00:00
Auxilor
ca41b54daa libreforge-updater 2022-10-28 11:34:59 +01:00
Auxilor
ff9e16a25f libreforge-updater 2022-10-26 22:10:30 +01:00
Auxilor
c0d94f6150 Fix 2022-10-24 17:09:11 +01:00
Auxilor
4b3bf30a9b Fix 2022-10-24 17:08:49 +01:00
Auxilor
4c1ee554b4 libreforge-updater 2022-10-24 17:05:03 +01:00
Auxilor
695d90c793 Fixed reforge stone bug 2022-10-24 12:54:51 +01:00
Auxilor
a67270c09d libreforge-updater 2022-10-21 19:25:56 +01:00
Auxilor
8f23b22a05 libreforge-updater 2022-10-19 20:43:41 +01:00
Auxilor
7279958cca libreforge-updater 2022-10-18 14:13:24 +01:00
Auxilor
6689c3cf23 Fixed GUI, Improved _example.yml 2022-10-18 14:02:09 +01:00
Auxilor
df8357ac61 libreforge-updater 2022-10-16 23:26:48 +01:00
Auxilor
aa0f06092e libreforge-updater 2022-10-13 20:12:39 +01:00
Auxilor
19083d54b8 libreforge-updater 2022-10-10 21:04:09 +01:00
Auxilor
2a6c2941d8 libreforge-updater 2022-10-09 15:02:19 +01:00
Auxilor
757dffb08d libreforge-updater 2022-10-07 19:51:01 +01:00
Auxilor
277a0bef78 libreforge-updater 2022-10-06 12:04:08 +01:00
Auxilor
c7f8b9f97e libreforge-updater 2022-10-04 15:53:05 +01:00
Auxilor
0f97e2dfc4 Fixed reforge GUI 2022-10-04 12:33:52 +01:00
Auxilor
ae503fd646 libreforge-updater 2022-10-03 18:29:16 +01:00
Auxilor
89df16dabe libreforge-updater 2022-10-02 14:57:56 +01:00
Auxilor
c6dfa1849d libreforge-updater 2022-09-28 17:52:47 +01:00
Auxilor
fb4022dfd9 libreforge-updater 2022-09-26 18:27:29 +01:00
Auxilor
60c785717a libreforge-updater 2022-09-26 14:41:56 +01:00
Auxilor
a3810a9ff8 libreforge-updater 2022-09-26 10:51:59 +01:00
Auxilor
3498b575dc libreforge-updater 2022-09-22 17:30:19 +01:00
Auxilor
8f5668d8c4 libreforge-updater 2022-09-21 15:28:42 +01:00
Auxilor
6cde0ca092 libreforge-updater 2022-09-20 10:39:57 +01:00
Auxilor
d54e4ee8d5 libreforge-updater 2022-09-17 15:45:48 +01:00
Auxilor
65ef2a63d2 libreforge-updater 2022-09-15 12:16:42 +01:00
Auxilor
0d1ea5a7c8 libreforge-updater 2022-09-15 12:10:27 +01:00
Auxilor
7d32350eed libreforge-updater 2022-09-14 18:54:05 +01:00
Auxilor
4361ce0407 libreforge-updater 2022-09-14 15:13:49 +01:00
Auxilor
4267f5bd5d libreforge-updater 2022-09-14 15:10:16 +01:00
Auxilor
a5fc6e7436 libreforge-updater 2022-09-14 13:00:33 +01:00
Auxilor
cc5dfc0b0d libreforge-updater 2022-09-13 19:16:01 +01:00
Auxilor
16082cf3c6 libreforge-updater 2022-09-12 21:22:09 +01:00
Auxilor
0d3485855a libreforge-updater 2022-09-12 17:15:58 +01:00
Auxilor
afaafb5899 libreforge-updater 2022-09-11 19:28:17 +01:00
Auxilor
8fbc672f1f libreforge-updater 2022-09-10 12:59:07 +01:00
Auxilor
19221c8969 libreforge-updater 2022-09-10 10:52:11 +01:00
Auxilor
0f96c5027e libreforge-updater 2022-09-06 15:44:05 +01:00
Auxilor
e58429c9c7 libreforge-updater 2022-09-06 13:46:56 +01:00
Auxilor
f2831f0bcd libreforge-updater 2022-09-06 11:26:12 +01:00
Auxilor
1c84929739 libreforge-updater 2022-09-05 18:01:20 +01:00
Auxilor
67b4e340d8 libreforge-updater 2022-09-04 17:23:21 +01:00
Auxilor
f6b23bf649 libreforge-updater 2022-09-04 16:22:50 +01:00
Auxilor
515d5022ba libreforge-updater 2022-09-03 14:21:09 +01:00
Auxilor
bf0813ae70 libreforge-updater 2022-09-01 13:07:13 +01:00
Auxilor
c5330b79b5 libreforge-updater 2022-08-31 12:46:44 +01:00
Auxilor
e961411808 libreforge-updater 2022-08-30 20:29:37 +01:00
Auxilor
75d8475ece libreforge-updater 2022-08-30 19:22:16 +01:00
Auxilor
9e7d9559d9 libreforge-updater 2022-08-29 10:59:43 +01:00
Auxilor
a58c7c892a libreforge-updater 2022-08-28 15:41:45 +01:00
Auxilor
9eaad16592 libreforge-updater 2022-08-27 11:27:38 +01:00
Auxilor
83690068b2 libreforge-updater 2022-08-24 12:52:19 +02:00
Auxilor
1391cdc978 libreforge-updater 2022-08-24 12:49:22 +02:00
Auxilor
9c6461984e libreforge-updater 2022-08-24 11:56:30 +02:00
Auxilor
340fcb1908 libreforge-updater 2022-08-23 11:06:49 +02:00
Auxilor
7f0f8078aa libreforge-updater 2022-08-22 12:45:17 +02:00
Auxilor
e1c70dd4b4 libreforge-updater 2022-08-20 09:58:58 +02:00
Auxilor
ec3a4215b7 libreforge-updater 2022-08-17 14:21:02 +02:00
Auxilor
4f80c3b5f3 libreforge-updater 2022-08-17 12:08:50 +02:00
Auxilor
55efb74fb4 libreforge-updater 2022-08-16 18:44:50 +02:00
Auxilor
d4efad6cd7 libreforge-updater 2022-08-14 17:29:22 +02:00
Auxilor
4fc10862f6 libreforge-updater 2022-08-13 11:56:10 +02:00
Auxilor
c0b96e58ff libreforge-updater 2022-08-05 18:42:27 +01:00
Auxilor
1bdf9b9f4c libreforge-updater 2022-08-05 18:40:57 +01:00
Auxilor
9baaf37108 libreforge-updater 2022-08-04 13:04:31 +01:00
Auxilor
8b89c16754 lang 2022-08-04 12:39:29 +01:00
Auxilor
8ee6b64dec lang 2022-08-04 12:36:42 +01:00
Auxilor
507e476de0 lang 2022-08-04 12:29:26 +01:00
Auxilor
e4bdc914d6 libreforge-updater 2022-08-04 12:27:32 +01:00
Auxilor
89c11c5d03 libreforge-updater 2022-08-04 12:25:20 +01:00
Auxilor
ace9174713 libreforge-updater 2022-08-02 16:27:39 +01:00
Auxilor
11b755c03e libreforge-updater 2022-08-02 16:22:17 +01:00
Auxilor
e502281fac libreforge-updater 2022-08-02 16:18:20 +01:00
Auxilor
7f5b2e28d4 libreforge-updater 2022-08-01 11:20:25 +01:00
Auxilor
0c77fae5c0 libreforge-updater 2022-07-29 17:51:47 +01:00
Auxilor
67c67fe494 libreforge-updater 2022-07-27 20:18:29 +01:00
Auxilor
91cd161e0f libreforge-updater 2022-07-25 17:54:45 +01:00
Auxilor
0ae01af7cf libreforge-updater 2022-07-25 17:03:41 +01:00
Auxilor
7dd0f35f1f Fixed migration 2022-07-24 22:51:14 +01:00
Auxilor
e4afc37f45 libreforge-updater 2022-07-24 22:49:58 +01:00
Auxilor
b74a7f1085 libreforge-updater 2022-07-24 21:52:02 +01:00
Auxilor
94d2ab4593 Updated to 5.27.3 2022-07-24 15:44:27 +01:00
Auxilor
9fce6a6d74 Updated eco, fixed display 2022-07-24 15:44:19 +01:00
Auxilor
a84231c13b libreforge-updater 2022-07-23 17:44:02 +01:00
Auxilor
c833cc9b67 libreforge-updater 2022-07-22 14:22:10 +01:00
Auxilor
2018f5c506 libreforge-updater 2022-07-21 20:15:20 +01:00
Auxilor
783b14d650 libreforge-updater 2022-07-20 00:11:25 +01:00
Auxilor
793075a70e libreforge-updater 2022-07-13 21:23:48 +01:00
Auxilor
f1f3d5b014 libreforge-updater 2022-07-12 14:59:51 +01:00
Auxilor
a0af472e17 libreforge-updater 2022-07-11 16:17:28 +01:00
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
62 changed files with 1574 additions and 2059 deletions

View File

@@ -4,7 +4,7 @@ buildscript {
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
}
}
@@ -40,21 +40,20 @@ allprojects {
shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.reforges.libreforge')
relocate('com.willfp.ecomponent', 'com.willfp.reforges.ecomponent')
relocate('org.joml', 'com.willfp.reforges.libreforge.joml')
}
dependencies {
compileOnly 'com.willfp:eco:6.34.0'
implementation 'com.willfp:libreforge:3.34.1'
compileOnly 'com.willfp:eco:6.46.0'
implementation 'com.willfp:libreforge:3.121.0'
implementation 'com.willfp:ecomponent:1.3.0'
implementation 'org.joml:joml:1.10.4'
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.kotlin:kotlin-stdlib:1.6.21'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10'
}
tasks.withType(JavaCompile) {
@@ -63,7 +62,7 @@ allprojects {
}
processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**reforges.yml", "**lang.yml"]) {
filesMatching(["**plugin.yml"]) {
expand projectVersion: project.version
}
}
@@ -71,6 +70,7 @@ allprojects {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs += ["-Xjvm-default=all"]
}
}

View File

@@ -1,184 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
https://docs.oracle.com/javase/specs/jls/se11/html/index.html
- the Sun Code Conventions at https://www.oracle.com/java/technologies/javase/codeconventions-contents.html
- the Javadoc guidelines at
https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html
- the JDK Api documentation https://docs.oracle.com/en/java/javase/11/
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
https://checkstyle.org (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
To suppress certain violations please review suppression filters.
Finally, it is worth reading the documentation.
-->
<module name="Checker">
<module name="SuppressionFilter">
<property name="file" value="config/checkstyle/suppression.xml"/>
</module>
<!--
If you set the basedir property below, then all reported file
names will be relative to the specified directory. See
https://checkstyle.org/config.html#Checker
<property name="basedir" value="${basedir}"/>
-->
<property name="severity" value="error"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Excludes all 'module-info.java' files -->
<!-- See https://checkstyle.org/config_filefilters.html -->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<!-- Checks whether files end with a new line. -->
<!-- See https://checkstyle.org/config_misc.html#NewlineAtEndOfFile -->
<module name="NewlineAtEndOfFile"/>
<!-- Checks that property files contain the same keys. -->
<!-- See https://checkstyle.org/config_misc.html#Translation -->
<module name="Translation"/>
<!-- Checks for Size Violations. -->
<!-- See https://checkstyle.org/config_sizes.html -->
<module name="FileLength"/>
<module name="LineLength">
<property name="fileExtensions" value="java"/>
<property name="max" value="200"/>
</module>
<!-- Checks for whitespace -->
<!-- See https://checkstyle.org/config_whitespace.html -->
<module name="FileTabCharacter"/>
<!-- Miscellaneous other checks. -->
<!-- See https://checkstyle.org/config_misc.html -->
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="minimum" value="0"/>
<property name="maximum" value="0"/>
<property name="message" value="Line has trailing spaces."/>
</module>
<!-- Checks for Headers -->
<!-- See https://checkstyle.org/config_header.html -->
<!-- <module name="Header"> -->
<!-- <property name="headerFile" value="${checkstyle.header.file}"/> -->
<!-- <property name="fileExtensions" value="java"/> -->
<!-- </module> -->
<module name="TreeWalker">
<!-- Checks for Javadoc comments. -->
<!-- See https://checkstyle.org/config_javadoc.html -->
<module name="InvalidJavadocPosition"/>
<module name="JavadocMethod"/>
<module name="JavadocType"/>
<module name="JavadocVariable"/>
<module name="JavadocStyle"/>
<module name="MissingJavadocMethod"/>
<!-- Checks for Naming Conventions. -->
<!-- See https://checkstyle.org/config_naming.html -->
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<module name="MethodName"/>
<module name="PackageName"/>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName"/>
<!-- Checks for imports -->
<!-- See https://checkstyle.org/config_imports.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
<module name="RedundantImport"/>
<module name="UnusedImports">
<property name="processJavadoc" value="true"/>
</module>
<!-- Checks for Size Violations. -->
<!-- See https://checkstyle.org/config_sizes.html -->
<!-- <module name="MethodLength"/> -->
<module name="ParameterNumber"/>
<!-- Checks for whitespace -->
<!-- See https://checkstyle.org/config_whitespace.html -->
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<!-- Modifier Checks -->
<!-- See https://checkstyle.org/config_modifiers.html -->
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<!-- Checks for blocks. You know, those {}'s -->
<!-- See https://checkstyle.org/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<module name="EmptyBlock"/>
<module name="LeftCurly"/>
<module name="NeedBraces"/>
<module name="RightCurly"/>
<!-- Checks for common coding problems -->
<!-- See https://checkstyle.org/config_coding.html -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<!-- <module name="MagicNumber"/> -->
<module name="MissingSwitchDefault"/>
<module name="MultipleVariableDeclarations"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<!-- Checks for class design -->
<!-- See https://checkstyle.org/config_design.html -->
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/>
<!-- <module name="HideUtilityClassConstructor"/> -->
<module name="InterfaceIsType"/>
<module name="VisibilityModifier"/>
<module name="RequireThis"/>
<!-- Miscellaneous other checks. -->
<!-- See https://checkstyle.org/config_misc.html -->
<module name="ArrayTypeStyle"/>
<module name="FinalParameters"/>
<module name="TodoComment"/>
<module name="UpperEll"/>
</module>
</module>

View File

@@ -1,14 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
<!-- Effects don't need javadoc. -->
<suppress files="[\\/]reforges[\\/]reforges[\\/]" checks="MissingJavadocMethod"/>
<suppress files="[\\/]reforges[\\/]reforges[\\/]" checks="JavadocVariable"/>
<!-- Fields don't need javadoc -->
<suppress files="Reforges.java" checks="JavadocVariable"/>
</suppressions>

View File

@@ -1,113 +0,0 @@
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.reforges.util.ReforgeEnableListeners;
import com.willfp.reforges.reforges.util.ReforgeLookup;
import com.willfp.reforges.util.AntiPlaceListener;
import com.willfp.reforges.util.DiscoverRecipeListener;
import lombok.Getter;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
public class ReforgesPlugin extends LibReforgePlugin {
/**
* Instance of Reforges.
*/
private static ReforgesPlugin instance;
/**
* target.yml.
*/
@Getter
private final TargetYml targetYml;
/**
* reforges.yml.
*/
@Getter
private final ReforgesYml reforgesYml;
/**
* Internal constructor called by bukkit on plugin load.
*/
public ReforgesPlugin() {
super(1330, 12412, "&3", "");
this.targetYml = new TargetYml(this);
this.reforgesYml = new ReforgesYml(this);
instance = this;
registerHolderProvider(ReforgeLookup::provideReforges);
}
@Override
public void handleEnableAdditional() {
Items.registerArgParser(new ReforgeArgParser());
}
@Override
public void handleReloadAdditional() {
this.getLogger().info(Reforges.values().size() + " Reforges Loaded");
}
@Override
protected List<Listener> loadListeners() {
return Arrays.asList(
new DiscoverRecipeListener(this),
new AntiPlaceListener(),
new ReforgeEnableListeners(this)
);
}
@Override
protected List<PluginCommand> loadPluginCommands() {
return Arrays.asList(
new CommandReforge(this),
new CommandReforges(this)
);
}
@Override
protected @Nullable DisplayModule createDisplayModule() {
return new ReforgesDisplay(this);
}
@NotNull
@Override
public List<IntegrationLoader> loadAdditionalIntegrations() {
return Arrays.asList(
new IntegrationLoader("Talismans", TalismansIntegration::registerProvider)
);
}
@Override
@NotNull
public String getMinimumEcoVersion() {
return "6.33.0";
}
/**
* Get an instance of Reforges.
*
* @return The instance.
*/
public static ReforgesPlugin getInstance() {
return instance;
}
}

View File

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

View File

@@ -1,55 +0,0 @@
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.meta.ReforgeTarget;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TargetYml extends StaticBaseConfig {
/**
* Instantiate target.yml.
*
* @param plugin Instance of EcoEnchants.
*/
public TargetYml(@NotNull final EcoPlugin plugin) {
super("target", plugin, ConfigType.YAML);
}
/**
* 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 + ".items").forEach(s -> items.add(Items.lookup(s.toUpperCase())));
return items;
}
/**
* Get all materials from a target name.
*
* @param target The name of the target.
* @return All materials.
*/
public ReforgeTarget.Slot getSlot(@NotNull final String target) {
return ReforgeTarget.Slot.valueOf(this.getString(target + ".slot").toUpperCase());
}
}

View File

@@ -1,92 +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.Config;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.libreforge.chains.EffectChains;
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 (Config config : plugin.getReforgesYml().getSubsections("chains")) {
EffectChains.compile(config, "Chains");
}
for (Reforge reforge : values()) {
removeReforge(reforge);
}
for (Config config : plugin.getReforgesYml().getSubsections("reforges")) {
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,152 +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 java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class ReforgeTarget {
/**
* Target containing the materials from all other targets.
*/
public static final ReforgeTarget ALL = new ReforgeTarget("all", Slot.ANY, 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;
/**
* The slot for the target.
*/
@Getter
private final Slot slot;
/**
* 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 Slot slot,
@NotNull final Set<TestableItem> items) {
this.name = name;
items.removeIf(item -> item instanceof EmptyTestableItem);
this.items = items;
this.slot = slot;
}
/**
* 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.
*/
public static List<ReforgeTarget> getForItem(@NotNull final ItemStack item) {
return REGISTERED.values().stream()
.filter(target -> !target.getName().equalsIgnoreCase("all"))
.filter(target -> target.matches(item))
.collect(Collectors.toList());
}
/**
* 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().getSlot(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());
}
/**
* Reforge slots.
*/
public enum Slot {
HANDS,
ARMOR,
ANY
}
}

View File

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

View File

@@ -1,150 +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.eco.core.integrations.economy.EconomyManager;
import com.willfp.reforges.reforges.PriceMultipliers;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
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;
import java.util.ArrayList;
import java.util.List;
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;
}
Reforge existingReforge = ReforgeUtils.getReforge(toReforge);
List<ReforgeTarget> target = ReforgeTarget.getForItem(toReforge);
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) {
List<Reforge> existing = new ArrayList<>();
if (existingReforge != null) {
existing.add(existingReforge);
}
reforge = ReforgeUtils.getRandomReforge(target, existing);
}
if (reforge == null) {
return;
}
double cost = 0;
if (EconomyManager.hasRegistrations()) {
cost = this.getPlugin().getConfigYml().getDouble("reforge.cost");
int reforges = ReforgeUtils.getReforges(toReforge);
cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges);
if (reforge.getRequiresStone() && reforge.getStonePrice() != -1) {
cost = reforge.getStonePrice();
}
cost *= PriceMultipliers.getForPlayer(player).getMultiplier();
if (!EconomyManager.hasAmount(player, cost)) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money"));
if (this.getPlugin().getConfigYml().getBool("gui.insufficient-money-sound.enabled")) {
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;
}
}
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);
xpCost *= PriceMultipliers.getForPlayer(player).getMultiplier();
if (player.getLevel() < xpCost) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-xp"));
if (this.getPlugin().getConfigYml().getBool("gui.insufficient-money-sound.enabled")) {
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;
}
if (EconomyManager.hasRegistrations()) {
EconomyManager.removeMoney(player, cost);
}
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);
if (this.getPlugin().getConfigYml().getBool("gui.stone-sound.enabled")) {
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")
);
}
}
if (this.getPlugin().getConfigYml().getBool("gui.sound.enabled")) {
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,150 +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.meta.ReforgeTarget;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ReforgeLookup {
/**
* All registered providers.
*/
private static final Set<Function<Player, Map<ItemStack, ReforgeTarget.Slot>>> PROVIDERS = new HashSet<>();
/**
* Cached items.
*/
private static final Map<UUID, Map<ItemStack, ReforgeTarget.Slot>> ITEM_CACHE = new WeakHashMap<>();
/**
* Cached reforges.
*/
private static final Map<UUID, Collection<Reforge>> REFORGE_CACHE = new WeakHashMap<>();
/**
* Instance of Reforges.
*/
private static final EcoPlugin PLUGIN = ReforgesPlugin.getInstance();
/**
* Register provider.
*
* @param provider The provider.
*/
public static void registerProvider(@NotNull final Function<Player, Map<ItemStack, ReforgeTarget.Slot>> provider) {
PROVIDERS.add(provider);
}
/**
* Provide ItemStacks.
*
* @param player The player.
* @return The ItemStacks.
*/
public static Map<ItemStack, ReforgeTarget.Slot> provide(@NotNull final Player player) {
if (ITEM_CACHE.containsKey(player.getUniqueId())) {
return new HashMap<>(ITEM_CACHE.get(player.getUniqueId()));
}
Map<ItemStack, ReforgeTarget.Slot> found = new HashMap<>();
for (Function<Player, Map<ItemStack, ReforgeTarget.Slot>> provider : PROVIDERS) {
found.putAll(provider.apply(player));
}
found.keySet().removeIf(Objects::isNull);
ITEM_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> ITEM_CACHE.remove(player.getUniqueId()), 40);
return found;
}
/**
* Provide Reforges.
*
* @param player The player.
* @return The Reforges.
*/
public static List<Reforge> provideReforges(@NotNull final Player player) {
if (REFORGE_CACHE.containsKey(player.getUniqueId())) {
return new ArrayList<>(REFORGE_CACHE.get(player.getUniqueId()));
}
List<Reforge> found = new ArrayList<>();
for (Map.Entry<ItemStack, ReforgeTarget.Slot> entry : provide(player).entrySet()) {
ItemStack itemStack = entry.getKey();
ReforgeTarget.Slot slot = entry.getValue();
if (itemStack == null) {
continue;
}
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
continue;
}
if (slot != ReforgeTarget.Slot.ANY) {
if (!reforge.getTargets().stream()
.map(ReforgeTarget::getSlot)
.collect(Collectors.toList())
.contains(slot)) {
continue;
}
}
found.add(reforge);
}
REFORGE_CACHE.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> REFORGE_CACHE.remove(player.getUniqueId()), 40);
return found;
}
/**
* Clear cache.
*
* @param player The player.
*/
public static void clearCache(@NotNull final Player player) {
ITEM_CACHE.remove(player.getUniqueId());
REFORGE_CACHE.remove(player.getUniqueId());
}
static {
registerProvider(player -> Map.of(
player.getInventory().getItemInMainHand(),
ReforgeTarget.Slot.HANDS
));
if (!PLUGIN.getConfigYml().getBool("no-offhand")) {
registerProvider(player -> Map.of(
player.getInventory().getItemInOffHand(),
ReforgeTarget.Slot.HANDS
));
}
registerProvider(player -> {
Map<ItemStack, ReforgeTarget.Slot> items = new HashMap<>();
for (ItemStack stack : player.getInventory().getArmorContents()) {
items.put(stack, ReforgeTarget.Slot.ARMOR);
}
return items;
});
}
}

View File

@@ -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,300 +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.Collection;
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 targets The targets.
*/
@Nullable
public static Reforge getRandomReforge(@NotNull final Collection<ReforgeTarget> targets) {
return getRandomReforge(targets, Collections.emptyList());
}
/**
* Get a random reforge for a target.
*
* @param targets The targets.
* @param disallowed The disallowed reforges.
*/
@Nullable
public static Reforge getRandomReforge(@NotNull final Collection<ReforgeTarget> targets,
@NotNull final Collection<Reforge> disallowed) {
List<Reforge> applicable = new ArrayList<>();
for (Reforge reforge : Reforges.values()) {
for (ReforgeTarget target : targets) {
if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) {
applicable.add(reforge);
}
}
}
Collections.shuffle(applicable);
applicable.removeAll(disallowed);
if (applicable.isEmpty()) {
return null;
}
return applicable.get(0);
}
public static MetadatedReforgeStatus 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;
List<ReforgeTarget> target = new ArrayList<>();
if (toReforge == null || toReforge.getType() == Material.AIR) {
status = ReforgeStatus.NO_ITEM;
} else {
target.addAll(ReforgeTarget.getForItem(toReforge));
if (target.isEmpty()) {
status = ReforgeStatus.INVALID_ITEM;
}
}
if (!target.isEmpty()) {
status = ReforgeStatus.ALLOW;
}
double cost = 0;
if (status == ReforgeStatus.ALLOW) {
Reforge reforgeStone = getReforgeStone(stone);
if (reforgeStone != null && reforgeStone.getTargets().stream()
.anyMatch(reforgeTarget -> reforgeTarget.getItems().stream()
.anyMatch(item -> item.matches(toReforge)))) {
cost = reforgeStone.getStonePrice();
status = ReforgeStatus.ALLOW_STONE;
}
}
return new MetadatedReforgeStatus(status, cost);
}
/**
* Get reforge on an item.
*
* @param item The item to query.
* @return The found reforge, or null.
*/
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.
*/
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;
}
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());
}
/**
* Get reforge stone on an item.
*
* @param item The item to query.
* @return The found reforge, or null.
*/
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.
*/
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

@@ -0,0 +1,73 @@
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.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.AntiPlaceListener
import com.willfp.reforges.util.DiscoverRecipeListener
import com.willfp.reforges.util.ReforgeEnableListeners
import com.willfp.reforges.util.ReforgeLookup
import org.bukkit.event.Listener
class ReforgesPlugin : LibReforgePlugin() {
val targetYml: TargetYml =
TargetYml(this)
init {
instance = this
}
override fun handleEnableAdditional() {
this.copyConfigs("reforges")
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() }
)
}
companion object {
/**
* Instance of Reforges.
*/
@JvmStatic
lateinit var instance: ReforgesPlugin
private set
}
}

View File

@@ -3,7 +3,7 @@ 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.reforges.util.ReforgeUtils
import com.willfp.reforges.util.reforge
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
@@ -27,7 +27,7 @@ class CommandApply(
if (sender is Player) {
val item = sender.inventory.itemInMainHand
ReforgeUtils.setReforge(item, reforge)
item.reforge = reforge
sender.sendMessage(
plugin.langYml.getMessage("applied-reforge")
.replace("%reforge%", reforge.name)
@@ -45,7 +45,7 @@ class CommandApply(
return
}
ReforgeUtils.setReforge(player.inventory.itemInMainHand, reforge)
player.inventory.itemInMainHand.reforge = reforge
sender.sendMessage(
plugin.langYml.getMessage("applied-reforge")
.replace("%reforge%", reforge.name)

View File

@@ -2,7 +2,7 @@ package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import com.willfp.reforges.gui.ReforgeGUI
import org.bukkit.Bukkit
import org.bukkit.Sound
import org.bukkit.command.CommandSender
@@ -29,7 +29,8 @@ class CommandOpen(
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
}
menu.open(player)
ReforgeGUI.open(player)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {

View File

@@ -2,7 +2,7 @@ package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import com.willfp.reforges.gui.ReforgeGUI
import org.bukkit.Sound
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
@@ -20,6 +20,7 @@ class CommandReforge(
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
}
menu.open(player)
ReforgeGUI.open(player)
}
}

View File

@@ -1,10 +1,15 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.libreforge.lrcdb.CommandExport
import com.willfp.libreforge.lrcdb.CommandImport
import com.willfp.libreforge.lrcdb.ExportableConfig
import com.willfp.reforges.reforges.Reforges
import org.bukkit.command.CommandSender
class CommandReforges(plugin: EcoPlugin) : PluginCommand(plugin, "reforges", "reforges.command.reforges", false) {
class CommandReforges(plugin: LibReforgePlugin) :
PluginCommand(plugin, "reforges", "reforges.command.reforges", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
sender.sendMessage(
plugin.langYml.getMessage("invalid-command")
@@ -16,5 +21,14 @@ class CommandReforges(plugin: EcoPlugin) : PluginCommand(plugin, "reforges", "re
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandOpen(plugin))
.addSubcommand(CommandApply(plugin))
.addSubcommand(CommandImport("reforges", plugin))
.addSubcommand(CommandExport(plugin) {
Reforges.values().map {
ExportableConfig(
it.id,
it.config
)
}
})
}
}

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

@@ -3,44 +3,39 @@ package com.willfp.reforges.display
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.display.DisplayProperties
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.formatEco
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.TextReplacementConfig
import net.kyori.adventure.text.format.TextDecoration
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
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.HIGH) {
/**
* Deprecated
*/
@Deprecated("Use PDC components!")
private val replacement = TextReplacementConfig.builder()
.match("§w(.+)§w")
.replacement("")
.build()
private val originalComponentKey = plugin.namespacedKeyFactory.create("real_name")
private val serializer = GsonComponentSerializer.gson()
private val tempKey = plugin.namespacedKeyFactory.create("temp")
override fun display(
itemStack: ItemStack,
player: Player?,
props: DisplayProperties,
vararg args: Any
) {
val target = ReforgeTarget.getForItem(itemStack)
val targets = ReforgeTargets.getForItem(itemStack)
val meta = itemStack.itemMeta ?: return
val fast = itemStack.fast()
val stone = ReforgeUtils.getReforgeStone(meta)
val stone = fast.persistentDataContainer.reforgeStone
if (target.isEmpty() && stone == null) {
if (targets.isEmpty() && stone == null) {
return
}
@@ -48,10 +43,16 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
val lore = fastItemStack.lore
val reforge = ReforgeUtils.getReforge(meta)
val reforge = fast.persistentDataContainer.reforge
if (reforge == null && stone == null && target != null) {
if (reforge == null && stone == null) {
if (plugin.configYml.getBool("reforge.show-reforgable")) {
if (plugin.configYml.getBool("reforge.no-reforgable-in-gui")) {
if (props.inGui) {
return
}
}
val addLore: MutableList<String> = ArrayList()
for (string in plugin.configYml.getFormattedStrings("reforge.reforgable-suffix")) {
addLore.add(Display.PREFIX + string)
@@ -61,23 +62,24 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
}
if (stone != null) {
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 = stone.config.getFormattedStrings("stone.lore").map {
"${Display.PREFIX}$it"
}.toList()
val stoneLore = stone.config.getStrings("stone.lore")
.map { it.replace("%price%", if (player == null) "" else stone.stonePrice?.getDisplay(player) ?: "") }
.formatEco(player)
.map { "${Display.PREFIX}$it" }
lore.addAll(0, stoneLore)
}
@@ -92,18 +94,29 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
lore.addAll(addLore)
}
if (plugin.configYml.getBool("reforge.display-in-name")) {
val displayName = fastItemStack.displayNameComponent.replaceText(replacement)
val displayName = fastItemStack.displayNameComponent
val newName = StringUtils.toComponent("${reforge.name} ")
.decoration(TextDecoration.ITALIC, false).append(displayName)
if (!fastItemStack.displayName.contains(reforge.name)) {
fastItemStack.persistentDataContainer.set(
tempKey,
PersistentDataType.STRING,
displayName.toJSON()
)
val newName = reforge.namePrefixComponent.append(displayName)
fastItemStack.setDisplayName(newName)
}
}
fastItemStack.persistentDataContainer.set(
originalComponentKey,
PersistentDataType.STRING,
serializer.serialize(displayName)
)
if (player != null) {
val lines = reforge.getNotMetLines(player).map { Display.PREFIX + it }
if (lines.isNotEmpty()) {
lore.add(Display.PREFIX)
lore.addAll(lines)
}
}
}
@@ -111,15 +124,25 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
}
override fun revert(itemStack: ItemStack) {
ReforgeTarget.getForItem(itemStack) ?: return
itemStack.reforge ?: return
val fis = FastItemStack.wrap(itemStack)
if (plugin.configYml.getBool("reforge.display-in-name")) {
val originalName =
fis.persistentDataContainer.get(originalComponentKey, PersistentDataType.STRING) ?: return
fis.persistentDataContainer.remove(originalComponentKey)
fis.setDisplayName(serializer.deserialize(originalName).replaceText(replacement))
if (!plugin.configYml.getBool("reforge.display-in-name")) {
return
}
if (fis.persistentDataContainer.has(tempKey, PersistentDataType.STRING)) {
fis.setDisplayName(
StringUtils.jsonToComponent(
fis.persistentDataContainer.get(
tempKey,
PersistentDataType.STRING
)
)
)
fis.persistentDataContainer.remove(tempKey)
}
}
}

View File

@@ -1,116 +1,205 @@
package com.willfp.reforges.gui
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.emptyConfig
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.core.gui.captiveSlot
import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuEvent
import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent
import com.willfp.eco.core.gui.onEvent
import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.CustomSlot
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.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.ReforgesPlugin
import com.willfp.eco.core.items.builder.modify
import com.willfp.eco.core.items.isEmpty
import com.willfp.eco.core.price.ConfiguredPrice
import com.willfp.eco.core.sound.PlayableSound
import com.willfp.ecomponent.CaptiveItem
import com.willfp.ecomponent.menuStateVar
import com.willfp.ecomponent.setSlot
import com.willfp.reforges.reforges.PriceMultipliers
import com.willfp.reforges.reforges.util.ReforgeHandler
import com.willfp.reforges.reforges.util.ReforgeStatus
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.Material
import com.willfp.reforges.reforges.PriceMultipliers.reforgePriceMultiplier
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.reforges.reforges.ReforgeTargets
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.Sound
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.Locale
import kotlin.math.pow
private data class ReforgeGUIStatus(
val status: ReforgeStatus,
val price: ConfiguredPrice,
val isStonePrice: Boolean
)
private class ReforgePriceChangeEvent : MenuEvent
private val Menu.reforgeStatus by menuStateVar(
ReforgeGUIStatus(
ReforgeStatus.NO_ITEM,
ConfiguredPrice.createOrFree(emptyConfig()),
false
)
)
private class IndicatorSlot(
plugin: EcoPlugin
) : CustomSlot() {
private val slot = slot { player, menu ->
val status = menu.reforgeStatus[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
}
}
init {
init(slot)
}
}
private class ActivatorSlot(
plugin: EcoPlugin,
itemToReforge: CaptiveItem,
reforgeStone: CaptiveItem
) : CustomSlot() {
private val slot = slot({ player, menu ->
val (status, price) = menu.reforgeStatus[player]
val configKey = status.configKey
Items.lookup(plugin.configYml.getString("gui.$configKey.material")).modify {
setDisplayName(plugin.configYml.getString("gui.$configKey.name"))
addLoreLines(plugin.configYml.getStrings("gui.$configKey.lore").map {
it.replace("%price%", price.getDisplay(player))
.replace(
"%stone%",
reforgeStone[player]?.reforgeStone?.name ?: ""
)
// Legacy
.replace("%cost%", price.getDisplay(player))
.replace("%xpcost%", price.getDisplay(player))
})
}
}) {
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
val item = itemToReforge[player] ?: return@onLeftClick
val currentReforge = item.reforge
val targets = ReforgeTargets.getForItem(item)
var usedStone = false
val stoneInMenu = reforgeStone[player]?.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
}
val price = menu.reforgeStatus[player].price
if (!price.canAfford(player)) {
player.sendMessage(
plugin.langYml.getMessage("cannot-afford-price").replace("%price%", price.getDisplay(player))
)
if (plugin.configYml.getBool("gui.cannot-afford-sound.enabled")) {
PlayableSound.create(
plugin.configYml.getSubsection("gui.cannot-afford-sound")
)?.playTo(player)
}
return@onLeftClick
}
price.pay(player)
player.sendMessage(plugin.langYml.getMessage("applied-reforge").replace("%reforge%", reforge.name))
item.timesReforged++
item.reforge = reforge
if (usedStone) {
val stone = reforgeStone[player]
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()
)
}
menu.callEvent(player, ReforgePriceChangeEvent())
}
}
init {
init(slot)
}
}
@Suppress("DEPRECATION")
object ReforgeGUI {
@JvmStatic
lateinit var menu: Menu
private lateinit var menu: Menu
init {
update(ReforgesPlugin.getInstance())
private lateinit var itemToReforge: CaptiveItem
private lateinit var reforgeStone: CaptiveItem
private lateinit var defaultPrice: ConfiguredPrice
@JvmStatic
fun open(player: Player) {
menu.open(player)
}
@JvmStatic
@ConfigUpdater
fun update(plugin: EcoPlugin) {
val handler = ReforgeHandler(plugin)
itemToReforge = CaptiveItem()
reforgeStone = CaptiveItem()
val activatorSlot = slot(ItemStack(Material.ANVIL)) {
setModifier { player, menu, previous ->
val meta = previous.itemMeta ?: return@setModifier
val (status, specialCost) = ReforgeUtils.getStatus(menu.getCaptiveItems(player))
val cost: Double = when {
status == ReforgeStatus.ALLOW || (status == ReforgeStatus.ALLOW_STONE && specialCost < 0) -> {
val amountOfReforges = ReforgeUtils.getReforges(menu.getCaptiveItems(player)[0])
plugin.configYml.getDouble("reforge.cost") *
plugin.configYml.getDouble("reforge.cost-exponent").pow(amountOfReforges) *
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 = ReforgeUtils.getReforges(item)
xpCost *= PriceMultipliers.getForPlayer(player).multiplier.toInt()
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
}
when (status) {
ReforgeStatus.INVALID_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.invalid-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.invalid-item.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.invalid-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.allow.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.allow.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW_STONE -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow-stone.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.allow-stone.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.allow-stone.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
.replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player)[1]).name)
}
}
ReforgeStatus.NO_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.no-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getFormattedString("gui.no-item.name"))
meta.lore = plugin.configYml.getFormattedStrings("gui.no-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
}
previous.itemMeta = meta
}
onLeftClick(handler::handleReforgeClick)
}
defaultPrice = ConfiguredPrice.createOrFree(plugin.configYml.getSubsection("reforge.price"))
val maskPattern = plugin.configYml.getStrings("gui.mask.pattern").toTypedArray()
@@ -118,70 +207,108 @@ object ReforgeGUI {
.mapNotNull { Items.lookup(it) }
.toTypedArray()
val allowItem = Items.lookup(plugin.configYml.getString("gui.show-allowed.allow-material")).item
val denyItem = Items.lookup(plugin.configYml.getString("gui.show-allowed.deny-material")).item
val closeItem = Items.lookup(plugin.configYml.getString("gui.close.material")).item
menu = menu(plugin.configYml.getInt("gui.rows")) {
setTitle(plugin.langYml.getFormattedString("menu.title"))
title = plugin.langYml.getFormattedString("menu.title")
setMask(FillerMask(MaskItems(*maskItems), *maskPattern))
modfiy { builder ->
val slot = Slot.builder(
ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
).apply {
setModifier { player, menu, previous ->
val status = ReforgeUtils.getStatus(
menu.getCaptiveItems(player)
).status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
previous.type = allowItem.type
previous.itemMeta = allowItem.itemMeta
} else {
previous.type = denyItem.type
previous.itemMeta = denyItem.itemMeta
}
}
}.build()
allowChangingHeldItem()
val allowedPattern = plugin.configYml.getStrings("gui.show-allowed.pattern")
for (i in 1..allowedPattern.size) {
val row = allowedPattern[i - 1]
for (j in 1..9) {
if (row[j - 1] != '0') {
builder.setSlot(i, j, slot)
}
setSlot(i, j, IndicatorSlot(plugin))
}
}
}
setSlot(
plugin.configYml.getInt("gui.item-slot.row"),
plugin.configYml.getInt("gui.item-slot.column"),
Slot.builder().setCaptive().build()
captiveSlot(),
bindCaptive = itemToReforge
)
setSlot(
plugin.configYml.getInt("gui.stone-slot.row"),
plugin.configYml.getInt("gui.stone-slot.column"),
Slot.builder().setCaptive().build()
captiveSlot(),
bindCaptive = reforgeStone
)
setSlot(
plugin.configYml.getInt("gui.activator-slot.row"),
plugin.configYml.getInt("gui.activator-slot.column"),
activatorSlot
ActivatorSlot(plugin, itemToReforge, reforgeStone)
)
setSlot(
plugin.configYml.getInt("gui.close.location.row"),
plugin.configYml.getInt("gui.close.location.column"),
Slot.builder(
ItemStackBuilder(closeItem)
slot(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.close.material")))
.setDisplayName(plugin.langYml.getFormattedString("menu.close"))
.build()
).onLeftClick { event, _, _ ->
event.whoClicked.closeInventory()
}.build()
) {
onLeftClick { event, _, _ -> event.whoClicked.closeInventory() }
}
)
onEvent<ReforgePriceChangeEvent> { player, menu, _ ->
val status = menu.reforgeStatus[player]
val item = itemToReforge[player]
val reforges = item?.timesReforged ?: 0
var multiplier = if (status.isStonePrice) 1.0 else {
plugin.configYml.getDouble("reforge.cost-exponent")
.pow(reforges.toDouble())
}
multiplier *= player.reforgePriceMultiplier
status.price.setMultiplier(player, multiplier)
}
onEvent<CaptiveItemChangeEvent> { player, menu, _ ->
val item = itemToReforge[player]
val stone = reforgeStone[player]
val targets = mutableListOf<ReforgeTarget>()
var price = defaultPrice
var isStonePrice = false
val status = if (item.isEmpty) {
ReforgeStatus.NO_ITEM
} else {
targets.addAll(ReforgeTargets.getForItem(item))
if (targets.isEmpty()) {
ReforgeStatus.INVALID_ITEM
} else {
val reforgeStone = stone.reforgeStone
if (reforgeStone == null) {
ReforgeStatus.ALLOW
} else {
if (reforgeStone.canBeAppliedTo(item)) {
price = reforgeStone.stonePrice ?: defaultPrice
isStonePrice = true
ReforgeStatus.ALLOW_STONE
} else {
ReforgeStatus.INVALID_ITEM
}
}
}
}
menu.reforgeStatus[player] = ReforgeGUIStatus(status, price, isStonePrice)
menu.callEvent(player, ReforgePriceChangeEvent())
}
onClose { event, menu ->
DropQueue(event.player as Player)
.addItems(menu.getCaptiveItems(event.player as Player))

View File

@@ -1,8 +1,8 @@
package com.willfp.reforges.integrations.talismans
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeLookup
import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.reforges.util.ReforgeLookup
import com.willfp.talismans.talismans.util.TalismanChecks
import org.bukkit.inventory.ItemStack
@@ -10,7 +10,7 @@ object TalismansIntegration : Integration {
@JvmStatic
fun registerProvider() {
ReforgeLookup.registerProvider { player ->
val provided = mutableMapOf<ItemStack, ReforgeTarget.Slot>()
val provided = mutableMapOf<ItemStack?, ReforgeTarget.Slot?>()
for (itemStack in TalismanChecks.getTalismanItemsOnPlayer(player)) {
provided[itemStack] = ReforgeTarget.Slot.ANY
}

View File

@@ -34,6 +34,10 @@ object PriceMultipliers {
return current
}
/** The price multiplier from permissions. */
val Player.reforgePriceMultiplier: Double
get() = getForPlayer(this).multiplier
/**
* List of all registered multipliers.
*

View File

@@ -1,40 +1,46 @@
package com.willfp.reforges.reforges
import com.willfp.eco.core.config.config
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.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.price.ConfiguredPrice
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.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 java.util.Objects
@Suppress("DEPRECATION")
class Reforge(
override val id: String,
internal val config: Config,
plugin: ReforgesPlugin
) : Holder {
val id = config.getString("id")
val name = config.getFormattedString("name")
val namePrefixComponent = StringUtils.toComponent("$name ").decoration(TextDecoration.ITALIC, false)
val description: List<String> = config.getFormattedStrings("description")
val targets = config.getStrings("targets").map { ReforgeTarget.getByName(it) }.toSet()
val targets = config.getStrings("targets").mapNotNull { ReforgeTargets.getByName(it) }.toSet()
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Reforge ID $id")
}.toSet()
override val effects = Effects.compile(
config.getSubsections("effects"),
"Reforge $id"
)
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Reforge ID $id")
}.toSet()
override val conditions = Conditions.compile(
config.getSubsections("conditions"),
"Reforge $id"
)
val requiresStone = config.getBool("stone.enabled")
@@ -46,19 +52,32 @@ class Reforge(
}
}.build()
val stonePrice = config.getIntOrNull("stone.price") ?: -1
val stonePrice = if (config.has("stone.price")) {
when {
// Legacy support
config.getDouble("stone.price") > 0 -> {
ConfiguredPrice.createOrFree(
config {
"value" to config.getDouble("stone.price")
"type" to "coins"
"display" to "%value%"
}
)
}
else -> ConfiguredPrice.createOrFree(config.getSubsection("stone.price"))
}
} else null
init {
Reforges.addNewReforge(this)
ReforgeUtils.setReforgeStone(stone, this)
stone.reforgeStone = this
Display.display(stone)
if (config.getBool("stone.enabled")) {
CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> ReforgeUtils.getReforgeStone(test) == this },
{ test -> test.reforgeStone == this },
stone
).register()
@@ -73,6 +92,10 @@ class Reforge(
}
}
fun canBeAppliedTo(item: ItemStack?): Boolean {
return targets.any { target -> target.items.any { it.matches(item) } }
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true

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,81 @@
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> {
if (item == null) {
return emptyList()
}
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,97 @@
package com.willfp.reforges.reforges
import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.libreforge.chains.EffectChains
import com.willfp.reforges.ReforgesPlugin
import java.io.File
@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) {
val reforgesYml = File(plugin.dataFolder, "reforges.yml").readConfig(ConfigType.YAML)
for (config in reforgesYml.getSubsections("chains")) {
EffectChains.compile(config, "Chains")
}
for (reforge in values()) {
removeReforge(reforge)
}
for ((id, config) in plugin.fetchConfigs("reforges")) {
Reforge(id, config, plugin)
}
for (config in reforgesYml.getSubsections("reforges")) {
Reforge(config.getString("id"), 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

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

View File

@@ -3,6 +3,7 @@ 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
@@ -26,16 +27,16 @@ class ReforgeArgParser : LookupArgParser {
reforge ?: return null
ReforgeUtils.setReforge(meta, reforge)
meta.reforge = reforge
return Predicate { test ->
val testMeta = test.itemMeta ?: return@Predicate false
reforge == ReforgeUtils.getReforge(testMeta)
reforge == testMeta.reforge
}
}
override fun serializeBack(meta: ItemMeta): String? {
val reforge = ReforgeUtils.getReforge(meta) ?: return null
val reforge = meta.reforge ?: return null
return "reforge:${reforge.id}"
}

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.disableFor(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

@@ -0,0 +1,21 @@
# Read more about chains: https://plugins.auxilor.io/effects/configuring-an-effect#effect-chains
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

View File

@@ -74,10 +74,6 @@ gui:
row: 6
column: 5
# Placeholders:
# %cost% - The economy cost
# %xp% - The levels required
allow:
material: anvil
name: "&aReforge Item"
@@ -86,8 +82,8 @@ gui:
- '&7it a random item modifier that'
- '&7boosts its stats.'
- ''
- '&7Cost'
- '&6\$%cost%'
- '&7Price:'
- '%price%'
- ''
- '&eClick to reforge!'
allow-stone:
@@ -99,8 +95,8 @@ gui:
- '&7the %stone%&7 reforge to'
- '&7boost its stats.'
- ''
- '&7Cost'
- '&6\$%cost%'
- '&7Price:'
- '%price%'
- ''
- '&eClick to reforge!'
no-item:
@@ -138,9 +134,11 @@ gui:
pitch: 0.8
reforge:
cost: 7500
xp-cost: 0 # In levels
use-player-points: false
# See here: https://plugins.auxilor.io/all-plugins/prices
price:
value: 7500
type: coins
display: "&6$%value%"
cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost
@@ -148,6 +146,8 @@ 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
@@ -177,12 +177,18 @@ cannot-afford-type:
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford-price:
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:

View File

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

View File

@@ -3,21 +3,28 @@ 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!) Took %time%ms"
insufficient-money: "&cYou don't have enough money for this!"
insufficient-xp: "&cYou don't have enough xp levels for this!"
reloaded: "Reloaded!"
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%"
cannot-afford-price: "&cYou can't afford to do this! &fPrice: %price%"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-transmit: "&cYou can't transmit here!"
must-specify-lrcdb-id: "&cYou must specify the ID of the config to download! Not sure what this means? Go to &alrcdb.auxilor.io"
lrcdb-import-error: "&cError importing config: &f%message%"
lrcdb-import-success: "&fImported &a%name%&f! Reload the plugin to install it"
must-specify-config-name: "&cYou must specify the config name!"
invalid-config-name: "&cInvalid config name!"
lrcdb-export-error: "&cError exporting config: &f%message%"
lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
applied-reforge: "Applied %reforge%&r reforge!"
needs-player: "&cYou must specify a player"
invalid-player: "&cInvalid player!"
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

@@ -0,0 +1,19 @@
# Options for lrcdb (https://lrcdb.auxilor.io), a website to share configs
# with other server owners, so you can get more configs without making them
# yourself!
author: "Unknown Author" # The name attached to configs you export
# Options about automatically sharing configs you create
share-configs:
# If you want all your configs to automatically be publicly available,
# set this to true. This really helps out other users!
publicly: false
# If you don't want your configs to be usable to gather information about
# plugin usage or to improve the plugins in the future, disable this.
# Nothing identifying is shared.
enabled: true
# If you disable share-configs, you can still share select configs publicly
# with /reforges export <config>.

View File

@@ -10,11 +10,17 @@ depend:
- ProtocolLib
softdepend:
- Vault
- EcoSkills
- Talismans
- AureliumSkills
- PlayerPoints
- Jobs
- TMMobcoins
- EcoEnchants
- EcoBosses
- Talismans
- EcoArmor
- EcoItems
- EcoSkills
- Boosters
commands:
reforges:
@@ -40,6 +46,8 @@ permissions:
reforges.command.give: true
reforges.command.apply: true
reforges.command.open: true
reforges.command.import: true
reforges.command.export: true
reforges.command.reload:
description: Allows reloading the config
@@ -59,3 +67,9 @@ permissions:
reforges.command.apply:
description: Allows the user of /reforges apply.
default: op
reforges.command.import:
description: Allows the user of /reforges import.
default: op
reforges.command.export:
description: Allows the user of /reforges export.
default: op

View File

@@ -1,405 +0,0 @@
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

@@ -0,0 +1,56 @@
# The ID of the reforge is the name of the .yml file,
# for example acute.yml has the ID of acute
# You can place reforges anywhere in this folder,
# including in subfolders if you want to organize your reforge configs
# _example.yml is not loaded.
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>" # The display name for the reforge
description: # The lore to add to an item with this reforge:
- "&a+5% &fDamage"
- "&a+10% &fCrit Damage"
targets: # The targets that this reforge can be applied to
- melee
# Options for the reforge stone
stone:
enabled: true # If this reforge requires the use of a reforge stone
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&f Reforge Stone" # The display name of the stone
lore: # The lore of the stone
- "&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 # If the reforge stone should be craftable
price: # (Optional) The price required to apply this reforge, overrides the default reforge price
value: 100000
type: coins # See here: https://plugins.auxilor.io/all-plugins/prices
display: "&6$%value%"
recipe: # The recipe for the stone to have
- air
- ecoitems:blank_reforge_stone ? air
- air
- iron_block
- daylight_sensor
- iron_block
- air
- phantom_membrane
- air
# The effects of the reforge (i.e. the functionality)
# See here: https://plugins.auxilor.io/effects/configuring-an-effect
effects:
- id: damage_multiplier
args:
multiplier: 1.05
triggers:
- melee_attack
- id: crit_multiplier
args:
multiplier: 1.1
triggers:
- melee_attack
# The conditions required to use the reforge
conditions: [ ]

View File

@@ -0,0 +1,17 @@
name: "<gradient:#4776E6>Acute</gradient:#8E54E9>"
description:
- "&a+2% &fTriple Damage Chance"
targets:
- axe
effects:
- id: damage_multiplier
args:
multiplier: 3
chance: 2
triggers:
- melee_attack
conditions: []

View File

@@ -0,0 +1,19 @@
name: "<gradient:#B993D6>Aerobic</gradient:#8CA6DB>"
description:
- "&a+9% &fDamage when shot in air"
targets:
- bow
effects:
- id: damage_multiplier
args:
multiplier: 1.09
triggers:
- bow_attack
conditions:
- id: in_air
args:
in_air: true

View File

@@ -0,0 +1,48 @@
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
price:
value: 100000
type: coins
display: "&6$%value%"
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: []

View File

@@ -0,0 +1,17 @@
name: "<gradient:#EFEFBB>Evasive</gradient:#D4D3DD>"
description:
- "&a+2% &fIgnore Damage Chance"
targets:
- armor
effects:
- id: damage_multiplier
args:
multiplier: 0
chance: 2
triggers:
- take_damage
conditions: []

View File

@@ -0,0 +1,16 @@
name: "<gradient:#1e3c72>Gravitated</gradient:#2a5298>"
description:
- "&a+8% &fCritical Damage"
targets:
- melee
effects:
- id: crit_multiplier
args:
multiplier: 1.08
triggers:
- melee_attack
conditions: []

View File

@@ -0,0 +1,24 @@
name: "<gradient:#1c92d2>Light</gradient:#f2fcfe>"
description:
- "&c-5% &fDamage"
- "&c-5% &fKnockback"
- "&a+10% &fAttack Speed"
targets:
- melee
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: []

View File

@@ -0,0 +1,23 @@
name: "<gradient:#373B44>Nautical</gradient:#4286f4>"
description:
- "&a+20% &fDamage in water"
targets:
- melee
- bow
- trident
effects:
- id: damage_multiplier
args:
multiplier: 1.2
triggers:
- melee_attack
- bow_attack
- trident_attack
conditions:
- id: in_water
args:
in_water: true

View File

@@ -0,0 +1,16 @@
name: "<gradient:#076585>Pointy</gradient:#ffffff>"
description:
- "&a+10% &fDamage"
targets:
- trident
effects:
- id: damage_multiplier
args:
multiplier: 1.1
triggers:
- trident_attack
conditions: []

View File

@@ -0,0 +1,17 @@
name: "<gradient:#00B4DB>Prospecting</gradient:#0083B0>"
description:
- "&a+5% &fChance to get &e$$2&f for mining a block"
targets:
- pickaxe
effects:
- id: give_money
args:
amount: 2
chance: 5
triggers:
- mine_block
conditions: []

View File

@@ -0,0 +1,16 @@
name: "<gradient:#FBD786>Reinforced</gradient:#f7797d>"
description:
- "&a+4% &fDamage Resistance"
targets:
- armor
effects:
- id: damage_multiplier
args:
multiplier: 0.96
triggers:
- take_damage
conditions: []

View File

@@ -0,0 +1,37 @@
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: []

View File

@@ -0,0 +1,21 @@
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: []

View File

@@ -0,0 +1,16 @@
name: "<gradient:#74ebd5>Streamlined</gradient:#ACB6E5>"
description:
- "&a+4% &fDamage"
targets:
- bow
effects:
- id: damage_multiplier
args:
multiplier: 1.04
triggers:
- bow_attack
conditions: []

View File

@@ -0,0 +1,20 @@
name: "<gradient:#ED213A>Strong</gradient:#93291E>"
description:
- "&a+2% &fDamage"
- "&a+10% &fKnockback"
targets:
- melee
effects:
- id: damage_multiplier
args:
multiplier: 1.02
triggers:
- melee_attack
- id: knockback_multiplier
args:
multiplier: 1.1
conditions: []

View File

@@ -0,0 +1,20 @@
name: "<gradient:#D1913C>Thin</gradient:#FFD194>"
description:
- "&c-5% &fDamage Resistance"
- "&a+2.5% &fMovement Speed"
targets:
- armor
effects:
- id: damage_multiplier
args:
multiplier: 1.05
triggers:
- take_damage
- id: movement_speed_multiplier
args:
multiplier: 1.025
conditions: []

View File

@@ -0,0 +1,20 @@
name: "<gradient:#a73737>Tough</gradient:#7a2828>"
description:
- "&c+8% &fDamage Resistance"
- "&a-5% &fMovement Speed"
targets:
- armor
effects:
- id: damage_multiplier
args:
multiplier: 0.92
triggers:
- take_damage
- id: movement_speed_multiplier
args:
multiplier: 0.95
conditions: []

View File

@@ -1,2 +1,4 @@
version = 4.62.0
#libreforge-updater
#Wed Nov 23 17:24:59 GMT 2022
version=5.73.0
plugin-name=Reforges

0
gradlew vendored Normal file → Executable file
View File