Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
229c9e58c3 | ||
|
|
4f30a6e04e | ||
|
|
9ea45ee0d0 | ||
|
|
192316214d | ||
|
|
feb8898a87 | ||
|
|
1e64815e47 | ||
|
|
dc10648c25 | ||
|
|
70131a6cae | ||
|
|
6d23cc7141 | ||
|
|
473202527a | ||
|
|
bc24aaeb3c | ||
|
|
52072bd935 | ||
|
|
ad47b7898e | ||
|
|
19d6533db6 | ||
|
|
3a37d40271 | ||
|
|
cb3ccbb39a | ||
|
|
5c3bb678b3 | ||
|
|
4f4ee82e6b | ||
|
|
32d88f55f8 | ||
|
|
bc8d615079 | ||
|
|
55b7c3c16f | ||
|
|
9535986f59 | ||
|
|
fb17fc1383 | ||
|
|
4221368388 | ||
|
|
d4432d0cb8 | ||
|
|
f9093c2ed6 | ||
|
|
15f4d5c098 | ||
|
|
dc47bc7995 | ||
|
|
29ce0deb1b | ||
|
|
fd78402bf5 | ||
|
|
5f65e3f520 | ||
|
|
ceaf4d34a5 | ||
|
|
2d2e5f8150 | ||
|
|
323a4aefef | ||
|
|
af486580c1 | ||
|
|
7955a94f14 | ||
|
|
c99a1bd50a | ||
|
|
93364247de | ||
|
|
49612eddcb | ||
|
|
834c29f843 | ||
|
|
a806ac039d | ||
|
|
0ca2651af0 | ||
|
|
6157fdcfa1 | ||
|
|
36cfcd24c2 | ||
|
|
d4558db40c | ||
|
|
3f8448fee1 | ||
|
|
8b6e15457c |
@@ -26,6 +26,7 @@ dependencies {
|
|||||||
implementation(project(path = ":eco-core:core-nms:v1_18_R2", 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"))
|
implementation(project(path = ":eco-core:core-nms:v1_19_R1", configuration = "reobf"))
|
||||||
implementation(project(path = ":eco-core:core-nms:v1_19_R2", configuration = "reobf"))
|
implementation(project(path = ":eco-core:core-nms:v1_19_R2", configuration = "reobf"))
|
||||||
|
implementation(project(path = ":eco-core:core-nms:v1_19_R3", configuration = "reobf"))
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
@@ -56,7 +57,7 @@ allprojects {
|
|||||||
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
||||||
|
|
||||||
// ProtocolLib
|
// ProtocolLib
|
||||||
maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
//maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
||||||
|
|
||||||
// WorldGuard
|
// WorldGuard
|
||||||
maven("https://maven.enginehub.org/repo/")
|
maven("https://maven.enginehub.org/repo/")
|
||||||
@@ -79,6 +80,7 @@ allprojects {
|
|||||||
// LibsDisguises
|
// LibsDisguises
|
||||||
maven("https://repo.md-5.net/content/groups/public/")
|
maven("https://repo.md-5.net/content/groups/public/")
|
||||||
|
|
||||||
|
// UltraEconomy
|
||||||
maven("https://repo.techscode.com/repository/maven-releases/")
|
maven("https://repo.techscode.com/repository/maven-releases/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
// Adventure
|
|
||||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.1.0'
|
|
||||||
|
|
||||||
// Other
|
|
||||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
|
||||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
|
||||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
|
||||||
}
|
|
||||||
|
|
||||||
group 'com.willfp'
|
|
||||||
version rootProject.version
|
|
||||||
|
|
||||||
java {
|
|
||||||
withJavadocJar()
|
|
||||||
}
|
|
||||||
|
|
||||||
build.dependsOn publishToMavenLocal
|
|
||||||
|
|
||||||
publishing {
|
|
||||||
publications {
|
|
||||||
shadow(MavenPublication) {
|
|
||||||
from components.java
|
|
||||||
artifactId 'eco'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven {
|
|
||||||
name = "GitHubPackages"
|
|
||||||
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
|
||||||
credentials {
|
|
||||||
username = System.getenv("GITHUB_ACTOR")
|
|
||||||
password = System.getenv("GITHUB_TOKEN")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
42
eco-api/build.gradle.kts
Normal file
42
eco-api/build.gradle.kts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
dependencies {
|
||||||
|
// Adventure
|
||||||
|
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")
|
||||||
|
|
||||||
|
// Other
|
||||||
|
compileOnly("org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT")
|
||||||
|
compileOnly("com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT")
|
||||||
|
compileOnly("com.google.code.gson:gson:2.8.8")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "com.willfp"
|
||||||
|
version = rootProject.version
|
||||||
|
|
||||||
|
java {
|
||||||
|
withJavadocJar()
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
build {
|
||||||
|
dependsOn(publishToMavenLocal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
create<MavenPublication>("shadow") {
|
||||||
|
from(components["java"])
|
||||||
|
artifactId = "eco"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
name = "GitHubPackages"
|
||||||
|
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
||||||
|
credentials {
|
||||||
|
username = System.getenv("GITHUB_ACTOR")
|
||||||
|
password = System.getenv("GITHUB_TOKEN")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,8 +13,11 @@ import com.willfp.eco.core.factory.MetadataValueFactory;
|
|||||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||||
import com.willfp.eco.core.factory.RunnableFactory;
|
import com.willfp.eco.core.factory.RunnableFactory;
|
||||||
import com.willfp.eco.core.integrations.IntegrationLoader;
|
import com.willfp.eco.core.integrations.IntegrationLoader;
|
||||||
|
import com.willfp.eco.core.map.ListMap;
|
||||||
import com.willfp.eco.core.packet.PacketListener;
|
import com.willfp.eco.core.packet.PacketListener;
|
||||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
|
import com.willfp.eco.core.registry.Registrable;
|
||||||
|
import com.willfp.eco.core.registry.Registry;
|
||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import com.willfp.eco.core.web.UpdateChecker;
|
import com.willfp.eco.core.web.UpdateChecker;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
@@ -53,27 +56,12 @@ import java.util.stream.Collectors;
|
|||||||
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
||||||
* be cancelled.</b>
|
* be cancelled.</b>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"unused", "DeprecatedIsStillUsed", "deprecation", "RedundantSuppression"})
|
@SuppressWarnings({"unused", "DeprecatedIsStillUsed", "deprecation", "RedundantSuppression", "MismatchedQueryAndUpdateOfCollection"})
|
||||||
public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Registrable {
|
||||||
/**
|
/**
|
||||||
* The polymart resource ID of the plugin.
|
* The properties (eco.yml).
|
||||||
*/
|
*/
|
||||||
private final int resourceId;
|
private final PluginProps props;
|
||||||
|
|
||||||
/**
|
|
||||||
* The bStats resource ID of the plugin.
|
|
||||||
*/
|
|
||||||
private final int bStatsId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The package where proxy implementations are.
|
|
||||||
*/
|
|
||||||
private final String proxyPackage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The color of the plugin, used in messages.
|
|
||||||
*/
|
|
||||||
private final String color;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loaded integrations.
|
* Loaded integrations.
|
||||||
@@ -142,11 +130,6 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*/
|
*/
|
||||||
private boolean outdated = false;
|
private boolean outdated = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* If the plugin supports extensions.
|
|
||||||
*/
|
|
||||||
private final boolean supportingExtensions;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The proxy factory.
|
* The proxy factory.
|
||||||
*/
|
*/
|
||||||
@@ -156,27 +139,27 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
/**
|
/**
|
||||||
* The tasks to run on enable.
|
* The tasks to run on enable.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onEnable = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onEnable = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on disable.
|
* The tasks to run on disable.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onDisable = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onDisable = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on reload.
|
* The tasks to run on reload.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onReload = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onReload = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on load.
|
* The tasks to run on load.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onLoad = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onLoad = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run after load.
|
* The tasks to run after load.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> afterLoad = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> afterLoad = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new plugin.
|
* Create a new plugin.
|
||||||
@@ -193,7 +176,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* Create a new plugin without proxy support, polymart, or bStats.
|
* Create a new plugin without proxy support, polymart, or bStats.
|
||||||
*
|
*
|
||||||
* @param color The color.
|
* @param color The color.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(@NotNull final String color) {
|
protected EcoPlugin(@NotNull final String color) {
|
||||||
this("", color);
|
this("", color);
|
||||||
}
|
}
|
||||||
@@ -204,7 +189,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*
|
*
|
||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(@NotNull final String proxyPackage,
|
protected EcoPlugin(@NotNull final String proxyPackage,
|
||||||
@NotNull final String color) {
|
@NotNull final String color) {
|
||||||
this(0, 0, proxyPackage, color);
|
this(0, 0, proxyPackage, color);
|
||||||
@@ -216,7 +203,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param resourceId The polymart resource ID for the plugin.
|
* @param resourceId The polymart resource ID for the plugin.
|
||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String color) {
|
@NotNull final String color) {
|
||||||
@@ -230,7 +219,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
* @param supportingExtensions If the plugin supports extensions.
|
* @param supportingExtensions If the plugin supports extensions.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String color,
|
@NotNull final String color,
|
||||||
@@ -245,7 +236,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
@@ -261,21 +254,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
* @param supportingExtensions If the plugin supports extensions.
|
* @param supportingExtensions If the plugin supports extensions.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
@NotNull final String color,
|
@NotNull final String color,
|
||||||
final boolean supportingExtensions) {
|
final boolean supportingExtensions) {
|
||||||
this(
|
this(PluginProps.createSimple(resourceId, bStatsId, proxyPackage, color, supportingExtensions));
|
||||||
PluginProps.createSimple(
|
|
||||||
resourceId,
|
|
||||||
bStatsId,
|
|
||||||
proxyPackage,
|
|
||||||
color,
|
|
||||||
supportingExtensions
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -325,13 +312,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
PluginProps props = this.mutateProps(generatedProps);
|
PluginProps props = this.mutateProps(generatedProps);
|
||||||
props.validate();
|
props.validate();
|
||||||
|
|
||||||
this.resourceId = props.getResourceId();
|
this.props = props;
|
||||||
this.bStatsId = props.getBStatsId();
|
|
||||||
this.proxyPackage = props.getProxyPackage();
|
|
||||||
this.color = props.getColor();
|
|
||||||
this.supportingExtensions = props.isSupportingExtensions();
|
|
||||||
|
|
||||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
this.proxyFactory = this.props.getProxyPackage().equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
||||||
this.logger = Eco.get().createLogger(this);
|
this.logger = Eco.get().createLogger(this);
|
||||||
|
|
||||||
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
||||||
@@ -401,10 +384,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
Eco.get().registerBStats(this);
|
Eco.get().registerBStats(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).map(String::toLowerCase).collect(Collectors.toSet());
|
||||||
.map(Plugin::getName)
|
|
||||||
.map(String::toLowerCase)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
|
|
||||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||||
Eco.get().createPAPIIntegration(this);
|
Eco.get().createPAPIIntegration(this);
|
||||||
@@ -449,8 +429,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.onEnable.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleEnable();
|
this.handleEnable();
|
||||||
this.onEnable.forEach(Runnable::run);
|
this.onEnable.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
this.getLogger().info("");
|
this.getLogger().info("");
|
||||||
}
|
}
|
||||||
@@ -461,7 +442,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onEnable(@NotNull final Runnable task) {
|
public final void onEnable(@NotNull final Runnable task) {
|
||||||
this.onEnable.add(task);
|
this.onEnable(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on enable.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onEnable(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onEnable.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -474,8 +466,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getEventManager().unregisterAllListeners();
|
this.getEventManager().unregisterAllListeners();
|
||||||
this.getScheduler().cancelAll();
|
this.getScheduler().cancelAll();
|
||||||
|
|
||||||
|
this.onDisable.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleDisable();
|
this.handleDisable();
|
||||||
this.onDisable.forEach(Runnable::run);
|
this.onDisable.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
if (this.isSupportingExtensions()) {
|
if (this.isSupportingExtensions()) {
|
||||||
this.getExtensionLoader().unloadExtensions();
|
this.getExtensionLoader().unloadExtensions();
|
||||||
@@ -491,7 +484,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onDisable(@NotNull final Runnable task) {
|
public final void onDisable(@NotNull final Runnable task) {
|
||||||
this.onDisable.add(task);
|
this.onDisable(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on disable.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onDisable(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onDisable.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -501,8 +505,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
public final void onLoad() {
|
public final void onLoad() {
|
||||||
super.onLoad();
|
super.onLoad();
|
||||||
|
|
||||||
|
this.onLoad.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleLoad();
|
this.handleLoad();
|
||||||
this.onLoad.forEach(Runnable::run);
|
this.onLoad.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -511,7 +516,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onLoad(@NotNull final Runnable task) {
|
public final void onLoad(@NotNull final Runnable task) {
|
||||||
this.onLoad.add(task);
|
this.onLoad(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on load.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onLoad(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onLoad.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -545,8 +561,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getLogger().severe("");
|
this.getLogger().severe("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.afterLoad.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleAfterLoad();
|
this.handleAfterLoad();
|
||||||
this.afterLoad.forEach(Runnable::run);
|
this.afterLoad.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
this.reload();
|
this.reload();
|
||||||
|
|
||||||
@@ -554,7 +571,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
extension.handleAfterLoad();
|
extension.handleAfterLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getLogger().info("Loaded " + this.color + this.getName());
|
this.getLogger().info("Loaded " + this.props.getColor() + this.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -563,7 +580,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void afterLoad(@NotNull final Runnable task) {
|
public final void afterLoad(@NotNull final Runnable task) {
|
||||||
this.afterLoad.add(task);
|
this.afterLoad(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run after load.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void afterLoad(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.afterLoad.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -576,8 +604,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getConfigHandler().callUpdate();
|
this.getConfigHandler().callUpdate();
|
||||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||||
|
|
||||||
|
this.onReload.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleReload();
|
this.handleReload();
|
||||||
this.onReload.forEach(Runnable::run);
|
this.onReload.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
|
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
|
||||||
extension.handleReload();
|
extension.handleReload();
|
||||||
@@ -585,12 +614,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add new task to run on enable.
|
* Add new task to run on reload.
|
||||||
*
|
*
|
||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onReload(@NotNull final Runnable task) {
|
public final void onReload(@NotNull final Runnable task) {
|
||||||
this.onReload.add(task);
|
this.onReload(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on reload.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onReload(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onReload.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -713,7 +753,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*
|
*
|
||||||
* @return A list of all listeners.
|
* @return A list of all listeners.
|
||||||
*/
|
*/
|
||||||
protected abstract List<Listener> loadListeners();
|
protected List<Listener> loadListeners() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful for custom LangYml implementations.
|
* Useful for custom LangYml implementations.
|
||||||
@@ -760,10 +802,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
protected DisplayModule createDisplayModule() {
|
protected DisplayModule createDisplayModule() {
|
||||||
Validate.isTrue(
|
Validate.isTrue(this.getDisplayModule() == null, "Display module exists!");
|
||||||
this.getDisplayModule() == null,
|
|
||||||
"Display module exists!"
|
|
||||||
);
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -862,6 +901,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param pluginName The name.
|
* @param pluginName The name.
|
||||||
* @return The plugin.
|
* @return The plugin.
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||||
return Eco.get().getPluginByName(pluginName);
|
return Eco.get().getPluginByName(pluginName);
|
||||||
}
|
}
|
||||||
@@ -871,17 +911,28 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*
|
*
|
||||||
* @return The set of names.
|
* @return The set of names.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
public static Set<String> getPluginNames() {
|
public static Set<String> getPluginNames() {
|
||||||
return new HashSet<>(Eco.get().getLoadedPlugins());
|
return new HashSet<>(Eco.get().getLoadedPlugins());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin props. (eco.yml).
|
||||||
|
*
|
||||||
|
* @return The props.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public PluginProps getProps() {
|
||||||
|
return this.props;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the polymart resource ID.
|
* Get the polymart resource ID.
|
||||||
*
|
*
|
||||||
* @return The resource ID.
|
* @return The resource ID.
|
||||||
*/
|
*/
|
||||||
public int getResourceId() {
|
public int getResourceId() {
|
||||||
return this.resourceId;
|
return this.getProps().getResourceId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -890,7 +941,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The ID.
|
* @return The ID.
|
||||||
*/
|
*/
|
||||||
public int getBStatsId() {
|
public int getBStatsId() {
|
||||||
return this.bStatsId;
|
return this.getProps().getBStatsId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -899,7 +950,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The package where proxies are contained.
|
* @return The package where proxies are contained.
|
||||||
*/
|
*/
|
||||||
public String getProxyPackage() {
|
public String getProxyPackage() {
|
||||||
return this.proxyPackage;
|
return this.getProps().getProxyPackage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -908,7 +959,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The color.
|
* @return The color.
|
||||||
*/
|
*/
|
||||||
public String getColor() {
|
public String getColor() {
|
||||||
return this.color;
|
return this.getProps().getColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1026,7 +1077,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return If extensions are supported.
|
* @return If extensions are supported.
|
||||||
*/
|
*/
|
||||||
public boolean isSupportingExtensions() {
|
public boolean isSupportingExtensions() {
|
||||||
return this.supportingExtensions;
|
return this.getProps().isSupportingExtensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1060,4 +1111,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
||||||
return this.getMetadataValueFactory().create(value);
|
return this.getMetadataValueFactory().create(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public final String getID() {
|
||||||
|
return Registry.tryFitPattern(this.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks a position in a lifecycle (e.g. enable, reload, etc).
|
||||||
|
*/
|
||||||
|
public enum LifecyclePosition {
|
||||||
|
/**
|
||||||
|
* Run at the start of the lifecycle.
|
||||||
|
*/
|
||||||
|
START,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run at the end of the lifecycle.
|
||||||
|
*/
|
||||||
|
END
|
||||||
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
package com.willfp.eco.core;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Quick DI class to manage passing eco plugins.
|
|
||||||
* <p>
|
|
||||||
* Basically just a quick bit of laziness if you can't be bothered to add a private field
|
|
||||||
* and a protected getter, don't use this in kotlin as you can just specify
|
|
||||||
* {@code
|
|
||||||
* private val plugin: EcoPlugin
|
|
||||||
* }
|
|
||||||
* in the constructor.
|
|
||||||
*
|
|
||||||
* @param <T> The eco plugin type.
|
|
||||||
* @deprecated Leaky inheritance, shouldn't exist.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
public abstract class PluginDependent<T extends EcoPlugin> {
|
|
||||||
/**
|
|
||||||
* The {@link EcoPlugin} that is stored.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
private final T plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin to manage.
|
|
||||||
*/
|
|
||||||
protected PluginDependent(@NotNull final T plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the plugin.
|
|
||||||
*
|
|
||||||
* @return The plugin.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
protected T getPlugin() {
|
|
||||||
return this.plugin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -49,6 +49,16 @@ public final class PluginProps {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Boolean supportingExtensions;
|
private Boolean supportingExtensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The environment variables.
|
||||||
|
*/
|
||||||
|
private final Map<String, String> environment = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the plugin uses reflective reload (via {@link com.willfp.eco.core.config.updating.ConfigUpdater}).
|
||||||
|
*/
|
||||||
|
private boolean usesReflectiveReload = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new blank props.
|
* Create new blank props.
|
||||||
*/
|
*/
|
||||||
@@ -153,6 +163,46 @@ public final class PluginProps {
|
|||||||
this.supportingExtensions = supportingExtensions;
|
this.supportingExtensions = supportingExtensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an environment variable.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @return The value of the variable.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getEnvironmentVariable(@NotNull final String name) {
|
||||||
|
return environment.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an environment variable.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @param value The value.
|
||||||
|
*/
|
||||||
|
public void setEnvironmentVariable(@NotNull final String name,
|
||||||
|
@NotNull final String value) {
|
||||||
|
environment.put(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the plugin uses reflective reload.
|
||||||
|
*
|
||||||
|
* @return If the plugin uses reflective reload.
|
||||||
|
*/
|
||||||
|
public boolean isUsingReflectiveReload() {
|
||||||
|
return usesReflectiveReload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the plugin uses reflective reload.
|
||||||
|
*
|
||||||
|
* @param usesReflectiveReload If the plugin uses reflective reload.
|
||||||
|
*/
|
||||||
|
public void setUsesReflectiveReload(final boolean usesReflectiveReload) {
|
||||||
|
this.usesReflectiveReload = usesReflectiveReload;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure that all required props have been set.
|
* Ensure that all required props have been set.
|
||||||
*/
|
*/
|
||||||
@@ -232,7 +282,9 @@ public final class PluginProps {
|
|||||||
* @param color The primary color of the plugin.
|
* @param color The primary color of the plugin.
|
||||||
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
||||||
* @return The props.
|
* @return The props.
|
||||||
|
* @deprecated Moving to force the usage of eco.yml.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0")
|
||||||
static PluginProps createSimple(final int resourceId,
|
static PluginProps createSimple(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.willfp.eco.core;
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
import com.willfp.eco.core.integrations.economy.EconomyManager;
|
|
||||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||||
import com.willfp.eco.util.ClassUtils;
|
import com.willfp.eco.util.ClassUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -38,17 +37,6 @@ public class Prerequisite {
|
|||||||
"Requires server to have ProtocolLib"
|
"Requires server to have ProtocolLib"
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Requires the server to have vault installed.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
public static final Prerequisite HAS_VAULT = new Prerequisite(
|
|
||||||
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
|
|
||||||
"Requires server to have vault"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to be running 1.19.
|
* Requires the server to be running 1.19.
|
||||||
*/
|
*/
|
||||||
@@ -65,17 +53,6 @@ public class Prerequisite {
|
|||||||
"Requires server to be running 1.18+"
|
"Requires server to be running 1.18+"
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Requires the server to be running 1.17.
|
|
||||||
*
|
|
||||||
* @deprecated eco no longer supports versions before 1.17.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.25.2", forRemoval = true)
|
|
||||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
|
||||||
() -> ProxyConstants.NMS_VERSION.contains("17") || HAS_1_18.isMet(),
|
|
||||||
"Requires server to be running 1.17+"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to be running an implementation of BungeeCord.
|
* Requires the server to be running an implementation of BungeeCord.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* @deprecated Internal command implementations have been removed from the API.
|
* @deprecated Internal command implementations have been removed from the API.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true, since = "6.49.0")
|
@Deprecated(since = "6.49.0", forRemoval = true)
|
||||||
public final class DelegatedBukkitCommand extends Command implements TabCompleter, PluginIdentifiableCommand {
|
public final class DelegatedBukkitCommand extends Command implements TabCompleter, PluginIdentifiableCommand {
|
||||||
/**
|
/**
|
||||||
* The delegate command.
|
* The delegate command.
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
*/
|
*/
|
||||||
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
||||||
/**
|
/**
|
||||||
|
* Create a new extendable config.
|
||||||
|
*
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ import java.util.Map;
|
|||||||
@Deprecated(since = "6.44.0", forRemoval = true)
|
@Deprecated(since = "6.44.0", forRemoval = true)
|
||||||
public class TransientConfig extends ConfigWrapper<Config> {
|
public class TransientConfig extends ConfigWrapper<Config> {
|
||||||
/**
|
/**
|
||||||
|
* Create new transient config from bukkit config.
|
||||||
|
*
|
||||||
* @param config The ConfigurationSection handle.
|
* @param config The ConfigurationSection handle.
|
||||||
*/
|
*/
|
||||||
public TransientConfig(@NotNull final ConfigurationSection config) {
|
public TransientConfig(@NotNull final ConfigurationSection config) {
|
||||||
@@ -42,6 +44,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Create a transient config from an input stream.
|
||||||
|
*
|
||||||
* @param stream The InputStream.
|
* @param stream The InputStream.
|
||||||
*/
|
*/
|
||||||
public TransientConfig(@Nullable final InputStream stream) {
|
public TransientConfig(@Nullable final InputStream stream) {
|
||||||
@@ -51,15 +55,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param file The File.
|
* Load a file to a config.
|
||||||
* @deprecated Specify the config type to prevent bugs.
|
*
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
|
||||||
public TransientConfig(@Nullable final File file) {
|
|
||||||
this(file, ConfigType.YAML);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param file The file.
|
* @param file The file.
|
||||||
* @param type The config type to try read from.
|
* @param type The config type to try read from.
|
||||||
*/
|
*/
|
||||||
@@ -97,6 +94,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Load a config from a string.
|
||||||
|
*
|
||||||
* @param contents The contents of the config.
|
* @param contents The contents of the config.
|
||||||
* @param type The config type.
|
* @param type The config type.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -30,16 +30,6 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public interface Config extends Cloneable, PlaceholderInjectable {
|
public interface Config extends Cloneable, PlaceholderInjectable {
|
||||||
/**
|
|
||||||
* Clears cache.
|
|
||||||
* <p>
|
|
||||||
* Configs no longer have caches as they have in previous versions.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
|
||||||
default void clearCache() {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the config into readable text.
|
* Convert the config into readable text.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.config.interfaces;
|
|||||||
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -44,21 +43,6 @@ public interface LoadableConfig extends Config {
|
|||||||
*/
|
*/
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get bukkit {@link YamlConfiguration}.
|
|
||||||
* <p>
|
|
||||||
* This used to represent the underlying config, but since 6.30.0 configs use
|
|
||||||
* their own implementations internally, without relying on bukkit.
|
|
||||||
*
|
|
||||||
* @return The config, or null if config is not yaml-based.
|
|
||||||
* @deprecated Use toBukkit() instead.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
|
||||||
default YamlConfiguration getBukkitHandle() {
|
|
||||||
return this.toBukkit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the config to a bukkit {@link YamlConfiguration}.
|
* Convert the config to a bukkit {@link YamlConfiguration}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ import java.lang.annotation.Target;
|
|||||||
* <p>
|
* <p>
|
||||||
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
||||||
* calls in your code.
|
* calls in your code.
|
||||||
|
*
|
||||||
|
* While flexible, this can lead to long initialization times, so this feature
|
||||||
|
* can be disabled in eco.yml with the uses-reflective-reload option.
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.Set;
|
|||||||
*
|
*
|
||||||
* @param <T> The type of the handle.
|
* @param <T> The type of the handle.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"MethodDoesntCallSuperMethod", "removal"})
|
@SuppressWarnings("MethodDoesntCallSuperMethod")
|
||||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||||
/**
|
/**
|
||||||
* Configs from eco have an internal implementation,
|
* Configs from eco have an internal implementation,
|
||||||
@@ -42,12 +42,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
this.handle = handle;
|
this.handle = handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
|
||||||
public void clearCache() {
|
|
||||||
handle.clearCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toPlaintext() {
|
public String toPlaintext() {
|
||||||
return handle.toPlaintext();
|
return handle.toPlaintext();
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package com.willfp.eco.core.data;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple store key-value store for data to be stored outside of plugins.
|
||||||
|
*/
|
||||||
|
public final class ExternalDataStore {
|
||||||
|
/**
|
||||||
|
* The store.
|
||||||
|
*/
|
||||||
|
private static final HashMap<String, Object> data = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put data into the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param value The value.
|
||||||
|
*/
|
||||||
|
public static void put(@NotNull final String key,
|
||||||
|
@NotNull final Object value) {
|
||||||
|
data.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz) {
|
||||||
|
Object value = data.get(key);
|
||||||
|
|
||||||
|
if (clazz.isInstance(value)) {
|
||||||
|
return clazz.cast(value);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz,
|
||||||
|
@NotNull final T defaultValue) {
|
||||||
|
T value = get(key, clazz);
|
||||||
|
return value == null ? defaultValue : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz,
|
||||||
|
@NotNull final Supplier<T> defaultValue) {
|
||||||
|
return get(key, clazz, defaultValue.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExternalDataStore() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -82,44 +82,6 @@ public final class PersistentDataKey<T> {
|
|||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* In older eco versions, keys would have to be categorized in order
|
|
||||||
* to register the columns in the MySQL database. This is no longer needed.
|
|
||||||
* <p>
|
|
||||||
* Old description is below:
|
|
||||||
* <p>
|
|
||||||
* Categorize key as a server key, will register new column to MySQL
|
|
||||||
* database immediately rather than waiting for auto-categorization.
|
|
||||||
* <p>
|
|
||||||
* This will improve performance.
|
|
||||||
*
|
|
||||||
* @return The key.
|
|
||||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
|
||||||
public PersistentDataKey<T> server() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In older eco versions, keys would have to be categorized in order
|
|
||||||
* to register the columns in the MySQL database. This is no longer needed.
|
|
||||||
* <p>
|
|
||||||
* Old description is below:
|
|
||||||
* <p>
|
|
||||||
* Categorize key as a player key, will register new column to MySQL
|
|
||||||
* database immediately rather than waiting for auto-categorization.
|
|
||||||
* <p>
|
|
||||||
* This will improve performance.
|
|
||||||
*
|
|
||||||
* @return The key.
|
|
||||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
|
||||||
public PersistentDataKey<T> player() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all persistent data keys.
|
* Get all persistent data keys.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -22,55 +22,38 @@ public final class PersistentDataKeyType<T> {
|
|||||||
/**
|
/**
|
||||||
* String.
|
* String.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>(String.class, "STRING");
|
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>("STRING");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boolean.
|
* Boolean.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>(Boolean.class, "BOOLEAN");
|
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>("BOOLEAN");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Int.
|
* Int.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>(Integer.class, "INT");
|
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>("INT");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Double.
|
* Double.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>(Double.class, "DOUBLE");
|
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>("DOUBLE");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String List.
|
* String List.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>(null, "STRING_LIST");
|
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>("STRING_LIST");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Config.
|
* Config.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>(Config.class, "CONFIG");
|
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>("CONFIG");
|
||||||
|
|
||||||
/**
|
|
||||||
* The class of the type.
|
|
||||||
*/
|
|
||||||
private final Class<T> typeClass;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the key type.
|
* The name of the key type.
|
||||||
*/
|
*/
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the key type.
|
* Get the name of the key type.
|
||||||
*
|
*
|
||||||
@@ -83,14 +66,11 @@ public final class PersistentDataKeyType<T> {
|
|||||||
/**
|
/**
|
||||||
* Create new PersistentDataKeyType.
|
* Create new PersistentDataKeyType.
|
||||||
*
|
*
|
||||||
* @param typeClass The type class.
|
|
||||||
* @param name The name.
|
* @param name The name.
|
||||||
*/
|
*/
|
||||||
private PersistentDataKeyType(@Nullable final Class<T> typeClass,
|
private PersistentDataKeyType(@NotNull final String name) {
|
||||||
@NotNull final String name) {
|
|
||||||
VALUES.add(this);
|
VALUES.add(this);
|
||||||
|
|
||||||
this.typeClass = typeClass;
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,23 +112,6 @@ public abstract class DisplayModule {
|
|||||||
return this.getPlugin().getName();
|
return this.getPlugin().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the display priority.
|
|
||||||
*
|
|
||||||
* @return The priority.
|
|
||||||
* @deprecated Use getWeight instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public DisplayPriority getPriority() {
|
|
||||||
return 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.
|
* Get the display weight.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -6,7 +6,10 @@ package com.willfp.eco.core.display;
|
|||||||
public enum DisplayPriority {
|
public enum DisplayPriority {
|
||||||
/**
|
/**
|
||||||
* Custom weight.
|
* Custom weight.
|
||||||
|
*
|
||||||
|
* @deprecated Will never be used.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
CUSTOM(250),
|
CUSTOM(250),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -20,6 +20,13 @@ public abstract class CustomGoal<T extends Mob> implements EntityGoal<T>, Target
|
|||||||
*/
|
*/
|
||||||
private final Set<GoalFlag> flags = EnumSet.noneOf(GoalFlag.class);
|
private final Set<GoalFlag> flags = EnumSet.noneOf(GoalFlag.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new custom goal.
|
||||||
|
*/
|
||||||
|
protected CustomGoal() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the goal with a mob.
|
* Initialize the goal with a mob.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ public record EntityGoalTempt(
|
|||||||
boolean canBeScared
|
boolean canBeScared
|
||||||
) implements EntityGoal<Mob> {
|
) implements EntityGoal<Mob> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new entity goal.
|
||||||
|
*
|
||||||
* @param speed The speed at which the entity follows the item.
|
* @param speed The speed at which the entity follows the item.
|
||||||
* @param item The item that the entity will be attracted by.
|
* @param item The item that the entity will be attracted by.
|
||||||
* @param canBeScared If the entity can be scared and lose track of the item.
|
* @param canBeScared If the entity can be scared and lose track of the item.
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackable(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The type of entities to attack.
|
* @param target The type of entities to attack.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
* @param checkCanNavigate If navigation should be checked.
|
* @param checkCanNavigate If navigation should be checked.
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackableWitch(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The type of entities to attack.
|
* @param target The type of entities to attack.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
* @param checkCanNavigate If navigation should be checked.
|
* @param checkCanNavigate If navigation should be checked.
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ public record TargetGoalNearestHealableRaider(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The target.
|
* @param target The target.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ public record TargetGoalNonTameRandom(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Tameable> {
|
) implements TargetGoal<Tameable> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The types of entities to heal.
|
* @param target The types of entities to heal.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* The result of an arg parses.
|
||||||
|
*
|
||||||
* @param test The test for the entity.
|
* @param test The test for the entity.
|
||||||
* @param modifier The modifier to apply to the entity.
|
* @param modifier The modifier to apply to the entity.
|
||||||
* @see EntityArgParser
|
* @see EntityArgParser
|
||||||
|
|||||||
@@ -20,18 +20,6 @@ import java.util.Set;
|
|||||||
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
||||||
*/
|
*/
|
||||||
public interface FastItemStack extends PersistentDataHolder {
|
public interface FastItemStack extends PersistentDataHolder {
|
||||||
/**
|
|
||||||
* Get all enchantments on an item.
|
|
||||||
*
|
|
||||||
* @param checkStored If stored NBT should also be checked.
|
|
||||||
* @return A map of all enchantments.
|
|
||||||
* @deprecated Poorly named method. Use getEnchants instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
default Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored) {
|
|
||||||
return getEnchants(checkStored);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all enchantments on an item.
|
* Get all enchantments on an item.
|
||||||
* Does not account for stored enchants.
|
* Does not account for stored enchants.
|
||||||
@@ -51,33 +39,6 @@ public interface FastItemStack extends PersistentDataHolder {
|
|||||||
@NotNull
|
@NotNull
|
||||||
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
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.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
|
||||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
|
||||||
default int getLevelOnItem(@NotNull Enchantment enchantment,
|
|
||||||
boolean checkStored) {
|
|
||||||
return getEnchantmentLevel(enchantment, checkStored);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the level of an enchantment.
|
* Get the level of an enchantment.
|
||||||
*
|
*
|
||||||
@@ -85,7 +46,7 @@ public interface FastItemStack extends PersistentDataHolder {
|
|||||||
* @return The enchantment level, or 0 if not found.
|
* @return The enchantment level, or 0 if not found.
|
||||||
*/
|
*/
|
||||||
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
||||||
return getLevelOnItem(enchantment, false);
|
return getEnchantmentLevel(enchantment, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,20 +3,15 @@ package com.willfp.eco.core.gui.menu;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.gui.page.Page;
|
import com.willfp.eco.core.gui.page.Page;
|
||||||
import com.willfp.eco.core.gui.slot.Slot;
|
import com.willfp.eco.core.gui.slot.Slot;
|
||||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
|
||||||
import org.bukkit.NamespacedKey;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GUI version of {@link Inventory}.
|
* GUI version of {@link Inventory}.
|
||||||
@@ -240,58 +235,6 @@ public interface Menu {
|
|||||||
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Write data.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param key The key.
|
|
||||||
* @param type The type.
|
|
||||||
* @param value The value.
|
|
||||||
* @param <T> The type.
|
|
||||||
* @param <Z> The type.
|
|
||||||
* @deprecated Use addState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default <T, Z> void writeData(@NotNull final Player player,
|
|
||||||
@NotNull final NamespacedKey key,
|
|
||||||
@NotNull final PersistentDataType<T, Z> type,
|
|
||||||
@NotNull final Z value) {
|
|
||||||
this.setState(player, key.toString(), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read data.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param key The key.
|
|
||||||
* @param type The type.
|
|
||||||
* @param <T> The type.
|
|
||||||
* @param <Z> The type.
|
|
||||||
* @return The data.
|
|
||||||
* @deprecated Use getState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default @Nullable <T, Z> T readData(@NotNull final Player player,
|
|
||||||
@NotNull final NamespacedKey key,
|
|
||||||
@NotNull final PersistentDataType<T, Z> type) {
|
|
||||||
return this.getState(player, key.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all data keys for a player.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @return The keys.
|
|
||||||
* @deprecated Use getState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default Set<NamespacedKey> getKeys(@NotNull final Player player) {
|
|
||||||
return this.getState(player).keySet().stream()
|
|
||||||
.map(NamespacedKeyUtils::fromStringOrNull)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a builder with a given amount of rows.
|
* Create a builder with a given amount of rows.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -90,17 +90,4 @@ public abstract class CustomSlot implements Slot {
|
|||||||
public final Slot getSlotAt(int row, int column) {
|
public final Slot getSlotAt(int row, int column) {
|
||||||
return Slot.super.getSlotAt(row, column);
|
return Slot.super.getSlotAt(row, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the delegate slot.
|
|
||||||
* <p>
|
|
||||||
* This is not required to add the slot to a menu, but is instead used internally.
|
|
||||||
*
|
|
||||||
* @return The slot.
|
|
||||||
* @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)}
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
public Slot getDelegate() {
|
|
||||||
return this.delegate;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,27 +158,4 @@ public interface Slot extends GUIComponent {
|
|||||||
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
||||||
return Eco.get().createSlotBuilder(provider);
|
return Eco.get().createSlotBuilder(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If the slot is not captive for a player.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @return If not captive for the player.
|
|
||||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
default boolean isNotCaptiveFor(@NotNull Player player) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the slot is captive. (Can items be placed in it).
|
|
||||||
*
|
|
||||||
* @return If captive.
|
|
||||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
default boolean isCaptive() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.afk;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for afk integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AFKIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AFKWrapper extends AFKIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.willfp.eco.core.integrations.anticheat;
|
package com.willfp.eco.core.integrations.anticheat;
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -18,19 +17,6 @@ public final class AnticheatManager {
|
|||||||
*/
|
*/
|
||||||
private static final Set<AnticheatIntegration> 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 AnticheatIntegration anticheat) {
|
|
||||||
register(anticheat);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a new anticheat.
|
* Register a new anticheat.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.anticheat;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for anticheat integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AnticheatIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AnticheatWrapper extends AnticheatIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.antigrief;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for antigrief integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AntigriefIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AntigriefWrapper extends AntigriefIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.customentities;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for custom item integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use CustomEntitiesIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface CustomEntitiesWrapper extends CustomEntitiesIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.customitems;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for custom item integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use CustomItemsIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface CustomItemsWrapper extends CustomItemsIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.economy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for economy integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use EconomyIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface EconomyWrapper extends EconomyIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.hologram;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for hologram integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use HologramIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface HologramWrapper extends HologramIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.mcmmo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for mcmmo integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use McmmoIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface McmmoWrapper extends McmmoIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.placeholder;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import com.willfp.eco.core.placeholder.Placeholder;
|
|
||||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
|
||||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
|
||||||
import org.apache.commons.lang.Validate;
|
|
||||||
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 entry is a placeholder in and of itself.
|
|
||||||
* <p>
|
|
||||||
* It should be fairly straightforward.
|
|
||||||
*
|
|
||||||
* @deprecated Confusing functionality with inconsistent nullability and poor naming.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
|
||||||
public class PlaceholderEntry {
|
|
||||||
/**
|
|
||||||
* The name of the placeholder, used in lookups.
|
|
||||||
*/
|
|
||||||
private final String identifier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The lambda to retrieve the output of the placeholder given a player.
|
|
||||||
*/
|
|
||||||
private final Function<Player, String> function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the placeholder requires a player to lookup.
|
|
||||||
*/
|
|
||||||
private final boolean requiresPlayer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The plugin for the placeholder.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
private final EcoPlugin plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that doesn't require a player.
|
|
||||||
*
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder given a player.
|
|
||||||
* @deprecated Specify a plugin.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function) {
|
|
||||||
this(identifier, function, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that may require a player.
|
|
||||||
*
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder.
|
|
||||||
* @param requiresPlayer If the placeholder requires a player.
|
|
||||||
* @deprecated Specify a plugin.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function,
|
|
||||||
final boolean requiresPlayer) {
|
|
||||||
this(null, identifier, function, requiresPlayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that doesn't require a player.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin for the placeholder.
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder given a player.
|
|
||||||
*/
|
|
||||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
|
||||||
@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function) {
|
|
||||||
this(plugin, identifier, function, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that may require a player.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin for the placeholder.
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder.
|
|
||||||
* @param requiresPlayer If the placeholder requires a player.
|
|
||||||
*/
|
|
||||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
|
||||||
@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function,
|
|
||||||
final boolean requiresPlayer) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
this.identifier = identifier;
|
|
||||||
this.function = function;
|
|
||||||
this.requiresPlayer = requiresPlayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the result of the placeholder with respect to a player.
|
|
||||||
*
|
|
||||||
* @param player The player to translate with respect to.
|
|
||||||
* @return The result of the placeholder.
|
|
||||||
*/
|
|
||||||
public String getResult(@Nullable final Player player) {
|
|
||||||
if (player == null) {
|
|
||||||
Validate.isTrue(!requiresPlayer, "null player passed to requiresPlayer placeholder.");
|
|
||||||
}
|
|
||||||
return this.function.apply(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get if the placeholder requires a player to get a result.
|
|
||||||
*
|
|
||||||
* @return If the placeholder requires a player.
|
|
||||||
*/
|
|
||||||
public boolean requiresPlayer() {
|
|
||||||
return requiresPlayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the identifier.
|
|
||||||
*
|
|
||||||
* @return The identifier.
|
|
||||||
*/
|
|
||||||
public String getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the plugin.
|
|
||||||
*
|
|
||||||
* @return The plugin.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public EcoPlugin getPlugin() {
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the placeholder.
|
|
||||||
*/
|
|
||||||
public void register() {
|
|
||||||
PlaceholderManager.registerPlaceholder(this.toModernPlaceholder());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert the placeholder to a modern placeholder.
|
|
||||||
*
|
|
||||||
* @return The placeholder.
|
|
||||||
*/
|
|
||||||
Placeholder toModernPlaceholder() {
|
|
||||||
if (this.requiresPlayer) {
|
|
||||||
return new PlayerPlaceholder(
|
|
||||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
|
||||||
identifier,
|
|
||||||
function
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return new PlayerlessPlaceholder(
|
|
||||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
|
||||||
identifier,
|
|
||||||
() -> function.apply(null)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(@Nullable final Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(o instanceof PlaceholderEntry entry)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return Objects.equals(this.getIdentifier(), entry.getIdentifier())
|
|
||||||
&& Objects.equals(this.getPlugin(), entry.getPlugin());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(this.getIdentifier(), this.getPlugin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,6 @@ package com.willfp.eco.core.integrations.placeholder;
|
|||||||
import com.github.benmanes.caffeine.cache.Cache;
|
import com.github.benmanes.caffeine.cache.Cache;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
import com.willfp.eco.core.Eco;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||||
import com.willfp.eco.core.placeholder.DynamicPlaceholder;
|
import com.willfp.eco.core.placeholder.DynamicPlaceholder;
|
||||||
@@ -16,6 +15,7 @@ import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
|||||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -36,7 +36,6 @@ import java.util.regex.Pattern;
|
|||||||
/**
|
/**
|
||||||
* Class to handle placeholder integrations.
|
* Class to handle placeholder integrations.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("removal")
|
|
||||||
public final class PlaceholderManager {
|
public final class PlaceholderManager {
|
||||||
/**
|
/**
|
||||||
* All registered placeholders.
|
* All registered placeholders.
|
||||||
@@ -78,6 +77,11 @@ public final class PlaceholderManager {
|
|||||||
* Empty injectable object.
|
* Empty injectable object.
|
||||||
*/
|
*/
|
||||||
public static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
public static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
||||||
|
@Override
|
||||||
|
public void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearInjectedPlaceholders() {
|
public void clearInjectedPlaceholders() {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
@@ -110,25 +114,12 @@ public final class PlaceholderManager {
|
|||||||
throw new IllegalArgumentException("Static placeholders cannot be registered!");
|
throw new IllegalArgumentException("Static placeholders cannot be registered!");
|
||||||
}
|
}
|
||||||
|
|
||||||
EcoPlugin plugin = placeholder.getPlugin() == null ? Eco.get().getEcoPlugin() : placeholder.getPlugin();
|
|
||||||
|
|
||||||
Map<Pattern, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
Map<Pattern, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
||||||
.getOrDefault(plugin, new HashMap<>());
|
.getOrDefault(placeholder.getPlugin(), new HashMap<>());
|
||||||
|
|
||||||
pluginPlaceholders.put(placeholder.getPattern(), placeholder);
|
pluginPlaceholders.put(placeholder.getPattern(), placeholder);
|
||||||
|
|
||||||
REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders);
|
REGISTERED_PLACEHOLDERS.put(placeholder.getPlugin(), pluginPlaceholders);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a placeholder.
|
|
||||||
*
|
|
||||||
* @param placeholder The placeholder to register.
|
|
||||||
* @deprecated Uses old placeholder system.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
|
||||||
public static void registerPlaceholder(@NotNull final PlaceholderEntry placeholder) {
|
|
||||||
registerPlaceholder(placeholder.toModernPlaceholder());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,10 +130,11 @@ public final class PlaceholderManager {
|
|||||||
* @return The value of the placeholder.
|
* @return The value of the placeholder.
|
||||||
* @deprecated Specify a plugin to get the result from.
|
* @deprecated Specify a plugin to get the result from.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated(since = "6.52.2", forRemoval = true)
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public static String getResult(@Nullable final Player player,
|
public static String getResult(@Nullable final Player player,
|
||||||
@NotNull final String identifier) {
|
@NotNull final String identifier) {
|
||||||
return getResult(player, identifier, null);
|
throw new UnsupportedOperationException("Please specify a plugin to get the result from!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,34 +148,21 @@ public final class PlaceholderManager {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static String getResult(@Nullable final Player player,
|
public static String getResult(@Nullable final Player player,
|
||||||
@NotNull final String identifier,
|
@NotNull final String identifier,
|
||||||
@Nullable final EcoPlugin plugin) {
|
@NotNull final EcoPlugin plugin) {
|
||||||
|
Validate.notNull(plugin, "Plugin cannot be null!");
|
||||||
|
|
||||||
// This is really janky, and it sucks, but it works so?
|
// This is really janky, and it sucks, but it works so?
|
||||||
// Compensating for regex being slow so that's why we get it.
|
// Compensating for regex being slow so that's why we get it.
|
||||||
Placeholder placeholder = PLACEHOLDER_LOOKUP_CACHE.get(
|
Placeholder placeholder = PLACEHOLDER_LOOKUP_CACHE.get(
|
||||||
new PlaceholderLookup(identifier, plugin),
|
new PlaceholderLookup(identifier, plugin),
|
||||||
(it) -> {
|
(it) -> {
|
||||||
EcoPlugin owner = plugin == null ? Eco.get().getEcoPlugin() : plugin;
|
|
||||||
|
|
||||||
// I hate the streams API.
|
// I hate the streams API.
|
||||||
Optional<Placeholder> found = REGISTERED_PLACEHOLDERS
|
return REGISTERED_PLACEHOLDERS
|
||||||
.getOrDefault(owner, new HashMap<>())
|
.getOrDefault(plugin, new HashMap<>())
|
||||||
.entrySet()
|
.entrySet()
|
||||||
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
||||||
.map(Map.Entry::getValue)
|
.map(Map.Entry::getValue)
|
||||||
.findFirst();
|
.findFirst();
|
||||||
|
|
||||||
if (found.isEmpty() && plugin != null) {
|
|
||||||
// Here we go again! Something about legacy support? I don't remember.
|
|
||||||
// I won't touch it though, I'm scared of the placeholder system.
|
|
||||||
found = REGISTERED_PLACEHOLDERS
|
|
||||||
.getOrDefault(Eco.get().getEcoPlugin(), new HashMap<>())
|
|
||||||
.entrySet()
|
|
||||||
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
|
||||||
.map(Map.Entry::getValue)
|
|
||||||
.findFirst();
|
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
).orElse(null);
|
).orElse(null);
|
||||||
|
|
||||||
@@ -231,22 +210,6 @@ public final class PlaceholderManager {
|
|||||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
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 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.
|
* Translate all placeholders with respect to a player.
|
||||||
*
|
*
|
||||||
@@ -276,6 +239,35 @@ public final class PlaceholderManager {
|
|||||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||||
String processed = text;
|
String processed = text;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Why am I doing statics at the start, but player statics at the end?
|
||||||
|
|
||||||
|
Additional players let you use something like victim as a player to parse in relation to,
|
||||||
|
for example doing %victim_player_health%, which would parse the health of the victim.
|
||||||
|
|
||||||
|
However, something like libreforge will also inject %victim_max_health%, which is unrelated
|
||||||
|
to additional players, and instead holds a constant value. So, eco saw this, smartly thought
|
||||||
|
"ah, it's an additional player, let's parse it", and then tried to parse %max_health% with
|
||||||
|
relation to the victim, which resolved to zero. So, we have to parse statics and player statics
|
||||||
|
that might include a prefix first, then additional players, then player statics with the support
|
||||||
|
of additional players.
|
||||||
|
|
||||||
|
This was a massive headache and took so many reports before I clocked what was going on.
|
||||||
|
|
||||||
|
Oh well, at least it's fixed now.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Prevent running 2 scans if there are no additional players.
|
// Prevent running 2 scans if there are no additional players.
|
||||||
if (!additionalPlayers.isEmpty()) {
|
if (!additionalPlayers.isEmpty()) {
|
||||||
List<String> found = findPlaceholdersIn(text);
|
List<String> found = findPlaceholdersIn(text);
|
||||||
@@ -297,19 +289,23 @@ public final class PlaceholderManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only run jank code if there are no integrations.
|
||||||
|
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||||
|
processed = setWithoutIntegration(processed, player);
|
||||||
|
}
|
||||||
|
|
||||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||||
processed = integration.translate(processed, player);
|
processed = integration.translate(processed, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DON'T REMOVE THIS, IT'S NOT DUPLICATE CODE.
|
||||||
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||||
// Do I know this is a bad way of doing this? Yes.
|
// Do I know this is a bad way of doing this? Yes.
|
||||||
// I know it's deprecated, but it's fast.
|
if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||||
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));
|
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return processed;
|
return processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,12 +318,9 @@ public final class PlaceholderManager {
|
|||||||
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||||
Set<String> found = new HashSet<>();
|
Set<String> found = new HashSet<>();
|
||||||
|
|
||||||
// Mock PAPI for those without it installed
|
Matcher matcher = PATTERN.matcher(text);
|
||||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
while (matcher.find()) {
|
||||||
Matcher matcher = PATTERN.matcher(text);
|
found.add(matcher.group());
|
||||||
while (matcher.find()) {
|
|
||||||
found.add(matcher.group());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||||
@@ -337,6 +330,95 @@ public final class PlaceholderManager {
|
|||||||
return new ArrayList<>(found);
|
return new ArrayList<>(found);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set placeholders without any integrations.
|
||||||
|
* <p>
|
||||||
|
* This is fallback if for some reason you don't have PAPI installed.
|
||||||
|
* It's a cut-down version of the actual PAPI code, and I don't
|
||||||
|
* really know how it works.
|
||||||
|
* <p>
|
||||||
|
* Original source
|
||||||
|
* <a href="https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java">here</a>.
|
||||||
|
*
|
||||||
|
* @param text The text.
|
||||||
|
* @param player The player.
|
||||||
|
* @return The text.
|
||||||
|
*/
|
||||||
|
private static String setWithoutIntegration(@NotNull final String text,
|
||||||
|
@Nullable final Player player) {
|
||||||
|
char[] chars = text.toCharArray();
|
||||||
|
StringBuilder builder = new StringBuilder(text.length());
|
||||||
|
StringBuilder identifier = new StringBuilder();
|
||||||
|
StringBuilder parameters = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < chars.length; i++) {
|
||||||
|
char currentChar = chars[i];
|
||||||
|
if (currentChar == '%' && i + 1 < chars.length) {
|
||||||
|
boolean identified = false;
|
||||||
|
boolean badPlaceholder = true;
|
||||||
|
boolean hadSpace = false;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
i++;
|
||||||
|
if (i >= chars.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char p = chars[i];
|
||||||
|
if (p == ' ' && !identified) {
|
||||||
|
hadSpace = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == '%') {
|
||||||
|
badPlaceholder = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == '_' && !identified) {
|
||||||
|
identified = true;
|
||||||
|
} else if (identified) {
|
||||||
|
parameters.append(p);
|
||||||
|
} else {
|
||||||
|
identifier.append(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String pluginName = identifier.toString().toLowerCase();
|
||||||
|
EcoPlugin plugin = EcoPlugin.getPlugin(pluginName);
|
||||||
|
String placeholderIdentifier = parameters.toString();
|
||||||
|
identifier.setLength(0);
|
||||||
|
parameters.setLength(0);
|
||||||
|
if (badPlaceholder) {
|
||||||
|
builder.append('%').append(pluginName);
|
||||||
|
if (identified) {
|
||||||
|
builder.append('_').append(placeholderIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hadSpace) {
|
||||||
|
builder.append(' ');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (plugin == null) {
|
||||||
|
builder.append('%').append(pluginName);
|
||||||
|
|
||||||
|
if (identified) {
|
||||||
|
builder.append('_');
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append(placeholderIdentifier).append('%');
|
||||||
|
} else {
|
||||||
|
builder.append(getResult(player, placeholderIdentifier, plugin));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
builder.append(currentChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private record PlaceholderLookup(@NotNull String identifier,
|
private record PlaceholderLookup(@NotNull String identifier,
|
||||||
@Nullable EcoPlugin plugin) {
|
@Nullable EcoPlugin plugin) {
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.shop;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for shop integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use ShopIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface ShopWrapper extends ShopIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -568,6 +568,42 @@ public final class Items {
|
|||||||
return EMPTY_TESTABLE_ITEM.matches(itemStack);
|
return EMPTY_TESTABLE_ITEM.matches(itemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if an item matches any items.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param items The items.
|
||||||
|
* @return If matches any.
|
||||||
|
*/
|
||||||
|
public static boolean matchesAny(@Nullable final ItemStack itemStack,
|
||||||
|
@NotNull final Collection<TestableItem> items) {
|
||||||
|
for (TestableItem item : items) {
|
||||||
|
if (item.matches(itemStack)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if any item matches any item.
|
||||||
|
*
|
||||||
|
* @param itemStacks The items.
|
||||||
|
* @param items The items.
|
||||||
|
* @return If matches any.
|
||||||
|
*/
|
||||||
|
public static boolean matchesAny(@NotNull final Collection<ItemStack> itemStacks,
|
||||||
|
@NotNull final Collection<TestableItem> items) {
|
||||||
|
for (ItemStack itemStack : itemStacks) {
|
||||||
|
if (matchesAny(itemStack, items)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private Items() {
|
private Items() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
168
eco-api/src/main/java/com/willfp/eco/core/map/DefaultMap.java
Normal file
168
eco-api/src/main/java/com/willfp/eco/core/map/DefaultMap.java
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
package com.willfp.eco.core.map;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A map with a default value.
|
||||||
|
*
|
||||||
|
* @param <K> The key type.
|
||||||
|
* @param <V> The value type.
|
||||||
|
*/
|
||||||
|
public class DefaultMap<K, V> implements Map<K, V> {
|
||||||
|
/**
|
||||||
|
* The map.
|
||||||
|
*/
|
||||||
|
private final Map<K, V> map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default value.
|
||||||
|
*/
|
||||||
|
private final Supplier<V> defaultValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new default map.
|
||||||
|
*
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
*/
|
||||||
|
public DefaultMap(@NotNull final V defaultValue) {
|
||||||
|
this(() -> defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new default map.
|
||||||
|
*
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
*/
|
||||||
|
public DefaultMap(@NotNull final Supplier<V> defaultValue) {
|
||||||
|
this(new HashMap<>(), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new default map.
|
||||||
|
*
|
||||||
|
* @param map The map.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
*/
|
||||||
|
public DefaultMap(@NotNull final Map<K, V> map,
|
||||||
|
@NotNull final V defaultValue) {
|
||||||
|
this(map, () -> defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new default map.
|
||||||
|
*
|
||||||
|
* @param map The map.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
*/
|
||||||
|
public DefaultMap(@NotNull final Map<K, V> map,
|
||||||
|
@NotNull final Supplier<V> defaultValue) {
|
||||||
|
this.map = map;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public V get(@Nullable final Object key) {
|
||||||
|
if (key == null) {
|
||||||
|
return defaultValue.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map.get(key) == null) {
|
||||||
|
map.put((K) key, defaultValue.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
return map.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return map.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return map.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsKey(@Nullable final Object key) {
|
||||||
|
return map.containsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsValue(@Nullable final Object value) {
|
||||||
|
return map.containsValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V put(@NotNull final K key, @Nullable final V value) {
|
||||||
|
return map.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V remove(@NotNull final Object key) {
|
||||||
|
return map.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putAll(@NotNull final Map<? extends K, ? extends V> m) {
|
||||||
|
map.putAll(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear() {
|
||||||
|
map.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<K> keySet() {
|
||||||
|
return map.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Collection<V> values() {
|
||||||
|
return map.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<Entry<K, V>> entrySet() {
|
||||||
|
return map.entrySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new nested map.
|
||||||
|
*
|
||||||
|
* @param <K> The key type.
|
||||||
|
* @param <K1> The nested key type.
|
||||||
|
* @param <V> The value type.
|
||||||
|
* @return The nested map.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <K, K1, V> DefaultMap<K, Map<K1, V>> createNestedMap() {
|
||||||
|
return new DefaultMap<>(new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new nested list map.
|
||||||
|
*
|
||||||
|
* @param <K> The key type.
|
||||||
|
* @param <K1> The nested key type.
|
||||||
|
* @param <V> The value type.
|
||||||
|
* @return The nested list map.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <K, K1, V> DefaultMap<K, ListMap<K1, V>> createNestedListMap() {
|
||||||
|
return new DefaultMap<>(new ListMap<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
32
eco-api/src/main/java/com/willfp/eco/core/map/ListMap.java
Normal file
32
eco-api/src/main/java/com/willfp/eco/core/map/ListMap.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package com.willfp.eco.core.map;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps keys to lists of values.
|
||||||
|
*
|
||||||
|
* @param <K> The key type.
|
||||||
|
* @param <V> The value type.
|
||||||
|
*/
|
||||||
|
public class ListMap<K, V> extends DefaultMap<K, List<V>> {
|
||||||
|
/**
|
||||||
|
* Create a new list map.
|
||||||
|
*/
|
||||||
|
public ListMap() {
|
||||||
|
super(ArrayList::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a value to a key.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param value The value.
|
||||||
|
*/
|
||||||
|
public void append(@NotNull final K key,
|
||||||
|
@NotNull final V value) {
|
||||||
|
this.get(key).add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,13 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* Empty (invalid) particle that is spawned when an invalid key is provided.
|
* Empty (invalid) particle that is spawned when an invalid key is provided.
|
||||||
*/
|
*/
|
||||||
public final class EmptyParticle implements SpawnableParticle {
|
public final class EmptyParticle implements SpawnableParticle {
|
||||||
|
/**
|
||||||
|
* Instantiate a new empty particle.
|
||||||
|
*/
|
||||||
|
public EmptyParticle() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void spawn(@NotNull final Location location,
|
public void spawn(@NotNull final Location location,
|
||||||
final int amount) {
|
final int amount) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.placeholder;
|
|||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceho
|
|||||||
*
|
*
|
||||||
* @return The plugin.
|
* @return The plugin.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@NotNull
|
||||||
EcoPlugin getPlugin();
|
EcoPlugin getPlugin();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.placeholder;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,7 +14,7 @@ public interface PlaceholderInjectable {
|
|||||||
* @param placeholders The placeholders.
|
* @param placeholders The placeholders.
|
||||||
*/
|
*/
|
||||||
default void injectPlaceholders(@NotNull StaticPlaceholder... placeholders) {
|
default void injectPlaceholders(@NotNull StaticPlaceholder... placeholders) {
|
||||||
this.injectPlaceholders(List.of(placeholders));
|
this.addInjectablePlaceholder(List.of(placeholders));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,20 +26,6 @@ public interface PlaceholderInjectable {
|
|||||||
this.addInjectablePlaceholder(List.of(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.
|
* Inject placeholders.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -48,41 +33,13 @@ public interface PlaceholderInjectable {
|
|||||||
*
|
*
|
||||||
* @param placeholders The placeholders.
|
* @param placeholders The placeholders.
|
||||||
*/
|
*/
|
||||||
default void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
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.
|
* Clear injected placeholders.
|
||||||
*/
|
*/
|
||||||
void clearInjectedPlaceholders();
|
void clearInjectedPlaceholders();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get injected placeholders.
|
|
||||||
*
|
|
||||||
* @return Injected placeholders.
|
|
||||||
* @deprecated Use getPlaceholderInjections.
|
|
||||||
*/
|
|
||||||
@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.
|
* Get injected placeholders.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -91,7 +48,5 @@ public interface PlaceholderInjectable {
|
|||||||
* @return Injected placeholders.
|
* @return Injected placeholders.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default List<InjectablePlaceholder> getPlaceholderInjections() {
|
List<InjectablePlaceholder> getPlaceholderInjections();
|
||||||
return new ArrayList<>(getInjectedPlaceholders());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
package com.willfp.eco.core.proxy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prior to 6.17.0, all proxies were required to implement this interface,
|
|
||||||
* however it produced no functionality and was not even used internally.
|
|
||||||
*
|
|
||||||
* @deprecated Unused class, not required. Will be removed in a subsequent release.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
|
||||||
public interface AbstractProxy {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package com.willfp.eco.core.proxy;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A cleaner is an internal component to fix classloader errors.
|
|
||||||
* <p>
|
|
||||||
* Important to allow for PlugMan/ServerUtils support.
|
|
||||||
*
|
|
||||||
* @deprecated No reason for this to be in the API.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
public interface Cleaner {
|
|
||||||
/**
|
|
||||||
* Clean up classes left over from plugin.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin.
|
|
||||||
*/
|
|
||||||
void clean(@NotNull EcoPlugin plugin);
|
|
||||||
}
|
|
||||||
@@ -22,7 +22,8 @@ public final class ProxyConstants {
|
|||||||
"v1_18_R1",
|
"v1_18_R1",
|
||||||
"v1_18_R2",
|
"v1_18_R2",
|
||||||
"v1_19_R1",
|
"v1_19_R1",
|
||||||
"v1_19_R2"
|
"v1_19_R2",
|
||||||
|
"v1_19_R3"
|
||||||
);
|
);
|
||||||
|
|
||||||
private ProxyConstants() {
|
private ProxyConstants() {
|
||||||
|
|||||||
@@ -16,15 +16,4 @@ public class ProxyError extends Error {
|
|||||||
@NotNull final Throwable cause) {
|
@NotNull final Throwable cause) {
|
||||||
super(message, cause);
|
super(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Thrown if there is an error getting a proxy.
|
|
||||||
*
|
|
||||||
* @param message The message to send.
|
|
||||||
* @deprecated Proxy Errors should include a cause.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
public ProxyError(@NotNull final String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package com.willfp.eco.core.proxy.exceptions;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Error if the server is running an unsupported version.
|
|
||||||
*
|
|
||||||
* @deprecated Poorly named, exception when it's actually an error, contains doubly nested errors.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("removal")
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
public class UnsupportedVersionException extends ProxyError {
|
|
||||||
/**
|
|
||||||
* Thrown if the server is running an unsupported NMS version.
|
|
||||||
*
|
|
||||||
* @param message The message to send.
|
|
||||||
* @deprecated Use the default constructor.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
public UnsupportedVersionException(@NotNull final String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thrown if the server is running an unsupported NMS version.
|
|
||||||
*/
|
|
||||||
public UnsupportedVersionException() {
|
|
||||||
super("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION, new IllegalStateException());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -53,7 +53,11 @@ public final class Recipes {
|
|||||||
* @return The match, or null if not found.
|
* @return The match, or null if not found.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static CraftingRecipe getMatch(@NotNull final ItemStack[] matrix) {
|
public static CraftingRecipe getMatch(@Nullable final ItemStack[] matrix) {
|
||||||
|
if (matrix == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return RECIPES_FROM_MATRIX.get(matrix).orElse(null);
|
return RECIPES_FROM_MATRIX.get(matrix).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public interface CraftingRecipe {
|
|||||||
* @param matrix The matrix to check.
|
* @param matrix The matrix to check.
|
||||||
* @return If the recipe matches.
|
* @return If the recipe matches.
|
||||||
*/
|
*/
|
||||||
boolean test(@NotNull ItemStack[] matrix);
|
boolean test(@Nullable ItemStack[] matrix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the recipe.
|
* Register the recipe.
|
||||||
|
|||||||
@@ -69,7 +69,11 @@ public final class ShapedCraftingRecipe implements CraftingRecipe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(@NotNull final ItemStack[] matrix) {
|
public boolean test(@Nullable final ItemStack[] matrix) {
|
||||||
|
if (matrix == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
List<ItemStack> dynamicMatrix = Arrays.asList(matrix);
|
List<ItemStack> dynamicMatrix = Arrays.asList(matrix);
|
||||||
boolean matches = true;
|
boolean matches = true;
|
||||||
for (int i = 0; i < 9; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
|
|||||||
@@ -80,7 +80,11 @@ public final class ShapelessCraftingRecipe implements CraftingRecipe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(@NotNull final ItemStack[] matrix) {
|
public boolean test(@Nullable final ItemStack[] matrix) {
|
||||||
|
if (matrix == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
RecipeTest test = newTest();
|
RecipeTest test = newTest();
|
||||||
|
|
||||||
for (ItemStack stack : matrix) {
|
for (ItemStack stack : matrix) {
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.willfp.eco.core.registry;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An object that can be registered.
|
||||||
|
*
|
||||||
|
* @see Registry
|
||||||
|
*/
|
||||||
|
public interface Registrable {
|
||||||
|
/**
|
||||||
|
* Get the ID of the element.
|
||||||
|
*
|
||||||
|
* @return The ID.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
String getID();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the element is registered.
|
||||||
|
* <p>
|
||||||
|
* This is called after registration.
|
||||||
|
*/
|
||||||
|
default void onRegister() {
|
||||||
|
// Do nothing by default.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the element is removed.
|
||||||
|
* <p>
|
||||||
|
* This is called before removal.
|
||||||
|
*/
|
||||||
|
default void onRemove() {
|
||||||
|
// Do nothing by default.
|
||||||
|
}
|
||||||
|
}
|
||||||
125
eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java
Normal file
125
eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
package com.willfp.eco.core.registry;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A registry for {@link Registrable}s.
|
||||||
|
*
|
||||||
|
* @param <T> The type of {@link Registrable}.
|
||||||
|
*/
|
||||||
|
public class Registry<T extends Registrable> {
|
||||||
|
/**
|
||||||
|
* The ID pattern.
|
||||||
|
*/
|
||||||
|
private static final Pattern ID_PATTERN = Pattern.compile("[a-z0-9_]{1,100}");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The registry.
|
||||||
|
*/
|
||||||
|
private final Map<String, T> registry = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate a new registry.
|
||||||
|
*/
|
||||||
|
public Registry() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new element.
|
||||||
|
*
|
||||||
|
* @param element The element to register.
|
||||||
|
* @return The element.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public T register(@NotNull final T element) {
|
||||||
|
Validate.isTrue(ID_PATTERN.matcher(element.getID()).matches(), "ID must match pattern: " + ID_PATTERN.pattern() + " (was " + element.getID() + ")");
|
||||||
|
|
||||||
|
registry.put(element.getID(), element);
|
||||||
|
|
||||||
|
element.onRegister();
|
||||||
|
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an element.
|
||||||
|
*
|
||||||
|
* @param element The element.
|
||||||
|
* @return The element.
|
||||||
|
*/
|
||||||
|
public T remove(@NotNull final T element) {
|
||||||
|
element.onRemove();
|
||||||
|
|
||||||
|
registry.remove(element.getID());
|
||||||
|
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an element by ID.
|
||||||
|
*
|
||||||
|
* @param id The ID.
|
||||||
|
* @return The element.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public T remove(@NotNull final String id) {
|
||||||
|
T element = registry.get(id);
|
||||||
|
|
||||||
|
if (element != null) {
|
||||||
|
element.onRemove();
|
||||||
|
}
|
||||||
|
|
||||||
|
return registry.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an element by ID.
|
||||||
|
*
|
||||||
|
* @param id The ID.
|
||||||
|
* @return The element, or null if not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public T get(@NotNull final String id) {
|
||||||
|
return registry.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the registry.
|
||||||
|
*/
|
||||||
|
public void clear() {
|
||||||
|
for (T value : Set.copyOf(registry.values())) {
|
||||||
|
remove(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all elements.
|
||||||
|
*
|
||||||
|
* @return All elements.
|
||||||
|
*/
|
||||||
|
public Set<T> values() {
|
||||||
|
return Set.copyOf(registry.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to fit a string to the ID pattern.
|
||||||
|
*
|
||||||
|
* @param string The string.
|
||||||
|
* @return The string in lowercase, but with all spaces, dots, and dashes replaced with underscores.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static String tryFitPattern(@NotNull final String string) {
|
||||||
|
return string.replace(" ", "_")
|
||||||
|
.replace(".", "_")
|
||||||
|
.replace("-", "_")
|
||||||
|
.toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
package com.willfp.eco.util;
|
package com.willfp.eco.util;
|
||||||
|
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
import org.bukkit.persistence.PersistentDataType;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -62,27 +59,6 @@ public final class BlockUtils {
|
|||||||
return getNearbyBlocks(start, allowedMaterials, new HashSet<>(), limit);
|
return getNearbyBlocks(start, allowedMaterials, new HashSet<>(), limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Break the block as if the player had done it manually.
|
|
||||||
*
|
|
||||||
* @param player The player to break the block as.
|
|
||||||
* @param block The block to break.
|
|
||||||
* @deprecated Added into spigot API in 1.17.1
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.26.2", forRemoval = true)
|
|
||||||
public static void breakBlock(@NotNull final Player player,
|
|
||||||
@NotNull final Block block) {
|
|
||||||
Location location = block.getLocation();
|
|
||||||
World world = location.getWorld();
|
|
||||||
assert world != null;
|
|
||||||
|
|
||||||
if (location.getY() < world.getMinHeight() || location.getY() > world.getMaxHeight()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.breakBlock(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get if a block was placed by a player.
|
* Get if a block was placed by a player.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.player.PlayerItemBreakEvent;
|
import org.bukkit.event.player.PlayerItemBreakEvent;
|
||||||
import org.bukkit.event.player.PlayerItemDamageEvent;
|
import org.bukkit.event.player.PlayerItemDamageEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
|
||||||
import org.bukkit.inventory.meta.Damageable;
|
import org.bukkit.inventory.meta.Damageable;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -19,25 +18,6 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
// Have to suppress casts to ItemMeta because the methods don't exist for some older versions that eco supports.
|
// Have to suppress casts to ItemMeta because the methods don't exist for some older versions that eco supports.
|
||||||
@SuppressWarnings("RedundantCast")
|
@SuppressWarnings("RedundantCast")
|
||||||
public final class DurabilityUtils {
|
public final class DurabilityUtils {
|
||||||
/**
|
|
||||||
* Damage an item in a player's inventory.
|
|
||||||
* The slot of a held item can be obtained with {@link PlayerInventory#getHeldItemSlot()}.
|
|
||||||
* Armor slots are 39 (helmet), 38 (chestplate), 37 (leggings), 36 (boots).
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param item The item to damage.
|
|
||||||
* @param damage The amount of damage to deal.
|
|
||||||
* @param slot The slot in the inventory of the item.
|
|
||||||
* @deprecated The slot is not required.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
public static void damageItem(@NotNull final Player player,
|
|
||||||
@NotNull final ItemStack item,
|
|
||||||
final int damage,
|
|
||||||
final int slot) {
|
|
||||||
damageItem(player, item, damage);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Damage an item in a player's inventory.
|
* Damage an item in a player's inventory.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -2,11 +2,9 @@ package com.willfp.eco.util;
|
|||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
|
||||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
|
||||||
import com.willfp.eco.core.math.MathContext;
|
import com.willfp.eco.core.math.MathContext;
|
||||||
|
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -14,7 +12,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -89,34 +86,6 @@ public final class NumberUtils {
|
|||||||
return (input * k) / (input * k - input + 1);
|
return (input * k) / (input * k - input + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If value is above maximum, set it to maximum.
|
|
||||||
*
|
|
||||||
* @param toChange The value to test.
|
|
||||||
* @param limit The maximum.
|
|
||||||
* @return The new value.
|
|
||||||
* @deprecated Pointless method.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.19.0")
|
|
||||||
public static int equalIfOver(final int toChange,
|
|
||||||
final int limit) {
|
|
||||||
return Math.min(toChange, limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If value is above maximum, set it to maximum.
|
|
||||||
*
|
|
||||||
* @param toChange The value to test.
|
|
||||||
* @param limit The maximum.
|
|
||||||
* @return The new value.
|
|
||||||
* @deprecated Pointless method.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.19.0", forRemoval = true)
|
|
||||||
public static double equalIfOver(final double toChange,
|
|
||||||
final double limit) {
|
|
||||||
return Math.min(toChange, limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Roman Numeral from number.
|
* Get Roman Numeral from number.
|
||||||
*
|
*
|
||||||
@@ -256,36 +225,6 @@ public final class NumberUtils {
|
|||||||
return evaluateExpression(expression, player, PlaceholderManager.EMPTY_INJECTABLE);
|
return evaluateExpression(expression, player, PlaceholderManager.EMPTY_INJECTABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Evaluate an expression with respect to a player (for placeholders).
|
|
||||||
*
|
|
||||||
* @param expression The expression.
|
|
||||||
* @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 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).
|
* Evaluate an expression with respect to a player (for placeholders).
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -426,20 +426,6 @@ public final class StringUtils {
|
|||||||
return processedString;
|
return processedString;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal implementation of {@link String#valueOf}.
|
|
||||||
* Formats collections and doubles better.
|
|
||||||
*
|
|
||||||
* @param object The object to convert to string.
|
|
||||||
* @return The object stringified.
|
|
||||||
* @deprecated Poorly named method. Use {@link StringUtils#toNiceString(Object)} instead.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
@Deprecated(since = "6.26.0", forRemoval = true)
|
|
||||||
public static String internalToString(@Nullable final Object object) {
|
|
||||||
return toNiceString(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal implementation of {@link String#valueOf}.
|
* Internal implementation of {@link String#valueOf}.
|
||||||
* Formats collections and doubles better.
|
* Formats collections and doubles better.
|
||||||
|
|||||||
@@ -4,24 +4,16 @@ import com.google.common.collect.BiMap;
|
|||||||
import com.google.common.collect.HashBiMap;
|
import com.google.common.collect.HashBiMap;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.scoreboard.Scoreboard;
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
import org.bukkit.scoreboard.Team;
|
import org.bukkit.scoreboard.Team;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities / API methods for teams.
|
* Utilities / API methods for teams.
|
||||||
*/
|
*/
|
||||||
public final class TeamUtils {
|
public final class TeamUtils {
|
||||||
/**
|
|
||||||
* Ore ChatColors.
|
|
||||||
*/
|
|
||||||
private static final Map<Material, ChatColor> MATERIAL_COLORS = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All chat color teams.
|
* All chat color teams.
|
||||||
*/
|
*/
|
||||||
@@ -60,44 +52,10 @@ public final class TeamUtils {
|
|||||||
return team;
|
return team;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get team from material.
|
|
||||||
* <p>
|
|
||||||
* For {@link org.bukkit.potion.PotionEffectType#GLOWING}.
|
|
||||||
*
|
|
||||||
* @param material The material to find the team from.
|
|
||||||
* @return The team.
|
|
||||||
* @deprecated Stupid method.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
public static Team getMaterialColorTeam(@NotNull final Material material) {
|
|
||||||
return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE));
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
for (ChatColor value : ChatColor.values()) {
|
for (ChatColor value : ChatColor.values()) {
|
||||||
fromChatColor(value);
|
fromChatColor(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
MATERIAL_COLORS.put(Material.COAL_ORE, ChatColor.BLACK);
|
|
||||||
MATERIAL_COLORS.put(Material.IRON_ORE, ChatColor.GRAY);
|
|
||||||
MATERIAL_COLORS.put(Material.GOLD_ORE, ChatColor.YELLOW);
|
|
||||||
MATERIAL_COLORS.put(Material.LAPIS_ORE, ChatColor.BLUE);
|
|
||||||
MATERIAL_COLORS.put(Material.REDSTONE_ORE, ChatColor.RED);
|
|
||||||
MATERIAL_COLORS.put(Material.DIAMOND_ORE, ChatColor.AQUA);
|
|
||||||
MATERIAL_COLORS.put(Material.EMERALD_ORE, ChatColor.GREEN);
|
|
||||||
MATERIAL_COLORS.put(Material.ANCIENT_DEBRIS, ChatColor.DARK_RED);
|
|
||||||
|
|
||||||
MATERIAL_COLORS.put(Material.COPPER_ORE, ChatColor.GOLD);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COPPER_ORE, ChatColor.GOLD);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COAL_ORE, ChatColor.BLACK);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_IRON_ORE, ChatColor.GRAY);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_GOLD_ORE, ChatColor.YELLOW);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_LAPIS_ORE, ChatColor.BLUE);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_REDSTONE_ORE, ChatColor.RED);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_DIAMOND_ORE, ChatColor.AQUA);
|
|
||||||
MATERIAL_COLORS.put(Material.DEEPSLATE_EMERALD_ORE, ChatColor.GREEN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TeamUtils() {
|
private TeamUtils() {
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
@file:JvmName("ExternalDataStoreExtensions")
|
||||||
|
|
||||||
|
package com.willfp.eco.core.data
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ExternalDataStore.put
|
||||||
|
*/
|
||||||
|
fun writeExternalData(
|
||||||
|
key: String,
|
||||||
|
value: Any
|
||||||
|
) = ExternalDataStore.put(key, value)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ExternalDataStore.get
|
||||||
|
*/
|
||||||
|
inline fun <reified T> readExternalData(
|
||||||
|
key: String
|
||||||
|
): T? = ExternalDataStore.get(key, T::class.java)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ExternalDataStore.get
|
||||||
|
*/
|
||||||
|
inline fun <reified T> readExternalData(
|
||||||
|
key: String,
|
||||||
|
default: T
|
||||||
|
): T = ExternalDataStore.get(key, T::class.java) ?: default
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ExternalDataStore.get
|
||||||
|
*/
|
||||||
|
inline fun <reified T> readExternalData(
|
||||||
|
key: String,
|
||||||
|
default: () -> T
|
||||||
|
): T = readExternalData(key, default())
|
||||||
@@ -39,3 +39,11 @@ fun ItemStack.toSNBT() =
|
|||||||
/** @see Items.isEmpty */
|
/** @see Items.isEmpty */
|
||||||
val ItemStack?.isEmpty: Boolean
|
val ItemStack?.isEmpty: Boolean
|
||||||
get() = Items.isEmpty(this)
|
get() = Items.isEmpty(this)
|
||||||
|
|
||||||
|
/** @see Items.matchesAny */
|
||||||
|
fun Collection<TestableItem>.matches(item: ItemStack): Boolean =
|
||||||
|
Items.matchesAny(item, this)
|
||||||
|
|
||||||
|
/** @see Items.matchesAny */
|
||||||
|
fun Collection<TestableItem>.matches(items: Collection<ItemStack>): Boolean =
|
||||||
|
Items.matchesAny(items, this)
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
@file:JvmName("DefaultMapExtensions")
|
||||||
|
|
||||||
|
package com.willfp.eco.core.map
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required to avoid type ambiguity.
|
||||||
|
*
|
||||||
|
* @see ListMap
|
||||||
|
*/
|
||||||
|
@Suppress("RedundantOverride")
|
||||||
|
class MutableListMap<K : Any, V : Any> : ListMap<K, V>() {
|
||||||
|
/**
|
||||||
|
* Override with enforced MutableList type.
|
||||||
|
*/
|
||||||
|
override fun get(key: K?): MutableList<V> =
|
||||||
|
super.get(key)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override with enforced MutableList type.
|
||||||
|
*/
|
||||||
|
override fun getOrDefault(key: K, defaultValue: MutableList<V>?): MutableList<V> {
|
||||||
|
return super.getOrDefault(key, defaultValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DefaultMap
|
||||||
|
*/
|
||||||
|
fun <K : Any, V : Any> defaultMap(defaultValue: V) =
|
||||||
|
DefaultMap<K, V>(defaultValue)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ListMap
|
||||||
|
*/
|
||||||
|
fun <K : Any, V : Any> listMap() =
|
||||||
|
MutableListMap<K, V>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DefaultMap.createNestedMap
|
||||||
|
*/
|
||||||
|
fun <K : Any, K1 : Any, V : Any> nestedMap() =
|
||||||
|
DefaultMap.createNestedMap<K, K1, V>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DefaultMap.createNestedListMap
|
||||||
|
*/
|
||||||
|
fun <K : Any, K1 : Any, V : Any> nestedListMap() =
|
||||||
|
DefaultMap<K, MutableListMap<K1, V>>(MutableListMap())
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@file:JvmName("RegistryExtensions")
|
||||||
|
|
||||||
|
package com.willfp.eco.core.registry
|
||||||
|
|
||||||
|
/** @see Registry.tryFitPattern */
|
||||||
|
fun String.tryFitRegistryPattern(): String =
|
||||||
|
Registry.tryFitPattern(this)
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
group 'com.willfp'
|
|
||||||
version rootProject.version
|
|
||||||
|
|
||||||
subprojects {
|
|
||||||
dependencies {
|
|
||||||
compileOnly project(":eco-api")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
8
eco-core/build.gradle.kts
Normal file
8
eco-core/build.gradle.kts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
group = "com.willfp"
|
||||||
|
version = rootProject.version
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
dependencies {
|
||||||
|
compileOnly(project(":eco-api"))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
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 'net.kyori:adventure-text-minimessage:4.10.0'
|
|
||||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.1.0'
|
|
||||||
compileOnly 'org.yaml:snakeyaml:1.33'
|
|
||||||
compileOnly 'com.moandjiezana.toml:toml4j:0.7.2'
|
|
||||||
}
|
|
||||||
15
eco-core/core-backend/build.gradle.kts
Normal file
15
eco-core/core-backend/build.gradle.kts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
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("net.kyori:adventure-text-minimessage:4.10.0")
|
||||||
|
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")
|
||||||
|
compileOnly("org.yaml:snakeyaml:1.33")
|
||||||
|
compileOnly("com.moandjiezana.toml:toml4j:0.7.2")
|
||||||
|
}
|
||||||
@@ -7,18 +7,39 @@ import com.willfp.eco.core.config.readConfig
|
|||||||
|
|
||||||
object EcoPropsParser : PluginProps.PropsParser<Config> {
|
object EcoPropsParser : PluginProps.PropsParser<Config> {
|
||||||
override fun parseFrom(config: Config): PluginProps {
|
override fun parseFrom(config: Config): PluginProps {
|
||||||
|
val props = blankProps
|
||||||
|
|
||||||
|
if (!config.has("options")) {
|
||||||
|
parseAndApplyOptions(props, config)
|
||||||
|
} else {
|
||||||
|
parseAndApplyOptions(props, config.getSubsection("options"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return props.apply {
|
||||||
|
for (envConfig in config.getSubsections("environment")) {
|
||||||
|
val name = envConfig.getStringOrNull("name") ?: continue
|
||||||
|
val value = envConfig.getStringOrNull("value") ?: continue
|
||||||
|
|
||||||
|
this.setEnvironmentVariable(name, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseAndApplyOptions(props: PluginProps, config: Config) {
|
||||||
val resourceId = config.getIntOrNull("resource-id") ?: 0
|
val resourceId = config.getIntOrNull("resource-id") ?: 0
|
||||||
val bStatsId = config.getIntOrNull("bstats-id") ?: 0
|
val bStatsId = config.getIntOrNull("bstats-id") ?: 0
|
||||||
val proxyPackage = config.getStringOrNull("proxy-package") ?: ""
|
val proxyPackage = config.getStringOrNull("proxy-package") ?: ""
|
||||||
val color = config.getStringOrNull("color") ?: "&f"
|
val color = config.getStringOrNull("color") ?: "&f"
|
||||||
val supportsExtensions = config.getBoolOrNull("supports-extensions") ?: false
|
val supportsExtensions = config.getBoolOrNull("supports-extensions") ?: false
|
||||||
|
val usesReflectiveReload = config.getBoolOrNull("uses-reflective-reload") ?: true
|
||||||
|
|
||||||
return blankProps.apply {
|
props.apply {
|
||||||
this.resourceId = resourceId
|
this.resourceId = resourceId
|
||||||
this.bStatsId = bStatsId
|
this.bStatsId = bStatsId
|
||||||
this.proxyPackage = proxyPackage
|
this.proxyPackage = proxyPackage
|
||||||
this.color = color
|
this.color = color
|
||||||
this.isSupportingExtensions = supportsExtensions
|
this.isSupportingExtensions = supportsExtensions
|
||||||
|
this.setUsesReflectiveReload(usesReflectiveReload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,18 @@
|
|||||||
package com.willfp.eco.internal.config
|
package com.willfp.eco.internal.config.handler
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
|
||||||
import com.willfp.eco.core.config.updating.ConfigHandler
|
|
||||||
import com.willfp.eco.core.config.updating.ConfigUpdater
|
import com.willfp.eco.core.config.updating.ConfigUpdater
|
||||||
import org.reflections.Reflections
|
import org.reflections.Reflections
|
||||||
import org.reflections.scanners.MethodAnnotationsScanner
|
import org.reflections.scanners.MethodAnnotationsScanner
|
||||||
|
|
||||||
class EcoConfigHandler(
|
class ReflectiveConfigHandler(
|
||||||
private val plugin: EcoPlugin
|
private val plugin: EcoPlugin
|
||||||
) : ConfigHandler {
|
) : SimpleConfigHandler() {
|
||||||
private val reflections: Reflections = Reflections(
|
private val reflections: Reflections = Reflections(
|
||||||
this.plugin::class.java.classLoader,
|
this.plugin::class.java.classLoader,
|
||||||
MethodAnnotationsScanner()
|
MethodAnnotationsScanner()
|
||||||
)
|
)
|
||||||
|
|
||||||
private val configs = mutableListOf<LoadableConfig>()
|
|
||||||
|
|
||||||
override fun callUpdate() {
|
override fun callUpdate() {
|
||||||
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {
|
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {
|
||||||
runCatching {
|
runCatching {
|
||||||
@@ -31,25 +27,6 @@ class EcoConfigHandler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun saveAllConfigs() {
|
|
||||||
for (config in configs) {
|
|
||||||
config.save()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addConfig(config: LoadableConfig) {
|
|
||||||
configs.add(config)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun updateConfigs() {
|
|
||||||
for (config in configs) {
|
|
||||||
when (config) {
|
|
||||||
is EcoUpdatableConfig -> config.update()
|
|
||||||
is EcoLoadableConfig -> config.reloadFromFile()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class InvalidUpdateMethodException(message: String) : RuntimeException(message)
|
class InvalidUpdateMethodException(message: String) : RuntimeException(message)
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.internal.config.handler
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||||
|
import com.willfp.eco.core.config.updating.ConfigHandler
|
||||||
|
import com.willfp.eco.internal.config.EcoLoadableConfig
|
||||||
|
import com.willfp.eco.internal.config.EcoUpdatableConfig
|
||||||
|
|
||||||
|
open class SimpleConfigHandler : ConfigHandler {
|
||||||
|
private val configs = mutableListOf<LoadableConfig>()
|
||||||
|
|
||||||
|
override fun callUpdate() {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun saveAllConfigs() {
|
||||||
|
for (config in configs) {
|
||||||
|
config.save()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addConfig(config: LoadableConfig) {
|
||||||
|
configs.add(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateConfigs() {
|
||||||
|
for (config in configs) {
|
||||||
|
when (config) {
|
||||||
|
is EcoUpdatableConfig -> config.update()
|
||||||
|
is EcoLoadableConfig -> config.reloadFromFile()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import java.util.logging.Logger
|
|||||||
|
|
||||||
class EcoLogger(private val plugin: EcoPlugin) : Logger(plugin.name, null as String?) {
|
class EcoLogger(private val plugin: EcoPlugin) : Logger(plugin.name, null as String?) {
|
||||||
override fun info(msg: String) {
|
override fun info(msg: String) {
|
||||||
Bukkit.getConsoleSender().sendMessage("[${plugin.name}] ${StringUtils.format(msg)}")
|
Bukkit.getConsoleSender().sendMessage("[${plugin.name}] ${StringUtils.format(msg, StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
plugins {
|
||||||
|
id("io.papermc.paperweight.userdev") version "1.5.3" apply false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
version = rootProject.version
|
version = rootProject.version
|
||||||
|
|
||||||
@@ -9,4 +14,4 @@ subprojects {
|
|||||||
// libraries.minecraft.net machine broke
|
// libraries.minecraft.net machine broke
|
||||||
compileOnly("com.github.Mojang:brigadier:1.0.18")
|
compileOnly("com.github.Mojang:brigadier:1.0.18")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
version = rootProject.version
|
version = rootProject.version
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
paperDevBundle("1.17.1-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.17.1-R0.1-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ import org.bukkit.event.Listener
|
|||||||
import org.bukkit.event.player.PlayerJoinEvent
|
import org.bukkit.event.player.PlayerJoinEvent
|
||||||
import org.bukkit.event.player.PlayerQuitEvent
|
import org.bukkit.event.player.PlayerQuitEvent
|
||||||
|
|
||||||
|
private const val BASE_NAME = "packet_handler"
|
||||||
|
private const val ECO_NAME = "eco_packets"
|
||||||
|
|
||||||
object PacketInjectorListener : Listener {
|
object PacketInjectorListener : Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onJoin(event: PlayerJoinEvent) {
|
fun onJoin(event: PlayerJoinEvent) {
|
||||||
@@ -13,7 +16,15 @@ object PacketInjectorListener : Listener {
|
|||||||
|
|
||||||
val channel = player.toNMS().connection.connection.channel
|
val channel = player.toNMS().connection.connection.channel
|
||||||
|
|
||||||
channel.pipeline().addBefore("packet_handler", "eco_packets", EcoChannelDuplexHandler(player.uniqueId))
|
if (BASE_NAME !in channel.pipeline().names()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ECO_NAME in channel.pipeline().names()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
channel.pipeline().addBefore(BASE_NAME, ECO_NAME, EcoChannelDuplexHandler(player.uniqueId))
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@@ -23,8 +34,8 @@ object PacketInjectorListener : Listener {
|
|||||||
val channel = player.toNMS().connection.connection.channel
|
val channel = player.toNMS().connection.connection.channel
|
||||||
|
|
||||||
channel.eventLoop().submit {
|
channel.eventLoop().submit {
|
||||||
if (channel.pipeline().get("eco_packets") != null) {
|
if (channel.pipeline().get(ECO_NAME) != null) {
|
||||||
channel.pipeline().remove("eco_packets")
|
channel.pipeline().remove(ECO_NAME)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
@@ -7,7 +7,7 @@ version = rootProject.version
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":eco-core:core-nms:nms-common"))
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
paperDevBundle("1.17.1-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.17.1-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
implementation("net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT") {
|
implementation("net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT") {
|
||||||
version {
|
version {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
@@ -7,7 +7,7 @@ version = rootProject.version
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":eco-core:core-nms:nms-common"))
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
paperDevBundle("1.18.1-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.18.1-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
implementation("net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT") {
|
implementation("net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT") {
|
||||||
version {
|
version {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
@@ -7,7 +7,7 @@ version = rootProject.version
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":eco-core:core-nms:nms-common"))
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
paperDevBundle("1.18.2-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.18.2-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
implementation("net.kyori:adventure-text-minimessage:4.10.0") {
|
implementation("net.kyori:adventure-text-minimessage:4.10.0") {
|
||||||
version {
|
version {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
@@ -7,7 +7,7 @@ version = rootProject.version
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":eco-core:core-nms:nms-common"))
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
paperDevBundle("1.19-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.19-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
|
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
|
||||||
version {
|
version {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.spigot.proxy.v1_19_R1
|
|||||||
|
|
||||||
import com.willfp.eco.core.entities.ai.EntityController
|
import com.willfp.eco.core.entities.ai.EntityController
|
||||||
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
|
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.common.ai.EcoEntityController
|
import com.willfp.eco.internal.spigot.proxy.v1_19_R1.entity.EcoEntityController
|
||||||
import org.bukkit.entity.Mob
|
import org.bukkit.entity.Mob
|
||||||
|
|
||||||
class EntityControllerFactory : EntityControllerFactoryProxy {
|
class EntityControllerFactory : EntityControllerFactoryProxy {
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R1.entity
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.ai.CustomGoal
|
||||||
|
import com.willfp.eco.core.entities.ai.EntityController
|
||||||
|
import com.willfp.eco.core.entities.ai.EntityGoal
|
||||||
|
import com.willfp.eco.core.entities.ai.TargetGoal
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.ai.CustomGoalFactory
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.ai.getGoalFactory
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.toPathfinderMob
|
||||||
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
|
import net.minecraft.world.entity.ai.goal.Goal
|
||||||
|
import org.bukkit.entity.Mob
|
||||||
|
|
||||||
|
class EcoEntityController<T : Mob>(
|
||||||
|
private val handle: T
|
||||||
|
) : EntityController<T> {
|
||||||
|
override fun addEntityGoal(priority: Int, goal: EntityGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
nms.goalSelector.addGoal(
|
||||||
|
priority,
|
||||||
|
goal.getGoalFactory()?.create(goal, nms) ?: return this
|
||||||
|
)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun removeEntityGoal(goal: EntityGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
|
||||||
|
{ CustomGoalFactory.isGoalOfType(it, goal) }
|
||||||
|
} else {
|
||||||
|
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (wrapped in nms.goalSelector.availableGoals.toSet()) {
|
||||||
|
if (predicate(wrapped.goal)) {
|
||||||
|
nms.goalSelector.removeGoal(wrapped.goal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearEntityGoals(): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
nms.goalSelector.availableGoals.clear()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addTargetGoal(priority: Int, goal: TargetGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
nms.targetSelector.addGoal(
|
||||||
|
priority, goal.getGoalFactory()?.create(goal, nms) ?: return this
|
||||||
|
)
|
||||||
|
|
||||||
|
nms.targetSelector
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun removeTargetGoal(goal: TargetGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
|
||||||
|
{ CustomGoalFactory.isGoalOfType(it, goal) }
|
||||||
|
} else {
|
||||||
|
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (wrapped in nms.targetSelector.availableGoals.toSet()) {
|
||||||
|
if (predicate(wrapped.goal)) {
|
||||||
|
nms.targetSelector.removeGoal(wrapped.goal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearTargetGoals(): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
nms.targetSelector.availableGoals.clear()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getNms(): PathfinderMob? {
|
||||||
|
return handle.toPathfinderMob()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getEntity(): T {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("io.papermc.paperweight.userdev") version "1.3.6"
|
id("io.papermc.paperweight.userdev")
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.willfp"
|
group = "com.willfp"
|
||||||
@@ -7,7 +7,7 @@ version = rootProject.version
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":eco-core:core-nms:nms-common"))
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
paperDevBundle("1.19.3-R0.1-SNAPSHOT")
|
paperweight.paperDevBundle("1.19.3-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
|
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
|
||||||
version {
|
version {
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
|
|||||||
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
|
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
|
||||||
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
|
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
|
||||||
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
|
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
|
||||||
|
import io.netty.channel.Channel
|
||||||
import net.minecraft.core.registries.BuiltInRegistries
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.nbt.Tag
|
import net.minecraft.nbt.Tag
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.server.network.ServerGamePacketListenerImpl
|
||||||
import net.minecraft.world.entity.PathfinderMob
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
import net.minecraft.world.item.Item
|
import net.minecraft.world.item.Item
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.spigot.proxy.v1_19_R2
|
|||||||
|
|
||||||
import com.willfp.eco.core.entities.ai.EntityController
|
import com.willfp.eco.core.entities.ai.EntityController
|
||||||
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
|
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.common.ai.EcoEntityController
|
import com.willfp.eco.internal.spigot.proxy.v1_19_R2.entity.EcoEntityController
|
||||||
import org.bukkit.entity.Mob
|
import org.bukkit.entity.Mob
|
||||||
|
|
||||||
class EntityControllerFactory : EntityControllerFactoryProxy {
|
class EntityControllerFactory : EntityControllerFactoryProxy {
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R2.entity
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.ai.CustomGoal
|
||||||
|
import com.willfp.eco.core.entities.ai.EntityController
|
||||||
|
import com.willfp.eco.core.entities.ai.EntityGoal
|
||||||
|
import com.willfp.eco.core.entities.ai.TargetGoal
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.ai.CustomGoalFactory
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.ai.getGoalFactory
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.toPathfinderMob
|
||||||
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
|
import net.minecraft.world.entity.ai.goal.Goal
|
||||||
|
import org.bukkit.entity.Mob
|
||||||
|
|
||||||
|
class EcoEntityController<T : Mob>(
|
||||||
|
private val handle: T
|
||||||
|
) : EntityController<T> {
|
||||||
|
override fun addEntityGoal(priority: Int, goal: EntityGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
nms.goalSelector.addGoal(
|
||||||
|
priority,
|
||||||
|
goal.getGoalFactory()?.create(goal, nms) ?: return this
|
||||||
|
)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun removeEntityGoal(goal: EntityGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
|
||||||
|
{ CustomGoalFactory.isGoalOfType(it, goal) }
|
||||||
|
} else {
|
||||||
|
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (wrapped in nms.goalSelector.availableGoals.toSet()) {
|
||||||
|
if (predicate(wrapped.goal)) {
|
||||||
|
nms.goalSelector.removeGoal(wrapped.goal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearEntityGoals(): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
nms.goalSelector.availableGoals.clear()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addTargetGoal(priority: Int, goal: TargetGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
nms.targetSelector.addGoal(
|
||||||
|
priority, goal.getGoalFactory()?.create(goal, nms) ?: return this
|
||||||
|
)
|
||||||
|
|
||||||
|
nms.targetSelector
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun removeTargetGoal(goal: TargetGoal<in T>): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
|
||||||
|
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
|
||||||
|
{ CustomGoalFactory.isGoalOfType(it, goal) }
|
||||||
|
} else {
|
||||||
|
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (wrapped in nms.targetSelector.availableGoals.toSet()) {
|
||||||
|
if (predicate(wrapped.goal)) {
|
||||||
|
nms.targetSelector.removeGoal(wrapped.goal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearTargetGoals(): EntityController<T> {
|
||||||
|
val nms = getNms() ?: return this
|
||||||
|
nms.targetSelector.availableGoals.clear()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getNms(): PathfinderMob? {
|
||||||
|
return handle.toPathfinderMob()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getEntity(): T {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
}
|
||||||
39
eco-core/core-nms/v1_19_R3/build.gradle.kts
Normal file
39
eco-core/core-nms/v1_19_R3/build.gradle.kts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
plugins {
|
||||||
|
id("io.papermc.paperweight.userdev")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "com.willfp"
|
||||||
|
version = rootProject.version
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":eco-core:core-nms:nms-common"))
|
||||||
|
paperweight.paperDevBundle("1.19.4-R0.1-SNAPSHOT")
|
||||||
|
|
||||||
|
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
|
||||||
|
version {
|
||||||
|
strictly("4.11.0")
|
||||||
|
}
|
||||||
|
exclude(group = "net.kyori", module = "adventure-api")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
build {
|
||||||
|
dependsOn(reobfJar)
|
||||||
|
}
|
||||||
|
|
||||||
|
reobfJar {
|
||||||
|
mustRunAfter(shadowJar)
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
relocate(
|
||||||
|
"com.willfp.eco.internal.spigot.proxy.common",
|
||||||
|
"com.willfp.eco.internal.spigot.proxy.v1_19_R3.common"
|
||||||
|
)
|
||||||
|
relocate(
|
||||||
|
"net.kyori.adventure.text.minimessage",
|
||||||
|
"com.willfp.eco.internal.spigot.proxy.v1_19_R3.minimessage"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.command.PluginCommandBase
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.BukkitCommandsProxy
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.SimpleCommandMap
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.CraftServer
|
||||||
|
import java.lang.reflect.Field
|
||||||
|
|
||||||
|
class BukkitCommands : BukkitCommandsProxy {
|
||||||
|
private val knownCommandsField: Field by lazy {
|
||||||
|
SimpleCommandMap::class.java.getDeclaredField("knownCommands")
|
||||||
|
.apply {
|
||||||
|
isAccessible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
private val knownCommands: MutableMap<String, Command>
|
||||||
|
get() = knownCommandsField.get(getCommandMap()) as MutableMap<String, Command>
|
||||||
|
|
||||||
|
override fun getCommandMap(): SimpleCommandMap {
|
||||||
|
return (Bukkit.getServer() as CraftServer).commandMap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun syncCommands() {
|
||||||
|
(Bukkit.getServer() as CraftServer).syncCommands()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun unregisterCommand(command: PluginCommandBase) {
|
||||||
|
knownCommands.remove(command.name)
|
||||||
|
knownCommands.remove("${command.plugin.name.lowercase()}:${command.name}")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
|
||||||
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
|
import net.minecraft.nbt.CompoundTag
|
||||||
|
import net.minecraft.nbt.Tag
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
|
import net.minecraft.world.item.Item
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.NamespacedKey
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.CraftServer
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMob
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataContainer
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataTypeRegistry
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
import org.bukkit.entity.Mob
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import org.bukkit.persistence.PersistentDataContainer
|
||||||
|
import java.lang.reflect.Field
|
||||||
|
|
||||||
|
class CommonsInitializer : CommonsInitializerProxy {
|
||||||
|
override fun init(plugin: EcoPlugin) {
|
||||||
|
CommonsProvider.setIfNeeded(CommonsProviderImpl)
|
||||||
|
plugin.onEnable {
|
||||||
|
plugin.eventManager.registerListener(PacketInjectorListener)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object CommonsProviderImpl : CommonsProvider {
|
||||||
|
private val cisHandle: Field = CraftItemStack::class.java.getDeclaredField("handle").apply {
|
||||||
|
isAccessible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
private val pdcRegsitry = Class.forName("org.bukkit.craftbukkit.v1_19_R3.inventory.CraftMetaItem")
|
||||||
|
.getDeclaredField("DATA_TYPE_REGISTRY")
|
||||||
|
.apply { isAccessible = true }
|
||||||
|
.get(null) as CraftPersistentDataTypeRegistry
|
||||||
|
|
||||||
|
override val nbtTagString = CraftMagicNumbers.NBT.TAG_STRING
|
||||||
|
|
||||||
|
override fun toPathfinderMob(mob: Mob): PathfinderMob? {
|
||||||
|
val craft = mob as? CraftMob ?: return null
|
||||||
|
return craft.handle as? PathfinderMob
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation =
|
||||||
|
CraftNamespacedKey.toMinecraft(namespacedKey)
|
||||||
|
|
||||||
|
override fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack {
|
||||||
|
return if (itemStack !is CraftItemStack) {
|
||||||
|
CraftItemStack.asNMSCopy(itemStack)
|
||||||
|
} else {
|
||||||
|
cisHandle[itemStack] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(itemStack)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack {
|
||||||
|
return CraftItemStack.asCraftMirror(itemStack)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) {
|
||||||
|
if (itemStack !is CraftItemStack) {
|
||||||
|
itemStack.itemMeta = CraftItemStack.asCraftMirror(nmsStack).itemMeta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toBukkitEntity(entity: net.minecraft.world.entity.LivingEntity): LivingEntity? =
|
||||||
|
CraftEntity.getEntity(Bukkit.getServer() as CraftServer, entity) as? LivingEntity
|
||||||
|
|
||||||
|
override fun makePdc(tag: CompoundTag, base: Boolean): PersistentDataContainer {
|
||||||
|
fun emptyPdc(): CraftPersistentDataContainer = CraftPersistentDataContainer(pdcRegsitry)
|
||||||
|
|
||||||
|
fun CompoundTag?.toPdc(): PersistentDataContainer {
|
||||||
|
val pdc = emptyPdc()
|
||||||
|
this ?: return pdc
|
||||||
|
val keys = this.allKeys
|
||||||
|
for (key in keys) {
|
||||||
|
pdc.put(key, this[key])
|
||||||
|
}
|
||||||
|
|
||||||
|
return pdc
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (base) {
|
||||||
|
tag.toPdc()
|
||||||
|
} else {
|
||||||
|
if (tag.contains("PublicBukkitValues")) {
|
||||||
|
tag.getCompound("PublicBukkitValues").toPdc()
|
||||||
|
} else {
|
||||||
|
emptyPdc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setPdc(
|
||||||
|
tag: CompoundTag,
|
||||||
|
pdc: PersistentDataContainer?,
|
||||||
|
item: net.minecraft.world.item.ItemStack?
|
||||||
|
) {
|
||||||
|
fun CraftPersistentDataContainer.toTag(): CompoundTag {
|
||||||
|
val compound = CompoundTag()
|
||||||
|
val rawPublicMap: Map<String, Tag> = this.raw
|
||||||
|
for ((key, value) in rawPublicMap) {
|
||||||
|
compound.put(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return compound
|
||||||
|
}
|
||||||
|
|
||||||
|
val container = when (pdc) {
|
||||||
|
is CraftPersistentDataContainer? -> pdc
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item != null) {
|
||||||
|
if (container != null && !container.isEmpty) {
|
||||||
|
for (key in tag.allKeys.toSet()) {
|
||||||
|
tag.remove(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
tag.merge(container.toTag())
|
||||||
|
} else {
|
||||||
|
item.tag = null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (container != null && !container.isEmpty) {
|
||||||
|
tag.put("PublicBukkitValues", container.toTag())
|
||||||
|
} else {
|
||||||
|
tag.remove("PublicBukkitValues")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun materialToItem(material: Material): Item =
|
||||||
|
BuiltInRegistries.ITEM.getOptional(material.key.toResourceLocation())
|
||||||
|
.orElseThrow { IllegalArgumentException("Material is not item!") }
|
||||||
|
|
||||||
|
override fun itemToMaterial(item: Item) =
|
||||||
|
Material.getMaterial(BuiltInRegistries.ITEM.getKey(item).path.uppercase())
|
||||||
|
?: throw IllegalArgumentException("Invalid material!")
|
||||||
|
|
||||||
|
override fun toNMS(player: Player): ServerPlayer {
|
||||||
|
return (player as CraftPlayer).handle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.internal.entities.EcoDummyEntity
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.DummyEntityFactoryProxy
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld
|
||||||
|
import org.bukkit.entity.Entity
|
||||||
|
import org.bukkit.entity.EntityType
|
||||||
|
|
||||||
|
class DummyEntityFactory : DummyEntityFactoryProxy {
|
||||||
|
override fun createDummyEntity(location: Location): Entity {
|
||||||
|
val world = location.world as CraftWorld
|
||||||
|
@Suppress("UsePropertyAccessSyntax")
|
||||||
|
return EcoDummyEntity(world.createEntity(location, EntityType.ZOMBIE.entityClass).getBukkitEntity())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.ai.EntityController
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.v1_19_R3.entity.EcoEntityController
|
||||||
|
import org.bukkit.entity.Mob
|
||||||
|
|
||||||
|
class EntityControllerFactory : EntityControllerFactoryProxy {
|
||||||
|
override fun <T : Mob> createEntityController(entity: T): EntityController<T> {
|
||||||
|
return EcoEntityController(entity)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.data.ExtendedPersistentDataContainer
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.ExtendedPersistentDataContainerFactoryProxy
|
||||||
|
import net.minecraft.nbt.Tag
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataContainer
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataTypeRegistry
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import org.bukkit.persistence.PersistentDataContainer
|
||||||
|
import org.bukkit.persistence.PersistentDataType
|
||||||
|
|
||||||
|
class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy {
|
||||||
|
private val registry: CraftPersistentDataTypeRegistry
|
||||||
|
|
||||||
|
init {
|
||||||
|
/*
|
||||||
|
Can't grab actual instance since it's in CraftMetaItem (which is package-private)
|
||||||
|
And getting it would mean more janky reflection
|
||||||
|
*/
|
||||||
|
val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE))
|
||||||
|
val pdc = item.itemMeta!!.persistentDataContainer
|
||||||
|
this.registry = CraftPersistentDataContainer::class.java.getDeclaredField("registry")
|
||||||
|
.apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer {
|
||||||
|
return when (pdc) {
|
||||||
|
is CraftPersistentDataContainer -> EcoPersistentDataContainer(pdc)
|
||||||
|
else -> throw IllegalArgumentException("Custom PDC instance ims not supported!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun newPdc(): PersistentDataContainer {
|
||||||
|
return CraftPersistentDataContainer(registry)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class EcoPersistentDataContainer(
|
||||||
|
private val handle: CraftPersistentDataContainer
|
||||||
|
) : ExtendedPersistentDataContainer {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
private val customDataTags: MutableMap<String, Tag> =
|
||||||
|
CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags")
|
||||||
|
.apply { isAccessible = true }.get(handle) as MutableMap<String, Tag>
|
||||||
|
|
||||||
|
override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) {
|
||||||
|
customDataTags[key] =
|
||||||
|
registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, handle.adapterContext))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T : Any, Z : Any> has(key: String, dataType: PersistentDataType<T, Z>): Boolean {
|
||||||
|
val value = customDataTags[key] ?: return false
|
||||||
|
return registry.isInstanceOf(dataType.primitiveType, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T : Any, Z : Any> get(key: String, dataType: PersistentDataType<T, Z>): Z? {
|
||||||
|
val value = customDataTags[key] ?: return null
|
||||||
|
return dataType.fromPrimitive(registry.extract(dataType.primitiveType, value), handle.adapterContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T : Any, Z : Any> getOrDefault(
|
||||||
|
key: String,
|
||||||
|
dataType: PersistentDataType<T, Z>,
|
||||||
|
defaultValue: Z
|
||||||
|
): Z {
|
||||||
|
return get(key, dataType) ?: defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun remove(key: String) {
|
||||||
|
customDataTags.remove(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAllKeys(): MutableSet<String> {
|
||||||
|
return customDataTags.keys
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getBase(): PersistentDataContainer {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.fast.FastItemStack
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.item.EcoFastItemStack
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class FastItemStackFactory : FastItemStackFactoryProxy {
|
||||||
|
override fun create(itemStack: ItemStack): FastItemStack {
|
||||||
|
return EcoFastItemStack(itemStack)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.display.Display
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.MiniMessageTranslatorProxy
|
||||||
|
import com.willfp.eco.util.toLegacy
|
||||||
|
import net.kyori.adventure.text.minimessage.MiniMessage
|
||||||
|
|
||||||
|
class MiniMessageTranslator : MiniMessageTranslatorProxy {
|
||||||
|
override fun format(message: String): String {
|
||||||
|
var mut = message
|
||||||
|
|
||||||
|
val startsWithPrefix = mut.startsWith(Display.PREFIX)
|
||||||
|
if (startsWithPrefix) {
|
||||||
|
mut = mut.substring(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
mut = mut.replace('§', '&')
|
||||||
|
|
||||||
|
val miniMessage = runCatching {
|
||||||
|
MiniMessage.miniMessage().deserialize(
|
||||||
|
mut
|
||||||
|
).toLegacy()
|
||||||
|
}.getOrNull() ?: mut
|
||||||
|
|
||||||
|
mut = if (startsWithPrefix) {
|
||||||
|
Display.PREFIX + miniMessage
|
||||||
|
} else {
|
||||||
|
miniMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
return mut
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin
|
||||||
|
import com.willfp.eco.core.packet.PacketListener
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames
|
||||||
|
import net.minecraft.network.protocol.Packet
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
|
||||||
|
class PacketHandler : PacketHandlerProxy {
|
||||||
|
override fun sendPacket(player: Player, packet: com.willfp.eco.core.packet.Packet) {
|
||||||
|
if (player !is CraftPlayer) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val handle = packet.handle
|
||||||
|
|
||||||
|
if (handle !is Packet<*>) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
player.handle.connection.send(handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearDisplayFrames() {
|
||||||
|
clearFrames()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getPacketListeners(plugin: EcoPlugin): List<PacketListener> {
|
||||||
|
return listOf(
|
||||||
|
PacketAutoRecipe(plugin),
|
||||||
|
PacketHeldItemSlot,
|
||||||
|
PacketOpenWindowMerchant,
|
||||||
|
PacketSetCreativeSlot,
|
||||||
|
PacketSetSlot,
|
||||||
|
PacketWindowItems(plugin)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
|
||||||
|
|
||||||
|
import com.willfp.eco.core.items.TestableItem
|
||||||
|
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
|
||||||
|
import com.willfp.eco.internal.spigot.proxy.SNBTConverterProxy
|
||||||
|
import net.minecraft.nbt.CompoundTag
|
||||||
|
import net.minecraft.nbt.SnbtPrinterTagVisitor
|
||||||
|
import net.minecraft.nbt.TagParser
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class SNBTConverter : SNBTConverterProxy {
|
||||||
|
override fun fromSNBT(snbt: String): ItemStack? {
|
||||||
|
val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return null
|
||||||
|
val nms = net.minecraft.world.item.ItemStack.of(nbt)
|
||||||
|
return CraftItemStack.asBukkitCopy(nms)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toSNBT(itemStack: ItemStack): String {
|
||||||
|
val nms = CraftItemStack.asNMSCopy(itemStack)
|
||||||
|
return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag()))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun makeSNBTTestable(snbt: String): TestableItem {
|
||||||
|
val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return EmptyTestableItem()
|
||||||
|
val nms = net.minecraft.world.item.ItemStack.of(nbt)
|
||||||
|
if (nms == net.minecraft.world.item.ItemStack.EMPTY) {
|
||||||
|
return EmptyTestableItem()
|
||||||
|
}
|
||||||
|
|
||||||
|
nbt.remove("Count")
|
||||||
|
return SNBTTestableItem(CraftItemStack.asBukkitCopy(nms), nbt)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SNBTTestableItem(
|
||||||
|
private val item: ItemStack,
|
||||||
|
private val tag: CompoundTag
|
||||||
|
) : TestableItem {
|
||||||
|
override fun matches(itemStack: ItemStack?): Boolean {
|
||||||
|
if (itemStack == null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val nms = CraftItemStack.asNMSCopy(itemStack)
|
||||||
|
val nmsTag = nms.save(CompoundTag())
|
||||||
|
nmsTag.remove("Count")
|
||||||
|
return tag.copy().merge(nmsTag) == nmsTag
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItem(): ItemStack = item
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user