Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
863818d2eb | ||
|
|
d35285d0dc | ||
|
|
bc92f8a444 | ||
|
|
2fafef17d7 | ||
|
|
24078a2838 | ||
|
|
73d13277be | ||
|
|
0e4c23d70c | ||
|
|
ddf5094c5a | ||
|
|
925fc56cab | ||
|
|
3208d0328f | ||
|
|
317824ae78 | ||
|
|
41a4b4fc1a | ||
|
|
c528e4cd42 | ||
|
|
2724f21d4e | ||
|
|
5cb14e31b7 | ||
|
|
6b9942f412 | ||
|
|
fbe88ab0fd | ||
|
|
d042211dbe | ||
|
|
5781df011e | ||
|
|
c191ff0767 | ||
|
|
b9cbcbe7a0 | ||
|
|
6009122c48 | ||
|
|
7536794100 | ||
|
|
e80aa5f910 | ||
|
|
b4aeeac570 | ||
|
|
33515aa5f7 | ||
|
|
047b535a40 | ||
|
|
ef8093ec7f | ||
|
|
9d0f95617d | ||
|
|
183b18c0ec | ||
|
|
e026a767d9 | ||
|
|
d2966aa428 | ||
|
|
9168e68b5a | ||
|
|
51a61b65c6 | ||
|
|
76be236dac | ||
|
|
f1bbac2dd0 | ||
|
|
6e88aef572 | ||
|
|
804f187964 | ||
|
|
623b8a18f4 | ||
|
|
0d4e424582 | ||
|
|
452e499467 | ||
|
|
b2950ab035 | ||
|
|
e47d05ccb2 | ||
|
|
b9e61b8c0d | ||
|
|
0f35d5d16e | ||
|
|
3a7315d728 | ||
|
|
6f193f70b0 | ||
|
|
bab3f078f6 | ||
|
|
5b4b17b97f | ||
|
|
f0e02ca25e | ||
|
|
7426e9adba | ||
|
|
00905aa9d5 | ||
|
|
f7b57880cb | ||
|
|
c1b673e30c | ||
|
|
4cf45795d6 | ||
|
|
59d31584e6 | ||
|
|
68e1f4afac | ||
|
|
507fad186a | ||
|
|
ca6b3185a3 | ||
|
|
8e96329fdc | ||
|
|
440605f636 | ||
|
|
bb686dca17 | ||
|
|
e595ea2247 | ||
|
|
a776b60f86 | ||
|
|
db7ac55eb2 | ||
|
|
52d77d7861 | ||
|
|
f8ece2d6c7 | ||
|
|
b353b5ec04 | ||
|
|
bbc412e589 | ||
|
|
b4a474c703 | ||
|
|
75e6a3da79 | ||
|
|
a1afffdbbb | ||
|
|
f6942192de | ||
|
|
dab26cbe95 | ||
|
|
b945a3f948 | ||
|
|
b2c1d650de | ||
|
|
4b994d5f4c | ||
|
|
ed2dffb52c | ||
|
|
20c870da06 | ||
|
|
7684e431f5 | ||
|
|
abcc13685f | ||
|
|
ac902eaa08 | ||
|
|
4e52913504 | ||
|
|
7505f7732f | ||
|
|
15fae21fd5 | ||
|
|
e9d98816ce | ||
|
|
675fc07ebf | ||
|
|
b8b8fd70b5 | ||
|
|
1d9fca1fb8 | ||
|
|
9b83f6eab4 | ||
|
|
8190660b8f | ||
|
|
cbf4d111fb | ||
|
|
6a139bef67 | ||
|
|
9e3fecfd13 | ||
|
|
3b260e2e5d | ||
|
|
3d4c33860a | ||
|
|
651426ed76 | ||
|
|
1a49165656 | ||
|
|
a48c3c2fed |
@@ -1,6 +1,6 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("java-library")
|
id("java-library")
|
||||||
id("com.github.johnrengelman.shadow") version "7.0.0"
|
id("com.github.johnrengelman.shadow") version "7.1.0"
|
||||||
id("maven-publish")
|
id("maven-publish")
|
||||||
id("java")
|
id("java")
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ dependencies {
|
|||||||
implementation(project(":eco-core:core-backend"))
|
implementation(project(":eco-core:core-backend"))
|
||||||
implementation(project(":eco-core:core-nms:v1_16_R3"))
|
implementation(project(":eco-core:core-nms:v1_16_R3"))
|
||||||
implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf"))
|
implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf"))
|
||||||
implementation(project(":eco-core:core-nms:v1_18_R1"))
|
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
@@ -61,6 +61,9 @@ allprojects {
|
|||||||
|
|
||||||
// IridiumSkyblock
|
// IridiumSkyblock
|
||||||
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")
|
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")
|
||||||
|
|
||||||
|
// MythicMobs
|
||||||
|
maven("https://mvn.lumine.io/repository/maven-public/")
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -68,7 +71,7 @@ allprojects {
|
|||||||
|
|
||||||
// Test
|
// Test
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
|
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
|
||||||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
|
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
||||||
|
|
||||||
// Adventure
|
// Adventure
|
||||||
compileOnly("net.kyori:adventure-api:4.9.3")
|
compileOnly("net.kyori:adventure-api:4.9.3")
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ import org.jetbrains.annotations.ApiStatus;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class to hold the handler.
|
* Holds the instance of the eco handler for bridging between the frontend
|
||||||
|
* and backend.
|
||||||
*
|
*
|
||||||
|
* @see Eco#getHandler()
|
||||||
* @see Handler
|
* @see Handler
|
||||||
*/
|
*/
|
||||||
|
@ApiStatus.Internal
|
||||||
public final class Eco {
|
public final class Eco {
|
||||||
/**
|
/**
|
||||||
* Instance of eco handler.
|
* Instance of eco handler.
|
||||||
@@ -18,6 +21,7 @@ public final class Eco {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the handler.
|
* Set the handler.
|
||||||
|
*
|
||||||
* @param handler The handler.
|
* @param handler The handler.
|
||||||
*/
|
*/
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
@@ -28,18 +32,18 @@ public final class Eco {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the instance of the eco handler.
|
* Get the instance of the eco handler; the bridge between the api frontend
|
||||||
|
* and the implementation backend.
|
||||||
* <p>
|
* <p>
|
||||||
* The handler is, in essence, a way to interface between the eco-api
|
* <strong>Do not use the handler in your plugins!</strong> It can and will contain
|
||||||
* frontend module, and the eco-backend implementations.
|
* breaking changes between minor versions and even patches, and you will create
|
||||||
|
* compatibility issues by using the handler. All parts of the handler have been abstracted
|
||||||
|
* into logically named API components that you can use.
|
||||||
* <p>
|
* <p>
|
||||||
* There shouldn't really be any reason to ever use the handler
|
* Prior to version 6.12.0, the handler was considered as an API component, but it has
|
||||||
* in your own plugins, and you are likely to break things. All parts of
|
* since been moved into an internal component, and in 6.17.0, the first breaking change
|
||||||
* the handler are abstracted into logically named parts of the API.
|
* was introduced to {@link com.willfp.eco.core.config.wrapper.ConfigFactory}. This means
|
||||||
* <p>
|
* that any usages of the handler can now cause problems in your plugins.
|
||||||
* In versions of eco before 6.12.0, the handler was considered part of
|
|
||||||
* the eco API, however it has since been moved into an internal component
|
|
||||||
* that shouldn't be used in your plugins.
|
|
||||||
*
|
*
|
||||||
* @return The handler.
|
* @return The handler.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ 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.integrations.placeholder.PlaceholderManager;
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||||
import com.willfp.eco.core.proxy.AbstractProxy;
|
|
||||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
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;
|
||||||
@@ -32,6 +31,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -327,11 +327,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||||
this.outdated = true;
|
this.outdated = true;
|
||||||
this.getScheduler().runTimer(() -> {
|
this.getLogger().warning("&c " + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||||
this.getLogger().info("&c " + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
this.getLogger().warning("&cThe newest version is &f" + version);
|
||||||
this.getLogger().info("&cThe newest version is &f" + version);
|
this.getLogger().warning("&cDownload the new version!");
|
||||||
this.getLogger().info("&cDownload the new version!");
|
|
||||||
}, 0, 864000);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -636,7 +634,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param <T> The proxy type.
|
* @param <T> The proxy type.
|
||||||
* @return The proxy.
|
* @return The proxy.
|
||||||
*/
|
*/
|
||||||
public final <T extends AbstractProxy> T getProxy(@NotNull final Class<T> proxyClass) {
|
public final <T> T getProxy(@NotNull final Class<T> proxyClass) {
|
||||||
Validate.notNull(proxyFactory, "Plugin does not support proxy!");
|
Validate.notNull(proxyFactory, "Plugin does not support proxy!");
|
||||||
|
|
||||||
return proxyFactory.getProxy(proxyClass);
|
return proxyFactory.getProxy(proxyClass);
|
||||||
@@ -655,7 +653,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
public final FileConfiguration getConfig() {
|
public final FileConfiguration getConfig() {
|
||||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||||
|
|
||||||
return this.getConfigYml().getBukkitHandle();
|
return Objects.requireNonNull(this.getConfigYml().getBukkitHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ import com.willfp.eco.core.proxy.ProxyFactory;
|
|||||||
import com.willfp.eco.core.requirement.RequirementFactory;
|
import com.willfp.eco.core.requirement.RequirementFactory;
|
||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -230,5 +232,15 @@ public interface Handler {
|
|||||||
*
|
*
|
||||||
* @return The handler.
|
* @return The handler.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
PlayerProfileHandler getPlayerProfileHandler();
|
PlayerProfileHandler getPlayerProfileHandler();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create dummy entity - never spawned, exists purely in code.
|
||||||
|
*
|
||||||
|
* @param location The location.
|
||||||
|
* @return The entity.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
Entity createDummyEntity(@NotNull Location location);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,13 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Quick DI class to manage passing eco plugins.
|
* 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.
|
* @param <T> The eco plugin type.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core;
|
|||||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents any class that acts like a plugin, for example {@link EcoPlugin}
|
* Represents any class that acts like a plugin, for example {@link EcoPlugin}
|
||||||
@@ -26,4 +27,11 @@ public interface PluginLike {
|
|||||||
* @return The config handler.
|
* @return The config handler.
|
||||||
*/
|
*/
|
||||||
ConfigHandler getConfigHandler();
|
ConfigHandler getConfigHandler();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the logger.
|
||||||
|
*
|
||||||
|
* @return The logger.
|
||||||
|
*/
|
||||||
|
Logger getLogger();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package com.willfp.eco.core.command;
|
package com.willfp.eco.core.command;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for all command implementations.
|
* Interface for all command implementations.
|
||||||
*/
|
*/
|
||||||
@@ -35,31 +39,70 @@ public interface CommandBase {
|
|||||||
*/
|
*/
|
||||||
CommandBase addSubcommand(@NotNull CommandBase command);
|
CommandBase addSubcommand(@NotNull CommandBase command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle command execution.
|
||||||
|
* <p>
|
||||||
|
* Marked as default void with no implementation for backwards compatibility.
|
||||||
|
*
|
||||||
|
* @param sender The sender.
|
||||||
|
* @param args The args.
|
||||||
|
*/
|
||||||
|
default void onExecute(@NotNull CommandSender sender,
|
||||||
|
@NotNull List<String> args) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle tab completion.
|
||||||
|
* <p>
|
||||||
|
* Marked as default void with no implementation for backwards compatibility.
|
||||||
|
*
|
||||||
|
* @param sender The sender.
|
||||||
|
* @param args The args.
|
||||||
|
* @return The results.
|
||||||
|
*/
|
||||||
|
default List<String> tabComplete(@NotNull CommandSender sender,
|
||||||
|
@NotNull List<String> args) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the handler.
|
* Get the handler.
|
||||||
*
|
*
|
||||||
* @return The handler.
|
* @return The handler.
|
||||||
|
* @see CommandHandler
|
||||||
|
* @deprecated Use {@link CommandBase#onExecute(CommandSender, List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
CommandHandler getHandler();
|
CommandHandler getHandler();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the handler.
|
* Set the handler.
|
||||||
*
|
*
|
||||||
* @param handler The handler.
|
* @param handler The handler.
|
||||||
|
* @see CommandHandler
|
||||||
|
* @deprecated Handlers have been deprecated.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
void setHandler(@NotNull CommandHandler handler);
|
void setHandler(@NotNull CommandHandler handler);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the tab completer.
|
* Get the tab completer.
|
||||||
*
|
*
|
||||||
* @return The tab completer.
|
* @return The tab completer.
|
||||||
|
* @see TabCompleteHandler
|
||||||
|
* @deprecated Use {@link CommandBase#tabComplete(CommandSender, List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
TabCompleteHandler getTabCompleter();
|
TabCompleteHandler getTabCompleter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the tab completer.
|
* Set the tab completer.
|
||||||
*
|
*
|
||||||
* @param handler The handler.
|
* @param handler The handler.
|
||||||
|
* @see TabCompleteHandler
|
||||||
|
* @deprecated Handlers have been deprecated.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
void setTabCompleter(@NotNull TabCompleteHandler handler);
|
void setTabCompleter(@NotNull TabCompleteHandler handler);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,13 @@ import java.util.List;
|
|||||||
* A command handler handles the actual code for a command.
|
* A command handler handles the actual code for a command.
|
||||||
* <p>
|
* <p>
|
||||||
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
|
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
|
||||||
|
*
|
||||||
* @see CommandBase
|
* @see CommandBase
|
||||||
|
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
|
||||||
|
* update to use the new system: {@link CommandBase#onExecute(CommandSender, List)}.
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public interface CommandHandler {
|
public interface CommandHandler {
|
||||||
/**
|
/**
|
||||||
* The code to be called on execution.
|
* The code to be called on execution.
|
||||||
|
|||||||
@@ -10,9 +10,13 @@ import java.util.List;
|
|||||||
* A Tab Complete handler handles the actual tab-completion code.
|
* A Tab Complete handler handles the actual tab-completion code.
|
||||||
* <p>
|
* <p>
|
||||||
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
|
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
|
||||||
|
*
|
||||||
* @see CommandBase
|
* @see CommandBase
|
||||||
|
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
|
||||||
|
* update to use the new system: {@link CommandBase#tabComplete(CommandSender, List)}
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public interface TabCompleteHandler {
|
public interface TabCompleteHandler {
|
||||||
/**
|
/**
|
||||||
* Handle Tab Completion.
|
* Handle Tab Completion.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.util.StringUtil;
|
import org.bukkit.util.StringUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -23,6 +24,7 @@ import java.util.stream.Collectors;
|
|||||||
* in order to execute the command-specific code. It's essentially an internal
|
* in order to execute the command-specific code. It's essentially an internal
|
||||||
* layer, hence why it's a package-private class.
|
* layer, hence why it's a package-private class.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings({"DeprecatedIsStillUsed"})
|
||||||
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
||||||
/**
|
/**
|
||||||
* The name of the command.
|
* The name of the command.
|
||||||
@@ -46,14 +48,16 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
|||||||
/**
|
/**
|
||||||
* The actual code to be executed in the command.
|
* The actual code to be executed in the command.
|
||||||
*/
|
*/
|
||||||
private CommandHandler handler = (sender, args) -> {
|
@Deprecated
|
||||||
// Do nothing by default
|
@Nullable
|
||||||
};
|
private CommandHandler handler = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tab completion code to be executed in the command.
|
* The tab completion code to be executed in the command.
|
||||||
*/
|
*/
|
||||||
private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>();
|
@Deprecated
|
||||||
|
@Nullable
|
||||||
|
private TabCompleteHandler tabCompleter = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All subcommands for the command.
|
* All subcommands for the command.
|
||||||
@@ -120,7 +124,11 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getHandler().onExecute(sender, Arrays.asList(args));
|
if (this.getHandler() != null) {
|
||||||
|
this.getHandler().onExecute(sender, Arrays.asList(args));
|
||||||
|
} else {
|
||||||
|
this.onExecute(sender, Arrays.asList(args));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -167,7 +175,11 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
|
if (this.getTabCompleter() != null) {
|
||||||
|
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
|
||||||
|
} else {
|
||||||
|
return this.tabComplete(sender, Arrays.asList(args));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -221,24 +233,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
|||||||
return this.playersOnly;
|
return this.playersOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the actual code to be executed in the command.
|
|
||||||
*
|
|
||||||
* @return The code.
|
|
||||||
*/
|
|
||||||
public CommandHandler getHandler() {
|
|
||||||
return this.handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the tab completion code to be executed in the command.
|
|
||||||
*
|
|
||||||
* @return The code.
|
|
||||||
*/
|
|
||||||
public TabCompleteHandler getTabCompleter() {
|
|
||||||
return this.tabCompleter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the subcommands of the command.
|
* Get the subcommands of the command.
|
||||||
*
|
*
|
||||||
@@ -248,21 +242,27 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
|||||||
return this.subcommands;
|
return this.subcommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Deprecated
|
||||||
* Set the command handler.
|
@Override
|
||||||
*
|
public @Nullable CommandHandler getHandler() {
|
||||||
* @param handler The handler.
|
return this.handler;
|
||||||
*/
|
}
|
||||||
public void setHandler(@NotNull final CommandHandler handler) {
|
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public @Nullable TabCompleteHandler getTabCompleter() {
|
||||||
|
return this.tabCompleter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public void setHandler(@Nullable final CommandHandler handler) {
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Deprecated
|
||||||
* Set the tab completer.
|
@Override
|
||||||
*
|
public void setTabCompleter(@Nullable final TabCompleteHandler tabCompleter) {
|
||||||
* @param tabCompleter The tab completer.
|
|
||||||
*/
|
|
||||||
public void setTabCompleter(@NotNull final TabCompleteHandler tabCompleter) {
|
|
||||||
this.tabCompleter = tabCompleter;
|
this.tabCompleter = tabCompleter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PluginCommands are the class to be used instead of CommandExecutor.
|
* PluginCommands are the class to be used instead of CommandExecutor,
|
||||||
|
* they function as the base command, e.g. {@code /ecoenchants} would be a base command, with each
|
||||||
|
* subsequent argument functioning as subcommands.
|
||||||
* <p>
|
* <p>
|
||||||
* The command will not be registered until register() is called.
|
* The command will not be registered until register() is called.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.willfp.eco.core.config;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
|
* <p>
|
||||||
|
* Automatically updates.
|
||||||
|
*/
|
||||||
|
public abstract class BaseConfig extends LoadableConfigWrapper {
|
||||||
|
/**
|
||||||
|
* Create new Base Config.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin or extension.
|
||||||
|
* @param configName The config name (excluding extension).
|
||||||
|
* @param removeUnused If unused sections should be removed.
|
||||||
|
* @param type The config type.
|
||||||
|
*/
|
||||||
|
protected BaseConfig(@NotNull final String configName,
|
||||||
|
@NotNull final PluginLike plugin,
|
||||||
|
final boolean removeUnused,
|
||||||
|
@NotNull final ConfigType type) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
"",
|
||||||
|
plugin.getClass(),
|
||||||
|
removeUnused,
|
||||||
|
type
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.willfp.eco.core.config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config types, classified by file extension.
|
||||||
|
*/
|
||||||
|
public enum ConfigType {
|
||||||
|
/**
|
||||||
|
* .json config.
|
||||||
|
*/
|
||||||
|
JSON,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* .yml config.
|
||||||
|
*/
|
||||||
|
YAML
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.willfp.eco.core.config;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in one of two places:
|
||||||
|
* <ul>
|
||||||
|
* <li>Plugin base directory (eg config.yml, lang.json)</li>
|
||||||
|
* <li>Other extension's configs</li>
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* Automatically updates.
|
||||||
|
*/
|
||||||
|
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
||||||
|
/**
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||||
|
* @param subDirectoryPath The subdirectory path.
|
||||||
|
* @param type The config type.
|
||||||
|
* @param source The class that owns the resource.
|
||||||
|
*/
|
||||||
|
protected ExtendableConfig(@NotNull final String configName,
|
||||||
|
final boolean removeUnused,
|
||||||
|
@NotNull final PluginLike plugin,
|
||||||
|
@NotNull final Class<?> source,
|
||||||
|
@NotNull final String subDirectoryPath,
|
||||||
|
@NotNull final ConfigType type,
|
||||||
|
@NotNull final String... updateBlacklist) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source,
|
||||||
|
removeUnused,
|
||||||
|
type,
|
||||||
|
updateBlacklist
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.willfp.eco.core.config;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-updatable yaml config that exists within a plugin jar.
|
||||||
|
*/
|
||||||
|
public abstract class StaticBaseConfig extends LoadableConfigWrapper {
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
|
* <p>
|
||||||
|
* Does not automatically update.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param type The config type.
|
||||||
|
*/
|
||||||
|
protected StaticBaseConfig(@NotNull final String configName,
|
||||||
|
@NotNull final PluginLike plugin,
|
||||||
|
@NotNull final ConfigType type) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createLoadableConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
"",
|
||||||
|
plugin.getClass(),
|
||||||
|
type
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package com.willfp.eco.core.config;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config that exists purely in the code, not linked to any file.
|
||||||
|
* <p>
|
||||||
|
* Use for inline configs to move data around or to add subsections to other configs.
|
||||||
|
*/
|
||||||
|
public class TransientConfig extends ConfigWrapper<Config> {
|
||||||
|
/**
|
||||||
|
* @param config The YamlConfiguration handle.
|
||||||
|
*/
|
||||||
|
public TransientConfig(@NotNull final YamlConfiguration config) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new empty transient config.
|
||||||
|
*
|
||||||
|
* @param values The values.
|
||||||
|
*/
|
||||||
|
public TransientConfig(@NotNull final Map<String, Object> values) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createConfig(values));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new empty transient config.
|
||||||
|
*/
|
||||||
|
public TransientConfig() {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createConfig("", ConfigType.YAML));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param contents The contents of the config.
|
||||||
|
* @param type The config type.
|
||||||
|
*/
|
||||||
|
public TransientConfig(@NotNull final String contents,
|
||||||
|
@NotNull final ConfigType type) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createConfig(contents, type));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +1,21 @@
|
|||||||
package com.willfp.eco.core.config.base;
|
package com.willfp.eco.core.config.base;
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
import com.willfp.eco.core.config.BaseConfig;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default plugin config.yml.
|
* Default plugin config.yml.
|
||||||
*/
|
*/
|
||||||
public class ConfigYml extends YamlBaseConfig {
|
public class ConfigYml extends BaseConfig {
|
||||||
/**
|
/**
|
||||||
* Config.yml.
|
* Config.yml.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.
|
||||||
*/
|
*/
|
||||||
public ConfigYml(@NotNull final EcoPlugin plugin) {
|
public ConfigYml(@NotNull final EcoPlugin plugin) {
|
||||||
super("config", true, plugin);
|
super("config", plugin, true, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,7 +26,7 @@ public class ConfigYml extends YamlBaseConfig {
|
|||||||
*/
|
*/
|
||||||
public ConfigYml(@NotNull final EcoPlugin plugin,
|
public ConfigYml(@NotNull final EcoPlugin plugin,
|
||||||
final boolean removeUnused) {
|
final boolean removeUnused) {
|
||||||
super("config", removeUnused, plugin);
|
super("config", plugin, removeUnused, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +37,7 @@ public class ConfigYml extends YamlBaseConfig {
|
|||||||
*/
|
*/
|
||||||
public ConfigYml(@NotNull final EcoPlugin plugin,
|
public ConfigYml(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final String name) {
|
@NotNull final String name) {
|
||||||
super(name, true, plugin);
|
super(name, plugin, true, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,7 +50,6 @@ public class ConfigYml extends YamlBaseConfig {
|
|||||||
public ConfigYml(@NotNull final EcoPlugin plugin,
|
public ConfigYml(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final String name,
|
@NotNull final String name,
|
||||||
final boolean removeUnused) {
|
final boolean removeUnused) {
|
||||||
super(name, removeUnused, plugin);
|
super(name, plugin, removeUnused, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
package com.willfp.eco.core.config.base;
|
package com.willfp.eco.core.config.base;
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
import com.willfp.eco.core.config.BaseConfig;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default plugin lang.yml.
|
* Default plugin lang.yml.
|
||||||
*/
|
*/
|
||||||
public class LangYml extends YamlBaseConfig {
|
public class LangYml extends BaseConfig {
|
||||||
/**
|
/**
|
||||||
* Lang.yml.
|
* Lang.yml.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.
|
||||||
*/
|
*/
|
||||||
public LangYml(@NotNull final EcoPlugin plugin) {
|
public LangYml(@NotNull final EcoPlugin plugin) {
|
||||||
super("lang", false, plugin);
|
super("lang", plugin, false, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
package com.willfp.eco.core.config.interfaces;
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
|
import com.willfp.eco.core.config.TransientConfig;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All canfigs implement this interface.
|
* All configs implement this interface.
|
||||||
* <p>
|
* <p>
|
||||||
* Contains all methods that must exist in yaml and json configurations.
|
* Contains all methods that must exist in yaml and json configurations.
|
||||||
*/
|
*/
|
||||||
@@ -66,10 +70,12 @@ public interface Config extends Cloneable {
|
|||||||
* Get subsection from config.
|
* Get subsection from config.
|
||||||
*
|
*
|
||||||
* @param path The key to check.
|
* @param path The key to check.
|
||||||
* @return The subsection. Throws NPE if not found.
|
* @return The subsection. Returns an empty section if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
Config getSubsection(@NotNull String path);
|
default Config getSubsection(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getSubsectionOrNull(path), new TransientConfig());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get subsection from config.
|
* Get subsection from config.
|
||||||
@@ -86,7 +92,21 @@ public interface Config extends Cloneable {
|
|||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or 0 if not found.
|
* @return The found value, or 0 if not found.
|
||||||
*/
|
*/
|
||||||
int getInt(@NotNull String path);
|
default int getInt(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getIntOrNull(path), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an integer from config with a specified default (not found) value.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param def The value to default to if not found.
|
||||||
|
* @return The found value, or the default.
|
||||||
|
*/
|
||||||
|
default int getInt(@NotNull String path,
|
||||||
|
int def) {
|
||||||
|
return Objects.requireNonNullElse(getIntOrNull(path), def);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an integer from config.
|
* Get an integer from config.
|
||||||
@@ -97,16 +117,6 @@ public interface Config extends Cloneable {
|
|||||||
@Nullable
|
@Nullable
|
||||||
Integer getIntOrNull(@NotNull String path);
|
Integer getIntOrNull(@NotNull String path);
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an integer from config with a specified default (not found) value.
|
|
||||||
*
|
|
||||||
* @param path The key to fetch the value from.
|
|
||||||
* @param def The value to default to if not found.
|
|
||||||
* @return The found value, or the default.
|
|
||||||
*/
|
|
||||||
int getInt(@NotNull String path,
|
|
||||||
int def);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of integers from config.
|
* Get a list of integers from config.
|
||||||
*
|
*
|
||||||
@@ -114,7 +124,9 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<Integer> getInts(@NotNull String path);
|
default List<Integer> getInts(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getIntsOrNull(path), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of integers from config.
|
* Get a list of integers from config.
|
||||||
@@ -131,7 +143,9 @@ public interface Config extends Cloneable {
|
|||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or false if not found.
|
* @return The found value, or false if not found.
|
||||||
*/
|
*/
|
||||||
boolean getBool(@NotNull String path);
|
default boolean getBool(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getBoolOrNull(path), false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a boolean from config.
|
* Get a boolean from config.
|
||||||
@@ -149,7 +163,9 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<Boolean> getBools(@NotNull String path);
|
default List<Boolean> getBools(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getBoolsOrNull(path), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of booleans from config.
|
* Get a list of booleans from config.
|
||||||
@@ -168,7 +184,7 @@ public interface Config extends Cloneable {
|
|||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default String getFormattedString(@NotNull String path) {
|
default String getFormattedString(@NotNull String path) {
|
||||||
return getString(path, true);
|
return getString(path, true, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -187,25 +203,25 @@ public interface Config extends Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Get a string from config.
|
* Get a string from config.
|
||||||
* <p>
|
* <p>
|
||||||
* Formatted by default.
|
* Not formatted.
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or an empty string if not found.
|
* @return The found value, or an empty string if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default String getString(@NotNull String path) {
|
default String getString(@NotNull String path) {
|
||||||
return getString(path, true);
|
return getString(path, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a string from config.
|
* Get a string from config.
|
||||||
* <p>
|
|
||||||
* This will be deprecated when {@link Config#getString(String)} no longer formats by default.
|
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @param format If the string should be formatted.
|
* @param format If the string should be formatted.
|
||||||
* @return The found value, or an empty string if not found.
|
* @return The found value, or an empty string if not found.
|
||||||
|
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.18.0")
|
||||||
default String getString(@NotNull String path,
|
default String getString(@NotNull String path,
|
||||||
boolean format) {
|
boolean format) {
|
||||||
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
@@ -235,9 +251,11 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or an empty string if not found.
|
* @return The found value, or an empty string if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
String getString(@NotNull String path,
|
default String getString(@NotNull String path,
|
||||||
boolean format,
|
boolean format,
|
||||||
@NotNull StringUtils.FormatOption option);
|
@NotNull StringUtils.FormatOption option) {
|
||||||
|
return Objects.requireNonNullElse(getStringOrNull(path, format, option), "");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a formatted string from config.
|
* Get a formatted string from config.
|
||||||
@@ -247,7 +265,7 @@ public interface Config extends Cloneable {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
default String getFormattedStringOrNull(@NotNull String path) {
|
default String getFormattedStringOrNull(@NotNull String path) {
|
||||||
return getStringOrNull(path, true);
|
return getStringOrNull(path, true, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -273,19 +291,19 @@ public interface Config extends Cloneable {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
default String getStringOrNull(@NotNull String path) {
|
default String getStringOrNull(@NotNull String path) {
|
||||||
return getStringOrNull(path, true);
|
return getStringOrNull(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a string from config.
|
* Get a string from config.
|
||||||
* <p>
|
|
||||||
* This will be deprecated when {@link Config#getStringOrNull(String)} no longer formats by default.
|
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @param format If the string should be formatted.
|
* @param format If the string should be formatted.
|
||||||
* @return The found value, or null if not found.
|
* @return The found value, or null if not found.
|
||||||
|
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@Deprecated(since = "6.18.0")
|
||||||
default String getStringOrNull(@NotNull String path,
|
default String getStringOrNull(@NotNull String path,
|
||||||
boolean format) {
|
boolean format) {
|
||||||
return this.getStringOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
return this.getStringOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
@@ -350,28 +368,26 @@ public interface Config extends Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
* <p>
|
* <p>
|
||||||
* Formatted by default.
|
* Not formatted.
|
||||||
* <p>
|
|
||||||
* This will be changed in newer versions to <b>not</b> format by default.
|
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default List<String> getStrings(@NotNull String path) {
|
default List<String> getStrings(@NotNull String path) {
|
||||||
return getStrings(path, true);
|
return getStrings(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
* <p>
|
|
||||||
* This will be deprecated when {@link Config#getStrings(String)} no longer formats by default.
|
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @param format If the strings should be formatted.
|
* @param format If the strings should be formatted.
|
||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
|
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@Deprecated(since = "6.18.0")
|
||||||
default List<String> getStrings(@NotNull String path,
|
default List<String> getStrings(@NotNull String path,
|
||||||
boolean format) {
|
boolean format) {
|
||||||
return this.getStrings(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
return this.getStrings(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
@@ -389,7 +405,7 @@ public interface Config extends Cloneable {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
default List<String> getStrings(@NotNull String path,
|
default List<String> getStrings(@NotNull String path,
|
||||||
@NotNull StringUtils.FormatOption option) {
|
@NotNull StringUtils.FormatOption option) {
|
||||||
return getStrings(path, true, option);
|
return getStrings(path, false, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -401,14 +417,16 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<String> getStrings(@NotNull String path,
|
default List<String> getStrings(@NotNull String path,
|
||||||
boolean format,
|
boolean format,
|
||||||
@NotNull StringUtils.FormatOption option);
|
@NotNull StringUtils.FormatOption option) {
|
||||||
|
return Objects.requireNonNullElse(getStringsOrNull(path, format, option), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
* <p>
|
* <p>
|
||||||
* Formatted by default.
|
* Formatted.
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or null if not found.
|
* @return The found value, or null if not found.
|
||||||
@@ -421,7 +439,7 @@ public interface Config extends Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
* <p>
|
* <p>
|
||||||
* Formatted by default.
|
* Formatted.
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @param option The format option.
|
* @param option The format option.
|
||||||
@@ -436,7 +454,7 @@ public interface Config extends Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
* <p>
|
* <p>
|
||||||
* Formatted by default.
|
* Not formatted.
|
||||||
* <p>
|
* <p>
|
||||||
* This will be changed in newer versions to <b>not</b> format by default.
|
* This will be changed in newer versions to <b>not</b> format by default.
|
||||||
*
|
*
|
||||||
@@ -445,7 +463,7 @@ public interface Config extends Cloneable {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
default List<String> getStringsOrNull(@NotNull String path) {
|
default List<String> getStringsOrNull(@NotNull String path) {
|
||||||
return getStringsOrNull(path, true);
|
return getStringsOrNull(path, false, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -454,8 +472,10 @@ public interface Config extends Cloneable {
|
|||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @param format If the strings should be formatted.
|
* @param format If the strings should be formatted.
|
||||||
* @return The found value, or null if not found.
|
* @return The found value, or null if not found.
|
||||||
|
* @deprecated Since 6.18.0, {@link Config#getString(String)} is not formatted by default.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@Deprecated(since = "6.18.0")
|
||||||
default List<String> getStringsOrNull(@NotNull String path,
|
default List<String> getStringsOrNull(@NotNull String path,
|
||||||
boolean format) {
|
boolean format) {
|
||||||
return getStringsOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
return getStringsOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
|
||||||
@@ -473,7 +493,7 @@ public interface Config extends Cloneable {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
default List<String> getStringsOrNull(@NotNull String path,
|
default List<String> getStringsOrNull(@NotNull String path,
|
||||||
@NotNull StringUtils.FormatOption option) {
|
@NotNull StringUtils.FormatOption option) {
|
||||||
return getStringsOrNull(path, true, option);
|
return getStringsOrNull(path, false, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -495,7 +515,9 @@ public interface Config extends Cloneable {
|
|||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or 0 if not found.
|
* @return The found value, or 0 if not found.
|
||||||
*/
|
*/
|
||||||
double getDouble(@NotNull String path);
|
default double getDouble(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getDoubleOrNull(path), 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a decimal from config.
|
* Get a decimal from config.
|
||||||
@@ -513,7 +535,9 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<Double> getDoubles(@NotNull String path);
|
default List<Double> getDoubles(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getDoublesOrNull(path), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of decimals from config.
|
* Get a list of decimals from config.
|
||||||
@@ -531,7 +555,9 @@ public interface Config extends Cloneable {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<? extends Config> getSubsections(@NotNull String path);
|
default List<? extends Config> getSubsections(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getSubsectionsOrNull(path), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of subsections from config.
|
* Get a list of subsections from config.
|
||||||
@@ -542,6 +568,13 @@ public interface Config extends Cloneable {
|
|||||||
@Nullable
|
@Nullable
|
||||||
List<? extends Config> getSubsectionsOrNull(@NotNull String path);
|
List<? extends Config> getSubsectionsOrNull(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get config type.
|
||||||
|
*
|
||||||
|
* @return The type.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
ConfigType getType();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clone the config.
|
* Clone the config.
|
||||||
|
|||||||
@@ -3,13 +3,19 @@ package com.willfp.eco.core.config.interfaces;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON configs have extra methods compared to yaml configs.
|
* JSON config.
|
||||||
* <p>
|
*
|
||||||
* If you need to use them, then use JSONConfig instead.
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
|
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||||
public interface JSONConfig extends Config {
|
public interface JSONConfig extends Config {
|
||||||
/**
|
/**
|
||||||
* Get a list of subsections from config.
|
* Get a list of subsections from config.
|
||||||
@@ -18,7 +24,9 @@ public interface JSONConfig extends Config {
|
|||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
List<JSONConfig> getSubsections(@NotNull String path);
|
default List<JSONConfig> getSubsections(@NotNull String path) {
|
||||||
|
return Objects.requireNonNullElse(getSubsectionsOrNull(path), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of subsections from config.
|
* Get a list of subsections from config.
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
package com.willfp.eco.core.config.interfaces;
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for configs that physically exist as files in plugins.
|
* Interface for configs that physically exist as files in plugins.
|
||||||
*/
|
*/
|
||||||
public interface LoadableConfig {
|
public interface LoadableConfig extends Config {
|
||||||
/**
|
/**
|
||||||
* Create the file.
|
* Create the file.
|
||||||
*/
|
*/
|
||||||
@@ -39,4 +43,18 @@ public interface LoadableConfig {
|
|||||||
* @return The name.
|
* @return The name.
|
||||||
*/
|
*/
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get bukkit {@link YamlConfiguration}.
|
||||||
|
* <p>
|
||||||
|
* This method is not recommended unless absolutely required as it
|
||||||
|
* only returns true if the type of config is {@link com.willfp.eco.core.config.ConfigType#YAML},
|
||||||
|
* and if the handle is an {@link YamlConfiguration} specifically. This depends on the internals
|
||||||
|
* and the implementation, and so may cause problems - it exists mostly for parity with
|
||||||
|
* {@link JavaPlugin#getConfig()}.
|
||||||
|
*
|
||||||
|
* @return The config, or null if config is not yaml-based.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
YamlConfiguration getBukkitHandle();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,12 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
|||||||
/**
|
/**
|
||||||
* Interface for configs that wrap an {@link YamlConfiguration}.
|
* Interface for configs that wrap an {@link YamlConfiguration}.
|
||||||
*
|
*
|
||||||
* @see com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
|
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||||
public interface WrappedYamlConfiguration {
|
public interface WrappedYamlConfiguration {
|
||||||
/**
|
/**
|
||||||
* Get the ConfigurationSection handle.
|
* Get the ConfigurationSection handle.
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.willfp.eco.core.config.json;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -10,7 +12,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
||||||
* <p>
|
* <p>
|
||||||
* Automatically updates.
|
* Automatically updates.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
@@ -23,13 +30,16 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
|||||||
@NotNull final PluginLike plugin,
|
@NotNull final PluginLike plugin,
|
||||||
@NotNull final String... updateBlacklist) {
|
@NotNull final String... updateBlacklist) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
(JSONConfig)
|
||||||
configName,
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
plugin,
|
configName,
|
||||||
"",
|
plugin,
|
||||||
plugin.getClass(),
|
"",
|
||||||
removeUnused, updateBlacklist
|
plugin.getClass(),
|
||||||
)
|
removeUnused,
|
||||||
|
ConfigType.JSON,
|
||||||
|
updateBlacklist
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,13 +52,15 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
|||||||
final boolean removeUnused,
|
final boolean removeUnused,
|
||||||
@NotNull final PluginLike plugin) {
|
@NotNull final PluginLike plugin) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
(JSONConfig)
|
||||||
configName,
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
plugin,
|
configName,
|
||||||
"",
|
plugin,
|
||||||
plugin.getClass(),
|
"",
|
||||||
removeUnused
|
plugin.getClass(),
|
||||||
)
|
removeUnused,
|
||||||
|
ConfigType.JSON
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.willfp.eco.core.config.json;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -14,7 +16,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* </ul>
|
* </ul>
|
||||||
* <p>
|
* <p>
|
||||||
* Automatically updates.
|
* Automatically updates.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
@@ -31,16 +38,19 @@ public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
|||||||
@NotNull final String subDirectoryPath,
|
@NotNull final String subDirectoryPath,
|
||||||
@NotNull final String... updateBlacklist) {
|
@NotNull final String... updateBlacklist) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
(JSONConfig)
|
||||||
configName,
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
plugin,
|
configName,
|
||||||
subDirectoryPath,
|
plugin,
|
||||||
source,
|
subDirectoryPath,
|
||||||
removeUnused,
|
source,
|
||||||
updateBlacklist
|
removeUnused,
|
||||||
)
|
ConfigType.JSON,
|
||||||
|
updateBlacklist
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @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.
|
||||||
|
|||||||
@@ -3,12 +3,19 @@ package com.willfp.eco.core.config.json;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Non-updatable JSON config that exists within a plugin jar.
|
* Non-updatable JSON config that exists within a plugin jar.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||||
@@ -20,7 +27,7 @@ public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
|||||||
*/
|
*/
|
||||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||||
@NotNull final PluginLike plugin) {
|
@NotNull final PluginLike plugin) {
|
||||||
super(Eco.getHandler().getConfigFactory().createLoadableJSONConfig(configName, plugin, "", plugin.getClass()));
|
super((JSONConfig) Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.JSON));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,14 +1,21 @@
|
|||||||
package com.willfp.eco.core.config.json;
|
package com.willfp.eco.core.config.json;
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Raw JSON config with a map of values at its core.
|
* Raw JSON config with a map of values at its core.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public class JSONTransientConfig extends JSONConfigWrapper {
|
public class JSONTransientConfig extends JSONConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* Config implementation for passing maps.
|
* Config implementation for passing maps.
|
||||||
@@ -18,6 +25,13 @@ public class JSONTransientConfig extends JSONConfigWrapper {
|
|||||||
* @param values The map of values.
|
* @param values The map of values.
|
||||||
*/
|
*/
|
||||||
public JSONTransientConfig(@NotNull final Map<String, Object> values) {
|
public JSONTransientConfig(@NotNull final Map<String, Object> values) {
|
||||||
super(Eco.getHandler().getConfigFactory().createJSONConfig(values));
|
super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(values));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty JSON config.
|
||||||
|
*/
|
||||||
|
public JSONTransientConfig() {
|
||||||
|
super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(new HashMap<>()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,12 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to handle the backend JSON config implementations.
|
* Wrapper to handle the backend JSON config implementations.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
||||||
/**
|
/**
|
||||||
* Create a config wrapper.
|
* Create a config wrapper.
|
||||||
|
|||||||
@@ -3,14 +3,21 @@ package com.willfp.eco.core.config.json.wrapper;
|
|||||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to handle the backend loadable JSON config implementations.
|
* Wrapper to handle the backend loadable JSON config implementations.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
||||||
/**
|
/**
|
||||||
* Create a config wrapper.
|
* Create a config wrapper.
|
||||||
@@ -48,4 +55,9 @@ public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implem
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return ((LoadableConfig) this.getHandle()).getName();
|
return ((LoadableConfig) this.getHandle()).getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,14 @@ import java.lang.annotation.Target;
|
|||||||
* <p>
|
* <p>
|
||||||
* The second:
|
* The second:
|
||||||
* <pre>{@code
|
* <pre>{@code
|
||||||
* public static void update(EcoPlugin plugin) {}
|
* public static void update(EcoPlugin plugin) {
|
||||||
* // Update code
|
* // Update code
|
||||||
|
* }
|
||||||
* }</pre>
|
* }</pre>
|
||||||
* <p>
|
* <p>
|
||||||
|
* If using kotlin, you have to annotate the method with {@code @JvmStatic}
|
||||||
|
* in order to prevent null pointer exceptions.
|
||||||
|
* <p>
|
||||||
* Config update methods in all classes in a plugin jar will be called
|
* Config update methods in all classes in a plugin jar will be called
|
||||||
* on reload.
|
* on reload.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package com.willfp.eco.core.config.wrapper;
|
package com.willfp.eco.core.config.wrapper;
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -11,6 +13,7 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* Internal component to create backend config implementations.
|
* Internal component to create backend config implementations.
|
||||||
*/
|
*/
|
||||||
|
@ApiStatus.Internal
|
||||||
public interface ConfigFactory {
|
public interface ConfigFactory {
|
||||||
/**
|
/**
|
||||||
* Updatable config.
|
* Updatable config.
|
||||||
@@ -20,75 +23,57 @@ public interface ConfigFactory {
|
|||||||
* @param subDirectoryPath The subdirectory path.
|
* @param subDirectoryPath The subdirectory path.
|
||||||
* @param source The class that owns the resource.
|
* @param source The class that owns the resource.
|
||||||
* @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 type The config type.
|
||||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||||
* @return The config implementation.
|
* @return The config implementation.
|
||||||
*/
|
*/
|
||||||
Config createUpdatableYamlConfig(@NotNull String configName,
|
LoadableConfig createUpdatableConfig(@NotNull String configName,
|
||||||
@NotNull PluginLike plugin,
|
|
||||||
@NotNull String subDirectoryPath,
|
|
||||||
@NotNull Class<?> source,
|
|
||||||
boolean removeUnused,
|
|
||||||
@NotNull String... updateBlacklist);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updatable config.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @param subDirectoryPath The subdirectory path.
|
|
||||||
* @param source The class that owns the resource.
|
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
|
||||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
|
||||||
* @return The config implementation.
|
|
||||||
*/
|
|
||||||
JSONConfig createUpdatableJSONConfig(@NotNull String configName,
|
|
||||||
@NotNull PluginLike plugin,
|
@NotNull PluginLike plugin,
|
||||||
@NotNull String subDirectoryPath,
|
@NotNull String subDirectoryPath,
|
||||||
@NotNull Class<?> source,
|
@NotNull Class<?> source,
|
||||||
boolean removeUnused,
|
boolean removeUnused,
|
||||||
|
@NotNull ConfigType type,
|
||||||
@NotNull String... updateBlacklist);
|
@NotNull String... updateBlacklist);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON loadable config.
|
* Loadable config.
|
||||||
*
|
*
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.
|
||||||
* @param subDirectoryPath The subdirectory path.
|
* @param subDirectoryPath The subdirectory path.
|
||||||
* @param source The class that owns the resource.
|
* @param source The class that owns the resource.
|
||||||
|
* @param type The config type.
|
||||||
* @return The config implementation.
|
* @return The config implementation.
|
||||||
*/
|
*/
|
||||||
JSONConfig createLoadableJSONConfig(@NotNull String configName,
|
LoadableConfig createLoadableConfig(@NotNull String configName,
|
||||||
@NotNull PluginLike plugin,
|
@NotNull PluginLike plugin,
|
||||||
@NotNull String subDirectoryPath,
|
@NotNull String subDirectoryPath,
|
||||||
@NotNull Class<?> source);
|
@NotNull Class<?> source,
|
||||||
|
@NotNull ConfigType type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Yaml loadable config.
|
* Create config.
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @param subDirectoryPath The subdirectory path.
|
|
||||||
* @param source The class that owns the resource.
|
|
||||||
* @return The config implementation.
|
|
||||||
*/
|
|
||||||
Config createLoadableYamlConfig(@NotNull String configName,
|
|
||||||
@NotNull PluginLike plugin,
|
|
||||||
@NotNull String subDirectoryPath,
|
|
||||||
@NotNull Class<?> source);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Yaml config.
|
|
||||||
*
|
*
|
||||||
* @param config The handle.
|
* @param config The handle.
|
||||||
* @return The config implementation.
|
* @return The config implementation.
|
||||||
*/
|
*/
|
||||||
Config createYamlConfig(@NotNull YamlConfiguration config);
|
Config createConfig(@NotNull YamlConfiguration config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON config.
|
* Create config.
|
||||||
*
|
*
|
||||||
* @param values The values.
|
* @param values The values.
|
||||||
* @return The config implementation.
|
* @return The config implementation.
|
||||||
*/
|
*/
|
||||||
JSONConfig createJSONConfig(@NotNull Map<String, Object> values);
|
Config createConfig(@NotNull Map<String, Object> values);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create config.
|
||||||
|
*
|
||||||
|
* @param contents The file contents.
|
||||||
|
* @param type The type.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
Config createConfig(@NotNull String contents,
|
||||||
|
@NotNull ConfigType type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.config.wrapper;
|
package com.willfp.eco.core.config.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -15,6 +16,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* @param <T> The type of the handle.
|
* @param <T> The type of the handle.
|
||||||
*/
|
*/
|
||||||
|
@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,
|
||||||
@@ -68,70 +70,31 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
handle.set(path, object);
|
handle.set(path, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Config getSubsection(@NotNull final String path) {
|
|
||||||
return handle.getSubsection(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Config getSubsectionOrNull(@NotNull final String path) {
|
public @Nullable Config getSubsectionOrNull(@NotNull final String path) {
|
||||||
return handle.getSubsectionOrNull(path);
|
return handle.getSubsectionOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getInt(@NotNull final String path) {
|
|
||||||
return handle.getInt(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Integer getIntOrNull(@NotNull final String path) {
|
public @Nullable Integer getIntOrNull(@NotNull final String path) {
|
||||||
return handle.getIntOrNull(path);
|
return handle.getIntOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getInt(@NotNull final String path,
|
|
||||||
final int def) {
|
|
||||||
return handle.getInt(path, def);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull List<Integer> getInts(@NotNull final String path) {
|
|
||||||
return handle.getInts(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<Integer> getIntsOrNull(@NotNull final String path) {
|
public @Nullable List<Integer> getIntsOrNull(@NotNull final String path) {
|
||||||
return handle.getIntsOrNull(path);
|
return handle.getIntsOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getBool(@NotNull final String path) {
|
|
||||||
return handle.getBool(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Boolean getBoolOrNull(@NotNull final String path) {
|
public @Nullable Boolean getBoolOrNull(@NotNull final String path) {
|
||||||
return handle.getBoolOrNull(path);
|
return handle.getBoolOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull List<Boolean> getBools(@NotNull final String path) {
|
|
||||||
return handle.getBools(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<Boolean> getBoolsOrNull(@NotNull final String path) {
|
public @Nullable List<Boolean> getBoolsOrNull(@NotNull final String path) {
|
||||||
return handle.getBoolsOrNull(path);
|
return handle.getBoolsOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull String getString(@NotNull final String path,
|
|
||||||
final boolean format,
|
|
||||||
@NotNull final StringUtils.FormatOption option) {
|
|
||||||
return handle.getString(path, format, option);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable String getStringOrNull(@NotNull final String path,
|
public @Nullable String getStringOrNull(@NotNull final String path,
|
||||||
final boolean format,
|
final boolean format,
|
||||||
@@ -139,13 +102,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
return handle.getStringOrNull(path, format, option);
|
return handle.getStringOrNull(path, format, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull List<String> getStrings(@NotNull final String path,
|
|
||||||
final boolean format,
|
|
||||||
@NotNull final StringUtils.FormatOption option) {
|
|
||||||
return handle.getStrings(path, format, option);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<String> getStringsOrNull(@NotNull final String path,
|
public @Nullable List<String> getStringsOrNull(@NotNull final String path,
|
||||||
final boolean format,
|
final boolean format,
|
||||||
@@ -153,31 +109,16 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
return handle.getStringsOrNull(path, format, option);
|
return handle.getStringsOrNull(path, format, option);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getDouble(@NotNull final String path) {
|
|
||||||
return handle.getDouble(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Double getDoubleOrNull(@NotNull final String path) {
|
public @Nullable Double getDoubleOrNull(@NotNull final String path) {
|
||||||
return handle.getDoubleOrNull(path);
|
return handle.getDoubleOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull List<Double> getDoubles(@NotNull final String path) {
|
|
||||||
return handle.getDoubles(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<Double> getDoublesOrNull(@NotNull final String path) {
|
public @Nullable List<Double> getDoublesOrNull(@NotNull final String path) {
|
||||||
return handle.getDoublesOrNull(path);
|
return handle.getDoublesOrNull(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull List<? extends Config> getSubsections(@NotNull final String path) {
|
|
||||||
return handle.getSubsections(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<? extends Config> getSubsectionsOrNull(@NotNull final String path) {
|
public @Nullable List<? extends Config> getSubsectionsOrNull(@NotNull final String path) {
|
||||||
return handle.getSubsectionsOrNull(path);
|
return handle.getSubsectionsOrNull(path);
|
||||||
@@ -188,6 +129,11 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
return handle.clone();
|
return handle.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ConfigType getType() {
|
||||||
|
return handle.getType();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the handle.
|
* Get the handle.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.willfp.eco.core.config.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to handle the backend loadable yaml config implementations.
|
||||||
|
*/
|
||||||
|
public abstract class LoadableConfigWrapper extends ConfigWrapper<LoadableConfig> implements LoadableConfig {
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The handle.
|
||||||
|
*/
|
||||||
|
protected LoadableConfigWrapper(@NotNull final LoadableConfig handle) {
|
||||||
|
super(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createFile() {
|
||||||
|
this.getHandle().createFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getResourcePath() {
|
||||||
|
return this.getHandle().getResourcePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() throws IOException {
|
||||||
|
this.getHandle().save();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getConfigFile() {
|
||||||
|
return this.getHandle().getConfigFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.getHandle().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||||
|
return this.getHandle().getBukkitHandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core.config.yaml;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -10,7 +11,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
* <p>
|
* <p>
|
||||||
* Automatically updates.
|
* Automatically updates.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
@@ -23,12 +29,14 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
|||||||
@NotNull final PluginLike plugin,
|
@NotNull final PluginLike plugin,
|
||||||
@NotNull final String... updateBlacklist) {
|
@NotNull final String... updateBlacklist) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
configName,
|
configName,
|
||||||
plugin,
|
plugin,
|
||||||
"",
|
"",
|
||||||
plugin.getClass(),
|
plugin.getClass(),
|
||||||
removeUnused, updateBlacklist
|
removeUnused,
|
||||||
|
ConfigType.YAML,
|
||||||
|
updateBlacklist
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -42,12 +50,13 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
|||||||
final boolean removeUnused,
|
final boolean removeUnused,
|
||||||
@NotNull final PluginLike plugin) {
|
@NotNull final PluginLike plugin) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
configName,
|
configName,
|
||||||
plugin,
|
plugin,
|
||||||
"",
|
"",
|
||||||
plugin.getClass(),
|
plugin.getClass(),
|
||||||
removeUnused
|
removeUnused,
|
||||||
|
ConfigType.YAML
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core.config.yaml;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -14,7 +15,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* </ul>
|
* </ul>
|
||||||
* <p>
|
* <p>
|
||||||
* Automatically updates.
|
* Automatically updates.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
@@ -31,16 +37,18 @@ public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
|||||||
@NotNull final String subDirectoryPath,
|
@NotNull final String subDirectoryPath,
|
||||||
@NotNull final String... updateBlacklist) {
|
@NotNull final String... updateBlacklist) {
|
||||||
super(
|
super(
|
||||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||||
configName,
|
configName,
|
||||||
plugin,
|
plugin,
|
||||||
subDirectoryPath,
|
subDirectoryPath,
|
||||||
source,
|
source,
|
||||||
removeUnused,
|
removeUnused,
|
||||||
|
ConfigType.YAML,
|
||||||
updateBlacklist
|
updateBlacklist
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @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.
|
||||||
|
|||||||
@@ -3,12 +3,18 @@ package com.willfp.eco.core.config.yaml;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.PluginLike;
|
import com.willfp.eco.core.PluginLike;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Non-updatable yaml config that exists within a plugin jar.
|
* Non-updatable yaml config that exists within a plugin jar.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
@@ -20,7 +26,7 @@ public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
|||||||
*/
|
*/
|
||||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||||
@NotNull final PluginLike plugin) {
|
@NotNull final PluginLike plugin) {
|
||||||
super(Eco.getHandler().getConfigFactory().createLoadableYamlConfig(configName, plugin, "", plugin.getClass()));
|
super(Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.YAML));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.core.config.yaml;
|
package com.willfp.eco.core.config.yaml;
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -11,26 +12,31 @@ import java.io.StringReader;
|
|||||||
* Config implementation for passing YamlConfigurations.
|
* Config implementation for passing YamlConfigurations.
|
||||||
* <p>
|
* <p>
|
||||||
* Does not automatically update.
|
* Does not automatically update.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public class YamlTransientConfig extends YamlConfigWrapper {
|
public class YamlTransientConfig extends YamlConfigWrapper {
|
||||||
/**
|
/**
|
||||||
* @param config The YamlConfiguration handle.
|
* @param config The YamlConfiguration handle.
|
||||||
*/
|
*/
|
||||||
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
||||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(config));
|
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param contents The contents of the config.
|
* @param contents The contents of the config.
|
||||||
*/
|
*/
|
||||||
public YamlTransientConfig(@NotNull final String contents) {
|
public YamlTransientConfig(@NotNull final String contents) {
|
||||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader(contents))));
|
super(Eco.getHandler().getConfigFactory().createConfig(contents, ConfigType.YAML));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new empty transient config.
|
* Create a new empty transient config.
|
||||||
*/
|
*/
|
||||||
public YamlTransientConfig() {
|
public YamlTransientConfig() {
|
||||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader(""))));
|
super(Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration(new StringReader(""))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,21 @@ package com.willfp.eco.core.config.yaml.wrapper;
|
|||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to handle the backend loadable yaml config implementations.
|
* Wrapper to handle the backend loadable yaml config implementations.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
||||||
/**
|
/**
|
||||||
* Create a config wrapper.
|
* Create a config wrapper.
|
||||||
@@ -48,4 +55,9 @@ public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implem
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return ((LoadableConfig) this.getHandle()).getName();
|
return ((LoadableConfig) this.getHandle()).getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getBukkitHandle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper to handle the backend yaml config implementations.
|
* Wrapper to handle the backend yaml config implementations.
|
||||||
|
*
|
||||||
|
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||||
|
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||||
|
* These configs will be removed eventually.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0")
|
||||||
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
||||||
/**
|
/**
|
||||||
* Create a config wrapper.
|
* Create a config wrapper.
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public final class Display {
|
|||||||
* @return The ItemStack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
|
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
|
||||||
@Nullable final Player player) {
|
@Nullable final Player player) {
|
||||||
return finalize(display(itemStack, player));
|
return finalize(display(itemStack, player));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package com.willfp.eco.core.entities;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A custom entity has 3 components.
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>The key to identify it</li>
|
||||||
|
* <li>The test to check if any entity is this custom entity</li>
|
||||||
|
* <li>The supplier to spawn the custom {@link org.bukkit.entity.Entity}</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public class CustomEntity implements TestableEntity {
|
||||||
|
/**
|
||||||
|
* The key.
|
||||||
|
*/
|
||||||
|
private final NamespacedKey key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The test for Entities to pass.
|
||||||
|
*/
|
||||||
|
private final Predicate<@NotNull Entity> test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The provider to spawn the entity.
|
||||||
|
*/
|
||||||
|
private final Function<Location, Entity> provider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new custom entity.
|
||||||
|
*
|
||||||
|
* @param key The entity key.
|
||||||
|
* @param test The test.
|
||||||
|
* @param provider The provider to spawn the entity.
|
||||||
|
*/
|
||||||
|
public CustomEntity(@NotNull final NamespacedKey key,
|
||||||
|
@NotNull final Predicate<@NotNull Entity> test,
|
||||||
|
@NotNull final Function<Location, Entity> provider) {
|
||||||
|
this.key = key;
|
||||||
|
this.test = test;
|
||||||
|
this.provider = provider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(@Nullable final Entity entity) {
|
||||||
|
if (entity == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return test.test(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity spawn(@NotNull final Location location) {
|
||||||
|
Validate.notNull(location.getWorld());
|
||||||
|
|
||||||
|
return provider.apply(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the entity.
|
||||||
|
*/
|
||||||
|
public void register() {
|
||||||
|
Entities.registerCustomEntity(this.getKey(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the key.
|
||||||
|
*
|
||||||
|
* @return The key.
|
||||||
|
*/
|
||||||
|
public NamespacedKey getKey() {
|
||||||
|
return this.key;
|
||||||
|
}
|
||||||
|
}
|
||||||
239
eco-api/src/main/java/com/willfp/eco/core/entities/Entities.java
Normal file
239
eco-api/src/main/java/com/willfp/eco/core/entities/Entities.java
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
package com.willfp.eco.core.entities;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult;
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser;
|
||||||
|
import com.willfp.eco.core.entities.impl.EmptyTestableEntity;
|
||||||
|
import com.willfp.eco.core.entities.impl.ModifiedTestableEntity;
|
||||||
|
import com.willfp.eco.core.entities.impl.SimpleTestableEntity;
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||||
|
import com.willfp.eco.util.StringUtils;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to manage all custom and vanilla entities.
|
||||||
|
*/
|
||||||
|
public final class Entities {
|
||||||
|
/**
|
||||||
|
* All entities.
|
||||||
|
*/
|
||||||
|
private static final Map<NamespacedKey, TestableEntity> REGISTRY = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All entity parsers.
|
||||||
|
*/
|
||||||
|
private static final List<EntityArgParser> ARG_PARSERS = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new custom item.
|
||||||
|
*
|
||||||
|
* @param key The key of the item.
|
||||||
|
* @param item The item.
|
||||||
|
*/
|
||||||
|
public static void registerCustomEntity(@NotNull final NamespacedKey key,
|
||||||
|
@NotNull final TestableEntity item) {
|
||||||
|
REGISTRY.put(key, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new arg parser.
|
||||||
|
*
|
||||||
|
* @param parser The parser.
|
||||||
|
*/
|
||||||
|
public static void registerArgParser(@NotNull final EntityArgParser parser) {
|
||||||
|
ARG_PARSERS.add(parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an entity.
|
||||||
|
*
|
||||||
|
* @param key The key of the entity.
|
||||||
|
*/
|
||||||
|
public static void removeCustomEntity(@NotNull final NamespacedKey key) {
|
||||||
|
REGISTRY.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the backbone of the entire eco entity system.
|
||||||
|
* <p>
|
||||||
|
* You can look up a TestableEntity for any type or custom entity,
|
||||||
|
* and it will return it with any modifiers passed as parameters.
|
||||||
|
* <p>
|
||||||
|
* If you want to get an Entity instance from this, then just call
|
||||||
|
* {@link TestableEntity#spawn(Location)}.
|
||||||
|
* <p>
|
||||||
|
* The advantages of the testable entity system are that there is the inbuilt
|
||||||
|
* {@link TestableEntity#matches(Entity)} - this allows to check if any entity
|
||||||
|
* is that testable entity; which may sound negligible, but actually it allows for
|
||||||
|
* much more power and flexibility. For example, you can have an entity with an
|
||||||
|
* extra metadata tag, extra lore lines, different display name - and it
|
||||||
|
* will still work as long as the test passes.
|
||||||
|
*
|
||||||
|
* @param key The lookup string.
|
||||||
|
* @return The testable entity, or an empty testable entity if not found.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static TestableEntity lookup(@NotNull final String key) {
|
||||||
|
if (key.contains("?")) {
|
||||||
|
String[] options = key.split("\\?");
|
||||||
|
for (String option : options) {
|
||||||
|
TestableEntity lookup = lookup(option);
|
||||||
|
if (!(lookup instanceof EmptyTestableEntity)) {
|
||||||
|
return lookup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new EmptyTestableEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] args = StringUtils.parseTokens(key);
|
||||||
|
|
||||||
|
if (args.length == 0) {
|
||||||
|
return new EmptyTestableEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
TestableEntity entity;
|
||||||
|
|
||||||
|
String[] split = args[0].toLowerCase().split(":");
|
||||||
|
|
||||||
|
if (split.length == 1) {
|
||||||
|
EntityType type;
|
||||||
|
try {
|
||||||
|
type = EntityType.valueOf(args[0].toUpperCase());
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return new EmptyTestableEntity();
|
||||||
|
}
|
||||||
|
entity = new SimpleTestableEntity(type);
|
||||||
|
} else {
|
||||||
|
String namespace = split[0];
|
||||||
|
String keyID = split[1];
|
||||||
|
NamespacedKey namespacedKey = NamespacedKeyUtils.create(namespace, keyID);
|
||||||
|
|
||||||
|
TestableEntity part = REGISTRY.get(namespacedKey);
|
||||||
|
|
||||||
|
if (part == null) {
|
||||||
|
return new EmptyTestableEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
entity = part;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String[] modifierArgs = Arrays.copyOfRange(args, 1, args.length);
|
||||||
|
|
||||||
|
List<EntityArgParseResult> parseResults = new ArrayList<>();
|
||||||
|
|
||||||
|
for (EntityArgParser argParser : ARG_PARSERS) {
|
||||||
|
EntityArgParseResult result = argParser.parseArguments(modifierArgs);
|
||||||
|
if (result != null) {
|
||||||
|
parseResults.add(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Function<Location, Entity> spawner = entity::spawn;
|
||||||
|
|
||||||
|
if (!parseResults.isEmpty()) {
|
||||||
|
entity = new ModifiedTestableEntity(
|
||||||
|
entity,
|
||||||
|
test -> {
|
||||||
|
for (EntityArgParseResult parseResult : parseResults) {
|
||||||
|
if (!parseResult.test().test(test)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
location -> {
|
||||||
|
Entity spawned = spawner.apply(location);
|
||||||
|
|
||||||
|
for (EntityArgParseResult parseResult : parseResults) {
|
||||||
|
parseResult.modifier().accept(spawned);
|
||||||
|
}
|
||||||
|
|
||||||
|
return spawned;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a Testable Entity from an ItemStack.
|
||||||
|
* <p>
|
||||||
|
* Will search for registered entity first. If there are no matches in the registry,
|
||||||
|
* then it will return a {@link com.willfp.eco.core.entities.impl.SimpleTestableEntity} matching the entity type.
|
||||||
|
* <p>
|
||||||
|
* If the entity is not custom and has unknown type, this will return null.
|
||||||
|
*
|
||||||
|
* @param entity The Entity.
|
||||||
|
* @return The found Testable Entity.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static TestableEntity getEntity(@Nullable final Entity entity) {
|
||||||
|
if (entity == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestableEntity customEntity = getEntity(entity);
|
||||||
|
|
||||||
|
if (customEntity != null) {
|
||||||
|
return customEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (TestableEntity known : REGISTRY.values()) {
|
||||||
|
if (known.matches(entity)) {
|
||||||
|
return known;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entity.getType() == EntityType.UNKNOWN) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SimpleTestableEntity(entity.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if entity is a custom entity.
|
||||||
|
*
|
||||||
|
* @param entity The entity to check.
|
||||||
|
* @return If is custom.
|
||||||
|
*/
|
||||||
|
public static boolean isCustomEntity(@NotNull final Entity entity) {
|
||||||
|
for (TestableEntity testable : REGISTRY.values()) {
|
||||||
|
if (testable.matches(entity)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all registered custom items.
|
||||||
|
*
|
||||||
|
* @return A set of all items.
|
||||||
|
*/
|
||||||
|
public static Set<TestableEntity> getCustomEntities() {
|
||||||
|
return new HashSet<>(REGISTRY.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Entities() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.willfp.eco.core.entities;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An item with a test to see if any item is that item.
|
||||||
|
*/
|
||||||
|
public interface TestableEntity {
|
||||||
|
/**
|
||||||
|
* If an Entity matches the test.
|
||||||
|
*
|
||||||
|
* @param entity The entity to test.
|
||||||
|
* @return If the entity matches.
|
||||||
|
*/
|
||||||
|
boolean matches(@Nullable Entity entity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spawn the entity.
|
||||||
|
*
|
||||||
|
* @param location The location.
|
||||||
|
* @return The entity.
|
||||||
|
*/
|
||||||
|
Entity spawn(@NotNull Location location);
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.core.entities.args;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param test The test for the entity.
|
||||||
|
* @param modifier The modifier to apply to the entity.
|
||||||
|
* @see EntityArgParser
|
||||||
|
*/
|
||||||
|
public record EntityArgParseResult(@NotNull Predicate<Entity> test,
|
||||||
|
@NotNull Consumer<Entity> modifier) {
|
||||||
|
/**
|
||||||
|
* Kotlin destructuring support.
|
||||||
|
*
|
||||||
|
* @return The test.
|
||||||
|
*/
|
||||||
|
public Predicate<Entity> component1() {
|
||||||
|
return test;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kotlin destructuring support.
|
||||||
|
*
|
||||||
|
* @return The modifier.
|
||||||
|
*/
|
||||||
|
public Consumer<Entity> component2() {
|
||||||
|
return modifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.willfp.eco.core.entities.args;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An argument parser should generate the predicate as well
|
||||||
|
* as modify the Entity for {@link TestableEntity#spawn(Location)}.
|
||||||
|
*/
|
||||||
|
public interface EntityArgParser {
|
||||||
|
/**
|
||||||
|
* Parse the arguments.
|
||||||
|
*
|
||||||
|
* @param args The arguments.
|
||||||
|
* @return The predicate test to apply to the modified entity.
|
||||||
|
*/
|
||||||
|
@Nullable EntityArgParseResult parseArguments(@NotNull String[] args);
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.core.entities.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty entity.
|
||||||
|
*/
|
||||||
|
public class EmptyTestableEntity implements TestableEntity {
|
||||||
|
/**
|
||||||
|
* Create a new empty testable entity.
|
||||||
|
*/
|
||||||
|
public EmptyTestableEntity() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(@Nullable final Entity entity) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity spawn(@NotNull final Location location) {
|
||||||
|
Validate.notNull(location.getWorld());
|
||||||
|
|
||||||
|
return Eco.getHandler().createDummyEntity(location);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package com.willfp.eco.core.entities.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Existing testable entity with an extra filter.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.entities.CustomEntity
|
||||||
|
*/
|
||||||
|
public class ModifiedTestableEntity implements TestableEntity {
|
||||||
|
/**
|
||||||
|
* The item.
|
||||||
|
*/
|
||||||
|
private final TestableEntity handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount.
|
||||||
|
*/
|
||||||
|
private final Predicate<Entity> test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The provider to spawn the entity.
|
||||||
|
*/
|
||||||
|
private final Function<Location, Entity> provider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new modified testable entity.
|
||||||
|
*
|
||||||
|
* @param entity The base entity.
|
||||||
|
* @param test The test.
|
||||||
|
* @param provider The provider to spawn the entity.
|
||||||
|
*/
|
||||||
|
public ModifiedTestableEntity(@NotNull final TestableEntity entity,
|
||||||
|
@NotNull final Predicate<@NotNull Entity> test,
|
||||||
|
@NotNull final Function<Location, Entity> provider) {
|
||||||
|
this.handle = entity;
|
||||||
|
this.test = test;
|
||||||
|
this.provider = provider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(@Nullable final Entity entity) {
|
||||||
|
return entity != null && handle.matches(entity) && test.test(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity spawn(@NotNull final Location location) {
|
||||||
|
Validate.notNull(location.getWorld());
|
||||||
|
|
||||||
|
return provider.apply(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the handle.
|
||||||
|
*
|
||||||
|
* @return The handle.
|
||||||
|
*/
|
||||||
|
public TestableEntity getHandle() {
|
||||||
|
return this.handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.willfp.eco.core.entities.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default vanilla entities.
|
||||||
|
*/
|
||||||
|
public class SimpleTestableEntity implements TestableEntity {
|
||||||
|
/**
|
||||||
|
* The entity type.
|
||||||
|
*/
|
||||||
|
private final EntityType type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new simple testable entity.
|
||||||
|
*
|
||||||
|
* @param type The entity type.
|
||||||
|
*/
|
||||||
|
public SimpleTestableEntity(@NotNull final EntityType type) {
|
||||||
|
this.type = type;
|
||||||
|
|
||||||
|
Validate.notNull(type.getEntityClass(), "Entity cannot be of unknown type!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(@Nullable final Entity entity) {
|
||||||
|
return entity != null && entity.getType() == type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity spawn(@NotNull final Location location) {
|
||||||
|
Validate.notNull(location.getWorld());
|
||||||
|
|
||||||
|
assert type.getEntityClass() != null;
|
||||||
|
|
||||||
|
return location.getWorld().spawn(location, type.getEntityClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the type.
|
||||||
|
*
|
||||||
|
* @return The type.
|
||||||
|
*/
|
||||||
|
public EntityType getType() {
|
||||||
|
return this.type;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.core.events;
|
package com.willfp.eco.core.events;
|
||||||
|
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages listeners for a plugin.
|
* Manages listeners for a plugin.
|
||||||
@@ -11,14 +12,14 @@ public interface EventManager {
|
|||||||
*
|
*
|
||||||
* @param listener The listener to register.
|
* @param listener The listener to register.
|
||||||
*/
|
*/
|
||||||
void registerListener(Listener listener);
|
void registerListener(@NotNull Listener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister a listener with bukkit.
|
* Unregister a listener with bukkit.
|
||||||
*
|
*
|
||||||
* @param listener The listener to unregister.
|
* @param listener The listener to unregister.
|
||||||
*/
|
*/
|
||||||
void unregisterListener(Listener listener);
|
void unregisterListener(@NotNull Listener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister all listeners associated with the plugin.
|
* Unregister all listeners associated with the plugin.
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.apache.commons.lang.Validate;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An extension is a separate jar file that hooks into the base plugin jar.
|
* An extension is a separate jar file that hooks into the base plugin jar.
|
||||||
@@ -143,6 +144,11 @@ public abstract class Extension implements PluginLike {
|
|||||||
return this.plugin.getConfigHandler();
|
return this.plugin.getConfigHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Logger getLogger() {
|
||||||
|
return this.plugin.getLogger();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the plugin for the extension.
|
* Get the plugin for the extension.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
package com.willfp.eco.core.integrations;
|
package com.willfp.eco.core.integrations;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An integration loader runs a runnable only if a specific plugin is present on the server.
|
* An integration loader runs a runnable only if a specific plugin is present on the server.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -9,7 +15,15 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
*/
|
*/
|
||||||
public class IntegrationLoader {
|
public class IntegrationLoader {
|
||||||
/**
|
/**
|
||||||
* The lambda to be ran if the plugin is present.
|
* All loaded plugins on the server.
|
||||||
|
*/
|
||||||
|
private static final Set<String> LOADED_PLUGINS = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
||||||
|
.map(Plugin::getName)
|
||||||
|
.map(String::toLowerCase)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The lambda to be run if the plugin is present.
|
||||||
*/
|
*/
|
||||||
private final Runnable runnable;
|
private final Runnable runnable;
|
||||||
|
|
||||||
@@ -22,7 +36,7 @@ public class IntegrationLoader {
|
|||||||
* Create a new Integration Loader.
|
* Create a new Integration Loader.
|
||||||
*
|
*
|
||||||
* @param pluginName The plugin to require.
|
* @param pluginName The plugin to require.
|
||||||
* @param onLoad The lambda to be ran if the plugin is present.
|
* @param onLoad The lambda to be run if the plugin is present.
|
||||||
*/
|
*/
|
||||||
public IntegrationLoader(@NotNull final String pluginName,
|
public IntegrationLoader(@NotNull final String pluginName,
|
||||||
@NotNull final Runnable onLoad) {
|
@NotNull final Runnable onLoad) {
|
||||||
@@ -30,6 +44,15 @@ public class IntegrationLoader {
|
|||||||
this.pluginName = pluginName;
|
this.pluginName = pluginName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the integration if the specified plugin is present on the server.
|
||||||
|
*/
|
||||||
|
public void loadIfPresent() {
|
||||||
|
if (LOADED_PLUGINS.contains(this.pluginName.toLowerCase())) {
|
||||||
|
this.load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the integration.
|
* Load the integration.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public final class AnticheatManager {
|
|||||||
* @param anticheat The anticheat to register.
|
* @param anticheat The anticheat to register.
|
||||||
*/
|
*/
|
||||||
public static void register(@NotNull final EcoPlugin plugin,
|
public static void register(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final AnticheatWrapper anticheat) {
|
@NotNull final AnticheatWrapper anticheat) {
|
||||||
if (anticheat instanceof Listener) {
|
if (anticheat instanceof Listener) {
|
||||||
plugin.getEventManager().registerListener((Listener) anticheat);
|
plugin.getEventManager().registerListener((Listener) anticheat);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.willfp.eco.core.integrations.customentities;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle custom entity integrations.
|
||||||
|
*/
|
||||||
|
public final class CustomEntitiesManager {
|
||||||
|
/**
|
||||||
|
* A set of all registered integrations.
|
||||||
|
*/
|
||||||
|
private static final Set<CustomEntitiesWrapper> REGISTERED = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new integration.
|
||||||
|
*
|
||||||
|
* @param integration The integration to register.
|
||||||
|
*/
|
||||||
|
public static void register(@NotNull final CustomEntitiesWrapper integration) {
|
||||||
|
REGISTERED.add(integration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register all the custom entities for a specific plugin into eco.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.entities.Entities
|
||||||
|
*/
|
||||||
|
public static void registerAllEntities() {
|
||||||
|
for (CustomEntitiesWrapper wrapper : REGISTERED) {
|
||||||
|
wrapper.registerAllEntities();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CustomEntitiesManager() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.willfp.eco.core.integrations.customentities;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.integrations.Integration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for custom item integrations.
|
||||||
|
*/
|
||||||
|
public interface CustomEntitiesWrapper extends Integration {
|
||||||
|
/**
|
||||||
|
* Register all the custom entities for a specific plugin into eco.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.entities.Entities
|
||||||
|
*/
|
||||||
|
void registerAllEntities();
|
||||||
|
}
|
||||||
@@ -41,7 +41,7 @@ public final class EconomyManager {
|
|||||||
* @return If the player has the amount.
|
* @return If the player has the amount.
|
||||||
*/
|
*/
|
||||||
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||||
final double amount) {
|
final double amount) {
|
||||||
for (EconomyWrapper wrapper : REGISTERED) {
|
for (EconomyWrapper wrapper : REGISTERED) {
|
||||||
return wrapper.hasAmount(player, amount);
|
return wrapper.hasAmount(player, amount);
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ public final class EconomyManager {
|
|||||||
* @return If the transaction was a success.
|
* @return If the transaction was a success.
|
||||||
*/
|
*/
|
||||||
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||||
final double amount) {
|
final double amount) {
|
||||||
for (EconomyWrapper wrapper : REGISTERED) {
|
for (EconomyWrapper wrapper : REGISTERED) {
|
||||||
return wrapper.giveMoney(player, amount);
|
return wrapper.giveMoney(player, amount);
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ public final class EconomyManager {
|
|||||||
* @return If the transaction was a success.
|
* @return If the transaction was a success.
|
||||||
*/
|
*/
|
||||||
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||||
final double amount) {
|
final double amount) {
|
||||||
for (EconomyWrapper wrapper : REGISTERED) {
|
for (EconomyWrapper wrapper : REGISTERED) {
|
||||||
return wrapper.removeMoney(player, amount);
|
return wrapper.removeMoney(player, amount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public final class HologramManager {
|
|||||||
* @return The hologram.
|
* @return The hologram.
|
||||||
*/
|
*/
|
||||||
public static Hologram createHologram(@NotNull final Location location,
|
public static Hologram createHologram(@NotNull final Location location,
|
||||||
@NotNull final List<String> contents) {
|
@NotNull final List<String> contents) {
|
||||||
for (HologramWrapper wrapper : REGISTERED) {
|
for (HologramWrapper wrapper : REGISTERED) {
|
||||||
return wrapper.createHologram(location, contents);
|
return wrapper.createHologram(location, contents);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class CustomItem implements TestableItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getItem() {
|
public ItemStack getItem() {
|
||||||
return item;
|
return item.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.willfp.eco.core.recipe.parts.ModifiedTestableItem;
|
|||||||
import com.willfp.eco.core.recipe.parts.TestableStack;
|
import com.willfp.eco.core.recipe.parts.TestableStack;
|
||||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||||
import com.willfp.eco.util.NumberUtils;
|
import com.willfp.eco.util.NumberUtils;
|
||||||
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@@ -118,7 +119,8 @@ public final class Items {
|
|||||||
return new EmptyTestableItem();
|
return new EmptyTestableItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] args = key.split(" ");
|
String[] args = StringUtils.parseTokens(key);
|
||||||
|
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
return new EmptyTestableItem();
|
return new EmptyTestableItem();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
package com.willfp.eco.core.items.args;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -12,11 +14,23 @@ import java.util.function.Predicate;
|
|||||||
*
|
*
|
||||||
* @deprecated Moved to internals.
|
* @deprecated Moved to internals.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||||
|
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.1")
|
||||||
public class ColorArgParser implements LookupArgParser {
|
public class ColorArgParser implements LookupArgParser {
|
||||||
|
/**
|
||||||
|
* Instantiate arg parser.
|
||||||
|
*/
|
||||||
|
public ColorArgParser() {
|
||||||
|
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||||
@NotNull final ItemMeta meta) {
|
@NotNull final ItemMeta meta) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + ColorArgParser.class.getName() + "), this will throw an error in the next release!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
package com.willfp.eco.core.items.args;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -12,11 +14,23 @@ import java.util.function.Predicate;
|
|||||||
*
|
*
|
||||||
* @deprecated Moved to internals.
|
* @deprecated Moved to internals.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||||
|
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.1")
|
||||||
public class CustomModelDataArgParser implements LookupArgParser {
|
public class CustomModelDataArgParser implements LookupArgParser {
|
||||||
|
/**
|
||||||
|
* Instantiate arg parser.
|
||||||
|
*/
|
||||||
|
public CustomModelDataArgParser() {
|
||||||
|
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||||
@NotNull final ItemMeta meta) {
|
@NotNull final ItemMeta meta) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + CustomModelDataArgParser.class.getName() + "), this will throw an error in the next release!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
package com.willfp.eco.core.items.args;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -12,11 +14,23 @@ import java.util.function.Predicate;
|
|||||||
*
|
*
|
||||||
* @deprecated Moved to internals.
|
* @deprecated Moved to internals.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||||
|
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.1")
|
||||||
public class EnchantmentArgParser implements LookupArgParser {
|
public class EnchantmentArgParser implements LookupArgParser {
|
||||||
|
/**
|
||||||
|
* Instantiate arg parser.
|
||||||
|
*/
|
||||||
|
public EnchantmentArgParser() {
|
||||||
|
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||||
@NotNull final ItemMeta meta) {
|
@NotNull final ItemMeta meta) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + EnchantmentArgParser.class.getName() + "), this will throw an error in the next release!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
package com.willfp.eco.core.items.args;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -12,11 +14,23 @@ import java.util.function.Predicate;
|
|||||||
*
|
*
|
||||||
* @deprecated Moved to internals.
|
* @deprecated Moved to internals.
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||||
|
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.1")
|
||||||
public class TextureArgParser implements LookupArgParser {
|
public class TextureArgParser implements LookupArgParser {
|
||||||
|
/**
|
||||||
|
* Instantiate arg parser.
|
||||||
|
*/
|
||||||
|
public TextureArgParser() {
|
||||||
|
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||||
@NotNull final ItemMeta meta) {
|
@NotNull final ItemMeta meta) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + TextureArgParser.class.getName() + "), this will throw an error in the next release!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.items.TestableItem;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@@ -43,6 +44,15 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
|||||||
this(new ItemStack(material));
|
this(new ItemStack(material));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ItemStackBuilder to modify an existing item.
|
||||||
|
*
|
||||||
|
* @param item The item to start with.
|
||||||
|
*/
|
||||||
|
protected AbstractItemStackBuilder(@NotNull final TestableItem item) {
|
||||||
|
this(item.getItem());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ItemStackBuilder to modify an existing item.
|
* Create a new ItemStackBuilder to modify an existing item.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentSt
|
|||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
public EnchantedBookBuilder addStoredEnchantment(@NotNull final Supplier<Enchantment> enchantment,
|
public EnchantedBookBuilder addStoredEnchantment(@NotNull final Supplier<Enchantment> enchantment,
|
||||||
final Supplier<Integer> level) {
|
@NotNull final Supplier<Integer> level) {
|
||||||
return this.addStoredEnchantment(enchantment.get(), level.get());
|
return this.addStoredEnchantment(enchantment.get(), level.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.items.TestableItem;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
@@ -26,4 +27,13 @@ public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemSta
|
|||||||
public ItemStackBuilder(@NotNull final ItemStack base) {
|
public ItemStackBuilder(@NotNull final ItemStack base) {
|
||||||
super(base);
|
super(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ItemStackBuilder to modify an existing item.
|
||||||
|
*
|
||||||
|
* @param item The item to start with.
|
||||||
|
*/
|
||||||
|
public ItemStackBuilder(@NotNull final TestableItem item) {
|
||||||
|
super(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.items.TestableItem;
|
||||||
import org.bukkit.Color;
|
import org.bukkit.Color;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@@ -30,6 +31,15 @@ public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMe
|
|||||||
super(base);
|
super(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ItemStackBuilder to modify an existing item.
|
||||||
|
*
|
||||||
|
* @param item The item to start with.
|
||||||
|
*/
|
||||||
|
public LeatherArmorBuilder(@NotNull final TestableItem item) {
|
||||||
|
super(item);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set leather color.
|
* Set leather color.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
package com.willfp.eco.core.proxy;
|
package com.willfp.eco.core.proxy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All proxies must implement this interface.
|
* Prior to 6.17.0, all proxies were required to implement this interface,
|
||||||
* <p>
|
* however it produced no functionality and was not even used internally.
|
||||||
* A proxy is an NMS implementation of a proxy interface.
|
*
|
||||||
* <p>
|
* @deprecated Unused class, not required. Will be removed in a subsequent release.
|
||||||
* This allows for cross-version support.
|
|
||||||
* <p>
|
|
||||||
* See the core-spigot and core-nms modules of eco to see an example.
|
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.17.0", forRemoval = true)
|
||||||
public interface AbstractProxy {
|
public interface AbstractProxy {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,5 @@ public interface ProxyFactory {
|
|||||||
* @param <T> The proxy class.
|
* @param <T> The proxy class.
|
||||||
* @return The proxy implementation.
|
* @return The proxy implementation.
|
||||||
*/
|
*/
|
||||||
<T extends AbstractProxy> @NotNull T getProxy(@NotNull Class<T> proxyClass);
|
<T> @NotNull T getProxy(@NotNull Class<T> proxyClass);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,27 @@ public final class Recipes {
|
|||||||
@NotNull final String key,
|
@NotNull final String key,
|
||||||
@NotNull final ItemStack output,
|
@NotNull final ItemStack output,
|
||||||
@NotNull final List<String> recipeStrings) {
|
@NotNull final List<String> recipeStrings) {
|
||||||
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key).setOutput(output);
|
return createAndRegisterRecipe(plugin, key, output, recipeStrings, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and register recipe.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param key The key.
|
||||||
|
* @param output The output.
|
||||||
|
* @param recipeStrings The recipe.
|
||||||
|
* @param permission The permission.
|
||||||
|
* @return The recipe.
|
||||||
|
*/
|
||||||
|
public static CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final String key,
|
||||||
|
@NotNull final ItemStack output,
|
||||||
|
@NotNull final List<String> recipeStrings,
|
||||||
|
@Nullable final String permission) {
|
||||||
|
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key)
|
||||||
|
.setOutput(output)
|
||||||
|
.setPermission(permission);
|
||||||
|
|
||||||
for (int i = 0; i < 9; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
builder.setRecipePart(i, Items.lookup(recipeStrings.get(i)));
|
builder.setRecipePart(i, Items.lookup(recipeStrings.get(i)));
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.items.TestableItem;
|
|||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -31,6 +32,7 @@ public interface CraftingRecipe {
|
|||||||
*
|
*
|
||||||
* @return The parts.
|
* @return The parts.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
List<TestableItem> getParts();
|
List<TestableItem> getParts();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,6 +40,7 @@ public interface CraftingRecipe {
|
|||||||
*
|
*
|
||||||
* @return The key.
|
* @return The key.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
NamespacedKey getKey();
|
NamespacedKey getKey();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,6 +48,7 @@ public interface CraftingRecipe {
|
|||||||
*
|
*
|
||||||
* @return The key.
|
* @return The key.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
NamespacedKey getDisplayedKey();
|
NamespacedKey getDisplayedKey();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,5 +56,16 @@ public interface CraftingRecipe {
|
|||||||
*
|
*
|
||||||
* @return The output.
|
* @return The output.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
ItemStack getOutput();
|
ItemStack getOutput();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the recipe permission.
|
||||||
|
*
|
||||||
|
* @return The permission.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
default String getPermission() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.bukkit.inventory.RecipeChoice;
|
|||||||
import org.bukkit.inventory.ShapedRecipe;
|
import org.bukkit.inventory.ShapedRecipe;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -44,16 +45,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*/
|
*/
|
||||||
private final ItemStack output;
|
private final ItemStack output;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The permission.
|
||||||
|
*/
|
||||||
|
private final String permission;
|
||||||
|
|
||||||
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
|
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final String key,
|
@NotNull final String key,
|
||||||
@NotNull final List<TestableItem> parts,
|
@NotNull final List<TestableItem> parts,
|
||||||
@NotNull final ItemStack output) {
|
@NotNull final ItemStack output,
|
||||||
|
@Nullable final String permission) {
|
||||||
super(plugin);
|
super(plugin);
|
||||||
|
|
||||||
this.parts = parts;
|
this.parts = parts;
|
||||||
this.key = plugin.getNamespacedKeyFactory().create(key);
|
this.key = plugin.getNamespacedKeyFactory().create(key);
|
||||||
this.displayedKey = plugin.getNamespacedKeyFactory().create(key + "_displayed");
|
this.displayedKey = plugin.getNamespacedKeyFactory().create(key + "_displayed");
|
||||||
this.output = output;
|
this.output = output;
|
||||||
|
this.permission = permission;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -140,6 +148,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*
|
*
|
||||||
* @return The parts.
|
* @return The parts.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
public List<TestableItem> getParts() {
|
public List<TestableItem> getParts() {
|
||||||
return this.parts;
|
return this.parts;
|
||||||
}
|
}
|
||||||
@@ -149,6 +159,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*
|
*
|
||||||
* @return The key.
|
* @return The key.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
public NamespacedKey getKey() {
|
public NamespacedKey getKey() {
|
||||||
return this.key;
|
return this.key;
|
||||||
}
|
}
|
||||||
@@ -158,6 +170,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*
|
*
|
||||||
* @return The displayed key.
|
* @return The displayed key.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
public NamespacedKey getDisplayedKey() {
|
public NamespacedKey getDisplayedKey() {
|
||||||
return this.displayedKey;
|
return this.displayedKey;
|
||||||
}
|
}
|
||||||
@@ -167,10 +181,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*
|
*
|
||||||
* @return The output.
|
* @return The output.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
public ItemStack getOutput() {
|
public ItemStack getOutput() {
|
||||||
return this.output;
|
return this.output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the permission.
|
||||||
|
*
|
||||||
|
* @return The permission.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getPermission() {
|
||||||
|
return permission;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builder for recipes.
|
* Builder for recipes.
|
||||||
*/
|
*/
|
||||||
@@ -185,6 +212,11 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
*/
|
*/
|
||||||
private ItemStack output = null;
|
private ItemStack output = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The permission for the recipe.
|
||||||
|
*/
|
||||||
|
private String permission = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The key of the recipe.
|
* The key of the recipe.
|
||||||
*/
|
*/
|
||||||
@@ -244,6 +276,17 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the permission required to craft the recipe.
|
||||||
|
*
|
||||||
|
* @param permission The permission.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
public Builder setPermission(@Nullable final String permission) {
|
||||||
|
this.permission = permission;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the recipe.
|
* Build the recipe.
|
||||||
*
|
*
|
||||||
@@ -256,7 +299,7 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ShapedCraftingRecipe(plugin, key.toLowerCase(), recipeParts, output);
|
return new ShapedCraftingRecipe(plugin, key.toLowerCase(), recipeParts, output, permission);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,20 @@ public interface Scheduler {
|
|||||||
BukkitTask runLater(@NotNull Runnable runnable,
|
BukkitTask runLater(@NotNull Runnable runnable,
|
||||||
long ticksLater);
|
long ticksLater);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the task after a specified tick delay.
|
||||||
|
* <p>
|
||||||
|
* Reordered for better kotlin interop.
|
||||||
|
*
|
||||||
|
* @param runnable The lambda to run.
|
||||||
|
* @param ticksLater The amount of ticks to wait before execution.
|
||||||
|
* @return The created {@link BukkitTask}.
|
||||||
|
*/
|
||||||
|
default BukkitTask runLater(long ticksLater,
|
||||||
|
@NotNull Runnable runnable) {
|
||||||
|
return runLater(runnable, ticksLater);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the task repeatedly on a timer.
|
* Run the task repeatedly on a timer.
|
||||||
*
|
*
|
||||||
@@ -30,6 +44,22 @@ public interface Scheduler {
|
|||||||
long delay,
|
long delay,
|
||||||
long repeat);
|
long repeat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the task repeatedly on a timer.
|
||||||
|
* <p>
|
||||||
|
* Reordered for better kotlin interop.
|
||||||
|
*
|
||||||
|
* @param runnable The lambda to run.
|
||||||
|
* @param delay The amount of ticks to wait before the first execution.
|
||||||
|
* @param repeat The amount of ticks to wait between executions.
|
||||||
|
* @return The created {@link BukkitTask}.
|
||||||
|
*/
|
||||||
|
default BukkitTask runTimer(long delay,
|
||||||
|
long repeat,
|
||||||
|
@NotNull Runnable runnable) {
|
||||||
|
return runTimer(runnable, delay, repeat);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the task repeatedly and asynchronously on a timer.
|
* Run the task repeatedly and asynchronously on a timer.
|
||||||
*
|
*
|
||||||
@@ -42,6 +72,22 @@ public interface Scheduler {
|
|||||||
long delay,
|
long delay,
|
||||||
long repeat);
|
long repeat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the task repeatedly and asynchronously on a timer.
|
||||||
|
* <p>
|
||||||
|
* Reordered for better kotlin interop.
|
||||||
|
*
|
||||||
|
* @param runnable The lambda to run.
|
||||||
|
* @param delay The amount of ticks to wait before the first execution.
|
||||||
|
* @param repeat The amount of ticks to wait between executions.
|
||||||
|
* @return The created {@link BukkitTask}.
|
||||||
|
*/
|
||||||
|
default BukkitTask runAsyncTimer(long delay,
|
||||||
|
long repeat,
|
||||||
|
@NotNull Runnable runnable) {
|
||||||
|
return runAsyncTimer(runnable, delay, repeat);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the task.
|
* Run the task.
|
||||||
*
|
*
|
||||||
@@ -70,6 +116,22 @@ public interface Scheduler {
|
|||||||
long delay,
|
long delay,
|
||||||
long repeat);
|
long repeat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule the task to be ran repeatedly on a timer.
|
||||||
|
* <p>
|
||||||
|
* Reordered for better kotlin interop.
|
||||||
|
*
|
||||||
|
* @param runnable The lambda to run.
|
||||||
|
* @param delay The amount of ticks to wait before the first execution.
|
||||||
|
* @param repeat The amount of ticks to wait between executions.
|
||||||
|
* @return The id of the task.
|
||||||
|
*/
|
||||||
|
default int syncRepeating(long delay,
|
||||||
|
long repeat,
|
||||||
|
@NotNull Runnable runnable) {
|
||||||
|
return syncRepeating(runnable, delay, repeat);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel all running tasks from the linked {@link EcoPlugin}.
|
* Cancel all running tasks from the linked {@link EcoPlugin}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package com.willfp.eco.util;
|
package com.willfp.eco.util;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -55,6 +57,58 @@ public final class ListUtils {
|
|||||||
return frequencyMap;
|
return frequencyMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert nullable object to either singleton list or empty list.
|
||||||
|
*
|
||||||
|
* @param object The object.
|
||||||
|
* @param <T> The type of the object.
|
||||||
|
* @return The list.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <T> List<T> toSingletonList(@Nullable final T object) {
|
||||||
|
if (object == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
} else {
|
||||||
|
return Collections.singletonList(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get element from list or return null if out of bounds.
|
||||||
|
*
|
||||||
|
* @param list The list.
|
||||||
|
* @param index The index.
|
||||||
|
* @param <T> The type of the list.
|
||||||
|
* @return The found element, or null if out of bounds.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static <T> T getOrNull(@Nullable final List<T> list,
|
||||||
|
final int index) {
|
||||||
|
if (list == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index >= 0 && index < list.size() ? list.get(index) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if an iterable of strings contains a certain element regardless of case.
|
||||||
|
*
|
||||||
|
* @param list The list.
|
||||||
|
* @param element The element.
|
||||||
|
* @return If contained.
|
||||||
|
*/
|
||||||
|
public static boolean containsIgnoreCase(@NotNull final Iterable<String> list,
|
||||||
|
@NotNull final String element) {
|
||||||
|
for (String s : list) {
|
||||||
|
if (s.equalsIgnoreCase(element)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private ListUtils() {
|
private ListUtils() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,11 +185,23 @@ public final class NumberUtils {
|
|||||||
/**
|
/**
|
||||||
* Get Log base 2 of a number.
|
* Get Log base 2 of a number.
|
||||||
*
|
*
|
||||||
* @param toLog The number.
|
* @param a The number.
|
||||||
* @return The result.
|
* @return The result.
|
||||||
*/
|
*/
|
||||||
public static int log2(final int toLog) {
|
public static int log2(final int a) {
|
||||||
return (int) (Math.log(toLog) / Math.log(2));
|
return (int) logBase(a, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log with a base.
|
||||||
|
*
|
||||||
|
* @param a The number.
|
||||||
|
* @param base The base.
|
||||||
|
* @return The logarithm.
|
||||||
|
*/
|
||||||
|
public static double logBase(final double a,
|
||||||
|
final double base) {
|
||||||
|
return Math.log(a) / Math.log(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -16,30 +16,45 @@ public final class PotionUtils {
|
|||||||
public static int getDuration(@NotNull final PotionData data) {
|
public static int getDuration(@NotNull final PotionData data) {
|
||||||
if (data.isExtended()) {
|
if (data.isExtended()) {
|
||||||
return switch (data.getType()) {
|
return switch (data.getType()) {
|
||||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||||
case POISON, REGEN: yield 1800;
|
yield 0;
|
||||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 4800;
|
case POISON, REGEN:
|
||||||
case TURTLE_MASTER: yield 800;
|
yield 1800;
|
||||||
default: yield 9600;
|
case SLOW_FALLING, WEAKNESS, SLOWNESS:
|
||||||
|
yield 4800;
|
||||||
|
case TURTLE_MASTER:
|
||||||
|
yield 800;
|
||||||
|
default:
|
||||||
|
yield 9600;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.isUpgraded()) {
|
if (data.isUpgraded()) {
|
||||||
return switch (data.getType()) {
|
return switch (data.getType()) {
|
||||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||||
case POISON, REGEN: yield 420;
|
yield 0;
|
||||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 440;
|
case POISON, REGEN:
|
||||||
case TURTLE_MASTER: yield 400;
|
yield 420;
|
||||||
default: yield 1800;
|
case SLOW_FALLING, WEAKNESS, SLOWNESS:
|
||||||
|
yield 440;
|
||||||
|
case TURTLE_MASTER:
|
||||||
|
yield 400;
|
||||||
|
default:
|
||||||
|
yield 1800;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return switch (data.getType()) {
|
return switch (data.getType()) {
|
||||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||||
case POISON, REGEN: yield 900;
|
yield 0;
|
||||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 400;
|
case POISON, REGEN:
|
||||||
case TURTLE_MASTER: yield 1800;
|
yield 900;
|
||||||
default: yield 3600;
|
case SLOW_FALLING, WEAKNESS, SLOWNESS:
|
||||||
|
yield 400;
|
||||||
|
case TURTLE_MASTER:
|
||||||
|
yield 1800;
|
||||||
|
default:
|
||||||
|
yield 3600;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public final class SkullUtils {
|
|||||||
* @param base64 The base64 texture.
|
* @param base64 The base64 texture.
|
||||||
*/
|
*/
|
||||||
public static void setSkullTexture(@NotNull final SkullMeta meta,
|
public static void setSkullTexture(@NotNull final SkullMeta meta,
|
||||||
@NotNull final String base64) {
|
@NotNull final String base64) {
|
||||||
Validate.isTrue(initialized, "Must be initialized!");
|
Validate.isTrue(initialized, "Must be initialized!");
|
||||||
Validate.notNull(metaSetConsumer, "Must be initialized!");
|
Validate.notNull(metaSetConsumer, "Must be initialized!");
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ public final class SkullUtils {
|
|||||||
*/
|
*/
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
public static void initialize(@NotNull final BiConsumer<SkullMeta, String> function,
|
public static void initialize(@NotNull final BiConsumer<SkullMeta, String> function,
|
||||||
@NotNull final Function<SkullMeta, String> function2) {
|
@NotNull final Function<SkullMeta, String> function2) {
|
||||||
Validate.isTrue(!initialized, "Already initialized!");
|
Validate.isTrue(!initialized, "Already initialized!");
|
||||||
|
|
||||||
metaSetConsumer = function;
|
metaSetConsumer = function;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.willfp.eco.util;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.willfp.eco.core.Prerequisite;
|
import com.willfp.eco.core.Prerequisite;
|
||||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
@@ -58,6 +59,13 @@ public final class StringUtils {
|
|||||||
.hexColors()
|
.hexColors()
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GSON serializer.
|
||||||
|
*/
|
||||||
|
private static final GsonComponentSerializer GSON_COMPONENT_SERIALIZER = GsonComponentSerializer.builder()
|
||||||
|
.emitLegacyHoverEvent()
|
||||||
|
.build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Color map.
|
* Color map.
|
||||||
*/
|
*/
|
||||||
@@ -415,7 +423,7 @@ public final class StringUtils {
|
|||||||
if (legacy == null) {
|
if (legacy == null) {
|
||||||
processed = "";
|
processed = "";
|
||||||
}
|
}
|
||||||
return GsonComponentSerializer.gson().serialize(
|
return GSON_COMPONENT_SERIALIZER.serialize(
|
||||||
Component.empty().decoration(TextDecoration.ITALIC, false).append(
|
Component.empty().decoration(TextDecoration.ITALIC, false).append(
|
||||||
LEGACY_COMPONENT_SERIALIZER.deserialize(processed)
|
LEGACY_COMPONENT_SERIALIZER.deserialize(processed)
|
||||||
)
|
)
|
||||||
@@ -429,10 +437,17 @@ public final class StringUtils {
|
|||||||
* @return The legacy string.
|
* @return The legacy string.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static String jsonToLegacy(@NotNull final String json) {
|
public static String jsonToLegacy(@Nullable final String json) {
|
||||||
return LEGACY_COMPONENT_SERIALIZER.serialize(
|
if (json == null || json.isEmpty()) {
|
||||||
GsonComponentSerializer.gson().deserialize(json)
|
return "";
|
||||||
);
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Component component = GSON_COMPONENT_SERIALIZER.deserialize(json);
|
||||||
|
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
||||||
|
} catch (JsonSyntaxException e) {
|
||||||
|
return json;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -462,6 +477,53 @@ public final class StringUtils {
|
|||||||
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse string into tokens.
|
||||||
|
* <p>
|
||||||
|
* Handles quoted strings for names.
|
||||||
|
*
|
||||||
|
* @param lookup The lookup string.
|
||||||
|
* @return An array of tokens to be processed.
|
||||||
|
* @author Shawn (https://stackoverflow.com/questions/70606170/split-a-list-on-spaces-and-group-quoted-characters/70606653#70606653)
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static String[] parseTokens(@NotNull final String lookup) {
|
||||||
|
char[] chars = lookup.toCharArray();
|
||||||
|
List<String> tokens = new ArrayList<>();
|
||||||
|
StringBuilder tokenBuilder = new StringBuilder();
|
||||||
|
for (int i = 0; i < chars.length; i++) {
|
||||||
|
if (chars[i] == ' ') {
|
||||||
|
/*
|
||||||
|
Take the current value of the argument builder, append it to the
|
||||||
|
list of found tokens, and then clear it for the next argument.
|
||||||
|
*/
|
||||||
|
tokens.add(tokenBuilder.toString());
|
||||||
|
tokenBuilder.setLength(0);
|
||||||
|
} else if (chars[i] == '"') {
|
||||||
|
/*
|
||||||
|
Work until the next unescaped quote to handle quotes with
|
||||||
|
spaces in them - assumes the input string is well-formatted
|
||||||
|
*/
|
||||||
|
for (i++; chars[i] != '"'; i++) {
|
||||||
|
/*
|
||||||
|
If the found quote is escaped, ignore it in the parsing
|
||||||
|
*/
|
||||||
|
if (chars[i] == '\\') {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
tokenBuilder.append(chars[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
If it's a regular character, just append it to the current argument.
|
||||||
|
*/
|
||||||
|
tokenBuilder.append(chars[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tokens.add(tokenBuilder.toString()); // Adds the last argument to the tokens.
|
||||||
|
return tokens.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options for formatting.
|
* Options for formatting.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,87 +1,93 @@
|
|||||||
package com.willfp.eco.internal.config
|
package com.willfp.eco.internal.config
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
|
import com.willfp.eco.core.config.ConfigType
|
||||||
import com.willfp.eco.core.config.interfaces.Config
|
import com.willfp.eco.core.config.interfaces.Config
|
||||||
import com.willfp.eco.core.config.interfaces.JSONConfig
|
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||||
import com.willfp.eco.core.config.wrapper.ConfigFactory
|
import com.willfp.eco.core.config.wrapper.ConfigFactory
|
||||||
import com.willfp.eco.internal.config.json.EcoJSONConfigSection
|
import com.willfp.eco.internal.config.json.EcoJSONConfigSection
|
||||||
|
import com.willfp.eco.internal.config.json.EcoJSONConfigWrapper
|
||||||
import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig
|
import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig
|
||||||
import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig
|
import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig
|
||||||
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
||||||
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
||||||
import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
|
import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
|
||||||
import org.bukkit.configuration.file.YamlConfiguration
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
|
import java.io.StringReader
|
||||||
|
|
||||||
class EcoConfigFactory : ConfigFactory {
|
class EcoConfigFactory : ConfigFactory {
|
||||||
override fun createUpdatableYamlConfig(
|
override fun createConfig(config: YamlConfiguration): Config {
|
||||||
configName: String,
|
|
||||||
plugin: PluginLike,
|
|
||||||
subDirectoryPath: String,
|
|
||||||
source: Class<*>,
|
|
||||||
removeUnused: Boolean,
|
|
||||||
vararg updateBlacklist: String
|
|
||||||
): Config {
|
|
||||||
return EcoUpdatableYamlConfig(
|
|
||||||
configName,
|
|
||||||
plugin,
|
|
||||||
subDirectoryPath,
|
|
||||||
source,
|
|
||||||
removeUnused,
|
|
||||||
*updateBlacklist
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createUpdatableJSONConfig(
|
|
||||||
configName: String,
|
|
||||||
plugin: PluginLike,
|
|
||||||
subDirectoryPath: String,
|
|
||||||
source: Class<*>,
|
|
||||||
removeUnused: Boolean,
|
|
||||||
vararg updateBlacklist: String
|
|
||||||
): JSONConfig {
|
|
||||||
return EcoUpdatableJSONConfig(
|
|
||||||
configName,
|
|
||||||
plugin,
|
|
||||||
subDirectoryPath,
|
|
||||||
source,
|
|
||||||
removeUnused,
|
|
||||||
*updateBlacklist
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createLoadableJSONConfig(
|
|
||||||
configName: String,
|
|
||||||
plugin: PluginLike,
|
|
||||||
subDirectoryPath: String,
|
|
||||||
source: Class<*>
|
|
||||||
): JSONConfig {
|
|
||||||
return EcoLoadableJSONConfig(
|
|
||||||
configName,
|
|
||||||
plugin,
|
|
||||||
subDirectoryPath,
|
|
||||||
source
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createLoadableYamlConfig(
|
|
||||||
configName: String,
|
|
||||||
plugin: PluginLike,
|
|
||||||
subDirectoryPath: String,
|
|
||||||
source: Class<*>
|
|
||||||
): Config {
|
|
||||||
return EcoLoadableYamlConfig(
|
|
||||||
configName,
|
|
||||||
plugin,
|
|
||||||
subDirectoryPath,
|
|
||||||
source
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createYamlConfig(config: YamlConfiguration): Config {
|
|
||||||
return EcoYamlConfigSection(config)
|
return EcoYamlConfigSection(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createJSONConfig(values: Map<String, Any>): JSONConfig {
|
override fun createConfig(values: MutableMap<String, Any>): Config {
|
||||||
return EcoJSONConfigSection(values)
|
return EcoJSONConfigSection(values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun createConfig(contents: String, type: ConfigType): Config {
|
||||||
|
return if (type == ConfigType.JSON) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
EcoJSONConfigSection(
|
||||||
|
EcoJSONConfigWrapper.gson.fromJson(
|
||||||
|
StringReader(contents), Map::class.java
|
||||||
|
) as MutableMap<String, Any>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
EcoYamlConfigSection(YamlConfiguration.loadConfiguration(StringReader(contents)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createLoadableConfig(
|
||||||
|
configName: String,
|
||||||
|
plugin: PluginLike,
|
||||||
|
subDirectoryPath: String,
|
||||||
|
source: Class<*>,
|
||||||
|
type: ConfigType
|
||||||
|
): LoadableConfig {
|
||||||
|
return if (type == ConfigType.JSON) {
|
||||||
|
EcoLoadableJSONConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
EcoLoadableYamlConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createUpdatableConfig(
|
||||||
|
configName: String,
|
||||||
|
plugin: PluginLike,
|
||||||
|
subDirectoryPath: String,
|
||||||
|
source: Class<*>,
|
||||||
|
removeUnused: Boolean,
|
||||||
|
type: ConfigType,
|
||||||
|
vararg updateBlacklist: String
|
||||||
|
): LoadableConfig {
|
||||||
|
return if (type == ConfigType.JSON) {
|
||||||
|
EcoUpdatableJSONConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source,
|
||||||
|
removeUnused,
|
||||||
|
*updateBlacklist
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
EcoUpdatableYamlConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source,
|
||||||
|
removeUnused,
|
||||||
|
*updateBlacklist
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.internal.config.json
|
package com.willfp.eco.internal.config.json
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
class EcoJSONConfigSection(values: Map<String, Any?>) : EcoJSONConfigWrapper() {
|
class EcoJSONConfigSection(values: Map<String, Any?>) : EcoJSONConfigWrapper() {
|
||||||
init {
|
init {
|
||||||
init(values)
|
init(values)
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
|
@file:Suppress("DEPRECATION")
|
||||||
|
|
||||||
package com.willfp.eco.internal.config.json
|
package com.willfp.eco.internal.config.json
|
||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.willfp.eco.core.config.ConfigType
|
||||||
import com.willfp.eco.core.config.interfaces.JSONConfig
|
import com.willfp.eco.core.config.interfaces.JSONConfig
|
||||||
import com.willfp.eco.util.StringUtils
|
import com.willfp.eco.util.StringUtils
|
||||||
import java.util.Objects
|
import java.util.Objects
|
||||||
@@ -9,10 +12,12 @@ import java.util.concurrent.ConcurrentHashMap
|
|||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
open class EcoJSONConfigWrapper : JSONConfig {
|
open class EcoJSONConfigWrapper : JSONConfig {
|
||||||
val handle: Gson = GsonBuilder()
|
companion object {
|
||||||
.setPrettyPrinting()
|
val gson: Gson = GsonBuilder()
|
||||||
.disableHtmlEscaping()
|
.setPrettyPrinting()
|
||||||
.create()
|
.disableHtmlEscaping()
|
||||||
|
.create()
|
||||||
|
}
|
||||||
|
|
||||||
val values = ConcurrentHashMap<String, Any?>()
|
val values = ConcurrentHashMap<String, Any?>()
|
||||||
|
|
||||||
@@ -28,14 +33,14 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toPlaintext(): String {
|
override fun toPlaintext(): String {
|
||||||
return this.handle.toJson(this.values)
|
return gson.toJson(this.values)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun has(path: String): Boolean {
|
override fun has(path: String): Boolean {
|
||||||
return getOfKnownType(path, Any::class.java) != null
|
return getOfKnownType(path, Any::class.java) != null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <T: Any?> getOfKnownType(
|
private fun <T : Any?> getOfKnownType(
|
||||||
path: String,
|
path: String,
|
||||||
clazz: Class<T>
|
clazz: Class<T>
|
||||||
): T? {
|
): T? {
|
||||||
@@ -125,24 +130,18 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getSubsection(path: String): JSONConfig {
|
override fun getSubsection(path: String): JSONConfig {
|
||||||
val subsection = getSubsectionOrNull(path)
|
return getSubsectionOrNull(path) ?: EcoJSONConfigSection(mutableMapOf())
|
||||||
return subsection ?: EcoJSONConfigSection(emptyMap())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSubsectionOrNull(path: String): JSONConfig? {
|
override fun getSubsectionOrNull(path: String): JSONConfig? {
|
||||||
return if (values.containsKey(path)) {
|
return if (values.containsKey(path)) {
|
||||||
val subsection = values[path] as Map<String, Any>?
|
val subsection = values[path] as Map<String, Any>
|
||||||
EcoJSONConfigSection(subsection!!)
|
EcoJSONConfigSection(subsection)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSubsections(path: String): List<JSONConfig> {
|
|
||||||
val subsections = getSubsectionsOrNull(path)
|
|
||||||
return subsections ?: mutableListOf()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getSubsectionsOrNull(path: String): List<JSONConfig>? {
|
override fun getSubsectionsOrNull(path: String): List<JSONConfig>? {
|
||||||
val maps = getOfKnownType(path, Any::class.java) as List<Map<String, Any>>?
|
val maps = getOfKnownType(path, Any::class.java) as List<Map<String, Any>>?
|
||||||
?: return null
|
?: return null
|
||||||
@@ -153,68 +152,20 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
|||||||
return configs.toMutableList()
|
return configs.toMutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getInt(path: String): Int {
|
|
||||||
return (getOfKnownType(path, Double::class.java) ?: 0.0).toInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getIntOrNull(path: String): Int? {
|
override fun getIntOrNull(path: String): Int? {
|
||||||
return if (has(path)) {
|
return getOfKnownType(path, Double::class.java)?.toInt()
|
||||||
getInt(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getInt(
|
|
||||||
path: String,
|
|
||||||
def: Int
|
|
||||||
): Int {
|
|
||||||
return Objects.requireNonNullElse(getOfKnownType(path, Int::class.java), def)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getInts(path: String): MutableList<Int> {
|
|
||||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Int>()) as List<Int>).toMutableList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIntsOrNull(path: String): MutableList<Int>? {
|
override fun getIntsOrNull(path: String): MutableList<Int>? {
|
||||||
return if (has(path)) {
|
return (getOfKnownType(path, Any::class.java) as Collection<Int>?)?.toMutableList()
|
||||||
getInts(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getBool(path: String): Boolean {
|
|
||||||
return Objects.requireNonNullElse(getOfKnownType(path, Boolean::class.java), false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getBoolOrNull(path: String): Boolean? {
|
override fun getBoolOrNull(path: String): Boolean? {
|
||||||
return if (has(path)) {
|
return getOfKnownType(path, Boolean::class.java)
|
||||||
getBool(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getBools(path: String): MutableList<Boolean> {
|
|
||||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Boolean>()) as List<Boolean>).toMutableList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
|
override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
|
||||||
return if (has(path)) {
|
return (getOfKnownType(path, Any::class.java) as Collection<Boolean>?)?.toMutableList()
|
||||||
getBools(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getString(
|
|
||||||
path: String,
|
|
||||||
format: Boolean,
|
|
||||||
option: StringUtils.FormatOption
|
|
||||||
): String {
|
|
||||||
val string = getOfKnownType(path, String::class.java) ?: ""
|
|
||||||
return if (format) StringUtils.format(string, option) else string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getStringOrNull(
|
override fun getStringOrNull(
|
||||||
@@ -223,56 +174,40 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
|||||||
option: StringUtils.FormatOption
|
option: StringUtils.FormatOption
|
||||||
): String? {
|
): String? {
|
||||||
return if (has(path)) {
|
return if (has(path)) {
|
||||||
getString(path, format, option)
|
val string = getOfKnownType(path, String::class.java) ?: ""
|
||||||
|
return if (format) StringUtils.format(string, option) else string
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getStrings(
|
|
||||||
path: String,
|
|
||||||
format: Boolean,
|
|
||||||
option: StringUtils.FormatOption
|
|
||||||
): MutableList<String> {
|
|
||||||
val strings =
|
|
||||||
(Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<String>()) as List<String>).toMutableList()
|
|
||||||
return if (format) StringUtils.formatList(strings, option) else strings
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getStringsOrNull(
|
override fun getStringsOrNull(
|
||||||
path: String,
|
path: String,
|
||||||
format: Boolean,
|
format: Boolean,
|
||||||
option: StringUtils.FormatOption
|
option: StringUtils.FormatOption
|
||||||
): MutableList<String>? {
|
): MutableList<String>? {
|
||||||
return if (has(path)) {
|
return if (has(path)) {
|
||||||
getStrings(path, format, option)
|
val strings =
|
||||||
|
(Objects.requireNonNullElse(
|
||||||
|
getOfKnownType(path, Any::class.java),
|
||||||
|
emptyList<String>()
|
||||||
|
) as List<String>).toMutableList()
|
||||||
|
return if (format) StringUtils.formatList(strings, option) else strings
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDouble(path: String): Double {
|
|
||||||
return Objects.requireNonNullElse(getOfKnownType(path, Double::class.java), 0.0)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDoubleOrNull(path: String): Double? {
|
override fun getDoubleOrNull(path: String): Double? {
|
||||||
return if (has(path)) {
|
return getOfKnownType(path, Double::class.java)
|
||||||
getDouble(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDoubles(path: String): MutableList<Double> {
|
|
||||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Double>()) as List<Double>).toMutableList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDoublesOrNull(path: String): MutableList<Double>? {
|
override fun getDoublesOrNull(path: String): MutableList<Double>? {
|
||||||
return if (has(path)) {
|
return (getOfKnownType(path, Any::class.java) as Collection<Double>?)?.toMutableList()
|
||||||
getDoubles(path)
|
}
|
||||||
} else {
|
|
||||||
null
|
override fun getType(): ConfigType {
|
||||||
}
|
return ConfigType.JSON
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clone(): JSONConfig {
|
override fun clone(): JSONConfig {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.willfp.eco.internal.config.json
|
|||||||
|
|
||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
@@ -69,7 +70,7 @@ open class EcoLoadableJSONConfig(
|
|||||||
|
|
||||||
@Throws(FileNotFoundException::class)
|
@Throws(FileNotFoundException::class)
|
||||||
fun init(file: File) {
|
fun init(file: File) {
|
||||||
super.init(handle.fromJson(FileReader(file), Map::class.java) as MutableMap<String, Any>)
|
super.init(gson.fromJson(FileReader(file), Map::class.java) as MutableMap<String, Any>)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun getName(): String {
|
||||||
@@ -80,6 +81,10 @@ open class EcoLoadableJSONConfig(
|
|||||||
return configFile
|
return configFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getBukkitHandle(): YamlConfiguration? {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
||||||
if (!directory.exists()) {
|
if (!directory.exists()) {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
@file:Suppress("DEPRECATION")
|
||||||
|
|
||||||
package com.willfp.eco.internal.config.yaml
|
package com.willfp.eco.internal.config.yaml
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
@@ -60,10 +62,6 @@ open class EcoLoadableYamlConfig(
|
|||||||
handle.save(getConfigFile())
|
handle.save(getConfigFile())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getBukkitHandle(): YamlConfiguration {
|
|
||||||
return handle
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun getName(): String {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
@@ -72,6 +70,10 @@ open class EcoLoadableYamlConfig(
|
|||||||
return configFile
|
return configFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getBukkitHandle(): YamlConfiguration? {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
||||||
if (!directory.exists()) {
|
if (!directory.exists()) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.internal.config.yaml
|
package com.willfp.eco.internal.config.yaml
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.ConfigType
|
||||||
import com.willfp.eco.core.config.interfaces.Config
|
import com.willfp.eco.core.config.interfaces.Config
|
||||||
import com.willfp.eco.util.StringUtils
|
import com.willfp.eco.util.StringUtils
|
||||||
import org.bukkit.configuration.ConfigurationSection
|
import org.bukkit.configuration.ConfigurationSection
|
||||||
@@ -48,11 +49,6 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
|
|||||||
handle[path] = obj
|
handle[path] = obj
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSubsection(path: String): Config {
|
|
||||||
val subsection = getSubsectionOrNull(path)
|
|
||||||
return subsection ?: EcoYamlConfigSection(YamlConfiguration())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getSubsectionOrNull(path: String): Config? {
|
override fun getSubsectionOrNull(path: String): Config? {
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
cache[path] as Config?
|
cache[path] as Config?
|
||||||
@@ -67,109 +63,55 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getInt(path: String): Int {
|
|
||||||
return if (cache.containsKey(path)) {
|
|
||||||
(cache[path] as Number).toInt()
|
|
||||||
} else {
|
|
||||||
cache[path] = handle.getDouble(path, 0.0).toInt()
|
|
||||||
getInt(path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getIntOrNull(path: String): Int? {
|
override fun getIntOrNull(path: String): Int? {
|
||||||
return if (has(path)) {
|
|
||||||
getInt(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getInt(
|
|
||||||
path: String,
|
|
||||||
def: Int
|
|
||||||
): Int {
|
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
(cache[path] as Number).toInt()
|
(cache[path] as Number).toInt()
|
||||||
} else {
|
} else {
|
||||||
cache[path] = handle.getDouble(path, def.toDouble()).toInt()
|
if (has(path)) {
|
||||||
getInt(path)
|
cache[path] = handle.getDouble(path).toInt()
|
||||||
}
|
} else {
|
||||||
}
|
return null
|
||||||
|
}
|
||||||
override fun getInts(path: String): MutableList<Int> {
|
getIntOrNull(path)
|
||||||
return if (cache.containsKey(path)) {
|
|
||||||
(cache[path] as MutableList<Int>).toMutableList()
|
|
||||||
} else {
|
|
||||||
cache[path] = if (has(path)) ArrayList(handle.getIntegerList(path)) else mutableListOf<Int>()
|
|
||||||
getInts(path)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIntsOrNull(path: String): MutableList<Int>? {
|
override fun getIntsOrNull(path: String): MutableList<Int>? {
|
||||||
return if (has(path)) {
|
|
||||||
getInts(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getBool(path: String): Boolean {
|
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
cache[path] as Boolean
|
(cache[path] as Collection<Int>).toMutableList()
|
||||||
} else {
|
} else {
|
||||||
cache[path] = handle.getBoolean(path)
|
if (has(path)) {
|
||||||
getBool(path)
|
cache[path] = handle.getIntegerList(path).toMutableList()
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
getIntsOrNull(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getBoolOrNull(path: String): Boolean? {
|
override fun getBoolOrNull(path: String): Boolean? {
|
||||||
return if (has(path)) {
|
|
||||||
getBool(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getBools(path: String): MutableList<Boolean> {
|
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
(cache[path] as MutableList<Boolean>).toMutableList()
|
cache[path] as Boolean
|
||||||
} else {
|
} else {
|
||||||
cache[path] =
|
if (has(path)) {
|
||||||
if (has(path)) ArrayList(handle.getBooleanList(path)) else mutableListOf<Boolean>()
|
cache[path] = handle.getBoolean(path)
|
||||||
getBools(path)
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
getBoolOrNull(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
|
override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
|
||||||
return if (has(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
getBools(path)
|
(cache[path] as Collection<Boolean>).toMutableList()
|
||||||
} else {
|
} else {
|
||||||
null
|
if (has(path)) {
|
||||||
}
|
cache[path] = handle.getBooleanList(path).toMutableList()
|
||||||
}
|
|
||||||
|
|
||||||
override fun getString(
|
|
||||||
path: String,
|
|
||||||
format: Boolean,
|
|
||||||
option: StringUtils.FormatOption
|
|
||||||
): String {
|
|
||||||
if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
|
|
||||||
return if (cache.containsKey("$path\$FMT")) {
|
|
||||||
cache["$path\$FMT"] as String
|
|
||||||
} else {
|
} else {
|
||||||
val string: String = handle.getString(path, "")!!
|
return null
|
||||||
cache["$path\$FMT"] = StringUtils.format(string, option)
|
|
||||||
getString(path, format, option)
|
|
||||||
}
|
}
|
||||||
} else {
|
getBoolsOrNull(path)
|
||||||
val string = if (cache.containsKey(path)) {
|
|
||||||
cache[path] as String
|
|
||||||
} else {
|
|
||||||
cache[path] = handle.getString(path, "")!!
|
|
||||||
getString(path, format, option)
|
|
||||||
}
|
|
||||||
|
|
||||||
return if (format) StringUtils.format(string) else string
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,113 +121,114 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
|
|||||||
option: StringUtils.FormatOption
|
option: StringUtils.FormatOption
|
||||||
): String? {
|
): String? {
|
||||||
return if (has(path)) {
|
return if (has(path)) {
|
||||||
getString(path, format, option)
|
if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
|
||||||
|
return if (cache.containsKey("$path\$FMT")) {
|
||||||
|
cache["$path\$FMT"] as String
|
||||||
|
} else {
|
||||||
|
val string: String = handle.getString(path, "")!!
|
||||||
|
cache["$path\$FMT"] = StringUtils.format(string, option)
|
||||||
|
getString(path, format, option)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val string = if (cache.containsKey(path)) {
|
||||||
|
cache[path] as String
|
||||||
|
} else {
|
||||||
|
cache[path] = handle.getString(path, "")!!
|
||||||
|
getString(path, format, option)
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (format) StringUtils.format(string) else string
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getStrings(
|
|
||||||
path: String,
|
|
||||||
format: Boolean,
|
|
||||||
option: StringUtils.FormatOption
|
|
||||||
): MutableList<String> {
|
|
||||||
if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
|
|
||||||
return if (cache.containsKey("$path\$FMT")) {
|
|
||||||
(cache["$path\$FMT"] as MutableList<String>).toMutableList()
|
|
||||||
} else {
|
|
||||||
val list = if (has(path)) handle.getStringList(path) else mutableListOf<String>()
|
|
||||||
cache["$path\$FMT"] = StringUtils.formatList(list, option)
|
|
||||||
getStrings(path, true, option)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val strings = if (cache.containsKey(path)) {
|
|
||||||
(cache[path] as MutableList<String>).toMutableList()
|
|
||||||
} else {
|
|
||||||
cache[path] =
|
|
||||||
if (has(path)) ArrayList(handle.getStringList(path)) else mutableListOf<String>()
|
|
||||||
getStrings(path, false, option)
|
|
||||||
}
|
|
||||||
|
|
||||||
return if (format) {
|
|
||||||
StringUtils.formatList(strings, StringUtils.FormatOption.WITH_PLACEHOLDERS)
|
|
||||||
} else {
|
|
||||||
strings
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getStringsOrNull(
|
override fun getStringsOrNull(
|
||||||
path: String,
|
path: String,
|
||||||
format: Boolean,
|
format: Boolean,
|
||||||
option: StringUtils.FormatOption
|
option: StringUtils.FormatOption
|
||||||
): MutableList<String>? {
|
): MutableList<String>? {
|
||||||
return if (has(path)) {
|
return if (has(path)) {
|
||||||
getStrings(path, format, option)
|
if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
|
||||||
|
return if (cache.containsKey("$path\$FMT")) {
|
||||||
|
(cache["$path\$FMT"] as MutableList<String>).toMutableList()
|
||||||
|
} else {
|
||||||
|
val list = if (has(path)) handle.getStringList(path) else mutableListOf<String>()
|
||||||
|
cache["$path\$FMT"] = StringUtils.formatList(list, option)
|
||||||
|
getStrings(path, true, option)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val strings = if (cache.containsKey(path)) {
|
||||||
|
(cache[path] as MutableList<String>).toMutableList()
|
||||||
|
} else {
|
||||||
|
cache[path] =
|
||||||
|
if (has(path)) ArrayList(handle.getStringList(path)) else mutableListOf<String>()
|
||||||
|
getStrings(path, false, option)
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (format) {
|
||||||
|
StringUtils.formatList(strings, StringUtils.FormatOption.WITH_PLACEHOLDERS)
|
||||||
|
} else {
|
||||||
|
strings
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDouble(path: String): Double {
|
|
||||||
return if (cache.containsKey(path)) {
|
|
||||||
cache[path] as Double
|
|
||||||
} else {
|
|
||||||
cache[path] = handle.getDouble(path)
|
|
||||||
getDouble(path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDoubleOrNull(path: String): Double? {
|
override fun getDoubleOrNull(path: String): Double? {
|
||||||
return if (has(path)) {
|
|
||||||
getDouble(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDoubles(path: String): MutableList<Double> {
|
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
(cache[path] as MutableList<Double>).toMutableList()
|
(cache[path] as Number).toDouble()
|
||||||
} else {
|
} else {
|
||||||
cache[path] = if (has(path)) ArrayList(handle.getDoubleList(path)) else emptyList<Double>()
|
if (has(path)) {
|
||||||
getDoubles(path)
|
cache[path] = handle.getDouble(path)
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
getDoubleOrNull(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDoublesOrNull(path: String): MutableList<Double>? {
|
override fun getDoublesOrNull(path: String): MutableList<Double>? {
|
||||||
return if (has(path)) {
|
|
||||||
getDoubles(path)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getSubsections(path: String): MutableList<out Config> {
|
|
||||||
return if (cache.containsKey(path)) {
|
return if (cache.containsKey(path)) {
|
||||||
(cache[path] as Collection<Config>).toMutableList()
|
(cache[path] as Collection<Double>).toMutableList()
|
||||||
} else {
|
} else {
|
||||||
val mapList = ArrayList(handle.getMapList(path)) as List<Map<String, Any?>>
|
if (has(path)) {
|
||||||
val configList = mutableListOf<Config>()
|
cache[path] = handle.getDoubleList(path).toMutableList()
|
||||||
for (map in mapList) {
|
} else {
|
||||||
val temp = YamlConfiguration.loadConfiguration(StringReader(""))
|
return null
|
||||||
temp.createSection("a", map)
|
|
||||||
configList.add(EcoYamlConfigSection(temp.getConfigurationSection("a")!!))
|
|
||||||
}
|
}
|
||||||
|
getDoublesOrNull(path)
|
||||||
cache[path] = if (has(path)) configList else emptyList()
|
|
||||||
getSubsections(path)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSubsectionsOrNull(path: String): MutableList<out Config>? {
|
override fun getSubsectionsOrNull(path: String): MutableList<out Config>? {
|
||||||
return if (has(path)) {
|
return if (has(path)) {
|
||||||
getSubsections(path)
|
return if (cache.containsKey(path)) {
|
||||||
|
(cache[path] as Collection<Config>).toMutableList()
|
||||||
|
} else {
|
||||||
|
val mapList = ArrayList(handle.getMapList(path)) as List<Map<String, Any?>>
|
||||||
|
val configList = mutableListOf<Config>()
|
||||||
|
for (map in mapList) {
|
||||||
|
val temp = YamlConfiguration.loadConfiguration(StringReader(""))
|
||||||
|
temp.createSection("a", map)
|
||||||
|
configList.add(EcoYamlConfigSection(temp.getConfigurationSection("a")!!))
|
||||||
|
}
|
||||||
|
|
||||||
|
cache[path] = if (has(path)) configList else emptyList()
|
||||||
|
getSubsections(path)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getType(): ConfigType {
|
||||||
|
return ConfigType.JSON
|
||||||
|
}
|
||||||
|
|
||||||
override fun clone(): Config {
|
override fun clone(): Config {
|
||||||
return EcoYamlConfigSection(
|
return EcoYamlConfigSection(
|
||||||
YamlConfiguration.loadConfiguration(
|
YamlConfiguration.loadConfiguration(
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.Animals
|
||||||
|
|
||||||
|
class EntityArgParserAdult : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var baby = false
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
if (arg.equals("adult", true)) {
|
||||||
|
baby = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!baby) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is Animals) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
it.isAdult
|
||||||
|
},
|
||||||
|
{
|
||||||
|
(it as? Animals)?.setAdult()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserAttackDamage : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("attack-damage", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserAttackSpeed : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("attack-speed", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_ATTACK_SPEED) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_ATTACK_SPEED)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.Animals
|
||||||
|
|
||||||
|
class EntityArgParserBaby : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var baby = false
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
if (arg.equals("baby", true)) {
|
||||||
|
baby = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!baby) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is Animals) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
!it.isAdult
|
||||||
|
},
|
||||||
|
{
|
||||||
|
(it as? Animals)?.setBaby()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.Creeper
|
||||||
|
|
||||||
|
class EntityArgParserCharged : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var noAI = false
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
if (arg.equals("charged", true)) {
|
||||||
|
noAI = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!noAI) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is Creeper) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
it.isPowered
|
||||||
|
},
|
||||||
|
{
|
||||||
|
(it as? Creeper)?.isPowered = true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.Creeper
|
||||||
|
|
||||||
|
class EntityArgParserExplosionRadius : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var size: Int? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("explosion-radius", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
size = argSplit[1].toIntOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
size ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
when (it) {
|
||||||
|
is Creeper -> it.explosionRadius == size
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when (it) {
|
||||||
|
is Creeper -> it.explosionRadius = size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserFlySpeed : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("fly-speed", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_FLYING_SPEED) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_FLYING_SPEED)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserFollowRange : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("follow-range", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_FOLLOW_RANGE) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_FOLLOW_RANGE)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserHealth : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var health: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("health", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
health = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
health ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
it.health >= health
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_MAX_HEALTH)?.baseValue = health
|
||||||
|
it.health = health
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserJumpStrength : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("jump-strength", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.HORSE_JUMP_STRENGTH) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.HORSE_JUMP_STRENGTH)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserKnockback : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("knockback", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_ATTACK_KNOCKBACK) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_ATTACK_KNOCKBACK)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserKnockbackResistance : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("knockback-resistance", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import com.willfp.eco.util.StringUtils
|
||||||
|
|
||||||
|
class EntityArgParserName : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var name: String? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("name", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
name = argSplit[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
name ?: return null
|
||||||
|
|
||||||
|
val formatted = StringUtils.format(name)
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{ it.customName == formatted },
|
||||||
|
{
|
||||||
|
it.isCustomNameVisible = true
|
||||||
|
it.customName = formatted
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserNoAI : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var noAI = false
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
if (arg.equals("no-ai", true)) {
|
||||||
|
noAI = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!noAI) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
!it.hasAI()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
(it as? LivingEntity)?.setAI(false)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.entity.Phantom
|
||||||
|
import org.bukkit.entity.Slime
|
||||||
|
|
||||||
|
class EntityArgParserSize : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var size: Int? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("size", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
size = argSplit[1].toIntOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
size ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
when (it) {
|
||||||
|
is Slime -> it.size == size
|
||||||
|
is Phantom -> it.size == size
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when (it) {
|
||||||
|
is Slime -> it.size = size
|
||||||
|
is Phantom -> it.size = size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserSpawnReinforcements : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("spawn-reinforcements", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.ZOMBIE_SPAWN_REINFORCEMENTS) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.ZOMBIE_SPAWN_REINFORCEMENTS)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.internal.entities
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||||
|
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||||
|
import org.bukkit.attribute.Attribute
|
||||||
|
import org.bukkit.entity.LivingEntity
|
||||||
|
|
||||||
|
class EntityArgParserSpeed : EntityArgParser {
|
||||||
|
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||||
|
var attributeValue: Double? = null
|
||||||
|
|
||||||
|
for (arg in args) {
|
||||||
|
val argSplit = arg.split(":")
|
||||||
|
if (!argSplit[0].equals("speed", ignoreCase = true)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (argSplit.size < 2) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attributeValue = argSplit[1].toDoubleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeValue ?: return null
|
||||||
|
|
||||||
|
return EntityArgParseResult(
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult false
|
||||||
|
}
|
||||||
|
|
||||||
|
val inst = it.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED) ?: return@EntityArgParseResult false
|
||||||
|
inst.value >= attributeValue
|
||||||
|
},
|
||||||
|
{
|
||||||
|
if (it !is LivingEntity) {
|
||||||
|
return@EntityArgParseResult
|
||||||
|
}
|
||||||
|
|
||||||
|
it.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)?.baseValue = attributeValue
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.extensions
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableSet
|
import com.google.common.collect.ImmutableSet
|
||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.eco.core.config.yaml.YamlTransientConfig
|
import com.willfp.eco.core.config.TransientConfig
|
||||||
import com.willfp.eco.core.extensions.Extension
|
import com.willfp.eco.core.extensions.Extension
|
||||||
import com.willfp.eco.core.extensions.ExtensionLoader
|
import com.willfp.eco.core.extensions.ExtensionLoader
|
||||||
import com.willfp.eco.core.extensions.ExtensionMetadata
|
import com.willfp.eco.core.extensions.ExtensionMetadata
|
||||||
@@ -54,7 +54,7 @@ class EcoExtensionLoader(
|
|||||||
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
||||||
?: throw MalformedExtensionException("No extension.yml found in " + extensionJar.name)
|
?: throw MalformedExtensionException("No extension.yml found in " + extensionJar.name)
|
||||||
|
|
||||||
val extensionYml = YamlTransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn)))
|
val extensionYml = TransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn)))
|
||||||
|
|
||||||
val mainClass = extensionYml.getStringOrNull("main")
|
val mainClass = extensionYml.getStringOrNull("main")
|
||||||
var name = extensionYml.getStringOrNull("name")
|
var name = extensionYml.getStringOrNull("name")
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user