Compare commits
397 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f77fc5d182 | ||
|
|
6d1cc4c05d | ||
|
|
0775f0992f | ||
|
|
debb39105d | ||
|
|
3b4aa59bfb | ||
|
|
4e902c3964 | ||
|
|
3e325697e7 | ||
|
|
13b3e1e440 | ||
|
|
2b2406a4d0 | ||
|
|
048982c74a | ||
|
|
29b63a2ebb | ||
|
|
2a9cbdacfd | ||
|
|
35cfcdf4a9 | ||
|
|
06c1dc9afb | ||
|
|
18b58d584f | ||
|
|
a774791e65 | ||
|
|
bc22adae84 | ||
|
|
0eba82b221 | ||
|
|
4822ec3955 | ||
|
|
b845001467 | ||
|
|
25b6a15c9c | ||
|
|
1a3d035f78 | ||
|
|
a69f9f6e11 | ||
|
|
6efd9e4fcd | ||
|
|
3e948beb7a | ||
|
|
a8a491a0b7 | ||
|
|
2c0330898c | ||
|
|
e9794cfbf4 | ||
|
|
1694d858bc | ||
|
|
b79955ae9e | ||
|
|
803a8c5d17 | ||
|
|
c5cd15ad92 | ||
|
|
489b170888 | ||
|
|
9f57a322e8 | ||
|
|
86e113214d | ||
|
|
e791bb8893 | ||
|
|
f1220bd186 | ||
|
|
21d933cb11 | ||
|
|
e1c063d5f4 | ||
|
|
27d2b5c8a4 | ||
|
|
3b34d6ef27 | ||
|
|
bc1c8b8f46 | ||
|
|
2fa926ec02 | ||
|
|
d7891e1218 | ||
|
|
11685cd352 | ||
|
|
785127fe16 | ||
|
|
4a13bc5fea | ||
|
|
c7ad122050 | ||
|
|
28d63fc2e3 | ||
|
|
bb62cc0bcd | ||
|
|
740c79f087 | ||
|
|
33ab8e04a0 | ||
|
|
fcd3aac363 | ||
|
|
753d148d1b | ||
|
|
1bb47a9f13 | ||
|
|
40b4c26e0f | ||
|
|
97adae7b32 | ||
|
|
3d35a91314 | ||
|
|
0caa328b1e | ||
|
|
ab8c946914 | ||
|
|
e667537404 | ||
|
|
6bd2f2b823 | ||
|
|
8d8a8045c0 | ||
|
|
d5c669c72c | ||
|
|
28b268e175 | ||
|
|
33937d1ce7 | ||
|
|
e971778cc3 | ||
|
|
f99612ded3 | ||
|
|
50272bbbcf | ||
|
|
9a703f6190 | ||
|
|
f8fec7eec4 | ||
|
|
f6aadda4ed | ||
|
|
d8fca0f348 | ||
|
|
65ff4c4a31 | ||
|
|
90702bc7aa | ||
|
|
e81b788a1b | ||
|
|
ebc0ee7940 | ||
|
|
82d269daf1 | ||
|
|
9d5300d6ae | ||
|
|
8870e4d6fb | ||
|
|
d826a9f71f | ||
|
|
7ec3355237 | ||
|
|
e59a8cc2e6 | ||
|
|
88f974fd10 | ||
|
|
dfe2f1361b | ||
|
|
3826f9f713 | ||
|
|
c2d2303c91 | ||
|
|
b1158ceb3d | ||
|
|
af4048afbe | ||
|
|
fce12020d5 | ||
|
|
7e37332b64 | ||
|
|
52dbf9ff52 | ||
|
|
78b6292367 | ||
|
|
09705e787b | ||
|
|
9c86069a85 | ||
|
|
0a7acceb83 | ||
|
|
40aa8b17dd | ||
|
|
71eb386a19 | ||
|
|
c857df2360 | ||
|
|
f4fc611f3b | ||
|
|
0d91324d47 | ||
|
|
e9dbc3ec73 | ||
|
|
493d1b1b6d | ||
|
|
68221d5912 | ||
|
|
7f2ef4e038 | ||
|
|
be0a19175b | ||
|
|
5afdcd75f7 | ||
|
|
a1c0b8c857 | ||
|
|
0442ccf58f | ||
|
|
1c1a796610 | ||
|
|
eacb243493 | ||
|
|
7bbed31d4e | ||
|
|
58bccf3cd7 | ||
|
|
4502e1e311 | ||
|
|
054a8d5a5e | ||
|
|
dbdd4785ba | ||
|
|
35f800b62a | ||
|
|
591800dba8 | ||
|
|
46673e8d24 | ||
|
|
bb7c300074 | ||
|
|
b003ec96f7 | ||
|
|
a526f51780 | ||
|
|
dd14fc666a | ||
|
|
ae0150f012 | ||
|
|
04418fa038 | ||
|
|
bcb9523315 | ||
|
|
43e7972ca3 | ||
|
|
7ea61eb393 | ||
|
|
5245a9b1d8 | ||
|
|
195932463c | ||
|
|
3cf60a7e2c | ||
|
|
0f9f57fca2 | ||
|
|
fe21616dd5 | ||
|
|
396144abaa | ||
|
|
50b4fa59ab | ||
|
|
a6754379e8 | ||
|
|
bbd0182c2a | ||
|
|
0370e9f454 | ||
|
|
8d585b58cb | ||
|
|
0bfbd4c036 | ||
|
|
881839955e | ||
|
|
8ffc5f9c0f | ||
|
|
709de3bb5f | ||
|
|
f2aa2ffd9b | ||
|
|
5ce70399f0 | ||
|
|
3f8759b08a | ||
|
|
abecaa6e9f | ||
|
|
4744bfc78b | ||
|
|
487e68221a | ||
|
|
1c68992a8e | ||
|
|
c5b7d0b644 | ||
|
|
0f91aec3b7 | ||
|
|
d2bf38c5c9 | ||
|
|
2c96b79aba | ||
|
|
d539b9e59e | ||
|
|
b0b06ef402 | ||
|
|
7a84c3de3b | ||
|
|
9431321e1c | ||
|
|
4816284fba | ||
|
|
a9874c9386 | ||
|
|
fe68760184 | ||
|
|
5ae8e72a98 | ||
|
|
15fc6053c8 | ||
|
|
1f7cf78491 | ||
|
|
fc3c80f633 | ||
|
|
2bcbf181a9 | ||
|
|
7adcdd572d | ||
|
|
f6eba21006 | ||
|
|
cc02f26807 | ||
|
|
60f552ce65 | ||
|
|
9fe8d4ad15 | ||
|
|
b835988eec | ||
|
|
22366835de | ||
|
|
cdd1baec6c | ||
|
|
1ea0da365a | ||
|
|
852d40372d | ||
|
|
999c831dd7 | ||
|
|
80fa5d346a | ||
|
|
336cdc3716 | ||
|
|
a49a9e92b4 | ||
|
|
1c6e64832e | ||
|
|
44a141cddc | ||
|
|
ea4956870e | ||
|
|
9207d1782b | ||
|
|
9debcb7089 | ||
|
|
ef53ee2ed3 | ||
|
|
4c90360038 | ||
|
|
d4b5102913 | ||
|
|
f4553c544a | ||
|
|
5ad1db72fc | ||
|
|
c761df9ee6 | ||
|
|
b6d79da4e1 | ||
|
|
42f41618ca | ||
|
|
de878fd423 | ||
|
|
7782657d57 | ||
|
|
7778425936 | ||
|
|
6446cef255 | ||
|
|
8dacecbcba | ||
|
|
5f8ec4f94a | ||
|
|
d7847e9efc | ||
|
|
930ecd4896 | ||
|
|
af8d6a4167 | ||
|
|
361f0a0103 | ||
|
|
eb545a7d9e | ||
|
|
d3c64deef4 | ||
|
|
31db9dcb95 | ||
|
|
4938ad84bc | ||
|
|
06b2301da1 | ||
|
|
c307878c09 | ||
|
|
3b10ff01ec | ||
|
|
e042754f5d | ||
|
|
c2b8a80560 | ||
|
|
07c0e72564 | ||
|
|
de9b961d83 | ||
|
|
83958c719c | ||
|
|
9c3dfaeb01 | ||
|
|
7e61340285 | ||
|
|
78b76cb453 | ||
|
|
bb1da29704 | ||
|
|
cf152215d3 | ||
|
|
e6a59fbc91 | ||
|
|
b787f8b76a | ||
|
|
ccc83da5b0 | ||
|
|
f11068f2f1 | ||
|
|
a5cc1a5d32 | ||
|
|
7440749ba5 | ||
|
|
75010d25fa | ||
|
|
bb95376b93 | ||
|
|
ab6d4c7aa2 | ||
|
|
9ab8827e55 | ||
|
|
991290095b | ||
|
|
8735478fc3 | ||
|
|
6e44f09621 | ||
|
|
060106881e | ||
|
|
96cc9706b3 | ||
|
|
3d87b1eb73 | ||
|
|
4c4247b4ec | ||
|
|
b94dc4ac3a | ||
|
|
06bcb10958 | ||
|
|
295095e9ce | ||
|
|
ba9c5865e3 | ||
|
|
d24be4121f | ||
|
|
bcc5e4ef08 | ||
|
|
bf8609666a | ||
|
|
1a02335825 | ||
|
|
f5ef98ec5c | ||
|
|
45135e2b55 | ||
|
|
758b42ff8e | ||
|
|
4a134402da | ||
|
|
e6ad4c9268 | ||
|
|
809dcbae85 | ||
|
|
d7fce6834c | ||
|
|
ac807a991b | ||
|
|
ba315ced3c | ||
|
|
f2e65174f9 | ||
|
|
bd5555ff01 | ||
|
|
d5584e863b | ||
|
|
d9c0e8e763 | ||
|
|
b223f8457d | ||
|
|
694d57edf4 | ||
|
|
02afe7d788 | ||
|
|
0593e631ea | ||
|
|
2f22e02ff1 | ||
|
|
fb240bfd0a | ||
|
|
11c49a543f | ||
|
|
c565f5248d | ||
|
|
fac4f40430 | ||
|
|
a20cb63755 | ||
|
|
f17f67227f | ||
|
|
106c9b37fc | ||
|
|
f7cfcd5cbb | ||
|
|
44d9581222 | ||
|
|
0fa30a5f62 | ||
|
|
84f439976c | ||
|
|
01bcb62b31 | ||
|
|
47c8ea3341 | ||
|
|
e28c4288a3 | ||
|
|
386792d7ca | ||
|
|
8c6d98a666 | ||
|
|
6f42224593 | ||
|
|
36c857086b | ||
|
|
014bcddc0a | ||
|
|
96c56b0291 | ||
|
|
c1fe633e72 | ||
|
|
c9a9d86160 | ||
|
|
e79c7e9881 | ||
|
|
be617241e7 | ||
|
|
cb9b59ae01 | ||
|
|
a993acae72 | ||
|
|
e6cdc7d2ba | ||
|
|
94534b2f61 | ||
|
|
fe6b7805c7 | ||
|
|
be25f2f4fc | ||
|
|
a19cc7df1e | ||
|
|
13dbd08dcc | ||
|
|
5f80b6052d | ||
|
|
a48885b79a | ||
|
|
350c2d8775 | ||
|
|
5988dfb1fd | ||
|
|
57687859e4 | ||
|
|
ef42e689ae | ||
|
|
9a3aac9a66 | ||
|
|
7be5fbfbc4 | ||
|
|
4b344ccd18 | ||
|
|
3f50ae0a44 | ||
|
|
afb498b4bf | ||
|
|
6b18b06763 | ||
|
|
033e334877 | ||
|
|
eb9112e480 | ||
|
|
b75e4d59e4 | ||
|
|
c69bb6904f | ||
|
|
9f193b7206 | ||
|
|
6fce2c13fe | ||
|
|
02342c11a6 | ||
|
|
2fde56df0d | ||
|
|
cb64dedd74 | ||
|
|
a7c489413e | ||
|
|
f9ed174e31 | ||
|
|
496d878a14 | ||
|
|
00853d4a92 | ||
|
|
5eb0d2380a | ||
|
|
d19cff9a42 | ||
|
|
234b5fdd8e | ||
|
|
2dbe6c7fe4 | ||
|
|
9d4d1ace08 | ||
|
|
364550d228 | ||
|
|
d5e8cbaf33 | ||
|
|
c4d532fda9 | ||
|
|
aa097cf7e2 | ||
|
|
6f4ca40a94 | ||
|
|
2ef9b4033c | ||
|
|
9aa22ffc86 | ||
|
|
d81c1e6fcb | ||
|
|
ac72e0770a | ||
|
|
5e3e09c4bc | ||
|
|
ee945d5901 | ||
|
|
7f747f3afc | ||
|
|
2d47593f51 | ||
|
|
df529ba239 | ||
|
|
2fea736631 | ||
|
|
9df4fae2dc | ||
|
|
ca964a1a40 | ||
|
|
ada2832839 | ||
|
|
4d92cbb7ff | ||
|
|
d6ab36929b | ||
|
|
e06623d3fe | ||
|
|
8b70a37459 | ||
|
|
daab3829bc | ||
|
|
d09021707b | ||
|
|
bea8cb5757 | ||
|
|
bde546efcb | ||
|
|
e1ffc851a3 | ||
|
|
828229b3e5 | ||
|
|
f36e2f5349 | ||
|
|
cdbe5b141a | ||
|
|
08c3fc0cfa | ||
|
|
8f758fb100 | ||
|
|
ec339b0ecd | ||
|
|
9dedfb86a5 | ||
|
|
0146cff8d3 | ||
|
|
2454d99d84 | ||
|
|
7d9b1bc266 | ||
|
|
77c56c46a8 | ||
|
|
85303098a7 | ||
|
|
821dc62d56 | ||
|
|
f9af4a9e66 | ||
|
|
41b9d6b01d | ||
|
|
7a521acccf | ||
|
|
49233aef88 | ||
|
|
c5b47ed073 | ||
|
|
ddcef7cf0c | ||
|
|
0f86e1c1c1 | ||
|
|
f0f7e229ea | ||
|
|
ea674a3757 | ||
|
|
b7c51eba5e | ||
|
|
1127bf1700 | ||
|
|
376e3284fb | ||
|
|
12f355b205 | ||
|
|
f4b02591e8 | ||
|
|
f843725cf5 | ||
|
|
ed0536c188 | ||
|
|
849e005095 | ||
|
|
927d61dd6b | ||
|
|
9285cffc56 | ||
|
|
1b6c90e87d | ||
|
|
c79de6fbc1 | ||
|
|
fc83ebbb34 | ||
|
|
f330cc954c | ||
|
|
df4f98251c | ||
|
|
74861e9c01 | ||
|
|
7dad9d7875 | ||
|
|
338b9b2d4e | ||
|
|
f6d83867f3 | ||
|
|
bb632ac849 | ||
|
|
793f946b44 | ||
|
|
519a59cc88 | ||
|
|
79b1bff547 |
@@ -39,7 +39,7 @@ and many more.
|
||||
# For developers
|
||||
|
||||
## Javadoc
|
||||
The 6.27.2 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.27.2/javadoc/)
|
||||
The 6.38.2 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.38.2/javadoc/)
|
||||
|
||||
## Plugin Information
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ buildscript {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10")
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,17 +13,18 @@ plugins {
|
||||
id("com.github.johnrengelman.shadow") version "7.1.2"
|
||||
id("maven-publish")
|
||||
id("java")
|
||||
kotlin("jvm") version "1.6.10"
|
||||
kotlin("jvm") version "1.7.10"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":eco-api"))
|
||||
implementation(project(":eco-core:core-plugin"))
|
||||
implementation(project(path = ":eco-core:core-plugin", configuration = "shadow"))
|
||||
implementation(project(":eco-core:core-proxy"))
|
||||
implementation(project(":eco-core:core-backend"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_19_R1", configuration = "reobf"))
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@@ -44,11 +45,8 @@ allprojects {
|
||||
// SuperiorSkyblock2
|
||||
maven("https://repo.bg-software.com/repository/api/")
|
||||
|
||||
// NMS (for jitpack compilation)
|
||||
maven("https://repo.codemc.org/repository/nms/")
|
||||
|
||||
// mcMMO, BentoBox
|
||||
maven("https://repo.codemc.org/repository/maven-public/")
|
||||
maven("https://repo.codemc.io/repository/maven-public/")
|
||||
|
||||
// Spigot API, Bungee API
|
||||
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/")
|
||||
@@ -63,7 +61,7 @@ allprojects {
|
||||
maven("https://maven.enginehub.org/repo/")
|
||||
|
||||
// FactionsUUID
|
||||
maven("https://ci.ender.zone/plugin/repository/everything/")
|
||||
//maven("https://ci.ender.zone/plugin/repository/everything/")
|
||||
|
||||
// NoCheatPlus
|
||||
maven("https://repo.md-5.net/content/repositories/snapshots/")
|
||||
@@ -71,9 +69,6 @@ allprojects {
|
||||
// CombatLogX
|
||||
maven("https://nexus.sirblobman.xyz/repository/public/")
|
||||
|
||||
// IridiumSkyblock
|
||||
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")
|
||||
|
||||
// MythicMobs
|
||||
maven("https://mvn.lumine.io/repository/maven-public/")
|
||||
|
||||
@@ -85,21 +80,28 @@ allprojects {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(kotlin("stdlib", version = "1.6.10"))
|
||||
// Kotlin
|
||||
implementation(kotlin("stdlib", version = "1.7.10"))
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2")
|
||||
|
||||
// Included in spigot jar, no need to move to implementation
|
||||
compileOnly("org.jetbrains:annotations:23.0.0")
|
||||
compileOnly("com.google.guava:guava:31.1-jre")
|
||||
|
||||
// Test
|
||||
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
|
||||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
||||
|
||||
|
||||
// Adventure
|
||||
compileOnly("net.kyori:adventure-api:4.10.0")
|
||||
compileOnly("net.kyori:adventure-text-serializer-gson:4.10.0")
|
||||
compileOnly("net.kyori:adventure-text-serializer-legacy:4.10.0")
|
||||
implementation("net.kyori:adventure-api:4.10.1")
|
||||
implementation("net.kyori:adventure-text-serializer-gson:4.10.1") {
|
||||
exclude("com.google.code.gson", "gson") // Prevent shading into the jar
|
||||
}
|
||||
implementation("net.kyori:adventure-text-serializer-legacy:4.10.1")
|
||||
|
||||
// Other
|
||||
compileOnly("com.google.guava:guava:31.1-jre")
|
||||
compileOnly("com.github.ben-manes.caffeine:caffeine:3.0.5")
|
||||
implementation("com.github.ben-manes.caffeine:caffeine:3.1.0")
|
||||
implementation("org.apache.maven:maven-artifact:3.8.5")
|
||||
}
|
||||
|
||||
tasks.withType<JavaCompile> {
|
||||
@@ -115,10 +117,11 @@ allprojects {
|
||||
exclude(group = "com.darkblade12", module = "particleeffect")
|
||||
exclude(group = "com.github.cryptomorin", module = "XSeries")
|
||||
exclude(group = "net.wesjd", module = "anvilgui")
|
||||
exclude(group = "org.slf4j", module = "slf4j-api")
|
||||
}
|
||||
|
||||
configurations.testImplementation {
|
||||
setExtendsFrom(listOf(configurations.compileOnly.get()))
|
||||
setExtendsFrom(listOf(configurations.compileOnly.get(), configurations.implementation.get()))
|
||||
}
|
||||
|
||||
tasks {
|
||||
@@ -126,13 +129,41 @@ allprojects {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
targetCompatibility = "17"
|
||||
sourceCompatibility = "17"
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
relocate("org.bstats", "com.willfp.eco.libs.bstats")
|
||||
relocate("redempt.crunch", "com.willfp.eco.libs.crunch")
|
||||
relocate("org.apache.commons.lang3", "com.willfp.eco.libs.lang3")
|
||||
relocate("org.apache.maven", "com.willfp.eco.libs.maven")
|
||||
relocate("org.checkerframework", "com.willfp.eco.libs.checkerframework")
|
||||
relocate("org.intellij", "com.willfp.eco.libs.intellij")
|
||||
relocate("org.jetbrains.annotations", "com.willfp.eco.libs.jetbrains.annotations")
|
||||
//relocate("org.jetbrains.exposed", "com.willfp.eco.libs.exposed")
|
||||
relocate("org.objenesis", "com.willfp.eco.libs.objenesis")
|
||||
relocate("org.reflections", "com.willfp.eco.libs.reflections")
|
||||
relocate("javassist", "com.willfp.eco.libs.javassist")
|
||||
relocate("javax.annotation", "com.willfp.eco.libs.annotation")
|
||||
relocate("com.google.errorprone", "com.willfp.eco.libs.errorprone")
|
||||
relocate("com.google.j2objc", "com.willfp.eco.libs.j2objc")
|
||||
relocate("com.google.thirdparty", "com.willfp.eco.libs.google.thirdparty")
|
||||
relocate("com.google.protobuf", "com.willfp.eco.libs.google.protobuf") // No I don't know either
|
||||
relocate("google.protobuf", "com.willfp.eco.libs.protobuf") // Still don't know
|
||||
relocate("com.zaxxer.hikari", "com.willfp.eco.libs.hikari")
|
||||
//relocate("com.mysql", "com.willfp.eco.libs.mysql")
|
||||
relocate("de.undercouch.bson4jackson", "com.willfp.eco.libs.bson4jackson")
|
||||
relocate("com.fasterxml.jackson", "com.willfp.eco.libs.jackson")
|
||||
relocate("com.mongodb", "com.willfp.eco.libs.mongodb")
|
||||
relocate("org.bson", "com.willfp.eco.libs.bson")
|
||||
relocate("org.litote", "com.willfp.eco.libs.litote")
|
||||
relocate("org.reactivestreams", "com.willfp.eco.libs.reactivestreams")
|
||||
relocate("reactor.", "com.willfp.eco.libs.reactor.") // Dot in name to be safe
|
||||
relocate("com.moandjiezana.toml", "com.willfp.eco.libs.toml")
|
||||
|
||||
/*
|
||||
Kotlin and caffeine are not shaded so that they can be accessed directly by eco plugins.
|
||||
Also, not relocating adventure, because it's a pain in the ass, and it doesn't *seem* to be causing loader constraint violations.
|
||||
*/
|
||||
}
|
||||
|
||||
compileJava {
|
||||
|
||||
@@ -4,7 +4,6 @@ dependencies {
|
||||
|
||||
// Other
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||
}
|
||||
|
||||
@@ -1,82 +1,583 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
import com.willfp.eco.core.data.ExtendedPersistentDataContainer;
|
||||
import com.willfp.eco.core.data.PlayerProfile;
|
||||
import com.willfp.eco.core.data.ServerProfile;
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey;
|
||||
import com.willfp.eco.core.drops.DropQueue;
|
||||
import com.willfp.eco.core.entities.ai.EntityController;
|
||||
import com.willfp.eco.core.events.EventManager;
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||
import com.willfp.eco.core.factory.MetadataValueFactory;
|
||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||
import com.willfp.eco.core.factory.RunnableFactory;
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder;
|
||||
import com.willfp.eco.core.gui.menu.MenuType;
|
||||
import com.willfp.eco.core.gui.slot.SlotBuilder;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Mob;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Holds the instance of the eco handler for bridging between the frontend
|
||||
* Holds the instance of eco for bridging between the frontend
|
||||
* and backend.
|
||||
* <p>
|
||||
* <strong>Do not use this in your plugins!</strong> It can and will contain
|
||||
* breaking changes between minor versions and even patches, and you will create
|
||||
* compatibility issues by. All parts of this have been abstracted
|
||||
* into logically named API components that you can use.
|
||||
*
|
||||
* @see Eco#getHandler()
|
||||
* @see Handler
|
||||
* @see Eco#get()
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public final class Eco {
|
||||
public interface Eco {
|
||||
/**
|
||||
* Instance of eco handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
private static Handler handler;
|
||||
|
||||
/**
|
||||
* Set the handler.
|
||||
* Create a scheduler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @param plugin The plugin.
|
||||
* @return The scheduler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void setHandler(@NotNull final Handler handler) {
|
||||
Validate.isTrue(Eco.handler == null, "Already initialized!");
|
||||
|
||||
Eco.handler = handler;
|
||||
}
|
||||
@NotNull
|
||||
Scheduler createScheduler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get the instance of the eco handler; the bridge between the api frontend
|
||||
* and the implementation backend.
|
||||
* <p>
|
||||
* <strong>Do not use the handler in your plugins!</strong> It can and will contain
|
||||
* breaking changes between minor versions and even patches, and you will create
|
||||
* compatibility issues by using the handler. All parts of the handler have been abstracted
|
||||
* into logically named API components that you can use.
|
||||
* <p>
|
||||
* Prior to version 6.12.0, the handler was considered as an API component, but it has
|
||||
* since been moved into an internal component, and in 6.17.0, the first breaking change
|
||||
* was introduced to {@link com.willfp.eco.core.config.wrapper.ConfigFactory}. This means
|
||||
* that any usages of the handler can now cause problems in your plugins.
|
||||
* Create an event manager.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The event manager.
|
||||
*/
|
||||
@NotNull
|
||||
EventManager createEventManager(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a NamespacedKey factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKeyFactory createNamespacedKeyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a MetadataValue factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
MetadataValueFactory createMetadataValueFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a Runnable factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RunnableFactory createRunnableFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create an ExtensionLoader.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ExtensionLoader createExtensionLoader(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a config handler.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The handler.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigHandler createConfigHandler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a logger.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The logger.
|
||||
*/
|
||||
@NotNull
|
||||
Logger createLogger(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a PAPI integration.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The integration.
|
||||
*/
|
||||
@NotNull
|
||||
PlaceholderIntegration createPAPIIntegration(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a proxy factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ProxyFactory createProxyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get eco Spigot plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@NotNull
|
||||
EcoPlugin getEcoPlugin();
|
||||
|
||||
/**
|
||||
* Updatable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param type The config type.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param requiresChangesToSave If the config must be changed in order to save the config.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
LoadableConfig createUpdatableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull ConfigType type,
|
||||
boolean requiresChangesToSave,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* Loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param type The config type.
|
||||
* @param requiresChangesToSave If the config must be changed in order to save the config.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
LoadableConfig createLoadableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
@NotNull ConfigType type,
|
||||
boolean requiresChangesToSave);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param config The handle.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config wrapConfigurationSection(@NotNull ConfigurationSection config);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param values The values.
|
||||
* @param type The config type.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createConfig(@NotNull Map<String, Object> values,
|
||||
@NotNull ConfigType type);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param contents The file contents.
|
||||
* @param type The type.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createConfig(@NotNull String contents,
|
||||
@NotNull ConfigType type);
|
||||
|
||||
/**
|
||||
* Create a Drop Queue.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The drop queue.
|
||||
*/
|
||||
@NotNull
|
||||
DropQueue createDropQueue(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Create slot builder.
|
||||
*
|
||||
* @param provider The provider.
|
||||
* @return The builder.
|
||||
*/
|
||||
@NotNull
|
||||
SlotBuilder createSlotBuilder(@NotNull SlotProvider provider);
|
||||
|
||||
/**
|
||||
* Create menu builder.
|
||||
*
|
||||
* @param rows The amount of rows.
|
||||
* @param type The type.
|
||||
* @return The builder.
|
||||
*/
|
||||
@NotNull
|
||||
MenuBuilder createMenuBuilder(int rows,
|
||||
@NotNull MenuType type);
|
||||
|
||||
/**
|
||||
* Combine the state of two menus together.
|
||||
*
|
||||
* @param base The base menu.
|
||||
* @param additional The additional state.
|
||||
* @return The menu.
|
||||
*/
|
||||
@NotNull
|
||||
Menu blendMenuState(@NotNull Menu base,
|
||||
@NotNull Menu additional);
|
||||
|
||||
/**
|
||||
* Clean up ClassLoader (etc.) to allow PlugMan support.
|
||||
*
|
||||
* @param plugin The plugin to clean up.
|
||||
*/
|
||||
void clean(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Add new plugin.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void addNewPlugin(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get plugin by name.
|
||||
*
|
||||
* @param name The name.
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
EcoPlugin getPluginByName(@NotNull String name);
|
||||
|
||||
/**
|
||||
* Get all loaded eco plugins.
|
||||
*
|
||||
* @return A list of plugin names in lowercase.
|
||||
*/
|
||||
@NotNull
|
||||
List<String> getLoadedPlugins();
|
||||
|
||||
/**
|
||||
* Create a FastItemStack.
|
||||
*
|
||||
* @param itemStack The base ItemStack.
|
||||
* @return The FastItemStack.
|
||||
*/
|
||||
@NotNull
|
||||
FastItemStack createFastItemStack(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Register bStats metrics.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void registerBStats(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get Adventure audiences.
|
||||
*
|
||||
* @return The audiences.
|
||||
*/
|
||||
@Nullable
|
||||
BukkitAudiences getAdventure();
|
||||
|
||||
/**
|
||||
* Register a persistent data key to be stored.
|
||||
*
|
||||
* @param key The key.
|
||||
*/
|
||||
void registerPersistentKey(@NotNull PersistentDataKey<?> key);
|
||||
|
||||
/**
|
||||
* Get all registered keys.
|
||||
*
|
||||
* @return The keys.
|
||||
*/
|
||||
Set<PersistentDataKey<?>> getRegisteredPersistentDataKeys();
|
||||
|
||||
/**
|
||||
* Get persistent data key from namespaced key.
|
||||
*
|
||||
* @param namespacedKey The key.
|
||||
* @return The key, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
PersistentDataKey<?> getPersistentDataKeyFrom(@NotNull NamespacedKey namespacedKey);
|
||||
|
||||
/**
|
||||
* Load a player profile.
|
||||
*
|
||||
* @param uuid The UUID.
|
||||
* @return The profile.
|
||||
*/
|
||||
PlayerProfile loadPlayerProfile(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Load the server profile.
|
||||
*
|
||||
* @return The profile.
|
||||
*/
|
||||
ServerProfile getServerProfile();
|
||||
|
||||
/**
|
||||
* Unload a player profile from memory.
|
||||
* <p>
|
||||
* This will not save the profile first.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
*/
|
||||
void unloadPlayerProfile(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Save keys for a player.
|
||||
* <p>
|
||||
* Can run async if using MySQL.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
* @param keys The keys.
|
||||
*/
|
||||
void savePersistentDataKeysFor(@NotNull UUID uuid,
|
||||
@NotNull Set<PersistentDataKey<?>> keys);
|
||||
|
||||
/**
|
||||
* Commit all changes to the file.
|
||||
* <p>
|
||||
* Does nothing if using MySQL.
|
||||
*/
|
||||
void saveAllProfiles();
|
||||
|
||||
/**
|
||||
* Create dummy entity - never spawned, exists purely in code.
|
||||
*
|
||||
* @param location The location.
|
||||
* @return The entity.
|
||||
*/
|
||||
@NotNull
|
||||
Entity createDummyEntity(@NotNull Location location);
|
||||
|
||||
/**
|
||||
* Create a {@link NamespacedKey} quickly
|
||||
* <p>
|
||||
* Bypasses the constructor, allowing for the creation of invalid keys,
|
||||
* therefore this is considered unsafe and should only be called after
|
||||
* the key has been confirmed to be valid.
|
||||
*
|
||||
* @param namespace The namespace.
|
||||
* @param key The key.
|
||||
* @return The key.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKey createNamespacedKey(@NotNull String namespace,
|
||||
@NotNull String key);
|
||||
|
||||
/**
|
||||
* Return or get props for a plugin.
|
||||
*
|
||||
* @param existing The existing constructor props.
|
||||
* @param plugin The plugin.
|
||||
* @return The props.
|
||||
*/
|
||||
@NotNull
|
||||
PluginProps getProps(@Nullable PluginProps existing,
|
||||
@NotNull Class<? extends EcoPlugin> plugin);
|
||||
|
||||
/**
|
||||
* Format a string with MiniMessage.
|
||||
*
|
||||
* @param message The message.
|
||||
* @return The formatted string.
|
||||
*/
|
||||
@NotNull
|
||||
String formatMiniMessage(@NotNull String message);
|
||||
|
||||
/**
|
||||
* Create controlled entity from a mob.
|
||||
*
|
||||
* @param mob The mob.
|
||||
* @param <T> The mob type.
|
||||
* @return The controlled entity.
|
||||
*/
|
||||
@NotNull <T extends Mob> EntityController<T> createEntityController(@NotNull T mob);
|
||||
|
||||
/**
|
||||
* Adapt base PDC to extended PDC.
|
||||
*
|
||||
* @param container The container.
|
||||
* @return The extended container.
|
||||
*/
|
||||
@NotNull
|
||||
ExtendedPersistentDataContainer adaptPdc(@NotNull PersistentDataContainer container);
|
||||
|
||||
/**
|
||||
* Create new PDC.
|
||||
*
|
||||
* @return The container.
|
||||
*/
|
||||
@NotNull
|
||||
PersistentDataContainer newPdc();
|
||||
|
||||
/**
|
||||
* Get item from SNBT.
|
||||
*
|
||||
* @param snbt The NBT string.
|
||||
* @return The ItemStack, or null if invalid.
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack fromSNBT(@NotNull String snbt);
|
||||
|
||||
/**
|
||||
* Convert item to SNBT.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The NBT string.
|
||||
*/
|
||||
@NotNull
|
||||
String toSNBT(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Make TestableItem from SNBT.
|
||||
*
|
||||
* @param snbt The NBT string.
|
||||
* @return The TestableItem.
|
||||
*/
|
||||
@NotNull
|
||||
TestableItem testableItemFromSNBT(@NotNull String snbt);
|
||||
|
||||
/**
|
||||
* Get the texture of a skull.
|
||||
*
|
||||
* @param meta The skull meta.
|
||||
* @return The texture, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
String getSkullTexture(@NotNull SkullMeta meta);
|
||||
|
||||
/**
|
||||
* Set the texture of a skull.
|
||||
*
|
||||
* @param meta The skull meta.
|
||||
* @param base64 The texture.
|
||||
*/
|
||||
void setSkullTexture(@NotNull SkullMeta meta,
|
||||
@NotNull String base64);
|
||||
|
||||
/**
|
||||
* Get the current server TPS.
|
||||
*
|
||||
* @return The TPS.
|
||||
*/
|
||||
double getTPS();
|
||||
|
||||
/**
|
||||
* Evaluate an expression.
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param injectable The injectable placeholders.
|
||||
* @param additionalPlayers The additional players.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
double evaluate(@NotNull String expression,
|
||||
@Nullable Player player,
|
||||
@NotNull PlaceholderInjectable injectable,
|
||||
@NotNull Collection<AdditionalPlayer> additionalPlayers);
|
||||
|
||||
/**
|
||||
* Get the menu a player currently has open.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The menu, or null if no menu open.
|
||||
*/
|
||||
@Nullable
|
||||
Menu getOpenMenu(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Get the instance of eco; the bridge between the api frontend
|
||||
* and the implementation backend.
|
||||
*
|
||||
* @return The instance of eco.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static Handler getHandler() {
|
||||
return handler;
|
||||
static Eco get() {
|
||||
return Instance.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Eco Handler components are internals, so if a class is marked as a handler component,
|
||||
* then it should be treated the same as if it was marked with {@link ApiStatus.Internal}.
|
||||
* <p>
|
||||
* If a class is marked with {@link HandlerComponent}, <strong>Do not reference it in
|
||||
* your code!</strong> It can and will contain breaking changes between minor versions and
|
||||
* even patches, and you will create compatibility issues by using them.
|
||||
* <p>
|
||||
* Handler components should also be marked with {@link ApiStatus.Internal} in order to
|
||||
* cause compiler / IDE warnings.
|
||||
* Manages the internal frontend -> backend communication.
|
||||
*/
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.CLASS)
|
||||
@Target({ElementType.TYPE})
|
||||
public @interface HandlerComponent {
|
||||
@ApiStatus.Internal
|
||||
final class Instance {
|
||||
/**
|
||||
* Instance of eco.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
private static Eco eco;
|
||||
|
||||
}
|
||||
/**
|
||||
* Initialize eco.
|
||||
*
|
||||
* @param eco The instance of eco.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
static void set(@NotNull final Eco eco) {
|
||||
Validate.isTrue(Instance.eco == null, "Already initialized!");
|
||||
|
||||
private Eco() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
Instance.eco = eco;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get eco.
|
||||
*
|
||||
* @return eco.
|
||||
*/
|
||||
static Eco get() {
|
||||
return eco;
|
||||
}
|
||||
|
||||
private Instance() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,8 +20,10 @@ import com.willfp.eco.core.web.UpdateChecker;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -79,12 +81,12 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
private final Set<String> loadedIntegrations = new HashSet<>();
|
||||
|
||||
/**
|
||||
* The internal plugin scheduler.
|
||||
* The plugin scheduler.
|
||||
*/
|
||||
private final Scheduler scheduler;
|
||||
|
||||
/**
|
||||
* The internal plugin Event Manager.
|
||||
* The plugin Event Manager.
|
||||
*/
|
||||
private final EventManager eventManager;
|
||||
|
||||
@@ -99,17 +101,17 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
private final LangYml langYml;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link org.bukkit.NamespacedKey}s.
|
||||
* The factory to produce {@link org.bukkit.NamespacedKey}s.
|
||||
*/
|
||||
private final NamespacedKeyFactory namespacedKeyFactory;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s.
|
||||
* The factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s.
|
||||
*/
|
||||
private final MetadataValueFactory metadataValueFactory;
|
||||
|
||||
/**
|
||||
* The internal factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s.
|
||||
* The factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s.
|
||||
*/
|
||||
private final RunnableFactory runnableFactory;
|
||||
|
||||
@@ -258,42 +260,42 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
*/
|
||||
protected EcoPlugin(@Nullable final PluginProps pluginProps) {
|
||||
/*
|
||||
The handler must be initialized before any plugin's constructors
|
||||
are called, as the constructors call Eco#getHandler().
|
||||
Eco must be initialized before any plugin's constructors
|
||||
are called, as the constructors call Eco#get().
|
||||
|
||||
To fix this, EcoSpigotPlugin an abstract class and the 'actual'
|
||||
plugin class is EcoHandler - that way I can create the handler
|
||||
plugin class is EcoImpl - that way I can initialize eco
|
||||
before any plugins are loaded while still having a separation between
|
||||
the plugin class and the handler class (for code clarity).
|
||||
the plugin class and the implementation class (for code clarity).
|
||||
|
||||
I don't really like the fact that the handler class *is* the
|
||||
I don't really like the fact that the implementation class *is* the
|
||||
spigot plugin, but it is what it is.
|
||||
|
||||
There is probably a better way of doing it - maybe with
|
||||
some sort of HandlerCreator interface in order to still have
|
||||
a standalone handler class, but then there would be an interface
|
||||
some sort of EcoCrater interface in order to still have
|
||||
a standalone eco class, but then there would be an interface
|
||||
left in the API that doesn't really help anything.
|
||||
|
||||
The other alternative would be to use reflection to get a 'createHandler'
|
||||
The other alternative would be to use reflection to get a 'createEco'
|
||||
method that only exists in EcoSpigotPlugin - but that feels filthy,
|
||||
and I'd rather only use reflection where necessary.
|
||||
*/
|
||||
|
||||
if (Eco.getHandler() == null && this instanceof Handler) {
|
||||
if (Eco.get() == null && this instanceof Eco) {
|
||||
/*
|
||||
This code is only ever called by EcoSpigotPlugin (EcoHandler)
|
||||
as it's the first plugin to load, and it is a handler.
|
||||
This code is only ever called by EcoSpigotPlugin (EcoImpl)
|
||||
as it's the first plugin to load, and it's an instance of eco.
|
||||
|
||||
Any other plugins will never call this code as the handler
|
||||
will have already been initialized.
|
||||
Any other plugins will never call this code as eco will have already
|
||||
been initialized.
|
||||
*/
|
||||
|
||||
Eco.setHandler((Handler) this);
|
||||
Eco.Instance.set((Eco) this);
|
||||
}
|
||||
|
||||
assert Eco.getHandler() != null;
|
||||
assert Eco.get() != null;
|
||||
|
||||
PluginProps generatedProps = Eco.getHandler().getProps(pluginProps, this.getClass());
|
||||
PluginProps generatedProps = Eco.get().getProps(pluginProps, this.getClass());
|
||||
generatedProps.validate();
|
||||
PluginProps props = this.mutateProps(generatedProps);
|
||||
props.validate();
|
||||
@@ -304,20 +306,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.color = props.getColor();
|
||||
this.supportingExtensions = props.isSupportingExtensions();
|
||||
|
||||
this.scheduler = Eco.getHandler().createScheduler(this);
|
||||
this.eventManager = Eco.getHandler().createEventManager(this);
|
||||
this.namespacedKeyFactory = Eco.getHandler().createNamespacedKeyFactory(this);
|
||||
this.metadataValueFactory = Eco.getHandler().createMetadataValueFactory(this);
|
||||
this.runnableFactory = Eco.getHandler().createRunnableFactory(this);
|
||||
this.extensionLoader = Eco.getHandler().createExtensionLoader(this);
|
||||
this.configHandler = Eco.getHandler().createConfigHandler(this);
|
||||
this.logger = Eco.getHandler().createLogger(this);
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.getHandler().createProxyFactory(this);
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
||||
this.logger = Eco.get().createLogger(this);
|
||||
|
||||
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
||||
|
||||
this.scheduler = Eco.get().createScheduler(this);
|
||||
this.eventManager = Eco.get().createEventManager(this);
|
||||
this.namespacedKeyFactory = Eco.get().createNamespacedKeyFactory(this);
|
||||
this.metadataValueFactory = Eco.get().createMetadataValueFactory(this);
|
||||
this.runnableFactory = Eco.get().createRunnableFactory(this);
|
||||
this.extensionLoader = Eco.get().createExtensionLoader(this);
|
||||
this.configHandler = Eco.get().createConfigHandler(this);
|
||||
|
||||
this.langYml = this.createLangYml();
|
||||
this.configYml = this.createConfigYml();
|
||||
|
||||
Eco.getHandler().addNewPlugin(this);
|
||||
Eco.get().addNewPlugin(this);
|
||||
|
||||
/*
|
||||
The minimum eco version check was moved here because it's very common
|
||||
@@ -326,7 +331,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
they have an outdated version of eco installed.
|
||||
*/
|
||||
|
||||
DefaultArtifactVersion runningVersion = new DefaultArtifactVersion(Eco.getHandler().getEcoPlugin().getDescription().getVersion());
|
||||
DefaultArtifactVersion runningVersion = new DefaultArtifactVersion(Eco.get().getEcoPlugin().getDescription().getVersion());
|
||||
DefaultArtifactVersion requiredVersion = new DefaultArtifactVersion(this.getMinimumEcoVersion());
|
||||
if (!(runningVersion.compareTo(requiredVersion) > 0 || runningVersion.equals(requiredVersion))) {
|
||||
this.getLogger().severe("You are running an outdated version of eco!");
|
||||
@@ -347,21 +352,21 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.getLogger().info("");
|
||||
this.getLogger().info("Loading " + this.getColor() + this.getName());
|
||||
|
||||
if (this.getResourceId() != 0) {
|
||||
if (this.getResourceId() != 0 && !Eco.get().getEcoPlugin().getConfigYml().getBool("no-update-checker")) {
|
||||
new UpdateChecker(this).getVersion(version -> {
|
||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(this.getDescription().getVersion());
|
||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||
this.outdated = true;
|
||||
this.getLogger().warning("&c" + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||
this.getLogger().warning("&cThe newest version is &f" + version);
|
||||
this.getLogger().warning("&cDownload the new version!");
|
||||
this.getLogger().warning(this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||
this.getLogger().warning("The newest version is " + version);
|
||||
this.getLogger().warning("Download the new version!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (this.getBStatsId() != 0) {
|
||||
Eco.getHandler().registerBStats(this);
|
||||
Eco.get().registerBStats(this);
|
||||
}
|
||||
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
||||
@@ -371,15 +376,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
|
||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||
this.loadedIntegrations.add("PlaceholderAPI");
|
||||
PlaceholderManager.addIntegration(Eco.getHandler().createPAPIIntegration(this));
|
||||
PlaceholderManager.addIntegration(Eco.get().createPAPIIntegration(this));
|
||||
}
|
||||
|
||||
this.loadIntegrationLoaders().forEach((integrationLoader -> {
|
||||
this.loadIntegrationLoaders().forEach(integrationLoader -> {
|
||||
if (enabledPlugins.contains(integrationLoader.getPluginName().toLowerCase())) {
|
||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||
integrationLoader.load();
|
||||
}
|
||||
}));
|
||||
});
|
||||
|
||||
this.getLogger().info("Loaded integrations: " + String.join(", ", this.getLoadedIntegrations()));
|
||||
|
||||
@@ -430,7 +435,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
}
|
||||
|
||||
this.getLogger().info("Cleaning up...");
|
||||
Eco.getHandler().getCleaner().clean(this);
|
||||
Eco.get().clean(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -489,9 +494,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public final void reload() {
|
||||
this.getConfigHandler().updateConfigs();
|
||||
|
||||
this.getScheduler().cancelAll();
|
||||
this.getConfigHandler().callUpdate();
|
||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||
this.getScheduler().cancelAll();
|
||||
|
||||
this.handleReload();
|
||||
|
||||
@@ -694,7 +699,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public final FileConfiguration getConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
return Objects.requireNonNull(this.getConfigYml().getBukkitHandle());
|
||||
return Objects.requireNonNull(this.getConfigYml().toBukkit());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -743,7 +748,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The plugin.
|
||||
*/
|
||||
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||
return Eco.getHandler().getPluginByName(pluginName);
|
||||
return Eco.get().getPluginByName(pluginName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -752,7 +757,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The set of names.
|
||||
*/
|
||||
public static Set<String> getPluginNames() {
|
||||
return new HashSet<>(Eco.getHandler().getLoadedPlugins());
|
||||
return new HashSet<>(Eco.get().getLoadedPlugins());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -918,4 +923,26 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public ProxyFactory getProxyFactory() {
|
||||
return this.proxyFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a NamespacedKey.
|
||||
*
|
||||
* @param key The key.
|
||||
* @return The namespaced key.
|
||||
*/
|
||||
@NotNull
|
||||
public NamespacedKey createNamespacedKey(@NotNull final String key) {
|
||||
return this.getNamespacedKeyFactory().create(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a metadata value.
|
||||
*
|
||||
* @param value The value.
|
||||
* @return The metadata value.
|
||||
*/
|
||||
@NotNull
|
||||
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
||||
return this.getMetadataValueFactory().create(value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,285 +0,0 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigFactory;
|
||||
import com.willfp.eco.core.data.ProfileHandler;
|
||||
import com.willfp.eco.core.data.keys.KeyRegistry;
|
||||
import com.willfp.eco.core.drops.DropQueueFactory;
|
||||
import com.willfp.eco.core.entities.ai.EntityController;
|
||||
import com.willfp.eco.core.events.EventManager;
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||
import com.willfp.eco.core.factory.MetadataValueFactory;
|
||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||
import com.willfp.eco.core.factory.RunnableFactory;
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.core.gui.GUIFactory;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||
import com.willfp.eco.core.proxy.Cleaner;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Mob;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* @see Eco#getHandler()
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public interface Handler {
|
||||
/**
|
||||
* Create a scheduler.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The scheduler.
|
||||
*/
|
||||
@NotNull
|
||||
Scheduler createScheduler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create an event manager.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The event manager.
|
||||
*/
|
||||
@NotNull
|
||||
EventManager createEventManager(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a NamespacedKey factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKeyFactory createNamespacedKeyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a MetadataValue factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
MetadataValueFactory createMetadataValueFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a Runnable factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RunnableFactory createRunnableFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create an ExtensionLoader.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ExtensionLoader createExtensionLoader(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a config handler.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The handler.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigHandler createConfigHandler(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a logger.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The logger.
|
||||
*/
|
||||
@NotNull
|
||||
Logger createLogger(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a PAPI integration.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The integration.
|
||||
*/
|
||||
@NotNull
|
||||
PlaceholderIntegration createPAPIIntegration(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Create a proxy factory.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ProxyFactory createProxyFactory(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get eco Spigot plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@NotNull
|
||||
EcoPlugin getEcoPlugin();
|
||||
|
||||
/**
|
||||
* Get config factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigFactory getConfigFactory();
|
||||
|
||||
/**
|
||||
* Get drop queue factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
DropQueueFactory getDropQueueFactory();
|
||||
|
||||
/**
|
||||
* Get GUI factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
GUIFactory getGUIFactory();
|
||||
|
||||
/**
|
||||
* Get cleaner.
|
||||
*
|
||||
* @return The cleaner.
|
||||
*/
|
||||
@NotNull
|
||||
Cleaner getCleaner();
|
||||
|
||||
/**
|
||||
* Add new plugin.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void addNewPlugin(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get plugin by name.
|
||||
*
|
||||
* @param name The name.
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
EcoPlugin getPluginByName(@NotNull String name);
|
||||
|
||||
/**
|
||||
* Get all loaded eco plugins.
|
||||
*
|
||||
* @return A list of plugin names in lowercase.
|
||||
*/
|
||||
@NotNull
|
||||
List<String> getLoadedPlugins();
|
||||
|
||||
/**
|
||||
* Create a FastItemStack.
|
||||
*
|
||||
* @param itemStack The base ItemStack.
|
||||
* @return The FastItemStack.
|
||||
*/
|
||||
@NotNull
|
||||
FastItemStack createFastItemStack(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Register bStats metrics.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void registerBStats(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get Adventure audiences.
|
||||
*
|
||||
* @return The audiences.
|
||||
*/
|
||||
@Nullable
|
||||
BukkitAudiences getAdventure();
|
||||
|
||||
/**
|
||||
* Get the key registry.
|
||||
*
|
||||
* @return The registry.
|
||||
*/
|
||||
@NotNull
|
||||
KeyRegistry getKeyRegistry();
|
||||
|
||||
/**
|
||||
* Get the PlayerProfile handler.
|
||||
*
|
||||
* @return The handler.
|
||||
*/
|
||||
@NotNull
|
||||
ProfileHandler getProfileHandler();
|
||||
|
||||
/**
|
||||
* Create dummy entity - never spawned, exists purely in code.
|
||||
*
|
||||
* @param location The location.
|
||||
* @return The entity.
|
||||
*/
|
||||
@NotNull
|
||||
Entity createDummyEntity(@NotNull Location location);
|
||||
|
||||
/**
|
||||
* Create a {@link NamespacedKey} quickly
|
||||
* <p>
|
||||
* Bypasses the constructor, allowing for the creation of invalid keys,
|
||||
* therefore this is considered unsafe and should only be called after
|
||||
* the key has been confirmed to be valid.
|
||||
*
|
||||
* @param namespace The namespace.
|
||||
* @param key The key.
|
||||
* @return The key.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKey createNamespacedKey(@NotNull String namespace,
|
||||
@NotNull String key);
|
||||
|
||||
/**
|
||||
* Return or get props for a plugin.
|
||||
*
|
||||
* @param existing The existing constructor props.
|
||||
* @param plugin The plugin.
|
||||
* @return The props.
|
||||
*/
|
||||
@NotNull
|
||||
PluginProps getProps(@Nullable PluginProps existing,
|
||||
@NotNull Class<? extends EcoPlugin> plugin);
|
||||
|
||||
/**
|
||||
* Format a string with MiniMessage.
|
||||
*
|
||||
* @param message The message.
|
||||
* @return The formatted string.
|
||||
*/
|
||||
@NotNull
|
||||
String formatMiniMessage(@NotNull String message);
|
||||
|
||||
/**
|
||||
* Create controlled entity from a mob.
|
||||
*
|
||||
* @param mob The mob.
|
||||
* @param <T> The mob type.
|
||||
* @return The controlled entity.
|
||||
*/
|
||||
@NotNull
|
||||
<T extends Mob> EntityController<T> createEntityController(@NotNull T mob);
|
||||
}
|
||||
@@ -13,7 +13,9 @@ import org.jetbrains.annotations.NotNull;
|
||||
* in the constructor.
|
||||
*
|
||||
* @param <T> The eco plugin type.
|
||||
* @deprecated Leaky inheritance, shouldn't exist.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
public abstract class PluginDependent<T extends EcoPlugin> {
|
||||
/**
|
||||
* The {@link EcoPlugin} that is stored.
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -234,7 +233,6 @@ public final class PluginProps {
|
||||
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
||||
* @return The props.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
static PluginProps createSimple(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
|
||||
@@ -26,7 +26,7 @@ public class Prerequisite {
|
||||
* Requires the server to be running an implementation of paper.
|
||||
*/
|
||||
public static final Prerequisite HAS_PAPER = new Prerequisite(
|
||||
() -> ClassUtils.exists("com.destroystokyo.paper.event.player.PlayerElytraBoostEvent"),
|
||||
() -> ClassUtils.exists("com.destroystokyo.paper.event.block.BeaconEffectEvent"),
|
||||
"Requires server to be running paper (or a fork)"
|
||||
);
|
||||
|
||||
@@ -35,17 +35,25 @@ public class Prerequisite {
|
||||
*
|
||||
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
public static final Prerequisite HAS_VAULT = new Prerequisite(
|
||||
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
|
||||
"Requires server to have vault"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.19.
|
||||
*/
|
||||
public static final Prerequisite HAS_1_19 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("19"),
|
||||
"Requires server to be running 1.19+"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.18.
|
||||
*/
|
||||
public static final Prerequisite HAS_1_18 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("18"),
|
||||
() -> ProxyConstants.NMS_VERSION.contains("18") || HAS_1_19.isMet(),
|
||||
"Requires server to be running 1.18+"
|
||||
);
|
||||
|
||||
@@ -54,7 +62,7 @@ public class Prerequisite {
|
||||
*
|
||||
* @deprecated eco no longer supports versions before 1.17.
|
||||
*/
|
||||
@Deprecated(since = "6.25.2")
|
||||
@Deprecated(since = "6.25.2", forRemoval = true)
|
||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("17") || HAS_1_18.isMet(),
|
||||
"Requires server to be running 1.17+"
|
||||
|
||||
@@ -10,6 +10,7 @@ import java.util.List;
|
||||
/**
|
||||
* Interface for all command implementations.
|
||||
*/
|
||||
@SuppressWarnings("removal")
|
||||
public interface CommandBase {
|
||||
/**
|
||||
* Get command name.
|
||||
@@ -81,7 +82,7 @@ public interface CommandBase {
|
||||
* @see CommandHandler
|
||||
* @deprecated Use {@link CommandBase#onExecute(CommandSender, List)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
CommandHandler getHandler();
|
||||
|
||||
/**
|
||||
@@ -91,7 +92,7 @@ public interface CommandBase {
|
||||
* @see CommandHandler
|
||||
* @deprecated Handlers have been deprecated.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
void setHandler(@NotNull CommandHandler handler);
|
||||
|
||||
/**
|
||||
@@ -101,7 +102,7 @@ public interface CommandBase {
|
||||
* @see TabCompleteHandler
|
||||
* @deprecated Use {@link CommandBase#tabComplete(CommandSender, List)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
TabCompleteHandler getTabCompleter();
|
||||
|
||||
/**
|
||||
@@ -111,6 +112,6 @@ public interface CommandBase {
|
||||
* @see TabCompleteHandler
|
||||
* @deprecated Handlers have been deprecated.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
void setTabCompleter(@NotNull TabCompleteHandler handler);
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.List;
|
||||
* update to use the new system: {@link CommandBase#onExecute(CommandSender, List)}.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@Deprecated(since = "6.17.0")
|
||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
||||
public interface CommandHandler {
|
||||
/**
|
||||
* The code to be called on execution.
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.List;
|
||||
* update to use the new system: {@link CommandBase#tabComplete(CommandSender, List)}
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@Deprecated(since = "6.17.0")
|
||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
||||
public interface TabCompleteHandler {
|
||||
/**
|
||||
* Handle Tab Completion.
|
||||
|
||||
@@ -2,8 +2,6 @@ package com.willfp.eco.core.command.impl;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.command.CommandBase;
|
||||
import com.willfp.eco.core.command.CommandHandler;
|
||||
import com.willfp.eco.core.command.TabCompleteHandler;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.StringUtil;
|
||||
@@ -23,7 +21,7 @@ import java.util.stream.Collectors;
|
||||
* in order to execute the command-specific code. It's essentially an internal
|
||||
* layer, hence why it's a package-private class.
|
||||
*/
|
||||
@SuppressWarnings({"DeprecatedIsStillUsed"})
|
||||
@SuppressWarnings({"DeprecatedIsStillUsed", "removal"})
|
||||
abstract class HandledCommand implements CommandBase {
|
||||
/**
|
||||
* The plugin.
|
||||
@@ -54,14 +52,14 @@ abstract class HandledCommand implements CommandBase {
|
||||
*/
|
||||
@Deprecated
|
||||
@Nullable
|
||||
private CommandHandler handler = null;
|
||||
private com.willfp.eco.core.command.CommandHandler handler = null;
|
||||
|
||||
/**
|
||||
* The tab completion code to be executed in the command.
|
||||
*/
|
||||
@Deprecated
|
||||
@Nullable
|
||||
private TabCompleteHandler tabCompleter = null;
|
||||
private com.willfp.eco.core.command.TabCompleteHandler tabCompleter = null;
|
||||
|
||||
/**
|
||||
* All subcommands for the command.
|
||||
@@ -169,7 +167,10 @@ abstract class HandledCommand implements CommandBase {
|
||||
|
||||
StringUtil.copyPartialMatches(
|
||||
args[0],
|
||||
this.getSubcommands().stream().map(CommandBase::getName).collect(Collectors.toList()),
|
||||
this.getSubcommands().stream()
|
||||
.filter(subCommand -> sender.hasPermission(subCommand.getPermission()))
|
||||
.map(CommandBase::getName)
|
||||
.collect(Collectors.toList()),
|
||||
completions
|
||||
);
|
||||
|
||||
@@ -184,6 +185,10 @@ abstract class HandledCommand implements CommandBase {
|
||||
HandledCommand command = null;
|
||||
|
||||
for (CommandBase subcommand : this.getSubcommands()) {
|
||||
if (!sender.hasPermission(subcommand.getPermission())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase(subcommand.getName())) {
|
||||
command = (HandledCommand) subcommand;
|
||||
}
|
||||
@@ -256,27 +261,27 @@ abstract class HandledCommand implements CommandBase {
|
||||
return this.subcommands;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
@Override
|
||||
public @Nullable CommandHandler getHandler() {
|
||||
public @Nullable com.willfp.eco.core.command.CommandHandler getHandler() {
|
||||
return this.handler;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
@Override
|
||||
public @Nullable TabCompleteHandler getTabCompleter() {
|
||||
public @Nullable com.willfp.eco.core.command.TabCompleteHandler getTabCompleter() {
|
||||
return this.tabCompleter;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
@Override
|
||||
public void setHandler(@Nullable final CommandHandler handler) {
|
||||
public void setHandler(@Nullable final com.willfp.eco.core.command.CommandHandler handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
@Override
|
||||
public void setTabCompleter(@Nullable final TabCompleteHandler tabCompleter) {
|
||||
public void setTabCompleter(@Nullable final com.willfp.eco.core.command.TabCompleteHandler tabCompleter) {
|
||||
this.tabCompleter = tabCompleter;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,13 +23,31 @@ public abstract class BaseConfig extends LoadableConfigWrapper {
|
||||
@NotNull final PluginLike plugin,
|
||||
final boolean removeUnused,
|
||||
@NotNull final ConfigType type) {
|
||||
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
this(configName, plugin, removeUnused, type, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new Base Config.
|
||||
*
|
||||
* @param plugin The plugin or extension.
|
||||
* @param configName The config name (excluding extension).
|
||||
* @param removeUnused If unused sections should be removed.
|
||||
* @param type The config type.
|
||||
* @param requiresChangeToSave If changes must be applied to save the config.
|
||||
*/
|
||||
protected BaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin,
|
||||
final boolean removeUnused,
|
||||
@NotNull final ConfigType type,
|
||||
final boolean requiresChangeToSave) {
|
||||
super(Eco.get().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
type
|
||||
type,
|
||||
requiresChangeToSave
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.willfp.eco.core.config;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Builder for configs to create them programmatically.
|
||||
*/
|
||||
public class BuildableConfig extends TransientConfig {
|
||||
/**
|
||||
* Create a new empty config builder.
|
||||
*/
|
||||
public BuildableConfig() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add to the config builder.
|
||||
*
|
||||
* @param path The path.
|
||||
* @param object The object.
|
||||
* @return The builder.
|
||||
*/
|
||||
public BuildableConfig add(@NotNull final String path,
|
||||
@Nullable final Object object) {
|
||||
set(path, object);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.willfp.eco.core.config;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config types, classified by file extension.
|
||||
*/
|
||||
@@ -7,10 +9,33 @@ public enum ConfigType {
|
||||
/**
|
||||
* .json config.
|
||||
*/
|
||||
JSON,
|
||||
JSON("json"),
|
||||
|
||||
/**
|
||||
* .yml config.
|
||||
*/
|
||||
YAML
|
||||
YAML("yml"),
|
||||
|
||||
/**
|
||||
* .toml config.
|
||||
*/
|
||||
TOML("toml");
|
||||
|
||||
/**
|
||||
* The file extension.
|
||||
*/
|
||||
private final String extension;
|
||||
|
||||
ConfigType(@NotNull final String extension) {
|
||||
this.extension = extension;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file extension.
|
||||
*
|
||||
* @return The extension.
|
||||
*/
|
||||
public String getExtension() {
|
||||
return extension;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,13 +31,14 @@ public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final ConfigType type,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
super(Eco.get().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
type,
|
||||
true,
|
||||
updateBlacklist
|
||||
));
|
||||
}
|
||||
|
||||
@@ -21,12 +21,13 @@ public abstract class StaticBaseConfig extends LoadableConfigWrapper {
|
||||
protected StaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final ConfigType type) {
|
||||
super(Eco.getHandler().getConfigFactory().createLoadableConfig(
|
||||
super(Eco.get().createLoadableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
type
|
||||
type,
|
||||
true
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,17 @@ package com.willfp.eco.core.config;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.file.Files;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -18,35 +23,74 @@ import java.util.Map;
|
||||
*/
|
||||
public class TransientConfig extends ConfigWrapper<Config> {
|
||||
/**
|
||||
* @param config The ConfigurationSection handle.
|
||||
*/
|
||||
public TransientConfig(@NotNull final ConfigurationSection config) {
|
||||
super(Eco.get().wrapConfigurationSection(config));
|
||||
}
|
||||
|
||||
/**
|
||||
* Exists for backwards compatibility, YamlConfigurations are ConfigurationSections.
|
||||
*
|
||||
* @param config The YamlConfiguration handle.
|
||||
*/
|
||||
public TransientConfig(@NotNull final YamlConfiguration config) {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||
this((ConfigurationSection) config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param stream The InputStream.
|
||||
*/
|
||||
public TransientConfig(@Nullable final InputStream stream) {
|
||||
super(stream != null ? Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration(
|
||||
super(stream != null ? Eco.get().wrapConfigurationSection(YamlConfiguration.loadConfiguration(
|
||||
new InputStreamReader(stream)
|
||||
)) : new TransientConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param file The File.
|
||||
* @deprecated Specify the config type to prevent bugs.
|
||||
*/
|
||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
||||
public TransientConfig(@Nullable final File file) {
|
||||
this(file, ConfigType.YAML);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param file The file.
|
||||
* @param type The config type to try read from.
|
||||
*/
|
||||
public TransientConfig(@Nullable final File file,
|
||||
@NotNull final ConfigType type) {
|
||||
super(file != null ? Eco.get().createConfig(readFile(file), type)
|
||||
: new TransientConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty transient config.
|
||||
*
|
||||
* @param values The values.
|
||||
*/
|
||||
public TransientConfig(@NotNull final Map<String, Object> values) {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(values));
|
||||
super(Eco.get().createConfig(values, ConfigType.YAML));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty transient config.
|
||||
*
|
||||
* @param values The values.
|
||||
* @param type The type.
|
||||
*/
|
||||
public TransientConfig(@NotNull final Map<String, Object> values,
|
||||
@NotNull final ConfigType type) {
|
||||
super(Eco.get().createConfig(values, type));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty transient config.
|
||||
*/
|
||||
public TransientConfig() {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig("", ConfigType.YAML));
|
||||
this(new HashMap<>(), ConfigType.JSON);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,6 +99,24 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
||||
*/
|
||||
public TransientConfig(@NotNull final String contents,
|
||||
@NotNull final ConfigType type) {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(contents, type));
|
||||
super(Eco.get().createConfig(contents, type));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a file to a string.
|
||||
*
|
||||
* @param file The file.
|
||||
* @return The string.
|
||||
*/
|
||||
private static String readFile(@Nullable final File file) {
|
||||
if (file == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
try {
|
||||
return Files.readString(file.toPath());
|
||||
} catch (IOException e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,27 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import com.willfp.eco.core.config.BuildableConfig;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.TransientConfig;
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
import com.willfp.eco.util.NumberUtils;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
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.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* All configs implement this interface.
|
||||
@@ -24,8 +32,13 @@ import java.util.Objects;
|
||||
public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
/**
|
||||
* Clears cache.
|
||||
* <p>
|
||||
* Configs no longer have caches as they have in previous versions.
|
||||
*/
|
||||
void clearCache();
|
||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
||||
default void clearCache() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config into readable text.
|
||||
@@ -51,9 +64,21 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
@NotNull
|
||||
List<String> getKeys(boolean deep);
|
||||
|
||||
/**
|
||||
* Recurse config keys.
|
||||
*
|
||||
* @param found The found keys.
|
||||
* @param root The root.
|
||||
* @return The keys.
|
||||
*/
|
||||
@NotNull
|
||||
default List<String> recurseKeys(@NotNull Set<String> found,
|
||||
@NotNull String root) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an object from config.
|
||||
* Default implementations call {@link org.bukkit.configuration.file.YamlConfiguration#get(String)}.
|
||||
*
|
||||
* @param path The path.
|
||||
* @return The object.
|
||||
@@ -63,7 +88,6 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
|
||||
/**
|
||||
* Set an object in config.
|
||||
* Default implementations call {@link org.bukkit.configuration.file.YamlConfiguration#set(String, Object)}
|
||||
*
|
||||
* @param path The path.
|
||||
* @param object The object.
|
||||
@@ -135,6 +159,20 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
return Double.valueOf(getDoubleFromExpression(path, player)).intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a decimal value via a mathematical expression.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param player The player to evaluate placeholders with respect to.
|
||||
* @param additionalPlayers The additional players to evaluate placeholders with respect to.
|
||||
* @return The computed value, or 0 if not found or invalid.
|
||||
*/
|
||||
default int getIntFromExpression(@NotNull String path,
|
||||
@Nullable Player player,
|
||||
@NotNull Collection<AdditionalPlayer> additionalPlayers) {
|
||||
return Double.valueOf(getDoubleFromExpression(path, player, additionalPlayers)).intValue();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get an integer from config.
|
||||
@@ -241,35 +279,6 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
return getString(path, false, StringUtils.FormatOption.WITHOUT_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @return The found value, or an empty string if not found.
|
||||
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||
*/
|
||||
@Deprecated(since = "6.18.0")
|
||||
default String getString(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or an empty string if not found.
|
||||
* @deprecated Use {@link Config#getFormattedString(String, StringUtils.FormatOption)} instead.
|
||||
*/
|
||||
@NotNull
|
||||
@Deprecated
|
||||
default String getString(@NotNull String path,
|
||||
@NotNull final StringUtils.FormatOption option) {
|
||||
return this.getString(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
@@ -322,36 +331,6 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
return getStringOrNull(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the string should be formatted.
|
||||
* @return The found value, or null if not found.
|
||||
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated(since = "6.18.0")
|
||||
default String getStringOrNull(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getStringOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
* @deprecated Use {@link Config#getFormattedString(String, StringUtils.FormatOption)} instead.
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated
|
||||
default String getStringOrNull(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return this.getStringOrNull(path, true, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string from config.
|
||||
*
|
||||
@@ -406,36 +385,6 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
return getStrings(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||
*/
|
||||
@NotNull
|
||||
@Deprecated(since = "6.18.0")
|
||||
default List<String> getStrings(@NotNull String path,
|
||||
boolean format) {
|
||||
return this.getStrings(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
* @deprecated Use {@link Config#getFormattedStrings(String, StringUtils.FormatOption)} instead.
|
||||
*/
|
||||
@NotNull
|
||||
@Deprecated
|
||||
default List<String> getStrings(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return getStrings(path, false, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
@@ -494,36 +443,6 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
return getStringsOrNull(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param format If the strings should be formatted.
|
||||
* @return The found value, or null if not found.
|
||||
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated(since = "6.18.0")
|
||||
default List<String> getStringsOrNull(@NotNull String path,
|
||||
boolean format) {
|
||||
return getStringsOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param option The format option.
|
||||
* @return The found value, or null if not found.
|
||||
* @deprecated Use {@link Config#getFormattedStringsOrNull(String, StringUtils.FormatOption)} instead.
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated
|
||||
default List<String> getStringsOrNull(@NotNull String path,
|
||||
@NotNull StringUtils.FormatOption option) {
|
||||
return getStringsOrNull(path, false, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of strings from config.
|
||||
*
|
||||
@@ -566,7 +485,21 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
*/
|
||||
default double getDoubleFromExpression(@NotNull String path,
|
||||
@Nullable Player player) {
|
||||
return NumberUtils.evaluateExpression(this.getString(path), player, this.getInjectedPlaceholders());
|
||||
return NumberUtils.evaluateExpression(this.getString(path), player, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a decimal value via a mathematical expression.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @param player The player to evaluate placeholders with respect to.
|
||||
* @param additionalPlayers The additional players to evaluate placeholders with respect to.
|
||||
* @return The computed value, or 0 if not found or invalid.
|
||||
*/
|
||||
default double getDoubleFromExpression(@NotNull String path,
|
||||
@Nullable Player player,
|
||||
@NotNull Collection<AdditionalPlayer> additionalPlayers) {
|
||||
return NumberUtils.evaluateExpression(this.getString(path), player, this, additionalPlayers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -634,12 +567,12 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
Config clone();
|
||||
|
||||
@Override
|
||||
default void injectPlaceholders(@NotNull Iterable<StaticPlaceholder> placeholders) {
|
||||
default void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
default List<StaticPlaceholder> getInjectedPlaceholders() {
|
||||
default @NotNull List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@@ -647,4 +580,33 @@ public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
default void clearInjectedPlaceholders() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config to a map of values.
|
||||
*
|
||||
* @return The values.
|
||||
*/
|
||||
default Map<String, Object> toMap() {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config to a map of values.
|
||||
*
|
||||
* @return The values.
|
||||
*/
|
||||
default ConfigurationSection toBukkit() {
|
||||
YamlConfiguration empty = new YamlConfiguration();
|
||||
empty.createSection("temp", this.toMap());
|
||||
return empty.getConfigurationSection("temp");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new config builder.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
static BuildableConfig builder() {
|
||||
return new BuildableConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* JSON config.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
public interface JSONConfig extends Config {
|
||||
/**
|
||||
* Get a list of subsections from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||
*/
|
||||
@NotNull
|
||||
default List<JSONConfig> getSubsections(@NotNull String path) {
|
||||
return Objects.requireNonNullElse(getSubsectionsOrNull(path), new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of subsections from config.
|
||||
*
|
||||
* @param path The key to fetch the value from.
|
||||
* @return The found value, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
List<JSONConfig> getSubsectionsOrNull(@NotNull String path);
|
||||
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection. Throws NPE if not found.
|
||||
*/
|
||||
@Override
|
||||
@NotNull
|
||||
JSONConfig getSubsection(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get subsection from config.
|
||||
*
|
||||
* @param path The key to check.
|
||||
* @return The subsection, or null if not found.
|
||||
*/
|
||||
@Override
|
||||
@Nullable
|
||||
JSONConfig getSubsectionOrNull(@NotNull String path);
|
||||
|
||||
@Override
|
||||
JSONConfig clone();
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
@@ -47,14 +47,21 @@ public interface LoadableConfig extends Config {
|
||||
/**
|
||||
* Get bukkit {@link YamlConfiguration}.
|
||||
* <p>
|
||||
* This method is not recommended unless absolutely required as it
|
||||
* only returns true if the type of config is {@link com.willfp.eco.core.config.ConfigType#YAML},
|
||||
* and if the handle is an {@link YamlConfiguration} specifically. This depends on the internals
|
||||
* and the implementation, and so may cause problems - it exists mostly for parity with
|
||||
* {@link JavaPlugin#getConfig()}.
|
||||
* This used to represent the underlying config, but since 6.30.0 configs use
|
||||
* their own implementations internally, without relying on bukkit.
|
||||
*
|
||||
* @return The config, or null if config is not yaml-based.
|
||||
* @deprecated Use toBukkit() instead.
|
||||
*/
|
||||
@Nullable
|
||||
YamlConfiguration getBukkitHandle();
|
||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
||||
default YamlConfiguration getBukkitHandle() {
|
||||
return this.toBukkit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config to a bukkit {@link YamlConfiguration}.
|
||||
*/
|
||||
@NotNull
|
||||
YamlConfiguration toBukkit();
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
/**
|
||||
* Interface for configs that wrap an {@link YamlConfiguration}.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
public interface WrappedYamlConfiguration {
|
||||
/**
|
||||
* Get the ConfigurationSection handle.
|
||||
*
|
||||
* @return The handle.
|
||||
*/
|
||||
YamlConfiguration getBukkitHandle();
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
ConfigType.JSON,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
ConfigType.JSON
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, updateBlacklist);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, removeUnused, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in one of two places:
|
||||
* <ul>
|
||||
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||
* <li>Other extension's configs</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected JSONExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
ConfigType.JSON,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected JSONExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, source, subDirectoryPath, updateBlacklist);
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable JSON config that exists within a plugin jar.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super((JSONConfig) Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.JSON));
|
||||
}
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Raw JSON config with a map of values at its core.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public class JSONTransientConfig extends JSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for passing maps.
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param values The map of values.
|
||||
*/
|
||||
public JSONTransientConfig(@NotNull final Map<String, Object> values) {
|
||||
super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(values));
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty JSON config.
|
||||
*/
|
||||
public JSONTransientConfig() {
|
||||
super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(new HashMap<>()));
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package com.willfp.eco.core.config.json.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend JSON config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected JSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public @NotNull List<JSONConfig> getSubsections(@NotNull final String path) {
|
||||
return this.getHandle().getSubsections(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<JSONConfig> getSubsectionsOrNull(@NotNull final String path) {
|
||||
return this.getHandle().getSubsectionsOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull JSONConfig getSubsection(@NotNull final String path) {
|
||||
return this.getHandle().getSubsection(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable JSONConfig getSubsectionOrNull(@NotNull final String path) {
|
||||
return this.getHandle().getSubsectionOrNull(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONConfig clone() {
|
||||
return this.getHandle().clone();
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.willfp.eco.core.config.json.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable JSON config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected LoadableJSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||
super(handle);
|
||||
|
||||
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void createFile() {
|
||||
((LoadableConfig) this.getHandle()).createFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourcePath() {
|
||||
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() throws IOException {
|
||||
((LoadableConfig) this.getHandle()).save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getConfigFile() {
|
||||
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return ((LoadableConfig) this.getHandle()).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.config.updating;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
@@ -29,7 +30,8 @@ import java.lang.annotation.Target;
|
||||
* }</pre>
|
||||
* <p>
|
||||
* If using kotlin, you have to annotate the method with {@code @JvmStatic}
|
||||
* in order to prevent null pointer exceptions.
|
||||
* in order to prevent null pointer exceptions - this also means that you cannot
|
||||
* have config updater methods in companion objects.
|
||||
* <p>
|
||||
* Config update methods in all classes in a plugin jar will be called
|
||||
* on reload.
|
||||
@@ -39,5 +41,6 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Documented
|
||||
public @interface ConfigUpdater {
|
||||
}
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
package com.willfp.eco.core.config.wrapper;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Internal component to create backend config implementations.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface ConfigFactory {
|
||||
/**
|
||||
* Updatable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param type The config type.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
LoadableConfig createUpdatableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull ConfigType type,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* Loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param type The config type.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
LoadableConfig createLoadableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
@NotNull ConfigType type);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param config The handle.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createConfig(@NotNull YamlConfiguration config);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param values The values.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createConfig(@NotNull Map<String, Object> values);
|
||||
|
||||
/**
|
||||
* Create config.
|
||||
*
|
||||
* @param contents The file contents.
|
||||
* @param type The type.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createConfig(@NotNull String contents,
|
||||
@NotNull ConfigType type);
|
||||
}
|
||||
@@ -2,12 +2,14 @@ package com.willfp.eco.core.config.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
@@ -17,7 +19,7 @@ import java.util.List;
|
||||
*
|
||||
* @param <T> The type of the handle.
|
||||
*/
|
||||
@SuppressWarnings("MethodDoesntCallSuperMethod")
|
||||
@SuppressWarnings({"MethodDoesntCallSuperMethod", "removal"})
|
||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
@@ -41,6 +43,7 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
||||
public void clearCache() {
|
||||
handle.clearCache();
|
||||
}
|
||||
@@ -60,6 +63,12 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
return handle.getKeys(deep);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<String> recurseKeys(@NotNull final Set<String> found,
|
||||
@NotNull final String root) {
|
||||
return handle.recurseKeys(found, root);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object get(@NotNull final String path) {
|
||||
return handle.get(path);
|
||||
@@ -136,18 +145,13 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlaceholders(@NotNull final StaticPlaceholder... placeholders) {
|
||||
handle.injectPlaceholders(placeholders);
|
||||
public void addInjectablePlaceholder(@NotNull final Iterable<InjectablePlaceholder> placeholders) {
|
||||
handle.addInjectablePlaceholder(placeholders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlaceholders(@NotNull final Iterable<StaticPlaceholder> placeholders) {
|
||||
handle.injectPlaceholders(placeholders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<StaticPlaceholder> getInjectedPlaceholders() {
|
||||
return handle.getInjectedPlaceholders();
|
||||
public @NotNull List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return handle.getPlaceholderInjections();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -155,6 +159,11 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
handle.clearInjectedPlaceholders();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> toMap() {
|
||||
return this.handle.toMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the handle.
|
||||
*
|
||||
|
||||
@@ -3,7 +3,6 @@ package com.willfp.eco.core.config.wrapper;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@@ -47,7 +46,7 @@ public abstract class LoadableConfigWrapper extends ConfigWrapper<LoadableConfig
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||
return this.getHandle().getBukkitHandle();
|
||||
public @NotNull YamlConfiguration toBukkit() {
|
||||
return this.getHandle().toBukkit();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
ConfigType.YAML,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
ConfigType.YAML
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, updateBlacklist);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, removeUnused, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in one of two places:
|
||||
* <ul>
|
||||
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||
* <li>Other extension's configs</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected YamlExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
ConfigType.YAML,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param plugin The plugin.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
*/
|
||||
protected YamlExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
this(configName, removeUnused, (PluginLike) plugin, source, subDirectoryPath, updateBlacklist);
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable yaml config that exists within a plugin jar.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.YAML));
|
||||
}
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
this(configName, (PluginLike) plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.StringReader;
|
||||
|
||||
/**
|
||||
* Config implementation for passing YamlConfigurations.
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public class YamlTransientConfig extends YamlConfigWrapper {
|
||||
/**
|
||||
* @param config The YamlConfiguration handle.
|
||||
*/
|
||||
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param contents The contents of the config.
|
||||
*/
|
||||
public YamlTransientConfig(@NotNull final String contents) {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(contents, ConfigType.YAML));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty transient config.
|
||||
*/
|
||||
public YamlTransientConfig() {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration(new StringReader(""))));
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable yaml config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected LoadableYamlConfigWrapper(@NotNull final Config handle) {
|
||||
super(handle);
|
||||
|
||||
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void createFile() {
|
||||
((LoadableConfig) this.getHandle()).createFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourcePath() {
|
||||
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() throws IOException {
|
||||
((LoadableConfig) this.getHandle()).save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getConfigFile() {
|
||||
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return ((LoadableConfig) this.getHandle()).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||
return ((LoadableConfig) this.getHandle()).getBukkitHandle();
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
package com.willfp.eco.core.config.yaml.wrapper;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.interfaces.WrappedYamlConfiguration;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend yaml config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
*
|
||||
* @param handle The handle.
|
||||
*/
|
||||
protected YamlConfigWrapper(@NotNull final Config handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfiguration getBukkitHandle() {
|
||||
return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package com.willfp.eco.core.data;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Persistent data container wrapper that allows for full string (non-namespaced) keys.
|
||||
*/
|
||||
public interface ExtendedPersistentDataContainer {
|
||||
/**
|
||||
* Set a key.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param dataType The data type.
|
||||
* @param value The value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
*/
|
||||
<T, Z> void set(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType, @NotNull Z value);
|
||||
|
||||
/**
|
||||
* Get if there is a key.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param dataType The data type.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return If the key is present.
|
||||
*/
|
||||
<T, Z> boolean has(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType);
|
||||
|
||||
/**
|
||||
* Get a value.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param dataType The data type.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The value, or null if not found.
|
||||
*/
|
||||
@Nullable <T, Z> Z get(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType);
|
||||
|
||||
/**
|
||||
* Get a value or default if not present.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param dataType The data type.
|
||||
* @param defaultValue The default value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The value, or the default if not found.
|
||||
*/
|
||||
@NotNull <T, Z> Z getOrDefault(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType, @NotNull Z defaultValue);
|
||||
|
||||
/**
|
||||
* Get all keys, including namespaced keys.
|
||||
*
|
||||
* @return The keys.
|
||||
*/
|
||||
@NotNull
|
||||
Set<String> getAllKeys();
|
||||
|
||||
/**
|
||||
* Remove a key.
|
||||
*
|
||||
* @param key The key.
|
||||
*/
|
||||
void remove(@NotNull String key);
|
||||
|
||||
/**
|
||||
* Get the base PDC.
|
||||
*
|
||||
* @return The base.
|
||||
*/
|
||||
@NotNull
|
||||
PersistentDataContainer getBase();
|
||||
|
||||
/**
|
||||
* Get extension for PersistentDataContainers to add non-namespaced keys.
|
||||
*
|
||||
* @param base The base container.
|
||||
* @return The extended container.
|
||||
*/
|
||||
static ExtendedPersistentDataContainer extend(@NotNull PersistentDataContainer base) {
|
||||
return Eco.get().adaptPdc(base);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new extended container.
|
||||
*
|
||||
* @return The extended container.
|
||||
*/
|
||||
static ExtendedPersistentDataContainer create() {
|
||||
return extend(Eco.get().newPdc());
|
||||
}
|
||||
}
|
||||
@@ -31,6 +31,6 @@ public interface PlayerProfile extends Profile {
|
||||
*/
|
||||
@NotNull
|
||||
static PlayerProfile load(@NotNull final UUID uuid) {
|
||||
return Eco.getHandler().getProfileHandler().load(uuid);
|
||||
return Eco.get().loadPlayerProfile(uuid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
package com.willfp.eco.core.data;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* API to handle profiles.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface ProfileHandler {
|
||||
/**
|
||||
* Load a player profile.
|
||||
*
|
||||
* @param uuid The UUID.
|
||||
* @return The profile.
|
||||
*/
|
||||
PlayerProfile load(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Load the server profile.
|
||||
*
|
||||
* @return The profile.
|
||||
*/
|
||||
ServerProfile loadServerProfile();
|
||||
|
||||
/**
|
||||
* Unload a player profile from memory.
|
||||
* <p>
|
||||
* This will not save the profile first.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
*/
|
||||
void unloadPlayer(@NotNull UUID uuid);
|
||||
|
||||
/**
|
||||
* Save a player profile.
|
||||
* <p>
|
||||
* Can run async if using MySQL.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
* @deprecated Saving changes is faster and should be used. Saving a player manually is not recommended.
|
||||
*/
|
||||
@Deprecated
|
||||
default void savePlayer(@NotNull UUID uuid) {
|
||||
this.saveKeysFor(uuid, PersistentDataKey.values());
|
||||
}
|
||||
|
||||
/**
|
||||
* Save keys for a player.
|
||||
* <p>
|
||||
* Can run async if using MySQL.
|
||||
*
|
||||
* @param uuid The uuid.
|
||||
* @param keys The keys.
|
||||
*/
|
||||
void saveKeysFor(@NotNull UUID uuid,
|
||||
@NotNull Set<PersistentDataKey<?>> keys);
|
||||
|
||||
/**
|
||||
* Save all player data.
|
||||
*
|
||||
* @param async If the saving should be done asynchronously.
|
||||
* @deprecated async is now handled automatically depending on implementation.
|
||||
*/
|
||||
@Deprecated
|
||||
default void saveAll(boolean async) {
|
||||
saveAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save all player data.
|
||||
* <p>
|
||||
* Can run async if using MySQL.
|
||||
*/
|
||||
void saveAll();
|
||||
|
||||
/**
|
||||
* Commit all changes to the file.
|
||||
* <p>
|
||||
* Does nothing if using MySQL.
|
||||
*/
|
||||
void save();
|
||||
}
|
||||
@@ -16,6 +16,6 @@ public interface ServerProfile extends Profile {
|
||||
*/
|
||||
@NotNull
|
||||
static ServerProfile load() {
|
||||
return Eco.getHandler().getProfileHandler().loadServerProfile();
|
||||
return Eco.get().getServerProfile();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* API to register persistent data keys.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface KeyRegistry {
|
||||
/**
|
||||
* Register a persistent data key to be stored.
|
||||
*
|
||||
* @param key The key.
|
||||
*/
|
||||
void registerKey(@NotNull PersistentDataKey<?> key);
|
||||
|
||||
/**
|
||||
* Get all registered keys.
|
||||
*
|
||||
* @return The keys.
|
||||
*/
|
||||
Set<PersistentDataKey<?>> getRegisteredKeys();
|
||||
|
||||
/**
|
||||
* Mark key as category.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param category The category.
|
||||
*/
|
||||
void markKeyAs(@NotNull PersistentDataKey<?> key,
|
||||
@NotNull KeyRegistry.KeyCategory category);
|
||||
|
||||
/**
|
||||
* Get persistent data key from namespaced key.
|
||||
*
|
||||
* @param namespacedKey The key.
|
||||
* @return The key, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
PersistentDataKey<?> getKeyFrom(@NotNull NamespacedKey namespacedKey);
|
||||
|
||||
/**
|
||||
* Locations for key categorization.
|
||||
*/
|
||||
enum KeyCategory {
|
||||
/**
|
||||
* Player keys.
|
||||
*/
|
||||
PLAYER,
|
||||
|
||||
/**
|
||||
* Server keys.
|
||||
*/
|
||||
SERVER
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ public final class PersistentDataKey<T> {
|
||||
this.defaultValue = defaultValue;
|
||||
this.type = type;
|
||||
|
||||
Eco.getHandler().getKeyRegistry().registerKey(this);
|
||||
Eco.get().registerPersistentKey(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -83,28 +83,40 @@ public final class PersistentDataKey<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* In older eco versions, keys would have to be categorized in order
|
||||
* to register the columns in the MySQL database. This is no longer needed.
|
||||
* <p>
|
||||
* Old description is below:
|
||||
* <p>
|
||||
* Categorize key as a server key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
||||
*/
|
||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
||||
public PersistentDataKey<T> server() {
|
||||
Eco.getHandler().getKeyRegistry().markKeyAs(this, KeyRegistry.KeyCategory.SERVER);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* In older eco versions, keys would have to be categorized in order
|
||||
* to register the columns in the MySQL database. This is no longer needed.
|
||||
* <p>
|
||||
* Old description is below:
|
||||
* <p>
|
||||
* Categorize key as a player key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
||||
*/
|
||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
||||
public PersistentDataKey<T> player() {
|
||||
Eco.getHandler().getKeyRegistry().markKeyAs(this, KeyRegistry.KeyCategory.PLAYER);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -114,7 +126,7 @@ public final class PersistentDataKey<T> {
|
||||
* @return The keys.
|
||||
*/
|
||||
public static Set<PersistentDataKey<?>> values() {
|
||||
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
|
||||
return Eco.get().getRegisteredPersistentDataKeys();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* All storable data key types.
|
||||
@@ -37,6 +39,16 @@ public final class PersistentDataKeyType<T> {
|
||||
*/
|
||||
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>(Double.class, "DOUBLE");
|
||||
|
||||
/**
|
||||
* String List.
|
||||
*/
|
||||
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>(null, "STRING_LIST");
|
||||
|
||||
/**
|
||||
* Config.
|
||||
*/
|
||||
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>(Config.class, "CONFIG");
|
||||
|
||||
/**
|
||||
* The class of the type.
|
||||
*/
|
||||
@@ -51,7 +63,10 @@ public final class PersistentDataKeyType<T> {
|
||||
* Get the class of the type.
|
||||
*
|
||||
* @return The class.
|
||||
* @deprecated String list type will return null.
|
||||
*/
|
||||
@Deprecated(since = "6.36.0", forRemoval = true)
|
||||
@Nullable
|
||||
public Class<T> getTypeClass() {
|
||||
return typeClass;
|
||||
}
|
||||
@@ -71,7 +86,7 @@ public final class PersistentDataKeyType<T> {
|
||||
* @param typeClass The type class.
|
||||
* @param name The name.
|
||||
*/
|
||||
private PersistentDataKeyType(@NotNull final Class<T> typeClass,
|
||||
private PersistentDataKeyType(@Nullable final Class<T> typeClass,
|
||||
@NotNull final String name) {
|
||||
VALUES.add(this);
|
||||
|
||||
@@ -79,6 +94,22 @@ public final class PersistentDataKeyType<T> {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable final Object that) {
|
||||
if (this == that) {
|
||||
return true;
|
||||
}
|
||||
if (!(that instanceof PersistentDataKeyType type)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.name, type.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all registered {@link PersistentDataKeyType}s.
|
||||
*
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* Utility class to manage client-side item display.
|
||||
*/
|
||||
@@ -16,9 +27,14 @@ public final class Display {
|
||||
public static final String PREFIX = "§z";
|
||||
|
||||
/**
|
||||
* The display handler.
|
||||
* All registered modules.
|
||||
*/
|
||||
private static DisplayHandler handler = null;
|
||||
private static final Map<Integer, List<DisplayModule>> REGISTERED_MODULES = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* The finalize key.
|
||||
*/
|
||||
private static final NamespacedKey FINALIZE_KEY = NamespacedKeyUtils.createEcoKey("finalized");
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
@@ -39,7 +55,49 @@ public final class Display {
|
||||
*/
|
||||
public static ItemStack display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
return handler.display(itemStack, player);
|
||||
Map<String, Object[]> pluginVarArgs = new HashMap<>();
|
||||
|
||||
for (List<DisplayModule> modules : REGISTERED_MODULES.values()) {
|
||||
for (DisplayModule module : modules) {
|
||||
pluginVarArgs.put(module.getPluginName(), module.generateVarArgs(itemStack));
|
||||
}
|
||||
}
|
||||
|
||||
Display.revert(itemStack);
|
||||
|
||||
if (!itemStack.hasItemMeta()) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
ItemStack original = itemStack.clone();
|
||||
Inventory inventory = player == null ? null : player.getOpenInventory().getTopInventory();
|
||||
boolean inInventory = inventory != null && inventory.contains(original);
|
||||
boolean inGui = inventory != null && inventory.getHolder() == null;
|
||||
|
||||
DisplayProperties properties = new DisplayProperties(
|
||||
inInventory,
|
||||
inGui,
|
||||
original
|
||||
);
|
||||
|
||||
for (List<DisplayModule> modules : REGISTERED_MODULES.values()) {
|
||||
for (DisplayModule module : modules) {
|
||||
Object[] varargs = pluginVarArgs.get(module.getPluginName());
|
||||
|
||||
if (varargs == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
module.display(itemStack, varargs);
|
||||
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, varargs);
|
||||
module.display(itemStack, player, properties, varargs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -71,7 +129,25 @@ public final class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public static ItemStack revert(@NotNull final ItemStack itemStack) {
|
||||
return handler.revert(itemStack);
|
||||
if (Display.isFinalized(itemStack)) {
|
||||
Display.unfinalize(itemStack);
|
||||
}
|
||||
|
||||
FastItemStack fast = FastItemStack.wrap(itemStack);
|
||||
|
||||
List<String> lore = fast.getLore();
|
||||
|
||||
if (!lore.isEmpty() && lore.removeIf(line -> line.startsWith(Display.PREFIX))) {
|
||||
fast.setLore(lore);
|
||||
}
|
||||
|
||||
for (List<DisplayModule> modules : REGISTERED_MODULES.values()) {
|
||||
for (DisplayModule module : modules) {
|
||||
module.revert(itemStack);
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,7 +157,15 @@ public final class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public static ItemStack finalize(@NotNull final ItemStack itemStack) {
|
||||
return handler.finalize(itemStack);
|
||||
if (itemStack.getType().getMaxStackSize() > 1) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
FastItemStack.wrap(itemStack)
|
||||
.getPersistentDataContainer()
|
||||
.set(FINALIZE_KEY, PersistentDataType.INTEGER, 1);
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -91,7 +175,11 @@ public final class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public static ItemStack unfinalize(@NotNull final ItemStack itemStack) {
|
||||
return handler.unfinalize(itemStack);
|
||||
FastItemStack.wrap(itemStack)
|
||||
.getPersistentDataContainer()
|
||||
.remove(FINALIZE_KEY);
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -101,7 +189,9 @@ public final class Display {
|
||||
* @return If finalized.
|
||||
*/
|
||||
public static boolean isFinalized(@NotNull final ItemStack itemStack) {
|
||||
return handler.isFinalized(itemStack);
|
||||
return FastItemStack.wrap(itemStack)
|
||||
.getPersistentDataContainer()
|
||||
.has(FINALIZE_KEY, PersistentDataType.INTEGER);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -110,69 +200,15 @@ public final class Display {
|
||||
* @param module The module.
|
||||
*/
|
||||
public static void registerDisplayModule(@NotNull final DisplayModule module) {
|
||||
handler.registerDisplayModule(module);
|
||||
}
|
||||
List<DisplayModule> modules = REGISTERED_MODULES.getOrDefault(
|
||||
module.getWeight(),
|
||||
new ArrayList<>()
|
||||
);
|
||||
|
||||
/**
|
||||
* Initialize the display system.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void init(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalArgumentException("Already Initialized!");
|
||||
}
|
||||
Display.handler = handler;
|
||||
}
|
||||
modules.removeIf(it -> it.getPluginName().equalsIgnoreCase(module.getPluginName()));
|
||||
modules.add(module);
|
||||
|
||||
/**
|
||||
* Extremely janky method - also internal, so don't use it. <b>This method is
|
||||
* NOT part of the API and may be removed at any time!</b>
|
||||
* <p>
|
||||
* This calls a display module with the specified parameters, now
|
||||
* you might ask why I need a static java method when the DisplayHandler
|
||||
* implementation could just call it itself? Well, kotlin doesn't really
|
||||
* like dealing with vararg ambiguity, and so while kotlin can't figure out
|
||||
* what is and isn't a vararg when I call display with a player, java can.
|
||||
* <p>
|
||||
* Because of this, I need to have this part of the code in java.
|
||||
*
|
||||
* <b>Don't call this method as part of your plugins!</b>
|
||||
* <p>
|
||||
* No, seriously - don't. This skips a bunch of checks and you'll almost
|
||||
* definitely break something.
|
||||
*
|
||||
* @param module The display module.
|
||||
* @param itemStack The ItemStack.
|
||||
* @param player The player.
|
||||
* @param args The args.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void callDisplayModule(@NotNull final DisplayModule module,
|
||||
@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
module.display(itemStack, args);
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the display handler.
|
||||
* <p>
|
||||
* Internal API component, you will cause bugs if you create your own handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void setHandler(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalStateException("Display already initialized!");
|
||||
}
|
||||
|
||||
Display.handler = handler;
|
||||
REGISTERED_MODULES.put(module.getWeight(), modules);
|
||||
}
|
||||
|
||||
private Display() {
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Interface for display implementations.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface DisplayHandler {
|
||||
/**
|
||||
* Register display module.
|
||||
*
|
||||
* @param module The module.
|
||||
*/
|
||||
void registerDisplayModule(@NotNull DisplayModule module);
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack display(@NotNull ItemStack itemStack,
|
||||
@Nullable Player player);
|
||||
|
||||
/**
|
||||
* Revert on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack revert(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Finalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack finalize(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Unfinalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack unfinalize(@NotNull ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* If an item is finalized.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return If finalized.
|
||||
*/
|
||||
boolean isFinalized(@NotNull ItemStack itemStack);
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -10,11 +9,16 @@ import org.jetbrains.annotations.Nullable;
|
||||
/**
|
||||
* Class for all plugin-specific client-side item display modules.
|
||||
*/
|
||||
public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
public abstract class DisplayModule {
|
||||
/**
|
||||
* The priority of the module.
|
||||
*/
|
||||
private final DisplayPriority priority;
|
||||
private final int weight;
|
||||
|
||||
/**
|
||||
* The plugin.
|
||||
*/
|
||||
private final EcoPlugin plugin;
|
||||
|
||||
/**
|
||||
* Create a new display module.
|
||||
@@ -24,8 +28,19 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
*/
|
||||
protected DisplayModule(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final DisplayPriority priority) {
|
||||
super(plugin);
|
||||
this.priority = priority;
|
||||
this(plugin, priority.getWeight());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new display module.
|
||||
*
|
||||
* @param plugin The plugin that the display is for.
|
||||
* @param weight The weight/priority of the module.
|
||||
*/
|
||||
protected DisplayModule(@NotNull final EcoPlugin plugin,
|
||||
final int weight) {
|
||||
this.plugin = plugin;
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -52,6 +67,21 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
/**
|
||||
* Display an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @param properties The properties.
|
||||
* @param args Optional args for display.
|
||||
*/
|
||||
public void display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final DisplayProperties properties,
|
||||
@NotNull final Object... args) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
/**
|
||||
* Revert an item.
|
||||
*
|
||||
@@ -77,15 +107,41 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
* @return The plugin name.
|
||||
*/
|
||||
public final String getPluginName() {
|
||||
return super.getPlugin().getName();
|
||||
return this.getPlugin().getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display priority.
|
||||
*
|
||||
* @return The priority.
|
||||
* @deprecated Use getWeight instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public DisplayPriority getPriority() {
|
||||
return this.priority;
|
||||
return switch (this.weight) {
|
||||
case 100 -> DisplayPriority.LOWEST;
|
||||
case 200 -> DisplayPriority.LOW;
|
||||
case 300 -> DisplayPriority.HIGH;
|
||||
case 400 -> DisplayPriority.HIGHEST;
|
||||
default -> DisplayPriority.CUSTOM;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display weight.
|
||||
*
|
||||
* @return The weight.
|
||||
*/
|
||||
public int getWeight() {
|
||||
return this.weight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
public EcoPlugin getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,23 +4,51 @@ package com.willfp.eco.core.display;
|
||||
* The priority (order) of display modules.
|
||||
*/
|
||||
public enum DisplayPriority {
|
||||
/**
|
||||
* Custom weight.
|
||||
*/
|
||||
CUSTOM(250),
|
||||
|
||||
/**
|
||||
* Ran first.
|
||||
*/
|
||||
LOWEST,
|
||||
LOWEST(100),
|
||||
|
||||
/**
|
||||
* Ran second.
|
||||
*/
|
||||
LOW,
|
||||
LOW(200),
|
||||
|
||||
/**
|
||||
* Ran third.
|
||||
*/
|
||||
HIGH,
|
||||
HIGH(300),
|
||||
|
||||
/**
|
||||
* Ran last.
|
||||
*/
|
||||
HIGHEST
|
||||
HIGHEST(400);
|
||||
|
||||
/**
|
||||
* The display priority weight.
|
||||
*/
|
||||
private final int weight;
|
||||
|
||||
/**
|
||||
* Create new display priority.
|
||||
*
|
||||
* @param weight The weight.
|
||||
*/
|
||||
DisplayPriority(final int weight) {
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the weight.
|
||||
*
|
||||
* @return The weight.
|
||||
*/
|
||||
public int getWeight() {
|
||||
return weight;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Extra properties passed into {@link DisplayModule}.
|
||||
*
|
||||
* @param inInventory If the item was in an inventory.
|
||||
* @param inGui If the item is assumed to be in a gui. (Not perfectly accurate).
|
||||
* @param originalItem The original item, not to be modified.
|
||||
*/
|
||||
public record DisplayProperties(
|
||||
boolean inInventory,
|
||||
boolean inGui,
|
||||
@NotNull ItemStack originalItem
|
||||
) {
|
||||
}
|
||||
@@ -21,13 +21,25 @@ public class DropQueue {
|
||||
/**
|
||||
* The internally used {@link DropQueue}.
|
||||
*/
|
||||
private final InternalDropQueue handle;
|
||||
private final DropQueue delegate;
|
||||
|
||||
/**
|
||||
* Create a new DropQueue.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
public DropQueue(@NotNull final Player player) {
|
||||
handle = Eco.getHandler().getDropQueueFactory().create(player);
|
||||
this.delegate = Eco.get().createDropQueue(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new DropQueue with no delegate.
|
||||
* <p>
|
||||
* Call this constructor if you're creating custom DropQueue
|
||||
* implementations.
|
||||
*/
|
||||
protected DropQueue() {
|
||||
this.delegate = null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -37,7 +49,11 @@ public class DropQueue {
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
public DropQueue addItem(@NotNull final ItemStack item) {
|
||||
handle.addItem(item);
|
||||
if (delegate == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
delegate.addItem(item);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -48,7 +64,11 @@ public class DropQueue {
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
public DropQueue addItems(@NotNull final Collection<ItemStack> itemStacks) {
|
||||
handle.addItems(itemStacks);
|
||||
if (delegate == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
delegate.addItems(itemStacks);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -59,7 +79,11 @@ public class DropQueue {
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
public DropQueue addXP(final int amount) {
|
||||
handle.addXP(amount);
|
||||
if (delegate == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
delegate.addXP(amount);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -70,7 +94,11 @@ public class DropQueue {
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
public DropQueue setLocation(@NotNull final Location location) {
|
||||
handle.setLocation(location);
|
||||
if (delegate == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
delegate.setLocation(location);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -80,7 +108,11 @@ public class DropQueue {
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
public DropQueue forceTelekinesis() {
|
||||
handle.forceTelekinesis();
|
||||
if (delegate == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
delegate.forceTelekinesis();
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -88,6 +120,10 @@ public class DropQueue {
|
||||
* Push the queue.
|
||||
*/
|
||||
public void push() {
|
||||
handle.push();
|
||||
if (delegate == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
delegate.push();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.willfp.eco.core.drops;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Internal component to create backend DropQueue implementations.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface DropQueueFactory {
|
||||
/**
|
||||
* Create a DropQueue.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The Queue.
|
||||
*/
|
||||
InternalDropQueue create(@NotNull Player player);
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
package com.willfp.eco.core.drops;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Internal interface for backend DropQueue implementations.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface InternalDropQueue {
|
||||
/**
|
||||
* Add item to queue.
|
||||
*
|
||||
* @param item The item to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
InternalDropQueue addItem(@NotNull ItemStack item);
|
||||
|
||||
/**
|
||||
* Add multiple items to queue.
|
||||
*
|
||||
* @param itemStacks The items to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
InternalDropQueue addItems(@NotNull Collection<ItemStack> itemStacks);
|
||||
|
||||
/**
|
||||
* Add xp to queue.
|
||||
*
|
||||
* @param amount The amount to add.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
InternalDropQueue addXP(int amount);
|
||||
|
||||
/**
|
||||
* Set location of the origin of the drops.
|
||||
*
|
||||
* @param location The location.
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
InternalDropQueue setLocation(@NotNull Location location);
|
||||
|
||||
/**
|
||||
* Force the queue to act as if player is telekinetic.
|
||||
*
|
||||
* @return The DropQueue.
|
||||
*/
|
||||
InternalDropQueue forceTelekinesis();
|
||||
|
||||
/**
|
||||
* Push the queue.
|
||||
*/
|
||||
void push();
|
||||
}
|
||||
@@ -101,6 +101,6 @@ public interface EntityController<T extends Mob> {
|
||||
* @return The entity controller.
|
||||
*/
|
||||
static <T extends Mob> EntityController<T> getFor(@NotNull final T entity) {
|
||||
return Eco.getHandler().createEntityController(entity);
|
||||
return Eco.get().createEntityController(entity);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,6 @@ public class EmptyTestableEntity implements TestableEntity {
|
||||
public Entity spawn(@NotNull final Location location) {
|
||||
Validate.notNull(location.getWorld());
|
||||
|
||||
return Eco.getHandler().createDummyEntity(location);
|
||||
return Eco.get().createDummyEntity(location);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.willfp.eco.core.extensions;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Internal component to manage loading and unloading extensions.
|
||||
* Manages the loading and unloading of extensions for a particular plugin.
|
||||
*/
|
||||
public interface ExtensionLoader {
|
||||
/**
|
||||
|
||||
@@ -13,5 +13,6 @@ public interface NamespacedKeyFactory {
|
||||
* @param key The key in the {@link NamespacedKey}.
|
||||
* @return The created {@link NamespacedKey}.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKey create(@NotNull String key);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package com.willfp.eco.core.fast;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataHolder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -16,7 +19,7 @@ import java.util.Set;
|
||||
/**
|
||||
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
||||
*/
|
||||
public interface FastItemStack {
|
||||
public interface FastItemStack extends PersistentDataHolder {
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
*
|
||||
@@ -24,7 +27,7 @@ public interface FastItemStack {
|
||||
* @return A map of all enchantments.
|
||||
* @deprecated Poorly named method. Use getEnchants instead.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0")
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
default Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored) {
|
||||
return getEnchants(checkStored);
|
||||
}
|
||||
@@ -45,17 +48,55 @@ public interface FastItemStack {
|
||||
* @param checkStored If stored enchantments should be accounted for.
|
||||
* @return A map of all enchantments.
|
||||
*/
|
||||
@NotNull
|
||||
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
||||
*/
|
||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
||||
default int getLevelOnItem(@NotNull Enchantment enchantment) {
|
||||
return getEnchantmentLevel(enchantment, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @param checkStored If the stored NBT should also be checked.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
||||
*/
|
||||
int getLevelOnItem(@NotNull Enchantment enchantment,
|
||||
boolean checkStored);
|
||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
default int getLevelOnItem(@NotNull Enchantment enchantment,
|
||||
boolean checkStored) {
|
||||
return getEnchantmentLevel(enchantment, checkStored);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
*/
|
||||
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
||||
return getLevelOnItem(enchantment, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @param checkStored If the stored NBT should also be checked.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
*/
|
||||
int getEnchantmentLevel(@NotNull Enchantment enchantment,
|
||||
boolean checkStored);
|
||||
|
||||
/**
|
||||
* Set the item lore.
|
||||
@@ -64,6 +105,13 @@ public interface FastItemStack {
|
||||
*/
|
||||
void setLore(@Nullable List<String> lore);
|
||||
|
||||
/**
|
||||
* Set the item lore.
|
||||
*
|
||||
* @param lore The lore.
|
||||
*/
|
||||
void setLoreComponents(@Nullable List<Component> lore);
|
||||
|
||||
/**
|
||||
* Get the item lore.
|
||||
*
|
||||
@@ -71,6 +119,40 @@ public interface FastItemStack {
|
||||
*/
|
||||
List<String> getLore();
|
||||
|
||||
/**
|
||||
* Get the item lore.
|
||||
*
|
||||
* @return The lore.
|
||||
*/
|
||||
List<Component> getLoreComponents();
|
||||
|
||||
/**
|
||||
* Set the item name.
|
||||
*
|
||||
* @param name The name.
|
||||
*/
|
||||
void setDisplayName(@Nullable Component name);
|
||||
|
||||
/**
|
||||
* Set the item name.
|
||||
*
|
||||
* @param name The name.
|
||||
*/
|
||||
void setDisplayName(@Nullable String name);
|
||||
|
||||
/**
|
||||
* Get the item display name.
|
||||
*
|
||||
* @return The display name.
|
||||
*/
|
||||
Component getDisplayNameComponent();
|
||||
|
||||
/**
|
||||
* Get the item display name.
|
||||
*
|
||||
* @return The display name.
|
||||
*/
|
||||
String getDisplayName();
|
||||
|
||||
/**
|
||||
* Set the rework penalty.
|
||||
@@ -81,7 +163,6 @@ public interface FastItemStack {
|
||||
|
||||
/**
|
||||
* Get the rework penalty.
|
||||
* .
|
||||
*
|
||||
* @return The rework penalty found on the item.
|
||||
*/
|
||||
@@ -116,11 +197,72 @@ public interface FastItemStack {
|
||||
*/
|
||||
boolean hasItemFlag(@NotNull ItemFlag flag);
|
||||
|
||||
/**
|
||||
* Get the base NBT tag (Not PublicBukkitValues, the base) as a PersistentDataContainer.
|
||||
* <p>
|
||||
* The returned PersistentDataContainer will not modify the item until the tag is set.
|
||||
*
|
||||
* @return The base NBT tag.
|
||||
*/
|
||||
PersistentDataContainer getBaseTag();
|
||||
|
||||
/**
|
||||
* Set the base NBT tag (Not PublicBukkitValues, the base) from a PersistentDataContainer.
|
||||
*
|
||||
* @param container The PersistentDataContainer.
|
||||
*/
|
||||
void setBaseTag(@Nullable PersistentDataContainer container);
|
||||
|
||||
/**
|
||||
* Get the type of the item.
|
||||
*
|
||||
* @return The type.
|
||||
*/
|
||||
@NotNull
|
||||
Material getType();
|
||||
|
||||
/**
|
||||
* Set the type of the item.
|
||||
*
|
||||
* @param material The type.
|
||||
*/
|
||||
void setType(@NotNull Material material);
|
||||
|
||||
/**
|
||||
* Get the amount of the item.
|
||||
*
|
||||
* @return The amount.
|
||||
*/
|
||||
int getAmount();
|
||||
|
||||
/**
|
||||
* Set the amount of the item.
|
||||
*
|
||||
* @param amount The amount.
|
||||
*/
|
||||
void setAmount(int amount);
|
||||
|
||||
/**
|
||||
* Get the custom model data.
|
||||
*
|
||||
* @return The data, or null if none.
|
||||
*/
|
||||
@Nullable
|
||||
Integer getCustomModelData();
|
||||
|
||||
/**
|
||||
* Set the custom model data.
|
||||
*
|
||||
* @param data The data, null to remove.
|
||||
*/
|
||||
void setCustomModelData(@Nullable Integer data);
|
||||
|
||||
/**
|
||||
* Get the Bukkit ItemStack again.
|
||||
*
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
@NotNull
|
||||
ItemStack unwrap();
|
||||
|
||||
/**
|
||||
@@ -130,6 +272,6 @@ public interface FastItemStack {
|
||||
* @return The FastItemStack.
|
||||
*/
|
||||
static FastItemStack wrap(@Nullable final ItemStack itemStack) {
|
||||
return Eco.getHandler().createFastItemStack(Objects.requireNonNullElseGet(itemStack, () -> new ItemStack(Material.AIR)));
|
||||
return Eco.get().createFastItemStack(Objects.requireNonNullElseGet(itemStack, () -> new ItemStack(Material.AIR)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package com.willfp.eco.core.gui;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* A GUI Component is a 2-dimensional set of slots that can be
|
||||
* placed in a menu.
|
||||
*/
|
||||
public interface GUIComponent {
|
||||
/**
|
||||
* Get the amount of rows in the component.
|
||||
*
|
||||
* @return The rows.
|
||||
*/
|
||||
int getRows();
|
||||
|
||||
/**
|
||||
* Get the amount of columns in the component.
|
||||
*
|
||||
* @return The columns.
|
||||
*/
|
||||
int getColumns();
|
||||
|
||||
/**
|
||||
* Initialize the component.
|
||||
* <p>
|
||||
* This is called before getRows / getColumns is queried,
|
||||
* and allows for dynamically sized components.
|
||||
* <p>
|
||||
* getRows and getColumns can return values bigger than this,
|
||||
* it will simply prevent the component from being added at
|
||||
* this position (for minimum-sized components).
|
||||
*
|
||||
* @param maxRows The maximum number of rows.
|
||||
* @param maxColumns The maximum number of columns.
|
||||
*/
|
||||
default void init(final int maxRows,
|
||||
final int maxColumns) {
|
||||
// Most components will not require initialization.
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the slot at a certain position in the component.
|
||||
* <p>
|
||||
* It's safe to assume to the row and column will always be in bounds.
|
||||
*
|
||||
* @param row The row (1-indexed).
|
||||
* @param column The column (1-indexed).
|
||||
* @return The slot, or null if no slot at the location.
|
||||
*/
|
||||
@Nullable
|
||||
default Slot getSlotAt(final int row,
|
||||
final int column) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the slot at a certain position in the component.
|
||||
* <p>
|
||||
* If your component doesn't use context data (player, menu),
|
||||
* then it will default to the raw slot.
|
||||
* <p>
|
||||
* It's safe to assume to the row and column will always be in bounds.
|
||||
*
|
||||
* @param row The row (1-indexed).
|
||||
* @param column The column (1-indexed).
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @return The slot, or null if no slot at the location.
|
||||
*/
|
||||
@Nullable
|
||||
default Slot getSlotAt(final int row,
|
||||
final int column,
|
||||
@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return getSlotAt(row, column);
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
package com.willfp.eco.core.gui;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder;
|
||||
import com.willfp.eco.core.gui.slot.SlotBuilder;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Internal component used by {@link com.willfp.eco.core.gui.menu.Menu#builder(int)}
|
||||
* and {@link com.willfp.eco.core.gui.slot.Slot#builder(ItemStack)}.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface GUIFactory {
|
||||
/**
|
||||
* Create slot builder.
|
||||
*
|
||||
* @param provider The provider.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder createSlotBuilder(@NotNull SlotProvider provider);
|
||||
|
||||
/**
|
||||
* Create menu builder.
|
||||
*
|
||||
* @param rows The amount of rows.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder createMenuBuilder(int rows);
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.page.Page;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
@@ -11,7 +13,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* GUI version of {@link Inventory}.
|
||||
@@ -27,7 +32,19 @@ public interface Menu {
|
||||
int getRows();
|
||||
|
||||
/**
|
||||
* Get slot at given row and column.
|
||||
* Get the amount of columns.
|
||||
*
|
||||
* @return The amount of columns.
|
||||
*/
|
||||
default int getColumns() {
|
||||
return 9;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a static slot at a given row and column.
|
||||
* <p>
|
||||
* If the slot at the location is reactive, this will return
|
||||
* an empty slot.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
@@ -36,6 +53,24 @@ public interface Menu {
|
||||
Slot getSlot(int row,
|
||||
int column);
|
||||
|
||||
/**
|
||||
* Get a slot at a given row and column.
|
||||
* <p>
|
||||
* Defaults to static slot if no reactive slot exists.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @param player The player
|
||||
* @param menu The menu.
|
||||
* @return The slot.
|
||||
*/
|
||||
default Slot getSlot(int row,
|
||||
int column,
|
||||
@NotNull Player player,
|
||||
@NotNull Menu menu) {
|
||||
return this.getSlot(row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the menu title.
|
||||
*
|
||||
@@ -59,6 +94,117 @@ public interface Menu {
|
||||
*/
|
||||
List<ItemStack> getCaptiveItems(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Get a captive item at a specific position.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @return The captive item.
|
||||
*/
|
||||
@Nullable
|
||||
default ItemStack getCaptiveItem(@NotNull final Player player,
|
||||
final int row,
|
||||
final int column) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add state for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param value The state.
|
||||
*/
|
||||
void addState(@NotNull Player player,
|
||||
@NotNull String key,
|
||||
@Nullable Object value);
|
||||
|
||||
/**
|
||||
* Remove state for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
*/
|
||||
void removeState(@NotNull Player player,
|
||||
@NotNull String key);
|
||||
|
||||
/**
|
||||
* Clear state for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
void clearState(@NotNull Player player);
|
||||
|
||||
|
||||
/**
|
||||
* Get state for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param <T> The type of state.
|
||||
* @return The value.
|
||||
*/
|
||||
@Nullable <T> T getState(@NotNull Player player,
|
||||
@NotNull String key);
|
||||
|
||||
/**
|
||||
* Get state for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The state.
|
||||
*/
|
||||
Map<String, Object> getState(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Re-render the menu for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
void refresh(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* If the menu allows changing the held item.
|
||||
*
|
||||
* @return If allowed.
|
||||
*/
|
||||
default boolean allowsChangingHeldItem() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a menu event.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menuEvent The event.
|
||||
*/
|
||||
default void callEvent(@NotNull final Player player,
|
||||
@NotNull final MenuEvent menuEvent) {
|
||||
// Override when needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current page a player is on.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The page.
|
||||
*/
|
||||
default int getPage(@NotNull final Player player) {
|
||||
Integer pageState = this.getState(player, Page.PAGE_KEY);
|
||||
return Objects.requireNonNullElse(pageState, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the max page for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The page.
|
||||
*/
|
||||
default int getMaxPage(@NotNull final Player player) {
|
||||
Integer pageState = this.getState(player, Page.MAX_PAGE_KEY);
|
||||
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data.
|
||||
*
|
||||
@@ -68,11 +214,15 @@ public interface Menu {
|
||||
* @param value The value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @deprecated Use addState instead.
|
||||
*/
|
||||
<T, Z> void writeData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type,
|
||||
@NotNull Z value);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default <T, Z> void writeData(@NotNull final Player player,
|
||||
@NotNull final NamespacedKey key,
|
||||
@NotNull final PersistentDataType<T, Z> type,
|
||||
@NotNull final Z value) {
|
||||
this.addState(player, key.toString(), value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read data.
|
||||
@@ -83,25 +233,29 @@ public interface Menu {
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The data.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
@Nullable <T, Z> T readData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default @Nullable <T, Z> T readData(@NotNull final Player player,
|
||||
@NotNull final NamespacedKey key,
|
||||
@NotNull final PersistentDataType<T, Z> type) {
|
||||
return this.getState(player, key.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all data keys for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The keys.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
Set<NamespacedKey> getKeys(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Re-render the menu for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
void refresh(@NotNull Player player);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default Set<NamespacedKey> getKeys(@NotNull final Player player) {
|
||||
return this.getState(player).keySet().stream()
|
||||
.map(NamespacedKeyUtils::fromStringOrNull)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder with a given amount of rows.
|
||||
@@ -110,6 +264,19 @@ public interface Menu {
|
||||
* @return The builder.
|
||||
*/
|
||||
static MenuBuilder builder(final int rows) {
|
||||
return Eco.getHandler().getGUIFactory().createMenuBuilder(rows);
|
||||
return Eco.get().createMenuBuilder(
|
||||
rows,
|
||||
MenuType.NORMAL
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder with a given type.
|
||||
*
|
||||
* @param type The menu type.
|
||||
* @return The builder.
|
||||
*/
|
||||
static MenuBuilder builder(@NotNull final MenuType type) {
|
||||
return Eco.get().createMenuBuilder(type.getDefaultRows(), type);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.gui.page.Page;
|
||||
import com.willfp.eco.core.gui.page.PageBuilder;
|
||||
import com.willfp.eco.core.gui.slot.FillerMask;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Builder to create menus.
|
||||
*/
|
||||
public interface MenuBuilder {
|
||||
public interface MenuBuilder extends PageBuilder {
|
||||
/**
|
||||
* Set the menu title.
|
||||
*
|
||||
@@ -19,6 +25,15 @@ public interface MenuBuilder {
|
||||
*/
|
||||
MenuBuilder setTitle(@NotNull String title);
|
||||
|
||||
/**
|
||||
* Get the menu title.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
default String getTitle() {
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a slot.
|
||||
*
|
||||
@@ -27,9 +42,44 @@ public interface MenuBuilder {
|
||||
* @param slot The slot.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder setSlot(int row,
|
||||
int column,
|
||||
@NotNull Slot slot);
|
||||
@Override
|
||||
default MenuBuilder setSlot(final int row,
|
||||
final int column,
|
||||
@NotNull final Slot slot) {
|
||||
return this.addComponent(row, column, slot);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a component.
|
||||
*
|
||||
* @param layer The layer.
|
||||
* @param row The row of the top left corner.
|
||||
* @param column The column of the top left corner.
|
||||
* @param component The component.
|
||||
* @return The builder.
|
||||
*/
|
||||
@Override
|
||||
MenuBuilder addComponent(@NotNull MenuLayer layer,
|
||||
int row,
|
||||
int column,
|
||||
@NotNull GUIComponent component);
|
||||
|
||||
|
||||
/**
|
||||
* Add a component.
|
||||
*
|
||||
* @param row The row of the top left corner.
|
||||
* @param column The column of the top left corner.
|
||||
* @param component The component.
|
||||
* @return The builder.
|
||||
*/
|
||||
@Override
|
||||
default MenuBuilder addComponent(final int row,
|
||||
final int column,
|
||||
@NotNull final GUIComponent component) {
|
||||
return this.addComponent(MenuLayer.MIDDLE, row, column, component);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run function to modify the builder.
|
||||
@@ -45,27 +95,106 @@ public interface MenuBuilder {
|
||||
* @param mask The mask.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder setMask(@NotNull FillerMask mask);
|
||||
@Override
|
||||
default MenuBuilder setMask(@NotNull final FillerMask mask) {
|
||||
return this.addComponent(MenuLayer.BACKGROUND, 1, 1, mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
* Add a page.
|
||||
*
|
||||
* @param page The page.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder addPage(@NotNull final Page page) {
|
||||
return this.addComponent(MenuLayer.TOP, 1, 1, page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a page.
|
||||
*
|
||||
* @param pageNumber The page number.
|
||||
* @param builder The page builder.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder addPage(final int pageNumber,
|
||||
@NotNull final PageBuilder builder) {
|
||||
return this.addPage(new Page(pageNumber, ((MenuBuilder) builder).build()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the max pages.
|
||||
*
|
||||
* @param pages The max pages.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder maxPages(final int pages) {
|
||||
return this.maxPages(player -> pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the max pages dynamically for a player.
|
||||
*
|
||||
* @param pages The max pages.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder maxPages(@NotNull final Function<Player, Integer> pages) {
|
||||
return onOpen((player, menu) -> menu.addState(player, Page.MAX_PAGE_KEY, pages.apply(player)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder onClose(@NotNull Consumer<InventoryCloseEvent> action) {
|
||||
onClose((event, menu) -> action.accept(event));
|
||||
return this;
|
||||
default MenuBuilder onClose(@NotNull final Consumer<InventoryCloseEvent> action) {
|
||||
return this.onClose((event, menu) -> action.accept(event));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
* Add a menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onClose(@NotNull CloseHandler action);
|
||||
|
||||
/**
|
||||
* Add a menu open handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onOpen(@NotNull OpenHandler action);
|
||||
|
||||
/**
|
||||
* Add an action to run on render.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onRender(@NotNull BiConsumer<Player, Menu> action);
|
||||
|
||||
/**
|
||||
* Add an action to run on an event.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder onEvent(@NotNull final MenuEventHandler<?> action) {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow the player to change their held item.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
default MenuBuilder allowChangingHeldItem() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the menu.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
/**
|
||||
* Represents an event sent to a menu.
|
||||
*/
|
||||
public interface MenuEvent {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Handles menu events.
|
||||
*/
|
||||
public abstract class MenuEventHandler<T extends MenuEvent> {
|
||||
/**
|
||||
* The class of the event.
|
||||
*/
|
||||
private final Class<T> eventClass;
|
||||
|
||||
/**
|
||||
* Create a new menu event handler.
|
||||
*
|
||||
* @param eventClass The class of event to handle.
|
||||
*/
|
||||
protected MenuEventHandler(@NotNull final Class<T> eventClass) {
|
||||
this.eventClass = eventClass;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @param event The event.
|
||||
*/
|
||||
public abstract void handle(@NotNull Player player,
|
||||
@NotNull Menu menu,
|
||||
@NotNull T event);
|
||||
|
||||
/**
|
||||
* Get if this handler can handle a certain event.
|
||||
*
|
||||
* @param menuEvent The event
|
||||
* @return If the event can be handled.
|
||||
*/
|
||||
public boolean canHandleEvent(@NotNull final MenuEvent menuEvent) {
|
||||
return eventClass.isAssignableFrom(menuEvent.getClass());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
/**
|
||||
* Different layers of the menu.
|
||||
*/
|
||||
public enum MenuLayer {
|
||||
/**
|
||||
* Right at the back.
|
||||
*/
|
||||
BACKGROUND,
|
||||
|
||||
/**
|
||||
* Second from the back.
|
||||
*/
|
||||
LOWER,
|
||||
|
||||
/**
|
||||
* In the middle (default).
|
||||
*/
|
||||
MIDDLE,
|
||||
|
||||
/**
|
||||
* Near the top.
|
||||
*/
|
||||
UPPER,
|
||||
|
||||
/**
|
||||
* At the absolute top.
|
||||
*/
|
||||
TOP
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
/**
|
||||
* The type of menu.
|
||||
*/
|
||||
public enum MenuType {
|
||||
/**
|
||||
* Normal menu (1x9, 2x9, 3x9, etc).
|
||||
*/
|
||||
NORMAL(9, 6),
|
||||
|
||||
/**
|
||||
* Dispenser menu (3x3).
|
||||
*/
|
||||
DISPENSER(3, 3);
|
||||
|
||||
/**
|
||||
* The amount of columns.
|
||||
*/
|
||||
private final int columns;
|
||||
|
||||
/**
|
||||
* The default amount of rows.
|
||||
*/
|
||||
private final int defaultRows;
|
||||
|
||||
/**
|
||||
* Create a new menu type.
|
||||
*
|
||||
* @param columns The number of columns.
|
||||
* @param defaultRows The default number of rows.
|
||||
*/
|
||||
MenuType(final int columns,
|
||||
final int defaultRows) {
|
||||
this.columns = columns;
|
||||
this.defaultRows = defaultRows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of columns.
|
||||
*
|
||||
* @return The columns.
|
||||
*/
|
||||
public int getColumns() {
|
||||
return columns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default amount of rows.
|
||||
*
|
||||
* @return The default amount of rows.
|
||||
*/
|
||||
public int getDefaultRows() {
|
||||
return defaultRows;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on menu open.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface OpenHandler {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
*/
|
||||
void handle(@NotNull Player player,
|
||||
@NotNull Menu menu);
|
||||
}
|
||||
117
eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java
Normal file
117
eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java
Normal file
@@ -0,0 +1,117 @@
|
||||
package com.willfp.eco.core.gui.page;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A page is a component representing another menu.
|
||||
* This allows full component support in pagination.
|
||||
*/
|
||||
public final class Page implements GUIComponent {
|
||||
/**
|
||||
* The Menu state key for the current page.
|
||||
*/
|
||||
public static final String PAGE_KEY = "page";
|
||||
|
||||
/**
|
||||
* The Menu state key for the amount of pages.
|
||||
*/
|
||||
public static final String MAX_PAGE_KEY = "max_page";
|
||||
|
||||
/**
|
||||
* The page number.
|
||||
*/
|
||||
private final int pageNumber;
|
||||
|
||||
/**
|
||||
* The base menu.
|
||||
*/
|
||||
private final Menu page;
|
||||
|
||||
/**
|
||||
* The delegate menu.
|
||||
*/
|
||||
private Menu delegate = null;
|
||||
|
||||
/**
|
||||
* The rows for the page to have.
|
||||
*/
|
||||
private int rows = 6;
|
||||
|
||||
/**
|
||||
* The columns for the page to have.
|
||||
*/
|
||||
private int columns = 9;
|
||||
|
||||
/**
|
||||
* Create a new page.
|
||||
*
|
||||
* @param pageNumber The page number.
|
||||
* @param page The base menu.
|
||||
*/
|
||||
public Page(final int pageNumber,
|
||||
@NotNull final Menu page) {
|
||||
this.pageNumber = pageNumber;
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current page number.
|
||||
*
|
||||
* @return The page number.
|
||||
*/
|
||||
public int getPageNumber() {
|
||||
return this.pageNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Slot getSlotAt(final int row,
|
||||
final int column,
|
||||
@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
if (menu.getPage(player) != pageNumber) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (delegate == null) {
|
||||
delegate = Eco.get().blendMenuState(page, menu);
|
||||
}
|
||||
|
||||
return page.getSlot(row, column, player, delegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final int maxRows,
|
||||
final int maxColumns) {
|
||||
this.rows = maxRows;
|
||||
this.columns = maxColumns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumns() {
|
||||
return columns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new page builder.
|
||||
*
|
||||
* @param context The context to create the page for.
|
||||
* @return The page builder.
|
||||
*/
|
||||
public static PageBuilder builder(@NotNull final MenuBuilder context) {
|
||||
return Menu.builder(context.getRows());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.willfp.eco.core.gui.page;
|
||||
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.menu.MenuLayer;
|
||||
import com.willfp.eco.core.gui.slot.FillerMask;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* Builder to create pages.
|
||||
*/
|
||||
public interface PageBuilder {
|
||||
/**
|
||||
* Get the amount of rows.
|
||||
*
|
||||
* @return The amount of rows.
|
||||
*/
|
||||
int getRows();
|
||||
|
||||
/**
|
||||
* Get the amount of columns.
|
||||
*
|
||||
* @return The amount of columns.
|
||||
*/
|
||||
int getColumns();
|
||||
|
||||
/**
|
||||
* Set a slot.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @param slot The slot.
|
||||
* @return The builder.
|
||||
*/
|
||||
default PageBuilder setSlot(final int row,
|
||||
final int column,
|
||||
@NotNull final Slot slot) {
|
||||
return this.addComponent(row, column, slot);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a component.
|
||||
*
|
||||
* @param layer The layer.
|
||||
* @param row The row of the top left corner.
|
||||
* @param column The column of the top left corner.
|
||||
* @param component The component.
|
||||
* @return The builder.
|
||||
*/
|
||||
PageBuilder addComponent(@NotNull MenuLayer layer,
|
||||
int row,
|
||||
int column,
|
||||
@NotNull GUIComponent component);
|
||||
|
||||
|
||||
/**
|
||||
* Add a component.
|
||||
*
|
||||
* @param row The row of the top left corner.
|
||||
* @param column The column of the top left corner.
|
||||
* @param component The component.
|
||||
* @return The builder.
|
||||
*/
|
||||
default PageBuilder addComponent(final int row,
|
||||
final int column,
|
||||
@NotNull final GUIComponent component) {
|
||||
return this.addComponent(MenuLayer.MIDDLE, row, column, component);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu mask.
|
||||
*
|
||||
* @param mask The mask.
|
||||
* @return The builder.
|
||||
*/
|
||||
default PageBuilder setMask(@NotNull final FillerMask mask) {
|
||||
return this.addComponent(MenuLayer.BACKGROUND, 1, 1, mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the action to run on render.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return The builder.
|
||||
*/
|
||||
PageBuilder onRender(@NotNull BiConsumer<Player, Menu> action);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.willfp.eco.core.gui.page;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.MenuEvent;
|
||||
|
||||
/**
|
||||
* Represents a page change.
|
||||
*
|
||||
* @param newPage The new page.
|
||||
* @param oldPage The old page.
|
||||
*/
|
||||
public record PageChangeEvent(
|
||||
int newPage,
|
||||
int oldPage
|
||||
) implements MenuEvent {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
package com.willfp.eco.core.gui.page;
|
||||
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* A slot loaded in from config.
|
||||
*/
|
||||
public final class PageChanger implements GUIComponent {
|
||||
/**
|
||||
* The slot to be shown.
|
||||
*/
|
||||
private final Slot slot;
|
||||
|
||||
/**
|
||||
* The direction to turn the page.
|
||||
*/
|
||||
private final Direction direction;
|
||||
|
||||
/**
|
||||
* Create a new page change slot.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
* @param direction The direction.
|
||||
*/
|
||||
public PageChanger(@NotNull final ItemStack itemStack,
|
||||
@NotNull final Direction direction) {
|
||||
this.direction = direction;
|
||||
|
||||
slot = Slot.builder(itemStack)
|
||||
.onLeftClick((event, slot, menu) -> {
|
||||
Player player = (Player) event.getWhoClicked();
|
||||
int page = menu.getPage(player);
|
||||
int newPage = Math.max(
|
||||
1,
|
||||
Math.min(
|
||||
page + direction.getChange(),
|
||||
menu.getMaxPage(player)
|
||||
)
|
||||
);
|
||||
|
||||
if (newPage == page) {
|
||||
return;
|
||||
}
|
||||
|
||||
menu.addState(player, Page.PAGE_KEY, newPage);
|
||||
menu.callEvent(player, new PageChangeEvent(
|
||||
newPage,
|
||||
page
|
||||
));
|
||||
})
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRows() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumns() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Slot getSlotAt(final int row,
|
||||
final int column,
|
||||
@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
int page = menu.getPage(player);
|
||||
int maxPage = menu.getMaxPage(player);
|
||||
|
||||
if (page <= 1 && this.direction == Direction.BACKWARDS) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (page >= maxPage - 1 && this.direction == Direction.FORWARDS) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return slot;
|
||||
}
|
||||
|
||||
/**
|
||||
* The direction to change the page.
|
||||
*/
|
||||
public enum Direction {
|
||||
/**
|
||||
* Increment the page by 1.
|
||||
*/
|
||||
FORWARDS(1),
|
||||
|
||||
/**
|
||||
* Decrement the page by 1.
|
||||
*/
|
||||
BACKWARDS(-1);
|
||||
|
||||
/**
|
||||
* The amount of pages to change by.
|
||||
*/
|
||||
private final int change;
|
||||
|
||||
/**
|
||||
* Create a new direction.
|
||||
*
|
||||
* @param change The amount of pages to change by.
|
||||
*/
|
||||
Direction(final int change) {
|
||||
this.change = change;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of pages to change by.
|
||||
*
|
||||
* @return The change.
|
||||
*/
|
||||
public int getChange() {
|
||||
return change;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||
import com.willfp.eco.core.items.Items;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A slot loaded in from config.
|
||||
*/
|
||||
public class ConfigSlot extends CustomSlot {
|
||||
/**
|
||||
* The config of the slot.
|
||||
*/
|
||||
private final Config config;
|
||||
|
||||
/**
|
||||
* Cached handlers, for performance.
|
||||
*/
|
||||
private final Map<String, List<CommandToDispatch>> handlers = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Create a new config slot.
|
||||
*
|
||||
* @param config The config.
|
||||
*/
|
||||
public ConfigSlot(@NotNull final Config config) {
|
||||
this.config = config;
|
||||
|
||||
SlotBuilder builder = Slot.builder(Items.lookup(config.getString("item")));
|
||||
|
||||
for (ClickType clickType : ClickType.values()) {
|
||||
builder.onClick(
|
||||
clickType,
|
||||
dispatchCommandHandler(
|
||||
clickType.name().toLowerCase(Locale.ROOT)
|
||||
.replace("_", "-")
|
||||
+ "-click"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
init(builder.build());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a slot handler for dispatching commands.
|
||||
*
|
||||
* @param configKey The config key.
|
||||
* @return The handler.
|
||||
*/
|
||||
private SlotHandler dispatchCommandHandler(@NotNull final String configKey) {
|
||||
if (!handlers.containsKey(configKey)) {
|
||||
List<CommandToDispatch> commands = new ArrayList<>();
|
||||
|
||||
for (String command : config.getStrings(configKey)) {
|
||||
if (command.startsWith("console:")) {
|
||||
commands.add(new CommandToDispatch(
|
||||
StringUtils.removePrefix("console:", command),
|
||||
true
|
||||
));
|
||||
} else {
|
||||
commands.add(new CommandToDispatch(
|
||||
command,
|
||||
false
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
handlers.put(configKey, commands);
|
||||
}
|
||||
|
||||
List<CommandToDispatch> toDispatch = handlers.get(configKey);
|
||||
|
||||
return (event, slot, menu) -> {
|
||||
Player player = (Player) event.getWhoClicked();
|
||||
|
||||
for (CommandToDispatch dispatch : toDispatch) {
|
||||
dispatch.dispatch(player);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Signifies a command to dispatch.
|
||||
*
|
||||
* @param command The command.
|
||||
* @param console If the command should be run as console.
|
||||
*/
|
||||
private record CommandToDispatch(
|
||||
@NotNull String command,
|
||||
boolean console
|
||||
) {
|
||||
/**
|
||||
* Dispatch command.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
void dispatch(@NotNull final Player player) {
|
||||
if (console()) {
|
||||
Bukkit.dispatchCommand(
|
||||
Bukkit.getConsoleSender(),
|
||||
command().replace("%player%", player.getName())
|
||||
);
|
||||
} else {
|
||||
Bukkit.dispatchCommand(
|
||||
player,
|
||||
command().replace("%player%", player.getName())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Base class for custom slot implementations.
|
||||
*/
|
||||
public abstract class CustomSlot implements Slot {
|
||||
/**
|
||||
* The internal slot to delegate to.
|
||||
*/
|
||||
private Slot delegate = null;
|
||||
|
||||
/**
|
||||
* Create a new custom slot.
|
||||
*/
|
||||
protected CustomSlot() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the slot with the delegate.
|
||||
*
|
||||
* @param slot The slot to delegate to.
|
||||
*/
|
||||
protected void init(@NotNull final Slot slot) {
|
||||
this.delegate = slot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemStack(@NotNull final Player player) {
|
||||
if (delegate == null) {
|
||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||
}
|
||||
|
||||
return delegate.getItemStack(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCaptive(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
if (delegate == null) {
|
||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||
}
|
||||
|
||||
return delegate.isCaptive(player, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCaptiveFromEmpty() {
|
||||
if (delegate == null) {
|
||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||
}
|
||||
|
||||
return delegate.isCaptiveFromEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Slot getActionableSlot(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getRows() {
|
||||
return Slot.super.getRows();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getColumns() {
|
||||
return Slot.super.getColumns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Slot getSlotAt(int row, int column) {
|
||||
return Slot.super.getSlotAt(row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the delegate slot.
|
||||
* <p>
|
||||
* This is not required to add the slot to a menu, but is instead used internally.
|
||||
*
|
||||
* @return The slot.
|
||||
* @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)}
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
public Slot getDelegate() {
|
||||
return this.delegate;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.items.builder.ItemStackBuilder;
|
||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
||||
@@ -7,6 +8,7 @@ import com.willfp.eco.util.ListUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -26,12 +28,17 @@ import java.util.List;
|
||||
* "11111111"
|
||||
* );
|
||||
*/
|
||||
public class FillerMask {
|
||||
public class FillerMask implements GUIComponent {
|
||||
/**
|
||||
* Mask.
|
||||
*/
|
||||
private final List<List<Slot>> mask;
|
||||
|
||||
/**
|
||||
* Rows.
|
||||
*/
|
||||
private final int rows;
|
||||
|
||||
/**
|
||||
* Create a new filler mask.
|
||||
*
|
||||
@@ -71,7 +78,8 @@ public class FillerMask {
|
||||
throw new IllegalArgumentException("Items cannot be empty!");
|
||||
}
|
||||
|
||||
mask = ListUtils.create2DList(6, 9);
|
||||
rows = pattern.length;
|
||||
mask = ListUtils.create2DList(rows, 9);
|
||||
|
||||
for (int i = 0; i < items.items().length; i++) {
|
||||
ItemStack itemStack = new ItemStackBuilder(items.items()[i])
|
||||
@@ -82,9 +90,6 @@ public class FillerMask {
|
||||
|
||||
for (String patternRow : pattern) {
|
||||
int column = 0;
|
||||
if (patternRow.length() != 9) {
|
||||
throw new IllegalArgumentException("Invalid amount of columns in pattern!");
|
||||
}
|
||||
for (char c : patternRow.toCharArray()) {
|
||||
if (c == '0') {
|
||||
mask.get(row).set(column, null);
|
||||
@@ -107,4 +112,20 @@ public class FillerMask {
|
||||
public List<List<Slot>> getMask() {
|
||||
return this.mask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumns() {
|
||||
return 9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Slot getSlotAt(final int row,
|
||||
final int column) {
|
||||
return mask.get(row - 1).get(column - 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -9,37 +8,16 @@ import org.jetbrains.annotations.NotNull;
|
||||
* <p>
|
||||
* Useful for backgrounds.
|
||||
*/
|
||||
public class FillerSlot implements Slot {
|
||||
/**
|
||||
* The ItemStack.
|
||||
*/
|
||||
private final ItemStack itemStack;
|
||||
|
||||
public class FillerSlot extends CustomSlot {
|
||||
/**
|
||||
* Create new filler slot.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
*/
|
||||
public FillerSlot(@NotNull final ItemStack itemStack) {
|
||||
this.itemStack = itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemStack(@NotNull final Player player) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCaptive() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ItemStack.
|
||||
*
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack getItemStack() {
|
||||
return this.itemStack;
|
||||
init(
|
||||
Slot.builder(itemStack)
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.bukkit.Material;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -17,6 +18,15 @@ import java.util.List;
|
||||
* @param items The items.
|
||||
*/
|
||||
public record MaskItems(@NotNull TestableItem... items) {
|
||||
/**
|
||||
* Create mask items from materials.
|
||||
*
|
||||
* @param materials The materials.
|
||||
*/
|
||||
public MaskItems(@NotNull final Material... materials) {
|
||||
this(Arrays.stream(materials).map(MaterialTestableItem::new).toList().toArray(new TestableItem[0]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create MaskItems from a list of item names.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Base class for custom slot implementations.
|
||||
*/
|
||||
public abstract class ReactiveSlot implements Slot {
|
||||
/**
|
||||
* Create a new reactive slot.
|
||||
*/
|
||||
protected ReactiveSlot() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the actual slot to be shown.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @return The slot.
|
||||
*/
|
||||
@NotNull
|
||||
public abstract Slot getSlot(@NotNull final Player player,
|
||||
@NotNull final Menu menu);
|
||||
|
||||
@Override
|
||||
public ItemStack getItemStack(@NotNull final Player player) {
|
||||
return new ItemStack(Material.STONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCaptive(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return getSlot(player, menu).isCaptive(player, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Slot getActionableSlot(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return getSlot(player, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getRows() {
|
||||
return Slot.super.getRows();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getColumns() {
|
||||
return Slot.super.getColumns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Slot getSlotAt(int row, int column) {
|
||||
return Slot.super.getSlotAt(row, column);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.GUIComponent;
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -11,8 +14,16 @@ import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* A slot is an item in a GUI that can handle clicks.
|
||||
* <p>
|
||||
* While you can create custom Slot implementations directly from this class,
|
||||
* it's heavily encouraged to extend {@link CustomSlot}, which will abstract
|
||||
* internal functionality away.
|
||||
* <p>
|
||||
* A lot of methods here are marked as default as in 6.43.0 the GUI system
|
||||
* was overhauled, but to preserve backwards compatibility, the new methods
|
||||
* had to be marked default, and many old methods became deprecated.
|
||||
*/
|
||||
public interface Slot {
|
||||
public interface Slot extends GUIComponent {
|
||||
/**
|
||||
* Get the ItemStack that would be shown to a player.
|
||||
*
|
||||
@@ -24,9 +35,61 @@ public interface Slot {
|
||||
/**
|
||||
* If the slot is captive. (Can items be placed in it).
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @return If captive.
|
||||
*/
|
||||
boolean isCaptive();
|
||||
default boolean isCaptive(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the actionable slot to be shown.
|
||||
* <p>
|
||||
* This is mostly internal, if you want to implement custom slots you should
|
||||
* turn to {@link CustomSlot} or {@link ReactiveSlot}, which abstract this
|
||||
* behaviour away.
|
||||
* <p>
|
||||
* **Never** return {@code this} from this method. Always make sure that your
|
||||
* slots eventually delegate to a slot created by {@link Slot#builder()}.
|
||||
* <p>
|
||||
* {@code this} is returned by default for backwards-compatibility.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @return The slot.
|
||||
*/
|
||||
default Slot getActionableSlot(@NotNull final Player player,
|
||||
@NotNull final Menu menu) {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the slot is captive from empty.
|
||||
* If true, a captive item will be returned even if the item is the same as the rendered item.
|
||||
*
|
||||
* @return If captive from empty.
|
||||
*/
|
||||
default boolean isCaptiveFromEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getRows() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getColumns() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
default Slot getSlotAt(final int row,
|
||||
final int column) {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for an ItemStack.
|
||||
@@ -34,7 +97,7 @@ public interface Slot {
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder() {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> new ItemStack(Material.AIR));
|
||||
return Eco.get().createSlotBuilder((player, menu) -> new ItemStack(Material.AIR));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,7 +107,17 @@ public interface Slot {
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final ItemStack itemStack) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> itemStack);
|
||||
return Eco.get().createSlotBuilder((player, menu) -> itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for a TestableItem.
|
||||
*
|
||||
* @param item The item.
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final TestableItem item) {
|
||||
return Eco.get().createSlotBuilder((player, menu) -> item.getItem());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,7 +127,7 @@ public interface Slot {
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final Function<Player, ItemStack> provider) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder((player, menu) -> provider.apply(player));
|
||||
return Eco.get().createSlotBuilder((player, menu) -> provider.apply(player));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,6 +137,29 @@ public interface Slot {
|
||||
* @return The builder.
|
||||
*/
|
||||
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
||||
return Eco.getHandler().getGUIFactory().createSlotBuilder(provider);
|
||||
return Eco.get().createSlotBuilder(provider);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the slot is not captive for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If not captive for the player.
|
||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
default boolean isNotCaptiveFor(@NotNull Player player) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the slot is captive. (Can items be placed in it).
|
||||
*
|
||||
* @return If captive.
|
||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
default boolean isCaptive() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,15 +3,40 @@ package com.willfp.eco.core.gui.slot;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotUpdater;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Builder to create slots.
|
||||
*/
|
||||
public interface SlotBuilder {
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param type The click type.
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onClick(@NotNull ClickType type,
|
||||
@NotNull SlotHandler handler);
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
* @param type The click type.
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder onClick(@NotNull final ClickType type,
|
||||
@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
||||
return onClick(type, (event, slot, menu) -> action.accept(event, slot));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
*
|
||||
@@ -28,7 +53,9 @@ public interface SlotBuilder {
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onLeftClick(@NotNull SlotHandler handler);
|
||||
default SlotBuilder onLeftClick(@NotNull final SlotHandler handler) {
|
||||
return onClick(ClickType.LEFT, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
@@ -46,7 +73,9 @@ public interface SlotBuilder {
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onRightClick(@NotNull SlotHandler handler);
|
||||
default SlotBuilder onRightClick(@NotNull final SlotHandler handler) {
|
||||
return onClick(ClickType.RIGHT, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
@@ -64,7 +93,9 @@ public interface SlotBuilder {
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onShiftLeftClick(@NotNull SlotHandler handler);
|
||||
default SlotBuilder onShiftLeftClick(@NotNull final SlotHandler handler) {
|
||||
return onClick(ClickType.SHIFT_LEFT, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
@@ -82,7 +113,9 @@ public interface SlotBuilder {
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onShiftRightClick(@NotNull SlotHandler handler);
|
||||
default SlotBuilder onShiftRightClick(@NotNull final SlotHandler handler) {
|
||||
return onClick(ClickType.SHIFT_RIGHT, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set click handler.
|
||||
@@ -100,7 +133,49 @@ public interface SlotBuilder {
|
||||
* @param handler The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder onMiddleClick(@NotNull SlotHandler handler);
|
||||
default SlotBuilder onMiddleClick(@NotNull final SlotHandler handler) {
|
||||
return onClick(ClickType.MIDDLE, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent captive for players that match a predicate.
|
||||
*
|
||||
* @param predicate The predicate. Returns true when the slot should not be captive.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder notCaptiveFor(@NotNull Predicate<Player> predicate);
|
||||
|
||||
/**
|
||||
* Set the ItemStack updater.
|
||||
*
|
||||
* @param updater The updater.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setUpdater(@NotNull SlotUpdater updater);
|
||||
|
||||
/**
|
||||
* Set slot to be a captive slot.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
default SlotBuilder setCaptive() {
|
||||
return setCaptive(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set slot to be a captive slot.
|
||||
*
|
||||
* @param fromEmpty If an item with the same output as the rendered item counts as captive.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setCaptive(boolean fromEmpty);
|
||||
|
||||
/**
|
||||
* Build the slot.
|
||||
*
|
||||
* @return The slot.
|
||||
*/
|
||||
Slot build();
|
||||
|
||||
/**
|
||||
* Modify the ItemStack.
|
||||
@@ -116,26 +191,4 @@ public interface SlotBuilder {
|
||||
return previous;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the ItemStack updater.
|
||||
*
|
||||
* @param updater The updater.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setUpdater(@NotNull SlotUpdater updater);
|
||||
|
||||
/**
|
||||
* Set slot to be a captive slot.
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setCaptive();
|
||||
|
||||
/**
|
||||
* Build the slot.
|
||||
*
|
||||
* @return The slot.
|
||||
*/
|
||||
Slot build();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Interface to run on slot display.
|
||||
@@ -17,6 +18,7 @@ public interface SlotProvider {
|
||||
* @param menu The menu.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack provide(@NotNull Player player,
|
||||
@NotNull Menu menu);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Interface to run on slot update.
|
||||
@@ -18,6 +19,7 @@ public interface SlotUpdater {
|
||||
* @param previous The previous ItemStack.
|
||||
* @return The new ItemStack.
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack update(@NotNull Player player,
|
||||
@NotNull Menu menu,
|
||||
@NotNull ItemStack previous);
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.core.integrations.afk;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* AFK Integration.
|
||||
*/
|
||||
public interface AFKIntegration extends Integration {
|
||||
/**
|
||||
* Get if a player is afk.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If afk.
|
||||
*/
|
||||
boolean isAfk(@NotNull Player player);
|
||||
}
|
||||
@@ -13,14 +13,15 @@ public final class AFKManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<AFKWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<AFKIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final AFKWrapper integration) {
|
||||
public static void register(@NotNull final AFKIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -31,8 +32,8 @@ public final class AFKManager {
|
||||
* @return If afk.
|
||||
*/
|
||||
public static boolean isAfk(@NotNull final Player player) {
|
||||
for (AFKWrapper afkWrapper : REGISTERED) {
|
||||
if (afkWrapper.isAfk(player)) {
|
||||
for (AFKIntegration integration : REGISTERED) {
|
||||
if (integration.isAfk(player)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.afk;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for afk integrations.
|
||||
*
|
||||
* @deprecated Use AFKIntegration instead.
|
||||
*/
|
||||
public interface AFKWrapper extends Integration {
|
||||
/**
|
||||
* Get if a player is afk.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If afk.
|
||||
*/
|
||||
boolean isAfk(@NotNull Player player);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AFKWrapper extends AFKIntegration {
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for anticheat integrations.
|
||||
*/
|
||||
public interface AnticheatIntegration extends Integration {
|
||||
/**
|
||||
* Exempt a player from checks.
|
||||
*
|
||||
* @param player The player to exempt.
|
||||
*/
|
||||
void exempt(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Unexempt a player from checks.
|
||||
*
|
||||
* @param player The player to unexempt.
|
||||
*/
|
||||
void unexempt(@NotNull Player player);
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
@@ -15,19 +16,31 @@ public final class AnticheatManager {
|
||||
/**
|
||||
* A set of all registered anticheats.
|
||||
*/
|
||||
private static final Set<AnticheatWrapper> ANTICHEATS = new HashSet<>();
|
||||
private static final Set<AnticheatIntegration> ANTICHEATS = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new anticheat.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param anticheat The anticheat to register.
|
||||
* @deprecated Don't pass instance of eco.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public static void register(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final AnticheatWrapper anticheat) {
|
||||
@NotNull final AnticheatIntegration anticheat) {
|
||||
register(anticheat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new anticheat.
|
||||
*
|
||||
* @param anticheat The anticheat to register.
|
||||
*/
|
||||
public static void register(@NotNull final AnticheatIntegration anticheat) {
|
||||
if (anticheat instanceof Listener) {
|
||||
plugin.getEventManager().registerListener((Listener) anticheat);
|
||||
Eco.get().getEcoPlugin().getEventManager().registerListener((Listener) anticheat);
|
||||
}
|
||||
ANTICHEATS.removeIf(it -> it.getPluginName().equalsIgnoreCase(anticheat.getPluginName()));
|
||||
ANTICHEATS.add(anticheat);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,24 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for anticheat integrations.
|
||||
*
|
||||
* @deprecated Use AnticheatIntegration instead.
|
||||
*/
|
||||
public interface AnticheatWrapper extends Integration {
|
||||
/**
|
||||
* Exempt a player from checks.
|
||||
*
|
||||
* @param player The player to exempt.
|
||||
*/
|
||||
void exempt(@NotNull Player player);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AnticheatWrapper extends AnticheatIntegration {
|
||||
|
||||
/**
|
||||
* Unexempt a player from checks.
|
||||
*
|
||||
* @param player The player to unexempt.
|
||||
*/
|
||||
void unexempt(@NotNull Player player);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.integrations.antigrief;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for antigrief integrations.
|
||||
*/
|
||||
public interface AntigriefIntegration extends Integration {
|
||||
/**
|
||||
* Can player break block.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param block The block.
|
||||
* @return If player can break block.
|
||||
*/
|
||||
boolean canBreakBlock(@NotNull Player player, @NotNull Block block);
|
||||
|
||||
/**
|
||||
* Can player create explosion at location.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param location The location.
|
||||
* @return If player can create explosion.
|
||||
*/
|
||||
boolean canCreateExplosion(@NotNull Player player, @NotNull Location location);
|
||||
|
||||
/**
|
||||
* Can player place block.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param block The block.
|
||||
* @return If player can place block.
|
||||
*/
|
||||
boolean canPlaceBlock(@NotNull Player player, @NotNull Block block);
|
||||
|
||||
/**
|
||||
* Can player injure living entity.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param victim The victim.
|
||||
* @return If player can injure.
|
||||
*/
|
||||
boolean canInjure(@NotNull Player player, @NotNull LivingEntity victim);
|
||||
|
||||
/**
|
||||
* Can player pick up item.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param location The location.
|
||||
* @return If player can pick up item.
|
||||
*/
|
||||
default boolean canPickupItem(@NotNull Player player, @NotNull Location location) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -16,14 +16,15 @@ public final class AntigriefManager {
|
||||
/**
|
||||
* Registered antigriefs.
|
||||
*/
|
||||
private static final Set<AntigriefWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<AntigriefIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new AntiGrief/Land Management integration.
|
||||
*
|
||||
* @param antigrief The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final AntigriefWrapper antigrief) {
|
||||
public static void register(@NotNull final AntigriefIntegration antigrief) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
|
||||
REGISTERED.add(antigrief);
|
||||
}
|
||||
|
||||
@@ -32,7 +33,7 @@ public final class AntigriefManager {
|
||||
*
|
||||
* @param antigrief The integration to unregister.
|
||||
*/
|
||||
public static void unregister(@NotNull final AntigriefWrapper antigrief) {
|
||||
public static void unregister(@NotNull final AntigriefIntegration antigrief) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
|
||||
REGISTERED.remove(antigrief);
|
||||
}
|
||||
@@ -46,7 +47,7 @@ public final class AntigriefManager {
|
||||
*/
|
||||
public static boolean canPickupItem(@NotNull final Player player,
|
||||
@NotNull final Location location) {
|
||||
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPickupItem(player, location));
|
||||
return REGISTERED.stream().allMatch(antigriefIntegration -> antigriefIntegration.canPickupItem(player, location));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,7 +59,7 @@ public final class AntigriefManager {
|
||||
*/
|
||||
public static boolean canBreakBlock(@NotNull final Player player,
|
||||
@NotNull final Block block) {
|
||||
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canBreakBlock(player, block));
|
||||
return REGISTERED.stream().allMatch(antigriefIntegration -> antigriefIntegration.canBreakBlock(player, block));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,7 +71,7 @@ public final class AntigriefManager {
|
||||
*/
|
||||
public static boolean canCreateExplosion(@NotNull final Player player,
|
||||
@NotNull final Location location) {
|
||||
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canCreateExplosion(player, location));
|
||||
return REGISTERED.stream().allMatch(antigriefIntegration -> antigriefIntegration.canCreateExplosion(player, location));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,7 +83,7 @@ public final class AntigriefManager {
|
||||
*/
|
||||
public static boolean canPlaceBlock(@NotNull final Player player,
|
||||
@NotNull final Block block) {
|
||||
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPlaceBlock(player, block));
|
||||
return REGISTERED.stream().allMatch(antigriefIntegration -> antigriefIntegration.canPlaceBlock(player, block));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,7 +95,7 @@ public final class AntigriefManager {
|
||||
*/
|
||||
public static boolean canInjure(@NotNull final Player player,
|
||||
@NotNull final LivingEntity victim) {
|
||||
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canInjure(player, victim));
|
||||
return REGISTERED.stream().allMatch(antigriefIntegration -> antigriefIntegration.canInjure(player, victim));
|
||||
}
|
||||
|
||||
private AntigriefManager() {
|
||||
|
||||
@@ -1,60 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.antigrief;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for antigrief integrations.
|
||||
*
|
||||
* @deprecated Use AntigriefIntegration instead.
|
||||
*/
|
||||
public interface AntigriefWrapper extends Integration {
|
||||
/**
|
||||
* Can player break block.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param block The block.
|
||||
* @return If player can break block.
|
||||
*/
|
||||
boolean canBreakBlock(@NotNull Player player, @NotNull Block block);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AntigriefWrapper extends AntigriefIntegration {
|
||||
|
||||
/**
|
||||
* Can player create explosion at location.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param location The location.
|
||||
* @return If player can create explosion.
|
||||
*/
|
||||
boolean canCreateExplosion(@NotNull Player player, @NotNull Location location);
|
||||
|
||||
/**
|
||||
* Can player place block.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param block The block.
|
||||
* @return If player can place block.
|
||||
*/
|
||||
boolean canPlaceBlock(@NotNull Player player, @NotNull Block block);
|
||||
|
||||
/**
|
||||
* Can player injure living entity.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param victim The victim.
|
||||
* @return If player can injure.
|
||||
*/
|
||||
boolean canInjure(@NotNull Player player, @NotNull LivingEntity victim);
|
||||
|
||||
/**
|
||||
* Can player pick up item.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param location The location.
|
||||
* @return If player can pick up item.
|
||||
*/
|
||||
default boolean canPickupItem(@NotNull Player player, @NotNull Location location) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.willfp.eco.core.integrations.customentities;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*/
|
||||
public interface CustomEntitiesIntegration extends Integration {
|
||||
/**
|
||||
* Register all the custom entities for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.entities.Entities
|
||||
*/
|
||||
void registerAllEntities();
|
||||
}
|
||||
@@ -12,14 +12,15 @@ public final class CustomEntitiesManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<CustomEntitiesWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<CustomEntitiesIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final CustomEntitiesWrapper integration) {
|
||||
public static void register(@NotNull final CustomEntitiesIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -29,8 +30,8 @@ public final class CustomEntitiesManager {
|
||||
* @see com.willfp.eco.core.entities.Entities
|
||||
*/
|
||||
public static void registerAllEntities() {
|
||||
for (CustomEntitiesWrapper wrapper : REGISTERED) {
|
||||
wrapper.registerAllEntities();
|
||||
for (CustomEntitiesIntegration integration : REGISTERED) {
|
||||
integration.registerAllEntities();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.customentities;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*
|
||||
* @deprecated Use CustomEntitiesIntegration instead.
|
||||
*/
|
||||
public interface CustomEntitiesWrapper extends Integration {
|
||||
/**
|
||||
* Register all the custom entities for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.entities.Entities
|
||||
*/
|
||||
void registerAllEntities();
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface CustomEntitiesWrapper extends CustomEntitiesIntegration {
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.willfp.eco.core.integrations.customitems;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*/
|
||||
public interface CustomItemsIntegration extends Integration {
|
||||
/**
|
||||
* Register all the custom items for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
default void registerAllItems() {
|
||||
// Override when needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Register {@link com.willfp.eco.core.items.provider.ItemProvider}s.
|
||||
*/
|
||||
default void registerProvider() {
|
||||
// Override when needed.
|
||||
}
|
||||
}
|
||||
@@ -12,14 +12,15 @@ public final class CustomItemsManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<CustomItemsWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<CustomItemsIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final CustomItemsWrapper integration) {
|
||||
public static void register(@NotNull final CustomItemsIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -29,8 +30,19 @@ public final class CustomItemsManager {
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
public static void registerAllItems() {
|
||||
for (CustomItemsWrapper customItemsWrapper : REGISTERED) {
|
||||
customItemsWrapper.registerAllItems();
|
||||
for (CustomItemsIntegration customItemsIntegration : REGISTERED) {
|
||||
customItemsIntegration.registerAllItems();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register all the custom items for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
public static void registerProviders() {
|
||||
for (CustomItemsIntegration customItemsIntegration : REGISTERED) {
|
||||
customItemsIntegration.registerProvider();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.customitems;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*
|
||||
* @deprecated Use CustomItemsIntegration instead.
|
||||
*/
|
||||
public interface CustomItemsWrapper extends Integration {
|
||||
/**
|
||||
* Register all the custom items for a specific plugin into eco.
|
||||
*
|
||||
* @see com.willfp.eco.core.items.Items
|
||||
*/
|
||||
void registerAllItems();
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface CustomItemsWrapper extends CustomItemsIntegration {
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
* <p>
|
||||
* If you're adding your economy to be supported in eco,
|
||||
* it's recommended to override the {@link BigDecimal} methods
|
||||
* as opposed to the {@code double} methods.
|
||||
* <p>
|
||||
* <strong>You must override at least one of all methods</strong>,
|
||||
* i.e. one {@code hasAmount}, one {@code giveMoney}, etc.,
|
||||
* otherwise your integration will cause {@link StackOverflowError}.
|
||||
* <p>
|
||||
* All methods are marked as default to preserve compatibility with
|
||||
* integrations made before 6.43.0.
|
||||
*/
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
public interface EconomyIntegration extends Integration {
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount.
|
||||
* @return If the player has the amount.
|
||||
* @deprecated Use {@link BigDecimal} methods instead.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0")
|
||||
default boolean hasAmount(@NotNull OfflinePlayer player,
|
||||
double amount) {
|
||||
return hasAmount(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
default boolean hasAmount(@NotNull OfflinePlayer player,
|
||||
@NotNull BigDecimal amount) {
|
||||
return hasAmount(player, amount.doubleValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
* @deprecated Use {@link BigDecimal} methods instead.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0")
|
||||
default boolean giveMoney(@NotNull OfflinePlayer player,
|
||||
double amount) {
|
||||
return giveMoney(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
default boolean giveMoney(@NotNull OfflinePlayer player,
|
||||
@NotNull BigDecimal amount) {
|
||||
return giveMoney(player, amount.doubleValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
* @deprecated Use {@link BigDecimal} methods instead.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0")
|
||||
default boolean removeMoney(@NotNull OfflinePlayer player,
|
||||
double amount) {
|
||||
return removeMoney(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
default boolean removeMoney(@NotNull OfflinePlayer player,
|
||||
@NotNull BigDecimal amount) {
|
||||
return removeMoney(player, amount.doubleValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
* @deprecated Use {@link BigDecimal} methods instead.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0")
|
||||
default double getBalance(@NotNull OfflinePlayer player) {
|
||||
return getExactBalance(player).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
default BigDecimal getExactBalance(@NotNull OfflinePlayer player) {
|
||||
return BigDecimal.valueOf(getBalance(player));
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core.integrations.economy;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -13,14 +14,15 @@ public final class EconomyManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<EconomyWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<EconomyIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final EconomyWrapper integration) {
|
||||
public static void register(@NotNull final EconomyIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -42,8 +44,20 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.hasAmount(player, amount);
|
||||
return hasAmount(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount.
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||
final BigDecimal amount) {
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.hasAmount(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -58,8 +72,20 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.giveMoney(player, amount);
|
||||
return giveMoney(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||
@NotNull final BigDecimal amount) {
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.giveMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -74,8 +100,20 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.removeMoney(player, amount);
|
||||
return removeMoney(player, BigDecimal.valueOf(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||
@NotNull final BigDecimal amount) {
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.removeMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -88,11 +126,21 @@ public final class EconomyManager {
|
||||
* @return The balance.
|
||||
*/
|
||||
public static double getBalance(@NotNull final OfflinePlayer player) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.getBalance(player);
|
||||
return getExactBalance(player).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
public static BigDecimal getExactBalance(@NotNull final OfflinePlayer player) {
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.getExactBalance(player);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
private EconomyManager() {
|
||||
|
||||
@@ -1,48 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
*
|
||||
* @deprecated Use EconomyIntegration instead.
|
||||
*/
|
||||
public interface EconomyWrapper extends Integration {
|
||||
/**
|
||||
* Get if a player has a certain amount.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount.
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
boolean hasAmount(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface EconomyWrapper extends EconomyIntegration {
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean giveMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean removeMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
double getBalance(@NotNull OfflinePlayer player);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user