Compare commits
239 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -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/")
|
||||
|
||||
@@ -82,24 +77,34 @@ allprojects {
|
||||
|
||||
// LibsDisguises
|
||||
maven("https://repo.md-5.net/content/groups/public/")
|
||||
|
||||
// FabledSkyblock
|
||||
maven("https://repo.songoda.com/repository/public/")
|
||||
}
|
||||
|
||||
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 +120,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 +132,40 @@ 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
|
||||
|
||||
/*
|
||||
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'
|
||||
}
|
||||
|
||||
@@ -304,6 +304,11 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.color = props.getColor();
|
||||
this.supportingExtensions = props.isSupportingExtensions();
|
||||
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.getHandler().createProxyFactory(this);
|
||||
this.logger = Eco.getHandler().createLogger(this);
|
||||
|
||||
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
||||
|
||||
this.scheduler = Eco.getHandler().createScheduler(this);
|
||||
this.eventManager = Eco.getHandler().createEventManager(this);
|
||||
this.namespacedKeyFactory = Eco.getHandler().createNamespacedKeyFactory(this);
|
||||
@@ -311,8 +316,6 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.runnableFactory = Eco.getHandler().createRunnableFactory(this);
|
||||
this.extensionLoader = Eco.getHandler().createExtensionLoader(this);
|
||||
this.configHandler = Eco.getHandler().createConfigHandler(this);
|
||||
this.logger = Eco.getHandler().createLogger(this);
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.getHandler().createProxyFactory(this);
|
||||
|
||||
this.langYml = this.createLangYml();
|
||||
this.configYml = this.createConfigYml();
|
||||
@@ -354,7 +357,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||
this.outdated = true;
|
||||
this.getLogger().warning(this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||
this.getLogger().warning("The newest version is &f" + version);
|
||||
this.getLogger().warning("The newest version is " + version);
|
||||
this.getLogger().warning("Download the new version!");
|
||||
}
|
||||
});
|
||||
@@ -374,12 +377,12 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
PlaceholderManager.addIntegration(Eco.getHandler().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()));
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ 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.ExtendedPersistentDataContainer;
|
||||
import com.willfp.eco.core.data.ProfileHandler;
|
||||
import com.willfp.eco.core.data.keys.KeyRegistry;
|
||||
import com.willfp.eco.core.drops.DropQueueFactory;
|
||||
@@ -14,6 +15,7 @@ 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.items.SNBTHandler;
|
||||
import com.willfp.eco.core.proxy.Cleaner;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
@@ -23,6 +25,7 @@ import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Mob;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -280,6 +283,30 @@ public interface Handler {
|
||||
* @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
|
||||
<T extends Mob> EntityController<T> createEntityController(@NotNull T mob);
|
||||
ExtendedPersistentDataContainer adaptPdc(@NotNull PersistentDataContainer container);
|
||||
|
||||
/**
|
||||
* Create new PDC.
|
||||
*
|
||||
* @return The container.
|
||||
*/
|
||||
@NotNull
|
||||
PersistentDataContainer newPdc();
|
||||
|
||||
/**
|
||||
* Get SNBT handler.
|
||||
*
|
||||
* @return The SNBT handler.
|
||||
*/
|
||||
@NotNull
|
||||
SNBTHandler getSNBTHandler();
|
||||
}
|
||||
|
||||
@@ -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)"
|
||||
);
|
||||
|
||||
@@ -41,11 +41,19 @@ public class Prerequisite {
|
||||
"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+"
|
||||
);
|
||||
|
||||
|
||||
@@ -167,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
|
||||
);
|
||||
|
||||
@@ -182,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;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,9 @@ 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;
|
||||
@@ -14,6 +15,7 @@ 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;
|
||||
@@ -159,6 +161,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.
|
||||
@@ -471,7 +487,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -539,12 +569,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();
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ 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;
|
||||
@@ -145,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
|
||||
|
||||
@@ -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.getHandler().adaptPdc(base);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new extended container.
|
||||
*
|
||||
* @return The extended container.
|
||||
*/
|
||||
static ExtendedPersistentDataContainer create() {
|
||||
return extend(Eco.getHandler().newPdc());
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public interface ProfileHandler {
|
||||
* @param async If the saving should be done asynchronously.
|
||||
* @deprecated async is now handled automatically depending on implementation.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(forRemoval = true)
|
||||
default void saveAll(boolean async) {
|
||||
saveAll();
|
||||
}
|
||||
@@ -77,8 +77,13 @@ public interface ProfileHandler {
|
||||
* Save all player data.
|
||||
* <p>
|
||||
* Can run async if using MySQL.
|
||||
*
|
||||
* @deprecated Never used.
|
||||
*/
|
||||
void saveAll();
|
||||
@Deprecated(since = "6.36.0", forRemoval = true)
|
||||
default void saveAll() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit all changes to the file.
|
||||
|
||||
@@ -21,6 +21,15 @@ public interface KeyRegistry {
|
||||
*/
|
||||
void registerKey(@NotNull PersistentDataKey<?> key);
|
||||
|
||||
/**
|
||||
* Get a key's category.
|
||||
*
|
||||
* @param key The key.
|
||||
* @return The category.
|
||||
*/
|
||||
@Nullable
|
||||
KeyCategory getCategory(@NotNull PersistentDataKey<?> key);
|
||||
|
||||
/**
|
||||
* Get all registered keys.
|
||||
*
|
||||
|
||||
@@ -38,6 +38,11 @@ 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");
|
||||
|
||||
/**
|
||||
* The class of the type.
|
||||
*/
|
||||
@@ -52,7 +57,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;
|
||||
}
|
||||
@@ -72,7 +80,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);
|
||||
|
||||
|
||||
@@ -113,52 +113,6 @@ public final class Display {
|
||||
handler.registerDisplayModule(module);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the display system.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void init(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalArgumentException("Already Initialized!");
|
||||
}
|
||||
Display.handler = handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extremely janky method - also internal, so don't use it. <b>This method is
|
||||
* NOT part of the API and may be removed at any time!</b>
|
||||
* <p>
|
||||
* This calls a display module with the specified parameters, now
|
||||
* you might ask why I need a static java method when the DisplayHandler
|
||||
* implementation could just call it itself? Well, kotlin doesn't really
|
||||
* like dealing with vararg ambiguity, and so while kotlin can't figure out
|
||||
* what is and isn't a vararg when I call display with a player, java can.
|
||||
* <p>
|
||||
* Because of this, I need to have this part of the code in java.
|
||||
*
|
||||
* <b>Don't call this method as part of your plugins!</b>
|
||||
* <p>
|
||||
* No, seriously - don't. This skips a bunch of checks and you'll almost
|
||||
* definitely break something.
|
||||
*
|
||||
* @param module The display module.
|
||||
* @param itemStack The ItemStack.
|
||||
* @param player The player.
|
||||
* @param args The args.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void callDisplayModule(@NotNull final DisplayModule module,
|
||||
@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
module.display(itemStack, args);
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the display handler.
|
||||
* <p>
|
||||
|
||||
@@ -14,7 +14,7 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
/**
|
||||
* The priority of the module.
|
||||
*/
|
||||
private final DisplayPriority priority;
|
||||
private final int weight;
|
||||
|
||||
/**
|
||||
* Create a new display module.
|
||||
@@ -25,7 +25,19 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
protected DisplayModule(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final DisplayPriority priority) {
|
||||
super(plugin);
|
||||
this.priority = priority;
|
||||
this.weight = 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) {
|
||||
super(plugin);
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -52,6 +64,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.
|
||||
*
|
||||
@@ -84,8 +111,25 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
) {
|
||||
}
|
||||
@@ -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.
|
||||
*
|
||||
@@ -45,17 +48,54 @@ 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)
|
||||
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 +104,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 +118,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 +162,6 @@ public interface FastItemStack {
|
||||
|
||||
/**
|
||||
* Get the rework penalty.
|
||||
* .
|
||||
*
|
||||
* @return The rework penalty found on the item.
|
||||
*/
|
||||
@@ -116,11 +196,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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -59,6 +60,53 @@ public interface Menu {
|
||||
*/
|
||||
List<ItemStack> getCaptiveItems(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Write data.
|
||||
*
|
||||
@@ -68,7 +116,9 @@ public interface Menu {
|
||||
* @param value The value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @deprecated Use addState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
<T, Z> void writeData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type,
|
||||
@@ -83,7 +133,9 @@ public interface Menu {
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The data.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
@Nullable <T, Z> T readData(@NotNull Player player,
|
||||
@NotNull NamespacedKey key,
|
||||
@NotNull PersistentDataType<T, Z> type);
|
||||
@@ -93,7 +145,9 @@ public interface Menu {
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The keys.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
Set<NamespacedKey> getKeys(@NotNull Player player);
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,9 +2,11 @@ package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import com.willfp.eco.core.gui.slot.FillerMask;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
@@ -66,6 +68,22 @@ public interface MenuBuilder {
|
||||
*/
|
||||
MenuBuilder onClose(@NotNull CloseHandler action);
|
||||
|
||||
/**
|
||||
* Set the menu open handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onOpen(@NotNull OpenHandler action);
|
||||
|
||||
/**
|
||||
* Set the action to run on render.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onRender(@NotNull BiConsumer<Player, Menu> action);
|
||||
|
||||
/**
|
||||
* Build the menu.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -28,6 +28,26 @@ public interface Slot {
|
||||
*/
|
||||
boolean isCaptive();
|
||||
|
||||
/**
|
||||
* If the slot is not captive for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If not captive for the player.
|
||||
*/
|
||||
default boolean isNotCaptiveFor(@NotNull Player player) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for an ItemStack.
|
||||
*
|
||||
|
||||
@@ -3,10 +3,12 @@ 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.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Builder to create slots.
|
||||
@@ -102,6 +104,14 @@ public interface SlotBuilder {
|
||||
*/
|
||||
SlotBuilder onMiddleClick(@NotNull SlotHandler 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);
|
||||
|
||||
/**
|
||||
* Modify the ItemStack.
|
||||
*
|
||||
@@ -130,7 +140,17 @@ public interface SlotBuilder {
|
||||
*
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setCaptive();
|
||||
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.
|
||||
|
||||
@@ -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.getHandler().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,48 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
*/
|
||||
public interface 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.
|
||||
*/
|
||||
boolean hasAmount(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Give money to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to give.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean giveMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Remove money from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param amount The amount to remove.
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
boolean removeMoney(@NotNull OfflinePlayer player,
|
||||
double amount);
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
double getBalance(@NotNull OfflinePlayer player);
|
||||
}
|
||||
@@ -13,14 +13,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 +43,8 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.hasAmount(player, amount);
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.hasAmount(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -58,8 +59,8 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.giveMoney(player, amount);
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.giveMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -74,8 +75,8 @@ public final class EconomyManager {
|
||||
*/
|
||||
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.removeMoney(player, amount);
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.removeMoney(player, amount);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -88,8 +89,8 @@ public final class EconomyManager {
|
||||
* @return The balance.
|
||||
*/
|
||||
public static double getBalance(@NotNull final OfflinePlayer player) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.getBalance(player);
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.getBalance(player);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper class for hologram integrations.
|
||||
*/
|
||||
public interface HologramIntegration extends Integration {
|
||||
/**
|
||||
* Create hologram.
|
||||
*
|
||||
* @param location The location.
|
||||
* @param contents The contents for the hologram.
|
||||
* @return The hologram.
|
||||
*/
|
||||
Hologram createHologram(@NotNull Location location,
|
||||
@NotNull List<String> contents);
|
||||
}
|
||||
@@ -14,14 +14,15 @@ public final class HologramManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<HologramWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<HologramIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final HologramWrapper integration) {
|
||||
public static void register(@NotNull final HologramIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -34,8 +35,8 @@ public final class HologramManager {
|
||||
*/
|
||||
public static Hologram createHologram(@NotNull final Location location,
|
||||
@NotNull final List<String> contents) {
|
||||
for (HologramWrapper wrapper : REGISTERED) {
|
||||
return wrapper.createHologram(location, contents);
|
||||
for (HologramIntegration integration : REGISTERED) {
|
||||
return integration.createHologram(location, contents);
|
||||
}
|
||||
|
||||
return new DummyHologram();
|
||||
|
||||
@@ -1,22 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.Location;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wrapper class for hologram integrations.
|
||||
*
|
||||
* @deprecated Use HologramIntegration instead.
|
||||
*/
|
||||
public interface HologramWrapper extends Integration {
|
||||
/**
|
||||
* Create hologram.
|
||||
*
|
||||
* @param location The location.
|
||||
* @param contents The contents for the hologram.
|
||||
* @return The hologram.
|
||||
*/
|
||||
Hologram createHologram(@NotNull Location location,
|
||||
@NotNull List<String> contents);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface HologramWrapper extends HologramIntegration {
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.willfp.eco.core.integrations.mcmmo;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.Event;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for mcmmo integrations.
|
||||
*/
|
||||
public interface McmmoIntegration extends Integration {
|
||||
/**
|
||||
* Get bonus drop count of block.
|
||||
*
|
||||
* @param block The block.
|
||||
* @return The drop multiplier.
|
||||
*/
|
||||
int getBonusDropCount(@NotNull Block block);
|
||||
|
||||
/**
|
||||
* Get if event is fake.
|
||||
*
|
||||
* @param event The event.
|
||||
* @return If is fake.
|
||||
*/
|
||||
boolean isFake(@NotNull Event event);
|
||||
}
|
||||
@@ -14,14 +14,15 @@ public final class McmmoManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<McmmoWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<McmmoIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final McmmoWrapper integration) {
|
||||
public static void register(@NotNull final McmmoIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
@@ -32,8 +33,8 @@ public final class McmmoManager {
|
||||
* @return The bonus drop count.
|
||||
*/
|
||||
public static int getBonusDropCount(@NotNull final Block block) {
|
||||
for (McmmoWrapper mcmmoWrapper : REGISTERED) {
|
||||
return mcmmoWrapper.getBonusDropCount(block);
|
||||
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
||||
return mcmmoIntegration.getBonusDropCount(block);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -45,8 +46,8 @@ public final class McmmoManager {
|
||||
* @return If the event is fake.
|
||||
*/
|
||||
public static boolean isFake(@NotNull final Event event) {
|
||||
for (McmmoWrapper mcmmoWrapper : REGISTERED) {
|
||||
return mcmmoWrapper.isFake(event);
|
||||
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
||||
return mcmmoIntegration.isFake(event);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,27 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.mcmmo;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.Event;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for mcmmo integrations.
|
||||
*
|
||||
* @deprecated Use McmmoIntegration instead.
|
||||
*/
|
||||
public interface McmmoWrapper extends Integration {
|
||||
/**
|
||||
* Get bonus drop count of block.
|
||||
*
|
||||
* @param block The block.
|
||||
* @return The drop multiplier.
|
||||
*/
|
||||
int getBonusDropCount(@NotNull Block block);
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface McmmoWrapper extends McmmoIntegration {
|
||||
|
||||
/**
|
||||
* Get if event is fake.
|
||||
*
|
||||
* @param event The event.
|
||||
* @return If is fake.
|
||||
*/
|
||||
boolean isFake(@NotNull Event event);
|
||||
}
|
||||
|
||||
@@ -4,15 +4,21 @@ import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||
import com.willfp.eco.core.placeholder.Placeholder;
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
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.HashSet;
|
||||
@@ -20,6 +26,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Class to handle placeholder integrations.
|
||||
@@ -43,6 +51,27 @@ public final class PlaceholderManager {
|
||||
.expireAfterWrite(50, TimeUnit.MILLISECONDS)
|
||||
.build(key -> key.entry.getValue(key.player));
|
||||
|
||||
/**
|
||||
* Empty injectable object.
|
||||
*/
|
||||
private static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
||||
@Override
|
||||
public void clearInjectedPlaceholders() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull
|
||||
List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* The default PlaceholderAPI pattern; brought in for compatibility.
|
||||
*/
|
||||
private static final Pattern PATTERN = Pattern.compile("[%]([^%]+)[%]");
|
||||
|
||||
/**
|
||||
* Register a new placeholder integration.
|
||||
*
|
||||
@@ -144,7 +173,7 @@ public final class PlaceholderManager {
|
||||
*/
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player) {
|
||||
return translatePlaceholders(text, player, Collections.emptyList());
|
||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -154,17 +183,75 @@ public final class PlaceholderManager {
|
||||
* @param player The player to translate the placeholders with respect to.
|
||||
* @param statics Extra static placeholders.
|
||||
* @return The text, translated.
|
||||
* @deprecated Use new static system.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final List<StaticPlaceholder> statics) {
|
||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate all placeholders with respect to a player.
|
||||
*
|
||||
* @param text The text that may contain placeholders to translate.
|
||||
* @param player The player to translate the placeholders with respect to.
|
||||
* @param context The injectable context.
|
||||
* @return The text, translated.
|
||||
*/
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context) {
|
||||
return translatePlaceholders(text, player, context, new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate all placeholders with respect to a player.
|
||||
*
|
||||
* @param text The text that may contain placeholders to translate.
|
||||
* @param player The player to translate the placeholders with respect to.
|
||||
* @param context The injectable context.
|
||||
* @param additionalPlayers Additional players to translate placeholders for.
|
||||
* @return The text, translated.
|
||||
*/
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context,
|
||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||
String processed = text;
|
||||
|
||||
// Prevent running 2 scans if there are no additional players.
|
||||
if (!additionalPlayers.isEmpty()) {
|
||||
List<String> found = findPlaceholdersIn(text);
|
||||
|
||||
for (AdditionalPlayer additionalPlayer : additionalPlayers) {
|
||||
for (String placeholder : found) {
|
||||
String prefix = "%" + additionalPlayer.getIdentifier() + "_";
|
||||
|
||||
if (placeholder.startsWith(prefix)) {
|
||||
processed = processed.replace(
|
||||
placeholder,
|
||||
translatePlaceholders(
|
||||
"%" + StringUtils.removePrefix(prefix, placeholder),
|
||||
additionalPlayer.getPlayer()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
processed = integration.translate(processed, player);
|
||||
}
|
||||
for (StaticPlaceholder placeholder : statics) {
|
||||
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||
// Do I know this is a bad way of doing this? Yes.
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
||||
if (injection instanceof StaticPlaceholder placeholder) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
||||
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||
}
|
||||
}
|
||||
return processed;
|
||||
}
|
||||
@@ -176,12 +263,21 @@ public final class PlaceholderManager {
|
||||
* @return The placeholders.
|
||||
*/
|
||||
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||
List<String> found = new ArrayList<>();
|
||||
Set<String> found = new HashSet<>();
|
||||
|
||||
// Mock PAPI for those without it installed
|
||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||
Matcher matcher = PATTERN.matcher(text);
|
||||
while (matcher.find()) {
|
||||
found.add(matcher.group());
|
||||
}
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
found.addAll(integration.findPlaceholdersIn(text));
|
||||
}
|
||||
|
||||
return found;
|
||||
return new ArrayList<>(found);
|
||||
}
|
||||
|
||||
private record EntryWithPlayer(@NotNull PlayerPlaceholder entry,
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Wrapper class for shop integrations.
|
||||
*/
|
||||
public interface ShopIntegration extends Integration {
|
||||
/**
|
||||
* Register eco item provider for shop plugins.
|
||||
*/
|
||||
default void registerEcoProvider() {
|
||||
// Do nothing unless overridden.
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the sell event adapter.
|
||||
*
|
||||
* @return The listener.
|
||||
*/
|
||||
@Nullable
|
||||
default Listener getSellEventAdapter() {
|
||||
// Do nothing unless overridden.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -12,23 +15,40 @@ public final class ShopManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<ShopWrapper> REGISTERED = new HashSet<>();
|
||||
private static final Set<ShopIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final ShopWrapper integration) {
|
||||
public static void register(@NotNull final ShopIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the events with eco.
|
||||
*
|
||||
* @param plugin Instance of eco.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void registerEvents(@NotNull final EcoPlugin plugin) {
|
||||
for (ShopIntegration integration : REGISTERED) {
|
||||
Listener listener = integration.getSellEventAdapter();
|
||||
|
||||
if (listener != null) {
|
||||
plugin.getEventManager().registerListener(listener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register eco item provider for shop plugins.
|
||||
*/
|
||||
public static void registerEcoProvider() {
|
||||
for (ShopWrapper shopWrapper : REGISTERED) {
|
||||
shopWrapper.registerEcoProvider();
|
||||
for (ShopIntegration shopIntegration : REGISTERED) {
|
||||
shopIntegration.registerEcoProvider();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Unified event for shop plugins to fire in order to have sell multipliers.
|
||||
*/
|
||||
public class ShopSellEvent extends PlayerEvent {
|
||||
/**
|
||||
* The event handler list.
|
||||
*/
|
||||
private static final HandlerList HANDLER_LIST = new HandlerList();
|
||||
|
||||
/**
|
||||
* The sell price.
|
||||
*/
|
||||
private double price;
|
||||
|
||||
/**
|
||||
* The item to be sold.
|
||||
*/
|
||||
@Nullable
|
||||
private final ItemStack item;
|
||||
|
||||
/**
|
||||
* Create new shop sell event.
|
||||
*
|
||||
* @param who The player.
|
||||
* @param price The price.
|
||||
* @param item The item.
|
||||
*/
|
||||
public ShopSellEvent(@NotNull final Player who,
|
||||
final double price,
|
||||
@Nullable final ItemStack item) {
|
||||
super(who);
|
||||
|
||||
this.price = price;
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price.
|
||||
*
|
||||
* @return The price.
|
||||
*/
|
||||
public double getPrice() {
|
||||
return this.price;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the price.
|
||||
*
|
||||
* @param price The price.
|
||||
*/
|
||||
public void setPrice(final double price) {
|
||||
this.price = price;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the item to be sold.
|
||||
*
|
||||
* @return The item. Can be null for some plugins, so check hasKnownItem first!
|
||||
*/
|
||||
@Nullable
|
||||
public ItemStack getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if the item is known. Some shop plugins are lacking this in their event,
|
||||
* so always check this before getItem(), as getItem() may be null.
|
||||
*
|
||||
* @return If the item is known.
|
||||
*/
|
||||
public boolean hasKnownItem() {
|
||||
return item != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*
|
||||
* @return The handlers.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return HANDLER_LIST;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bukkit parity.
|
||||
*
|
||||
* @return The handlers.
|
||||
*/
|
||||
@NotNull
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLER_LIST;
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for shop integrations.
|
||||
*
|
||||
* @deprecated Use ShopIntegration instead.
|
||||
*/
|
||||
public interface ShopWrapper extends Integration {
|
||||
/**
|
||||
* Register eco item provider for shop plugins.
|
||||
*/
|
||||
void registerEcoProvider();
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface ShopWrapper extends ShopIntegration {
|
||||
|
||||
}
|
||||
|
||||
@@ -48,6 +48,11 @@ public class CustomItem implements TestableItem {
|
||||
this.test = test;
|
||||
this.item = item;
|
||||
|
||||
/*
|
||||
This runs the next tick, because it's very likely that the test can't return true
|
||||
immediately after due to registration order; so eco waits until the item should be
|
||||
working in order to check.
|
||||
*/
|
||||
Eco.getHandler().getEcoPlugin().getScheduler().runLater(() -> {
|
||||
if (!matches(getItem())) {
|
||||
Bukkit.getLogger().severe("Item with key " + key + " is invalid!");
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.willfp.eco.core.items;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.core.items.args.LookupArgParser;
|
||||
import com.willfp.eco.core.items.provider.ItemProvider;
|
||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||
@@ -13,8 +15,10 @@ import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import com.willfp.eco.util.NumberUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -182,6 +186,10 @@ public final class Items {
|
||||
*/
|
||||
@NotNull
|
||||
public static TestableItem lookup(@NotNull final String key) {
|
||||
if (key.startsWith("{")) {
|
||||
return Eco.getHandler().getSNBTHandler().createTestable(key);
|
||||
}
|
||||
|
||||
return ITEMS_LOOKUP_HANDLER.parseKey(key);
|
||||
}
|
||||
|
||||
@@ -219,7 +227,10 @@ public final class Items {
|
||||
|
||||
if (part == null && PROVIDERS.containsKey(namespace)) {
|
||||
ItemProvider provider = PROVIDERS.get(namespace);
|
||||
item = provider.provideForKey(keyID);
|
||||
|
||||
String reformattedKey = keyID.replace("__", ":");
|
||||
|
||||
item = provider.provideForKey(reformattedKey);
|
||||
if (item instanceof EmptyTestableItem || item == null) {
|
||||
return new EmptyTestableItem();
|
||||
}
|
||||
@@ -430,6 +441,112 @@ public final class Items {
|
||||
return items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge ItemStack onto another ItemStack.
|
||||
*
|
||||
* @param from The ItemStack to merge from.
|
||||
* @param to The ItemStack to merge onto.
|
||||
* @return The ItemStack, merged (same instance as to).
|
||||
*/
|
||||
@NotNull
|
||||
public static ItemStack mergeFrom(@NotNull final ItemStack from,
|
||||
@NotNull final ItemStack to) {
|
||||
ItemMeta fromMeta = from.getItemMeta();
|
||||
ItemMeta toMeta = to.getItemMeta();
|
||||
|
||||
if (fromMeta == null || toMeta == null) {
|
||||
return to;
|
||||
}
|
||||
|
||||
ItemMeta newMeta = mergeFrom(fromMeta, toMeta);
|
||||
|
||||
to.setItemMeta(newMeta);
|
||||
to.setType(from.getType());
|
||||
to.setAmount(from.getAmount());
|
||||
return to;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge ItemMeta onto other ItemMeta.
|
||||
*
|
||||
* @param from The ItemMeta to merge from.
|
||||
* @param to The ItemMeta to merge onto.
|
||||
* @return The ItemMeta, merged (same instance as to).
|
||||
*/
|
||||
@NotNull
|
||||
public static ItemMeta mergeFrom(@NotNull final ItemMeta from,
|
||||
@NotNull final ItemMeta to) {
|
||||
if (from.hasDisplayName()) {
|
||||
to.setDisplayName(from.getDisplayName());
|
||||
}
|
||||
|
||||
to.setLore(from.getLore());
|
||||
|
||||
for (Enchantment enchant : to.getEnchants().keySet()) {
|
||||
to.removeEnchant(enchant);
|
||||
}
|
||||
|
||||
for (Map.Entry<Enchantment, Integer> entry : from.getEnchants().entrySet()) {
|
||||
to.addEnchant(entry.getKey(), entry.getValue(), true);
|
||||
}
|
||||
|
||||
if (from.hasCustomModelData()) {
|
||||
to.setCustomModelData(from.getCustomModelData());
|
||||
} else {
|
||||
to.setCustomModelData(null);
|
||||
}
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the base NBT tag on an item.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
* @return The base NBT.
|
||||
*/
|
||||
@NotNull
|
||||
public static PersistentDataContainer getBaseNBT(@NotNull final ItemStack itemStack) {
|
||||
return FastItemStack.wrap(itemStack).getBaseTag();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the base NBT tag on an item.
|
||||
*
|
||||
* @param itemStack The ItemStack.
|
||||
* @param container The base NBT tag.
|
||||
* @return The ItemStack, modified. Not required to use, as this modifies the instance.¬
|
||||
*/
|
||||
@NotNull
|
||||
public static ItemStack setBaseNBT(@NotNull final ItemStack itemStack,
|
||||
@Nullable final PersistentDataContainer container) {
|
||||
FastItemStack fis = FastItemStack.wrap(itemStack);
|
||||
fis.setBaseTag(container);
|
||||
return fis.unwrap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert item to SNBT.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The NBT string.
|
||||
*/
|
||||
@NotNull
|
||||
public static String toSNBT(@NotNull final ItemStack itemStack) {
|
||||
return Eco.getHandler().getSNBTHandler().toSNBT(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get item from SNBT.
|
||||
*
|
||||
* @param snbt The NBT string.
|
||||
* @return The ItemStack, or null if invalid.
|
||||
*/
|
||||
@Nullable
|
||||
public static ItemStack fromSNBT(@NotNull final String snbt) {
|
||||
return Eco.getHandler().getSNBTHandler().fromSNBT(snbt);
|
||||
}
|
||||
|
||||
private Items() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.willfp.eco.core.items;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* API to handle SNBT conversion.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface SNBTHandler {
|
||||
/**
|
||||
* 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 createTestable(@NotNull String snbt);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.willfp.eco.core.placeholder;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* An additional player with an identifier to parse placeholders for the player.
|
||||
*/
|
||||
public class AdditionalPlayer {
|
||||
/**
|
||||
* The player.
|
||||
*/
|
||||
private final Player player;
|
||||
|
||||
/**
|
||||
* The identifier.
|
||||
*/
|
||||
private final String identifier;
|
||||
|
||||
/**
|
||||
* Create a new additional player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param identifier The identifier.
|
||||
*/
|
||||
public AdditionalPlayer(@NotNull final Player player,
|
||||
@NotNull final String identifier) {
|
||||
this.player = player;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player.
|
||||
*
|
||||
* @return The player.
|
||||
*/
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the identifier.
|
||||
*
|
||||
* @return The identifier.
|
||||
*/
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.willfp.eco.core.placeholder;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
|
||||
/**
|
||||
* Placeholders that can be injected into {@link PlaceholderInjectable} objects.
|
||||
*/
|
||||
public sealed interface InjectablePlaceholder extends Placeholder permits PlayerStaticPlaceholder, StaticPlaceholder {
|
||||
@Override
|
||||
default EcoPlugin getPlugin() {
|
||||
return Eco.getHandler().getEcoPlugin();
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import com.willfp.eco.core.EcoPlugin;
|
||||
/**
|
||||
* A placeholder represents a string that can hold a value.
|
||||
*/
|
||||
public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceholder, StaticPlaceholder {
|
||||
public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceholder, InjectablePlaceholder {
|
||||
/**
|
||||
* Get the plugin that holds the placeholder.
|
||||
*
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.willfp.eco.core.placeholder;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -22,7 +23,40 @@ public interface PlaceholderInjectable {
|
||||
*
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
void injectPlaceholders(@NotNull Iterable<StaticPlaceholder> placeholders);
|
||||
default void injectPlaceholders(@NotNull InjectablePlaceholder... placeholders) {
|
||||
this.addInjectablePlaceholder(List.of(placeholders));
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject placeholder.
|
||||
*
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default void injectPlaceholders(@NotNull Iterable<StaticPlaceholder> placeholders) {
|
||||
List<InjectablePlaceholder> toInject = new ArrayList<>();
|
||||
for (StaticPlaceholder placeholder : placeholders) {
|
||||
toInject.add(placeholder);
|
||||
}
|
||||
this.addInjectablePlaceholder(toInject);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject placeholders.
|
||||
* <p>
|
||||
* When implementing a PlaceholderInjectable object, override this method.
|
||||
*
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
default void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||
List<StaticPlaceholder> toInject = new ArrayList<>();
|
||||
for (InjectablePlaceholder placeholder : placeholders) {
|
||||
if (placeholder instanceof StaticPlaceholder staticPlaceholder) {
|
||||
toInject.add(staticPlaceholder);
|
||||
}
|
||||
}
|
||||
this.injectPlaceholders(toInject);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear injected placeholders.
|
||||
@@ -33,6 +67,31 @@ public interface PlaceholderInjectable {
|
||||
* Get injected placeholders.
|
||||
*
|
||||
* @return Injected placeholders.
|
||||
* @deprecated Use getPlaceholderInjections.
|
||||
*/
|
||||
List<StaticPlaceholder> getInjectedPlaceholders();
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
@NotNull
|
||||
default List<StaticPlaceholder> getInjectedPlaceholders() {
|
||||
List<StaticPlaceholder> found = new ArrayList<>();
|
||||
|
||||
for (InjectablePlaceholder placeholder : getPlaceholderInjections()) {
|
||||
if (placeholder instanceof StaticPlaceholder staticPlaceholder) {
|
||||
found.add(staticPlaceholder);
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get injected placeholders.
|
||||
* <p>
|
||||
* Override this method in implementations.
|
||||
*
|
||||
* @return Injected placeholders.
|
||||
*/
|
||||
@NotNull
|
||||
default List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return new ArrayList<>(getInjectedPlaceholders());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ public final class PlayerPlaceholder implements Placeholder {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof StaticPlaceholder that)) {
|
||||
if (!(o instanceof PlayerPlaceholder that)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.getIdentifier(), that.getIdentifier())
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.willfp.eco.core.placeholder;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* A placeholder that cannot be registered, and exists purely in injection.
|
||||
*/
|
||||
public final class PlayerStaticPlaceholder implements InjectablePlaceholder {
|
||||
/**
|
||||
* The name of the placeholder.
|
||||
*/
|
||||
private final String identifier;
|
||||
|
||||
/**
|
||||
* The function to retrieve the output of the placeholder.
|
||||
*/
|
||||
private final Function<Player, String> function;
|
||||
|
||||
/**
|
||||
* Create a new player placeholder.
|
||||
*
|
||||
* @param identifier The identifier.
|
||||
* @param function The function to retrieve the value.
|
||||
*/
|
||||
public PlayerStaticPlaceholder(@NotNull final String identifier,
|
||||
@NotNull final Function<Player, String> function) {
|
||||
this.identifier = identifier;
|
||||
this.function = function;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of the placeholder.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The value.
|
||||
*/
|
||||
public String getValue(@NotNull final Player player) {
|
||||
return function.apply(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdentifier() {
|
||||
return this.identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable final Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof PlayerStaticPlaceholder that)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.getIdentifier(), that.getIdentifier());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.getIdentifier());
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ public final class PlayerlessPlaceholder implements Placeholder {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof StaticPlaceholder that)) {
|
||||
if (!(o instanceof PlayerlessPlaceholder that)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.getIdentifier(), that.getIdentifier())
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.willfp.eco.core.placeholder;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -11,7 +9,7 @@ import java.util.function.Supplier;
|
||||
/**
|
||||
* A placeholder that cannot be registered, and exists purely in injection.
|
||||
*/
|
||||
public final class StaticPlaceholder implements Placeholder {
|
||||
public final class StaticPlaceholder implements InjectablePlaceholder {
|
||||
/**
|
||||
* The name of the placeholder.
|
||||
*/
|
||||
@@ -43,11 +41,6 @@ public final class StaticPlaceholder implements Placeholder {
|
||||
return function.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EcoPlugin getPlugin() {
|
||||
return Eco.getHandler().getEcoPlugin();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdentifier() {
|
||||
return this.identifier;
|
||||
|
||||
@@ -20,7 +20,8 @@ public final class ProxyConstants {
|
||||
public static final List<String> SUPPORTED_VERSIONS = Arrays.asList(
|
||||
"v1_17_R1",
|
||||
"v1_18_R1",
|
||||
"v1_18_R2"
|
||||
"v1_18_R2",
|
||||
"v1_19_R1"
|
||||
);
|
||||
|
||||
private ProxyConstants() {
|
||||
|
||||
@@ -96,50 +96,53 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
shapedRecipe.setIngredient(character, parts.get(i).getItem().getType());
|
||||
}
|
||||
|
||||
ShapedRecipe displayedRecipe = new ShapedRecipe(this.getDisplayedKey(), this.getOutput());
|
||||
displayedRecipe.shape("012", "345", "678");
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (parts.get(i) instanceof EmptyTestableItem) {
|
||||
continue;
|
||||
}
|
||||
|
||||
char character = String.valueOf(i).toCharArray()[0];
|
||||
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
if (parts.get(i) instanceof GroupedTestableItems group) {
|
||||
items.addAll(group.getChildren());
|
||||
} else {
|
||||
items.add(parts.get(i));
|
||||
}
|
||||
|
||||
List<ItemStack> displayedItems = new ArrayList<>();
|
||||
|
||||
for (TestableItem testableItem : items) {
|
||||
if (testableItem instanceof TestableStack) {
|
||||
ItemStack item = testableItem.getItem().clone();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
assert meta != null;
|
||||
|
||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||
assert lore != null;
|
||||
lore.add("");
|
||||
String add = Eco.getHandler().getEcoPlugin().getLangYml().getFormattedString("multiple-in-craft");
|
||||
add = add.replace("%amount%", String.valueOf(item.getAmount()));
|
||||
lore.add(add);
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
|
||||
displayedItems.add(item);
|
||||
} else {
|
||||
displayedItems.add(testableItem.getItem());
|
||||
if (Eco.getHandler().getEcoPlugin().getConfigYml().getBool("displayed-recipes")) {
|
||||
ShapedRecipe displayedRecipe = new ShapedRecipe(this.getDisplayedKey(), this.getOutput());
|
||||
displayedRecipe.shape("012", "345", "678");
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (parts.get(i) instanceof EmptyTestableItem) {
|
||||
continue;
|
||||
}
|
||||
|
||||
char character = String.valueOf(i).toCharArray()[0];
|
||||
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
if (parts.get(i) instanceof GroupedTestableItems group) {
|
||||
items.addAll(group.getChildren());
|
||||
} else {
|
||||
items.add(parts.get(i));
|
||||
}
|
||||
|
||||
List<ItemStack> displayedItems = new ArrayList<>();
|
||||
|
||||
for (TestableItem testableItem : items) {
|
||||
if (testableItem instanceof TestableStack) {
|
||||
ItemStack item = testableItem.getItem().clone();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
assert meta != null;
|
||||
|
||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||
assert lore != null;
|
||||
lore.add("");
|
||||
String add = Eco.getHandler().getEcoPlugin().getLangYml().getFormattedString("multiple-in-craft");
|
||||
add = add.replace("%amount%", String.valueOf(item.getAmount()));
|
||||
lore.add(add);
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
|
||||
displayedItems.add(item);
|
||||
} else {
|
||||
displayedItems.add(testableItem.getItem());
|
||||
}
|
||||
}
|
||||
|
||||
displayedRecipe.setIngredient(character, new RecipeChoice.ExactChoice(displayedItems));
|
||||
}
|
||||
|
||||
displayedRecipe.setIngredient(character, new RecipeChoice.ExactChoice(displayedItems));
|
||||
Bukkit.getServer().addRecipe(displayedRecipe);
|
||||
}
|
||||
|
||||
Bukkit.getServer().addRecipe(shapedRecipe);
|
||||
Bukkit.getServer().addRecipe(displayedRecipe);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -101,43 +101,46 @@ public final class ShapelessCraftingRecipe extends PluginDependent<EcoPlugin> im
|
||||
shapelessRecipe.addIngredient(part.getItem().getType());
|
||||
}
|
||||
|
||||
ShapelessRecipe displayedRecipe = new ShapelessRecipe(this.getDisplayedKey(), this.getOutput());
|
||||
for (TestableItem part : parts) {
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
if (part instanceof GroupedTestableItems group) {
|
||||
items.addAll(group.getChildren());
|
||||
} else {
|
||||
items.add(part);
|
||||
}
|
||||
|
||||
List<ItemStack> displayedItems = new ArrayList<>();
|
||||
|
||||
for (TestableItem testableItem : items) {
|
||||
if (testableItem instanceof TestableStack) {
|
||||
ItemStack item = testableItem.getItem().clone();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
assert meta != null;
|
||||
|
||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||
assert lore != null;
|
||||
lore.add("");
|
||||
String add = Eco.getHandler().getEcoPlugin().getLangYml().getFormattedString("multiple-in-craft");
|
||||
add = add.replace("%amount%", String.valueOf(item.getAmount()));
|
||||
lore.add(add);
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
|
||||
displayedItems.add(item);
|
||||
if (Eco.getHandler().getEcoPlugin().getConfigYml().getBool("displayed-recipes")) {
|
||||
ShapelessRecipe displayedRecipe = new ShapelessRecipe(this.getDisplayedKey(), this.getOutput());
|
||||
for (TestableItem part : parts) {
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
if (part instanceof GroupedTestableItems group) {
|
||||
items.addAll(group.getChildren());
|
||||
} else {
|
||||
displayedItems.add(testableItem.getItem());
|
||||
items.add(part);
|
||||
}
|
||||
|
||||
List<ItemStack> displayedItems = new ArrayList<>();
|
||||
|
||||
for (TestableItem testableItem : items) {
|
||||
if (testableItem instanceof TestableStack) {
|
||||
ItemStack item = testableItem.getItem().clone();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
assert meta != null;
|
||||
|
||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||
assert lore != null;
|
||||
lore.add("");
|
||||
String add = Eco.getHandler().getEcoPlugin().getLangYml().getFormattedString("multiple-in-craft");
|
||||
add = add.replace("%amount%", String.valueOf(item.getAmount()));
|
||||
lore.add(add);
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
|
||||
displayedItems.add(item);
|
||||
} else {
|
||||
displayedItems.add(testableItem.getItem());
|
||||
}
|
||||
}
|
||||
|
||||
displayedRecipe.addIngredient(new RecipeChoice.ExactChoice(displayedItems));
|
||||
}
|
||||
|
||||
displayedRecipe.addIngredient(new RecipeChoice.ExactChoice(displayedItems));
|
||||
Bukkit.getServer().addRecipe(displayedRecipe);
|
||||
}
|
||||
|
||||
Bukkit.getServer().addRecipe(shapelessRecipe);
|
||||
Bukkit.getServer().addRecipe(displayedRecipe);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,6 +18,11 @@ import java.util.Set;
|
||||
* Utilities / API methods for blocks.
|
||||
*/
|
||||
public final class BlockUtils {
|
||||
/**
|
||||
* Max blocks to mine (yes, this is to prevent a stack overflow).
|
||||
*/
|
||||
private static final int MAX_BLOCKS = 2500;
|
||||
|
||||
private static Set<Block> getNearbyBlocks(@NotNull final Block start,
|
||||
@NotNull final List<Material> allowedMaterials,
|
||||
@NotNull final Set<Block> blocks,
|
||||
@@ -31,7 +36,7 @@ public final class BlockUtils {
|
||||
if (allowedMaterials.contains(block.getType())) {
|
||||
blocks.add(block);
|
||||
|
||||
if (blocks.size() > limit || blocks.size() > 2500) {
|
||||
if (blocks.size() > limit || blocks.size() > MAX_BLOCKS) {
|
||||
return blocks;
|
||||
}
|
||||
|
||||
|
||||
@@ -109,8 +109,8 @@ public final class DurabilityUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Damageable meta = (Damageable) item.getItemMeta();
|
||||
// Suppression because when I fix it, it causes weird compile bugs.
|
||||
@SuppressWarnings("PatternVariableCanBeUsed") Damageable meta = (Damageable) item.getItemMeta();
|
||||
meta.setDamage(meta.getDamage() + damage);
|
||||
|
||||
if (meta.getDamage() >= item.getType().getMaxDurability()) {
|
||||
|
||||
@@ -1,12 +1,24 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import com.willfp.eco.core.tuples.Pair;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Utilities / API methods for menus.
|
||||
*/
|
||||
public final class MenuUtils {
|
||||
/**
|
||||
* The menu supplier.
|
||||
*/
|
||||
private static Function<Player, Menu> menuGetter = null;
|
||||
|
||||
/**
|
||||
* Convert 0-53 slot to row and column pair.
|
||||
*
|
||||
@@ -20,6 +32,40 @@ public final class MenuUtils {
|
||||
return new Pair<>(row + 1, column + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert row and column to 0-53 slot.
|
||||
*
|
||||
* @param row The row.
|
||||
* @param column The column.
|
||||
* @return The slot.
|
||||
*/
|
||||
public static int rowColumnToSlot(final int row, final int column) {
|
||||
return (column - 1) + ((row - 1) * 9);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a player's open menu.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The menu, or null if none open.
|
||||
*/
|
||||
@Nullable
|
||||
public static Menu getOpenMenu(@NotNull final Player player) {
|
||||
return menuGetter.apply(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the tps supplier function.
|
||||
*
|
||||
* @param function The function.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void initialize(@NotNull final Function<Player, Menu> function) {
|
||||
Validate.isTrue(menuGetter == null, "Already initialized!");
|
||||
|
||||
menuGetter = function;
|
||||
}
|
||||
|
||||
private MenuUtils() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
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 org.apache.commons.lang.Validate;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -8,7 +11,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
@@ -252,7 +258,18 @@ public final class NumberUtils {
|
||||
*/
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player) {
|
||||
return evaluateExpression(expression, player, Collections.emptyList());
|
||||
return evaluateExpression(expression, player, new PlaceholderInjectable() {
|
||||
@Override
|
||||
public void clearInjectedPlaceholders() {
|
||||
// Nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull
|
||||
List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -262,11 +279,57 @@ public final class NumberUtils {
|
||||
* @param player The player.
|
||||
* @param statics The static placeholders.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
* @deprecated Use new statics system.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Iterable<StaticPlaceholder> statics) {
|
||||
return crunch.evaluate(expression, player, statics);
|
||||
return evaluateExpression(expression, player, new PlaceholderInjectable() {
|
||||
@Override
|
||||
public void clearInjectedPlaceholders() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
List<InjectablePlaceholder> injections = new ArrayList<>();
|
||||
for (StaticPlaceholder placeholder : statics) {
|
||||
injections.add(placeholder);
|
||||
}
|
||||
return injections;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate an expression with respect to a player (for placeholders).
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param context The injectable placeholders.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context) {
|
||||
return evaluateExpression(expression, player, context, new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate an expression with respect to a player (for placeholders).
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param context The injectable placeholders.
|
||||
* @param additionalPlayers Additional players to parse placeholders for.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context,
|
||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||
return crunch.evaluate(expression, player, context, additionalPlayers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -288,14 +351,16 @@ public final class NumberUtils {
|
||||
/**
|
||||
* Evaluate an expression.
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param statics The statics.
|
||||
* @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 Iterable<StaticPlaceholder> statics);
|
||||
@NotNull PlaceholderInjectable injectable,
|
||||
@NotNull Collection<AdditionalPlayer> additionalPlayers);
|
||||
}
|
||||
|
||||
private NumberUtils() {
|
||||
|
||||
@@ -10,8 +10,14 @@ import net.kyori.adventure.audience.Audience;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.AnimalTamer;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Projectile;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@@ -142,6 +148,39 @@ public final class PlayerUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Try an entity as a player.
|
||||
*
|
||||
* @param entity The entity.
|
||||
* @return The player, or null if no player could be found.
|
||||
*/
|
||||
@Nullable
|
||||
public static Player tryAsPlayer(@Nullable final Entity entity) {
|
||||
if (entity == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (entity instanceof Player player) {
|
||||
return player;
|
||||
}
|
||||
|
||||
if (entity instanceof Projectile projectile) {
|
||||
ProjectileSource shooter = projectile.getShooter();
|
||||
if (shooter instanceof Player player) {
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
if (entity instanceof Tameable tameable) {
|
||||
AnimalTamer tamer = tameable.getOwner();
|
||||
if (tamer instanceof Player player) {
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private PlayerUtils() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@@ -12,6 +13,7 @@ import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -41,6 +43,7 @@ public final class StringUtils {
|
||||
.add(Pattern.compile("<G#([0-9A-Fa-f]{6})>(.*?)</G#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<#:([0-9A-Fa-f]{6})>(.*?)</#:([0-9A-Fa-f]{6})>"))
|
||||
.add(Pattern.compile("\\{#:([0-9A-Fa-f]{6})}(.*?)\\{/#:([0-9A-Fa-f]{6})}"))
|
||||
.add(Pattern.compile("\\{#([0-9A-Fa-f]{6})>}(.*?)\\{#([0-9A-Fa-f]{6})<}"))
|
||||
.build();
|
||||
|
||||
/**
|
||||
@@ -76,33 +79,37 @@ public final class StringUtils {
|
||||
.build(StringUtils::processFormatting);
|
||||
|
||||
/**
|
||||
* Json -> Legacy Cache.
|
||||
* Json -> Component Cache.
|
||||
*/
|
||||
private static final LoadingCache<String, String> JSON_TO_LEGACY = Caffeine.newBuilder()
|
||||
private static final Cache<String, Component> JSON_TO_COMPONENT = Caffeine.newBuilder()
|
||||
.expireAfterAccess(10, TimeUnit.SECONDS)
|
||||
.build(
|
||||
json -> {
|
||||
try {
|
||||
Component component = GSON_COMPONENT_SERIALIZER.deserialize(json);
|
||||
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
||||
} catch (JsonSyntaxException e) {
|
||||
return json;
|
||||
}
|
||||
}
|
||||
);
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Legacy -> Json Cache.
|
||||
* Component -> Json Cache.
|
||||
*/
|
||||
private static final LoadingCache<String, String> LEGACY_TO_JSON = Caffeine.newBuilder()
|
||||
private static final Cache<Component, String> COMPONENT_TO_JSON = Caffeine.newBuilder()
|
||||
.expireAfterAccess(10, TimeUnit.SECONDS)
|
||||
.build(
|
||||
legacy -> GSON_COMPONENT_SERIALIZER.serialize(
|
||||
Component.empty().decoration(TextDecoration.ITALIC, false).append(
|
||||
LEGACY_COMPONENT_SERIALIZER.deserialize(legacy)
|
||||
)
|
||||
)
|
||||
);
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Legacy -> Component Cache.
|
||||
*/
|
||||
private static final Cache<String, Component> LEGACY_TO_COMPONENT = Caffeine.newBuilder()
|
||||
.expireAfterAccess(10, TimeUnit.SECONDS)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Component -> Legacy Cache.
|
||||
*/
|
||||
private static final Cache<Component, String> COMPONENT_TO_LEGACY = Caffeine.newBuilder()
|
||||
.expireAfterAccess(10, TimeUnit.SECONDS)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Empty JSON.
|
||||
*/
|
||||
private static final String EMPTY_JSON = GSON_COMPONENT_SERIALIZER.serialize(Component.empty());
|
||||
|
||||
/**
|
||||
* Color map.
|
||||
@@ -483,12 +490,7 @@ public final class StringUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public static String legacyToJson(@Nullable final String legacy) {
|
||||
String processed = legacy;
|
||||
if (legacy == null) {
|
||||
processed = "";
|
||||
}
|
||||
|
||||
return LEGACY_TO_JSON.get(processed);
|
||||
return componentToJson(toComponent(legacy));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -499,11 +501,53 @@ public final class StringUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public static String jsonToLegacy(@Nullable final String json) {
|
||||
if (json == null || json.isEmpty()) {
|
||||
return "";
|
||||
return toLegacy(jsonToComponent(json));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert Component to JSON String.
|
||||
*
|
||||
* @param component The Component.
|
||||
* @return The JSON string.
|
||||
*/
|
||||
@NotNull
|
||||
public static String componentToJson(@Nullable final Component component) {
|
||||
if (component == null) {
|
||||
return EMPTY_JSON;
|
||||
}
|
||||
|
||||
return JSON_TO_LEGACY.get(json);
|
||||
return COMPONENT_TO_JSON.get(component, it -> {
|
||||
try {
|
||||
return GSON_COMPONENT_SERIALIZER.serialize(
|
||||
Component.empty().decoration(TextDecoration.ITALIC, false).append(
|
||||
it
|
||||
)
|
||||
);
|
||||
} catch (JsonSyntaxException e) {
|
||||
return GSON_COMPONENT_SERIALIZER.serialize(Component.empty());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert JSON String to Component.
|
||||
*
|
||||
* @param json The JSON String.
|
||||
* @return The component.
|
||||
*/
|
||||
@NotNull
|
||||
public static Component jsonToComponent(@Nullable final String json) {
|
||||
if (json == null || json.isEmpty()) {
|
||||
return Component.empty();
|
||||
}
|
||||
|
||||
return JSON_TO_COMPONENT.get(json, it -> {
|
||||
try {
|
||||
return GSON_COMPONENT_SERIALIZER.deserialize(it);
|
||||
} catch (JsonSyntaxException e) {
|
||||
return Component.empty();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -514,12 +558,7 @@ public final class StringUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public static Component toComponent(@Nullable final String legacy) {
|
||||
String processed = legacy;
|
||||
if (legacy == null) {
|
||||
processed = "";
|
||||
}
|
||||
|
||||
return LEGACY_COMPONENT_SERIALIZER.deserialize(processed);
|
||||
return LEGACY_TO_COMPONENT.get(legacy == null ? "" : legacy, LEGACY_COMPONENT_SERIALIZER::deserialize);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -530,7 +569,7 @@ public final class StringUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public static String toLegacy(@NotNull final Component component) {
|
||||
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
||||
return COMPONENT_TO_LEGACY.get(component, LEGACY_COMPONENT_SERIALIZER::serialize);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -596,6 +635,59 @@ public final class StringUtils {
|
||||
return SPACE_AROUND_CHARACTER.get(separator).split(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create progress bar.
|
||||
*
|
||||
* @param character The bar character.
|
||||
* @param bars The number of bars.
|
||||
* @param progress The bar progress, between 0 and 1.
|
||||
* @param completeFormat The color of a complete bar section.
|
||||
* @param inProgressFormat The color of an in-progress bar section.
|
||||
* @param incompleteFormat The color of an incomplete bar section.
|
||||
* @return The progress bar.
|
||||
*/
|
||||
@NotNull
|
||||
public static String createProgressBar(final char character,
|
||||
final int bars,
|
||||
final double progress,
|
||||
@NotNull final String completeFormat,
|
||||
@NotNull final String inProgressFormat,
|
||||
@NotNull final String incompleteFormat) {
|
||||
Validate.isTrue(progress >= 0 && progress <= 1, "Progress must be between 0 and 1!");
|
||||
Validate.isTrue(bars > 1, "Must have at least 2 bars!");
|
||||
|
||||
String completeColor = format(completeFormat);
|
||||
String inProgressColor = format(inProgressFormat);
|
||||
String incompleteColor = format(incompleteFormat);
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
// Full bar special case.
|
||||
if (progress == 1) {
|
||||
builder.append(completeColor);
|
||||
builder.append(String.valueOf(character).repeat(bars));
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
int completeBars = (int) Math.floor(progress * bars);
|
||||
int incompleteBars = bars - completeBars - 1;
|
||||
|
||||
if (completeBars > 0) {
|
||||
builder.append(completeColor)
|
||||
.append(String.valueOf(character).repeat(completeBars));
|
||||
}
|
||||
|
||||
builder.append(inProgressColor)
|
||||
.append(character);
|
||||
|
||||
if (incompleteBars > 0) {
|
||||
builder.append(incompleteColor)
|
||||
.append(String.valueOf(character).repeat(incompleteBars));
|
||||
}
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for formatting.
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Utilities / API methods for teams.
|
||||
@@ -49,7 +48,7 @@ public final class TeamUtils {
|
||||
|
||||
Team team;
|
||||
|
||||
if (!SCOREBOARD.getTeams().stream().map(Team::getName).collect(Collectors.toList()).contains("EC-" + color.name())) {
|
||||
if (!SCOREBOARD.getTeams().stream().map(Team::getName).toList().contains("EC-" + color.name())) {
|
||||
team = SCOREBOARD.registerNewTeam("EC-" + color.name());
|
||||
} else {
|
||||
team = SCOREBOARD.getTeam("EC-" + color.name());
|
||||
|
||||
@@ -152,6 +152,20 @@ public final class VectorUtils {
|
||||
return vectors.toArray(new Vector[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a vector is a safe velocity.
|
||||
*
|
||||
* @param vec The vector to check.
|
||||
* @return If safe.
|
||||
*/
|
||||
public static boolean isSafeVelocity(@NotNull final Vector vec) {
|
||||
double x = Math.abs(vec.getX());
|
||||
double y = Math.abs(vec.getY());
|
||||
double z = Math.abs(vec.getZ());
|
||||
|
||||
return x < 4 && y < 4 && z < 4;
|
||||
}
|
||||
|
||||
private VectorUtils() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -121,8 +121,8 @@ fun CommandBase.addSubcommand(
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for commands.
|
||||
* Inherits plugin, permission, players only.
|
||||
* Kotlin builder for commands. Inherits plugin, permission, players
|
||||
* only.
|
||||
*
|
||||
* @param name The command name.
|
||||
* @param init The builder.
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
@file:JvmName("ConfigExtensions")
|
||||
|
||||
package com.willfp.eco.core.config
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config
|
||||
|
||||
/** Helper class to create configs with a kotlin DSL. */
|
||||
class DSLConfig internal constructor(type: ConfigType) : TransientConfig(emptyMap(), type) {
|
||||
/**
|
||||
* Map a key to a value.
|
||||
*
|
||||
* @param value The value.
|
||||
*/
|
||||
infix fun String.to(value: Any?) =
|
||||
set(this, value)
|
||||
|
||||
/**
|
||||
* Helper function to create configs with a kotlin DSL.
|
||||
*
|
||||
* Inherits the config type of the sub-builder.
|
||||
*
|
||||
* @param builder The builder.
|
||||
* @return The config.
|
||||
*/
|
||||
fun config(builder: DSLConfig.() -> Unit): Config =
|
||||
DSLConfig(type).apply(builder)
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to create configs with a kotlin DSL.
|
||||
*
|
||||
* @param builder The builder.
|
||||
* @return The config.
|
||||
*/
|
||||
fun config(type: ConfigType = ConfigType.YAML, builder: DSLConfig.() -> Unit): Config =
|
||||
DSLConfig(type).apply(builder)
|
||||
@@ -0,0 +1,37 @@
|
||||
@file:JvmName("PersistentDataContainerExtensions")
|
||||
|
||||
package com.willfp.eco.core.data
|
||||
|
||||
import org.bukkit.persistence.PersistentDataContainer
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.set */
|
||||
fun <T : Any, Z : Any> PersistentDataContainer.set(key: String, dataType: PersistentDataType<T, Z>, value: Z) =
|
||||
ExtendedPersistentDataContainer.extend(this).set(key, dataType, value)
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.has */
|
||||
fun <T : Any, Z : Any> PersistentDataContainer.has(key: String, dataType: PersistentDataType<T, Z>): Boolean =
|
||||
ExtendedPersistentDataContainer.extend(this).has(key, dataType)
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.get */
|
||||
fun <T : Any, Z : Any> PersistentDataContainer.get(key: String, dataType: PersistentDataType<T, Z>): Z? =
|
||||
ExtendedPersistentDataContainer.extend(this).get(key, dataType)
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.getOrDefault */
|
||||
fun <T : Any, Z : Any> PersistentDataContainer.getOrDefault(
|
||||
key: String,
|
||||
dataType: PersistentDataType<T, Z>,
|
||||
defaultValue: Z
|
||||
): Z = ExtendedPersistentDataContainer.extend(this).getOrDefault(key, dataType, defaultValue)
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.getAllKeys */
|
||||
fun PersistentDataContainer.getAllKeys(): Set<String> =
|
||||
ExtendedPersistentDataContainer.extend(this).allKeys
|
||||
|
||||
/** @see ExtendedPersistentDataContainer.remove */
|
||||
fun PersistentDataContainer.remove(key: String) =
|
||||
ExtendedPersistentDataContainer.extend(this).remove(key)
|
||||
|
||||
/** Create a new PDC without the need for an adapter context. */
|
||||
fun newPersistentDataContainer() =
|
||||
ExtendedPersistentDataContainer.create().base
|
||||
@@ -5,14 +5,10 @@ package com.willfp.eco.core.data
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.Server
|
||||
|
||||
/**
|
||||
* @see PlayerProfile.load
|
||||
*/
|
||||
/** @see PlayerProfile.load */
|
||||
val OfflinePlayer.profile: PlayerProfile
|
||||
get() = PlayerProfile.load(this)
|
||||
|
||||
/**
|
||||
* @see ServerProfile.load
|
||||
*/
|
||||
/** @see ServerProfile.load */
|
||||
val Server.profile: ServerProfile
|
||||
get() = ServerProfile.load()
|
||||
|
||||
@@ -5,8 +5,6 @@ package com.willfp.eco.core.entities
|
||||
import com.willfp.eco.core.entities.ai.EntityController
|
||||
import org.bukkit.entity.Mob
|
||||
|
||||
/**
|
||||
* @see EntityController.getFor
|
||||
*/
|
||||
/** @see EntityController.getFor */
|
||||
val <T : Mob> T.controller: EntityController<T>
|
||||
get() = EntityController.getFor(this)
|
||||
|
||||
@@ -4,8 +4,6 @@ package com.willfp.eco.core.fast
|
||||
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see FastItemStack.wrap
|
||||
*/
|
||||
/** @see FastItemStack.wrap */
|
||||
fun ItemStack.fast(): FastItemStack =
|
||||
FastItemStack.wrap(this)
|
||||
|
||||
@@ -6,41 +6,36 @@ 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 com.willfp.eco.core.gui.slot.SlotBuilder
|
||||
import com.willfp.eco.core.items.TestableItem
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onLeftClick
|
||||
*/
|
||||
/** @see SlotBuilder.onLeftClick */
|
||||
fun SlotBuilder.onLeftClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onLeftClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onRightClick
|
||||
*/
|
||||
/** @see SlotBuilder.onRightClick */
|
||||
fun SlotBuilder.onRightClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onRightClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftLeftClick
|
||||
*/
|
||||
/** @see SlotBuilder.onShiftLeftClick */
|
||||
fun SlotBuilder.onShiftLeftClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onShiftLeftClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftRightClick
|
||||
*/
|
||||
/** @see SlotBuilder.onShiftRightClick */
|
||||
fun SlotBuilder.onShiftRightClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onShiftRightClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftRightClick
|
||||
*/
|
||||
/** @see SlotBuilder.onShiftRightClick */
|
||||
fun SlotBuilder.onMiddleClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onMiddleClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/** @see SlotBuilder.notCaptiveFor */
|
||||
fun SlotBuilder.notCaptiveFor(test: (Player) -> Boolean): SlotBuilder =
|
||||
this.notCaptiveFor { test(it) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.setModifier
|
||||
* @deprecated Use SlotUpdater instead.
|
||||
@@ -50,15 +45,32 @@ fun SlotBuilder.onMiddleClick(action: (InventoryClickEvent, Slot, Menu) -> Unit)
|
||||
fun SlotBuilder.setModifier(action: (Player, Menu, ItemStack) -> Unit): SlotBuilder =
|
||||
this.setUpdater { a, b, c -> c.apply { action(a, b, c) } }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.setUpdater
|
||||
*/
|
||||
/** @see SlotBuilder.setUpdater */
|
||||
fun SlotBuilder.setUpdater(action: (Player, Menu, ItemStack) -> ItemStack): SlotBuilder =
|
||||
this.setUpdater { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* Kotlin builder for slots.
|
||||
*/
|
||||
/** Kotlin builder for slots. */
|
||||
fun captiveSlot(): Slot = Slot.builder().setCaptive().build()
|
||||
|
||||
/** Kotlin builder for slots. */
|
||||
fun captiveSlot(
|
||||
init: SlotBuilder.() -> Unit
|
||||
): Slot {
|
||||
val builder = Slot.builder().setCaptive()
|
||||
init(builder)
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
init: SlotBuilder.() -> Unit
|
||||
): Slot {
|
||||
val builder = Slot.builder()
|
||||
init(builder)
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
item: ItemStack,
|
||||
init: SlotBuilder.() -> Unit
|
||||
@@ -68,9 +80,17 @@ fun slot(
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for slots.
|
||||
*/
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
item: ItemStack
|
||||
): Slot = Slot.builder(item).build()
|
||||
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
item: TestableItem
|
||||
): Slot = Slot.builder(item.item).build()
|
||||
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
provider: (Player, Menu) -> ItemStack,
|
||||
init: SlotBuilder.() -> Unit
|
||||
@@ -80,21 +100,28 @@ fun slot(
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/**
|
||||
* @see MenuBuilder.onClose
|
||||
*/
|
||||
/** Kotlin builder for slots. */
|
||||
fun slot(
|
||||
provider: (Player, Menu) -> ItemStack
|
||||
): Slot = Slot.builder { a, b -> provider(a, b) }.build()
|
||||
|
||||
/** @see MenuBuilder.onClose */
|
||||
fun MenuBuilder.onClose(action: (InventoryCloseEvent, Menu) -> Unit): MenuBuilder =
|
||||
this.onClose { a, b -> action(a, b) }
|
||||
|
||||
/**
|
||||
* @see MenuBuilder.modify
|
||||
*/
|
||||
/** @see MenuBuilder.onOpen */
|
||||
fun MenuBuilder.onOpen(action: (Player, Menu) -> Unit): MenuBuilder =
|
||||
this.onOpen { a, b -> action(a, b) }
|
||||
|
||||
/** @see MenuBuilder.modify */
|
||||
fun MenuBuilder.modify(modifier: (MenuBuilder) -> Unit): MenuBuilder =
|
||||
this.modfiy { modifier(it) }
|
||||
|
||||
/**
|
||||
* Kotlin builder for menus.
|
||||
*/
|
||||
/** @see MenuBuilder.onRender */
|
||||
fun MenuBuilder.onRender(action: (Player, Menu) -> Unit): MenuBuilder =
|
||||
this.onRender { a, b -> action(a, b) }
|
||||
|
||||
/** Kotlin builder for menus. */
|
||||
fun menu(
|
||||
rows: Int,
|
||||
init: MenuBuilder.() -> Unit
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
@file:JvmName("EconomyExtensions")
|
||||
|
||||
package com.willfp.eco.core.integrations.economy
|
||||
|
||||
import org.bukkit.OfflinePlayer
|
||||
|
||||
/** @see EconomyManager */
|
||||
var OfflinePlayer.balance: Double
|
||||
get() = EconomyManager.getBalance(this)
|
||||
set(value) {
|
||||
if (value <= 0) {
|
||||
EconomyManager.removeMoney(this, this.balance)
|
||||
return
|
||||
}
|
||||
|
||||
val diff = this.balance - value
|
||||
|
||||
if (diff > 0) {
|
||||
EconomyManager.removeMoney(this, diff)
|
||||
} else if (diff < 0) {
|
||||
EconomyManager.giveMoney(this, -diff)
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,31 @@
|
||||
package com.willfp.eco.core.items
|
||||
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.ItemMeta
|
||||
import org.bukkit.persistence.PersistentDataContainer
|
||||
|
||||
/**
|
||||
* @see Items.toLookupString
|
||||
*/
|
||||
/** @see Items.toLookupString */
|
||||
fun ItemStack?.toLookupString(): String =
|
||||
Items.toLookupString(this)
|
||||
|
||||
/** @see Items.mergeFrom */
|
||||
fun ItemStack.mergeFrom(other: ItemStack): ItemStack =
|
||||
Items.mergeFrom(other, this)
|
||||
|
||||
/** @see Items.mergeFrom */
|
||||
fun ItemMeta.mergeFrom(other: ItemMeta): ItemMeta =
|
||||
Items.mergeFrom(other, this)
|
||||
|
||||
/**
|
||||
* @see Items.getBaseNBT
|
||||
* @see Items.setBaseNBT
|
||||
*/
|
||||
var ItemStack.baseNBT: PersistentDataContainer
|
||||
get() = Items.getBaseNBT(this)
|
||||
set(value) {
|
||||
Items.setBaseNBT(this, value)
|
||||
}
|
||||
|
||||
/** @see Items.setBaseNBT */
|
||||
fun ItemStack.clearNBT() =
|
||||
Items.setBaseNBT(this, null)
|
||||
|
||||
@@ -5,8 +5,6 @@ package com.willfp.eco.util
|
||||
import org.bukkit.entity.Arrow
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see ArrowUtils.getBow
|
||||
*/
|
||||
/** @see ArrowUtils.getBow */
|
||||
val Arrow.bow: ItemStack?
|
||||
get() = ArrowUtils.getBow(this)
|
||||
|
||||
@@ -4,8 +4,6 @@ package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.block.Block
|
||||
|
||||
/**
|
||||
* @see ArrowUtils.getBow
|
||||
*/
|
||||
/** @see ArrowUtils.getBow */
|
||||
val Block.isPlayerPlaced: Boolean
|
||||
get() = BlockUtils.isPlayerPlaced(this)
|
||||
|
||||
@@ -5,14 +5,10 @@ package com.willfp.eco.util
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see DurabilityUtils.damageItem
|
||||
*/
|
||||
/** @see DurabilityUtils.damageItem */
|
||||
fun ItemStack.damage(damage: Int) =
|
||||
DurabilityUtils.damageItem(this, damage)
|
||||
|
||||
/**
|
||||
* @see DurabilityUtils.damageItem
|
||||
*/
|
||||
/** @see DurabilityUtils.damageItem */
|
||||
fun ItemStack.damage(damage: Int, player: Player) =
|
||||
DurabilityUtils.damageItem(player, this, damage)
|
||||
|
||||
@@ -2,20 +2,18 @@
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
/**
|
||||
* @see ListUtils.listToFrequencyMap
|
||||
*/
|
||||
/** @see ListUtils.listToFrequencyMap */
|
||||
fun <T> List<T>.toFrequencyMap(): Map<T, Int> =
|
||||
ListUtils.listToFrequencyMap(this)
|
||||
|
||||
/**
|
||||
* @see ListUtils.containsIgnoreCase
|
||||
*/
|
||||
/** @see ListUtils.containsIgnoreCase */
|
||||
fun Iterable<String>.containsIgnoreCase(element: String): Boolean =
|
||||
ListUtils.containsIgnoreCase(this, element)
|
||||
|
||||
/**
|
||||
* @see ListUtils.create2DList
|
||||
*/
|
||||
/** @see ListUtils.create2DList */
|
||||
fun <T> create2DList(rows: Int, columns: Int): MutableList<MutableList<T>> =
|
||||
ListUtils.create2DList(rows, columns)
|
||||
|
||||
/** @see ListUtils.toSingletonList */
|
||||
fun <T> T.toSingletonList(): List<T> =
|
||||
ListUtils.toSingletonList(this)
|
||||
|
||||
10
eco-api/src/main/kotlin/com/willfp/eco/util/MenuUtils.kt
Normal file
10
eco-api/src/main/kotlin/com/willfp/eco/util/MenuUtils.kt
Normal file
@@ -0,0 +1,10 @@
|
||||
@file:JvmName("MenuUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
/** @see MenuUtils.getOpenMenu */
|
||||
val Player.openMenu: Menu?
|
||||
get() = MenuUtils.getOpenMenu(this)
|
||||
@@ -4,26 +4,18 @@ package com.willfp.eco.util
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.fromString
|
||||
*/
|
||||
/** @see NamespacedKeyUtils.fromString */
|
||||
fun namespacedKeyOf(string: String) =
|
||||
NamespacedKeyUtils.fromString(string)
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.fromString
|
||||
*/
|
||||
/** @see NamespacedKeyUtils.fromString */
|
||||
fun safeNamespacedKeyOf(string: String) =
|
||||
NamespacedKeyUtils.fromStringOrNull(string)
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.create
|
||||
*/
|
||||
/** @see NamespacedKeyUtils.create */
|
||||
fun namespacedKeyOf(namespace: String, key: String) =
|
||||
NamespacedKeyUtils.create(namespace, key)
|
||||
|
||||
/**
|
||||
* @see EcoPlugin.namespacedKeyFactory
|
||||
*/
|
||||
/** @see EcoPlugin.namespacedKeyFactory */
|
||||
fun namespacedKeyOf(plugin: EcoPlugin, key: String) =
|
||||
plugin.namespacedKeyFactory.create(key)
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
/**
|
||||
* @see NumberUtils.toNumeral
|
||||
*/
|
||||
/** @see NumberUtils.toNumeral */
|
||||
fun Number.toNumeral(): String =
|
||||
NumberUtils.toNumeral(this.toInt())
|
||||
|
||||
@@ -5,28 +5,25 @@ package com.willfp.eco.util
|
||||
import net.kyori.adventure.audience.Audience
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.command.CommandSender
|
||||
import org.bukkit.entity.Entity
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getSavedDisplayName
|
||||
*/
|
||||
/** @see PlayerUtils.getSavedDisplayName */
|
||||
val OfflinePlayer.savedDisplayName: String
|
||||
get() = PlayerUtils.getSavedDisplayName(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getAudience
|
||||
*/
|
||||
/** @see PlayerUtils.getAudience */
|
||||
fun Player.asAudience(): Audience =
|
||||
PlayerUtils.getAudience(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getAudience
|
||||
*/
|
||||
/** @see PlayerUtils.getAudience */
|
||||
fun CommandSender.asAudience(): Audience =
|
||||
PlayerUtils.getAudience(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.runExempted
|
||||
*/
|
||||
/** @see PlayerUtils.runExempted */
|
||||
fun Player.runExempted(action: () -> Unit) =
|
||||
PlayerUtils.runExempted(this, action)
|
||||
|
||||
/** @see PlayerUtils.tryAsPlayer */
|
||||
fun Entity?.tryAsPlayer(): Player? =
|
||||
PlayerUtils.tryAsPlayer(this)
|
||||
|
||||
@@ -4,8 +4,6 @@ package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.potion.PotionData
|
||||
|
||||
/**
|
||||
* @see PotionData.duration
|
||||
*/
|
||||
/** @see PotionData.duration */
|
||||
val PotionData.duration: Int
|
||||
get() = PotionUtils.getDuration(this)
|
||||
|
||||
@@ -4,8 +4,6 @@ package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.Server
|
||||
|
||||
/**
|
||||
* @see ServerUtils.getTps
|
||||
*/
|
||||
/** @see ServerUtils.getTps */
|
||||
val Server.tps: Double
|
||||
get() = ServerUtils.getTps()
|
||||
|
||||
@@ -5,21 +5,23 @@ package com.willfp.eco.util
|
||||
import net.kyori.adventure.text.Component
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
/**
|
||||
* @see StringUtils.toComponent
|
||||
*/
|
||||
/** @see StringUtils.toComponent */
|
||||
fun String.toComponent(): Component =
|
||||
StringUtils.toComponent(this)
|
||||
|
||||
/**
|
||||
* @see StringUtils.toLegacy
|
||||
*/
|
||||
/** @see StringUtils.jsonToComponent */
|
||||
fun String.jsonToComponent(): Component =
|
||||
StringUtils.jsonToComponent(this)
|
||||
|
||||
/** @see StringUtils.toLegacy */
|
||||
fun Component.toLegacy(): String =
|
||||
StringUtils.toLegacy(this)
|
||||
|
||||
/**
|
||||
* @see StringUtils.format
|
||||
*/
|
||||
/** @see StringUtils.componentToJson */
|
||||
fun Component.toJSON(): String =
|
||||
StringUtils.componentToJson(this)
|
||||
|
||||
/** @see StringUtils.format */
|
||||
fun String.formatEco(
|
||||
player: Player? = null,
|
||||
formatPlaceholders: Boolean = false
|
||||
@@ -29,9 +31,7 @@ fun String.formatEco(
|
||||
if (formatPlaceholders) StringUtils.FormatOption.WITH_PLACEHOLDERS else StringUtils.FormatOption.WITHOUT_PLACEHOLDERS
|
||||
)
|
||||
|
||||
/**
|
||||
* @see StringUtils.formatList
|
||||
*/
|
||||
/** @see StringUtils.formatList */
|
||||
fun List<String>.formatEco(
|
||||
player: Player? = null,
|
||||
formatPlaceholders: Boolean = false
|
||||
@@ -41,14 +41,10 @@ fun List<String>.formatEco(
|
||||
if (formatPlaceholders) StringUtils.FormatOption.WITH_PLACEHOLDERS else StringUtils.FormatOption.WITHOUT_PLACEHOLDERS
|
||||
)
|
||||
|
||||
/**
|
||||
* @see StringUtils.splitAround
|
||||
*/
|
||||
/** @see StringUtils.splitAround */
|
||||
fun String.splitAround(separator: String): Array<String> =
|
||||
StringUtils.splitAround(this, separator)
|
||||
|
||||
/**
|
||||
* @see StringUtils.toNiceString
|
||||
*/
|
||||
/** @see StringUtils.toNiceString */
|
||||
fun Any?.toNiceString(): String =
|
||||
StringUtils.toNiceString(this)
|
||||
|
||||
@@ -4,14 +4,14 @@ package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.util.Vector
|
||||
|
||||
/**
|
||||
* @see VectorUtils.isFinite
|
||||
*/
|
||||
/** @see VectorUtils.isFinite */
|
||||
val Vector.isFinite: Boolean
|
||||
get() = VectorUtils.isFinite(this)
|
||||
|
||||
/**
|
||||
* @see VectorUtils.simplifyVector
|
||||
*/
|
||||
/** @see VectorUtils.simplifyVector */
|
||||
fun Vector.simplify(): Vector =
|
||||
VectorUtils.simplifyVector(this)
|
||||
|
||||
/** @see VectorUtils.isSafeVelocity */
|
||||
val Vector.isSafeVelocity: Boolean
|
||||
get() = VectorUtils.isSafeVelocity(this)
|
||||
|
||||
@@ -2,10 +2,12 @@ group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
// Libraries
|
||||
implementation 'org.reflections:reflections:0.9.12'
|
||||
implementation 'org.objenesis:objenesis:3.2'
|
||||
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.10'
|
||||
compileOnly 'org.reflections:reflections:0.9.12'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.10.0'
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.1.0'
|
||||
compileOnly 'org.objenesis:objenesis:3.2'
|
||||
}
|
||||
@@ -16,7 +16,7 @@ fun ConfigType.toMap(input: String?): Map<String, Any?> =
|
||||
fun ConfigType.toString(map: Map<String, Any?>): String =
|
||||
this.handler.toString(map)
|
||||
|
||||
fun Any?.constrainConfigTypes(type: ConfigType): Any? = when (this) {
|
||||
internal fun Any?.constrainConfigTypes(type: ConfigType): Any? = when (this) {
|
||||
is Map<*, *> -> EcoConfigSection(type, this.normalizeToConfig(type))
|
||||
is Iterable<*> -> {
|
||||
if (this.firstOrNull() == null) {
|
||||
@@ -31,7 +31,7 @@ fun Any?.constrainConfigTypes(type: ConfigType): Any? = when (this) {
|
||||
else -> this
|
||||
}
|
||||
|
||||
fun Map<*, *>.normalizeToConfig(type: ConfigType): Map<String, Any?> {
|
||||
internal fun Map<*, *>.normalizeToConfig(type: ConfigType): Map<String, Any?> {
|
||||
val building = mutableMapOf<String, Any?>()
|
||||
|
||||
for ((unprocessedKey, value) in this.entries) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user