Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
0c0370e256 | ||
|
|
227b748f85 | ||
|
|
3d4c33860a | ||
|
|
651426ed76 | ||
|
|
1a49165656 | ||
|
|
a48c3c2fed |
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
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("java")
|
||||
}
|
||||
@@ -68,7 +68,7 @@ allprojects {
|
||||
|
||||
// Test
|
||||
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
|
||||
compileOnly("net.kyori:adventure-api:4.9.3")
|
||||
|
||||
@@ -5,10 +5,13 @@ import org.jetbrains.annotations.ApiStatus;
|
||||
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
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public final class Eco {
|
||||
/**
|
||||
* Instance of eco handler.
|
||||
@@ -18,6 +21,7 @@ public final class Eco {
|
||||
|
||||
/**
|
||||
* Set the handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@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>
|
||||
* The handler is, in essence, a way to interface between the eco-api
|
||||
* frontend module, and the eco-backend implementations.
|
||||
* <strong>Do not use the handler in your plugins!</strong> It can and will contain
|
||||
* breaking changes between minor versions and even patches, and you will create
|
||||
* compatibility issues by using the handler. All parts of the handler have been abstracted
|
||||
* into logically named API components that you can use.
|
||||
* <p>
|
||||
* There shouldn't really be any reason to ever use the handler
|
||||
* in your own plugins, and you are likely to break things. All parts of
|
||||
* the handler are abstracted into logically named parts of the API.
|
||||
* <p>
|
||||
* 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.
|
||||
* Prior to version 6.12.0, the handler was considered as an API component, but it has
|
||||
* since been moved into an internal component, and in 6.17.0, the first breaking change
|
||||
* was introduced to {@link com.willfp.eco.core.config.wrapper.ConfigFactory}. This means
|
||||
* that any usages of the handler can now cause problems in your plugins.
|
||||
*
|
||||
* @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.integrations.IntegrationLoader;
|
||||
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.scheduling.Scheduler;
|
||||
import com.willfp.eco.core.web.UpdateChecker;
|
||||
@@ -32,6 +31,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -636,7 +636,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param <T> The proxy type.
|
||||
* @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!");
|
||||
|
||||
return proxyFactory.getProxy(proxyClass);
|
||||
@@ -655,7 +655,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public final FileConfiguration getConfig() {
|
||||
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||
|
||||
return this.getConfigYml().getBukkitHandle();
|
||||
return Objects.requireNonNull(this.getConfigYml().getBukkitHandle());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -230,5 +230,6 @@ public interface Handler {
|
||||
*
|
||||
* @return The handler.
|
||||
*/
|
||||
@NotNull
|
||||
PlayerProfileHandler getPlayerProfileHandler();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,13 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Quick DI class to manage passing eco plugins.
|
||||
* <p>
|
||||
* Basically just a quick bit of laziness if you can't be bothered to add a private field
|
||||
* and a protected getter, don't use this in kotlin as you can just specify
|
||||
* {@code
|
||||
* private val plugin: EcoPlugin
|
||||
* }
|
||||
* in the constructor.
|
||||
*
|
||||
* @param <T> The eco plugin type.
|
||||
*/
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core;
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Represents any class that acts like a plugin, for example {@link EcoPlugin}
|
||||
@@ -26,4 +27,11 @@ public interface PluginLike {
|
||||
* @return The config handler.
|
||||
*/
|
||||
ConfigHandler getConfigHandler();
|
||||
|
||||
/**
|
||||
* Get the logger.
|
||||
*
|
||||
* @return The logger.
|
||||
*/
|
||||
Logger getLogger();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package com.willfp.eco.core.command;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Interface for all command implementations.
|
||||
*/
|
||||
@@ -35,31 +39,70 @@ public interface CommandBase {
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* @return The handler.
|
||||
* @see CommandHandler
|
||||
* @deprecated Use {@link CommandBase#onExecute(CommandSender, List)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
CommandHandler getHandler();
|
||||
|
||||
/**
|
||||
* Set the handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @see CommandHandler
|
||||
* @deprecated Handlers have been deprecated.
|
||||
*/
|
||||
@Deprecated
|
||||
void setHandler(@NotNull CommandHandler handler);
|
||||
|
||||
/**
|
||||
* Get the tab completer.
|
||||
*
|
||||
* @return The tab completer.
|
||||
* @see TabCompleteHandler
|
||||
* @deprecated Use {@link CommandBase#tabComplete(CommandSender, List)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
TabCompleteHandler getTabCompleter();
|
||||
|
||||
/**
|
||||
* Set the tab completer.
|
||||
*
|
||||
* @param handler The handler.
|
||||
* @see TabCompleteHandler
|
||||
* @deprecated Handlers have been deprecated.
|
||||
*/
|
||||
@Deprecated
|
||||
void setTabCompleter(@NotNull TabCompleteHandler handler);
|
||||
}
|
||||
|
||||
@@ -10,9 +10,13 @@ import java.util.List;
|
||||
* A command handler handles the actual code for a command.
|
||||
* <p>
|
||||
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
|
||||
*
|
||||
* @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
|
||||
@Deprecated(since = "6.17.0")
|
||||
public interface CommandHandler {
|
||||
/**
|
||||
* 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.
|
||||
* <p>
|
||||
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
|
||||
*
|
||||
* @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
|
||||
@Deprecated(since = "6.17.0")
|
||||
public interface TabCompleteHandler {
|
||||
/**
|
||||
* Handle Tab Completion.
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.StringUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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
|
||||
* layer, hence why it's a package-private class.
|
||||
*/
|
||||
@SuppressWarnings({"DeprecatedIsStillUsed"})
|
||||
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
private CommandHandler handler = (sender, args) -> {
|
||||
// Do nothing by default
|
||||
};
|
||||
@Deprecated
|
||||
@Nullable
|
||||
private CommandHandler handler = null;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
@@ -248,21 +242,27 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
||||
return this.subcommands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the command handler.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
public void setHandler(@NotNull final CommandHandler handler) {
|
||||
@Deprecated
|
||||
@Override
|
||||
public @Nullable CommandHandler getHandler() {
|
||||
return this.handler;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public @Nullable TabCompleteHandler getTabCompleter() {
|
||||
return this.tabCompleter;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHandler(@Nullable final CommandHandler handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the tab completer.
|
||||
*
|
||||
* @param tabCompleter The tab completer.
|
||||
*/
|
||||
public void setTabCompleter(@NotNull final TabCompleteHandler tabCompleter) {
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setTabCompleter(@Nullable final TabCompleteHandler tabCompleter) {
|
||||
this.tabCompleter = tabCompleter;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,9 @@ import org.jetbrains.annotations.Nullable;
|
||||
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>
|
||||
* The command will not be registered until register() is called.
|
||||
* <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;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* Default plugin config.yml.
|
||||
*/
|
||||
public class ConfigYml extends YamlBaseConfig {
|
||||
public class ConfigYml extends BaseConfig {
|
||||
/**
|
||||
* Config.yml.
|
||||
*
|
||||
* @param plugin The 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,
|
||||
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,
|
||||
@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,
|
||||
@NotNull final String name,
|
||||
final boolean removeUnused) {
|
||||
super(name, removeUnused, plugin);
|
||||
super(name, plugin, removeUnused, ConfigType.YAML);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
package com.willfp.eco.core.config.base;
|
||||
|
||||
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 org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Default plugin lang.yml.
|
||||
*/
|
||||
public class LangYml extends YamlBaseConfig {
|
||||
public class LangYml extends BaseConfig {
|
||||
/**
|
||||
* Lang.yml.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
public LangYml(@NotNull final EcoPlugin plugin) {
|
||||
super("lang", false, plugin);
|
||||
super("lang", plugin, false, ConfigType.YAML);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -7,7 +8,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* All canfigs implement this interface.
|
||||
* All configs implement this interface.
|
||||
* <p>
|
||||
* Contains all methods that must exist in yaml and json configurations.
|
||||
*/
|
||||
@@ -542,6 +543,13 @@ public interface Config extends Cloneable {
|
||||
@Nullable
|
||||
List<? extends Config> getSubsectionsOrNull(@NotNull String path);
|
||||
|
||||
/**
|
||||
* Get config type.
|
||||
*
|
||||
* @return The type.
|
||||
*/
|
||||
@NotNull
|
||||
ConfigType getType();
|
||||
|
||||
/**
|
||||
* Clone the config.
|
||||
|
||||
@@ -6,10 +6,14 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* JSON configs have extra methods compared to yaml configs.
|
||||
* <p>
|
||||
* If you need to use them, then use JSONConfig instead.
|
||||
* JSON config.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
public interface JSONConfig extends Config {
|
||||
/**
|
||||
* Get a list of subsections from config.
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
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.IOException;
|
||||
|
||||
/**
|
||||
* Interface for configs that physically exist as files in plugins.
|
||||
*/
|
||||
public interface LoadableConfig {
|
||||
public interface LoadableConfig extends Config {
|
||||
/**
|
||||
* Create the file.
|
||||
*/
|
||||
@@ -39,4 +43,18 @@ public interface LoadableConfig {
|
||||
* @return The name.
|
||||
*/
|
||||
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}.
|
||||
*
|
||||
* @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 {
|
||||
/**
|
||||
* 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.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -10,7 +12,12 @@ import org.jetbrains.annotations.NotNull;
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
@@ -23,13 +30,16 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused, updateBlacklist
|
||||
)
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused,
|
||||
ConfigType.JSON,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -42,13 +52,15 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused
|
||||
)
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
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.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -14,7 +16,12 @@ import org.jetbrains.annotations.NotNull;
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
@@ -31,16 +38,19 @@ public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
updateBlacklist
|
||||
)
|
||||
(JSONConfig)
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
ConfigType.JSON,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
|
||||
@@ -3,12 +3,19 @@ package com.willfp.eco.core.config.json;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable JSON config that exists within a plugin jar.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||
@@ -20,7 +27,7 @@ public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||
*/
|
||||
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||
@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;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Raw JSON config with a map of values at its core.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public class JSONTransientConfig extends JSONConfigWrapper {
|
||||
/**
|
||||
* Config implementation for passing maps.
|
||||
@@ -18,6 +25,13 @@ public class JSONTransientConfig extends JSONConfigWrapper {
|
||||
* @param values The map of 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.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
|
||||
@@ -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.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable JSON config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
@@ -48,4 +55,9 @@ public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implem
|
||||
public String getName() {
|
||||
return ((LoadableConfig) this.getHandle()).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable YamlConfiguration getBukkitHandle() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,10 +23,14 @@ import java.lang.annotation.Target;
|
||||
* <p>
|
||||
* The second:
|
||||
* <pre>{@code
|
||||
* public static void update(EcoPlugin plugin) {}
|
||||
* public static void update(EcoPlugin plugin) {
|
||||
* // Update code
|
||||
* }
|
||||
* }</pre>
|
||||
* <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
|
||||
* on reload.
|
||||
* <p>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.willfp.eco.core.config.wrapper;
|
||||
|
||||
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.JSONConfig;
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -11,6 +13,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Internal component to create backend config implementations.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public interface ConfigFactory {
|
||||
/**
|
||||
* Updatable config.
|
||||
@@ -20,75 +23,57 @@ public interface ConfigFactory {
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
* @param type The config type.
|
||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createUpdatableYamlConfig(@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,
|
||||
LoadableConfig createUpdatableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull ConfigType type,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* JSON loadable config.
|
||||
* Loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @param type The config type.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
JSONConfig createLoadableJSONConfig(@NotNull String configName,
|
||||
LoadableConfig createLoadableConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source);
|
||||
@NotNull Class<?> source,
|
||||
@NotNull ConfigType type);
|
||||
|
||||
/**
|
||||
* Yaml loadable config.
|
||||
*
|
||||
* @param configName The name of the config
|
||||
* @param plugin The plugin.
|
||||
* @param subDirectoryPath The subdirectory path.
|
||||
* @param source The class that owns the resource.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createLoadableYamlConfig(@NotNull String configName,
|
||||
@NotNull PluginLike plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source);
|
||||
|
||||
/**
|
||||
* Yaml config.
|
||||
* Create config.
|
||||
*
|
||||
* @param config The handle.
|
||||
* @return The config implementation.
|
||||
*/
|
||||
Config createYamlConfig(@NotNull YamlConfiguration config);
|
||||
Config createConfig(@NotNull YamlConfiguration config);
|
||||
|
||||
/**
|
||||
* JSON config.
|
||||
* Create config.
|
||||
*
|
||||
* @param values The values.
|
||||
* @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;
|
||||
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -15,6 +16,7 @@ import java.util.List;
|
||||
*
|
||||
* @param <T> The type of the handle.
|
||||
*/
|
||||
@SuppressWarnings("MethodDoesntCallSuperMethod")
|
||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
@@ -188,6 +190,11 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
return handle.clone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ConfigType getType() {
|
||||
return handle.getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -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).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
@@ -23,12 +29,14 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||
@NotNull final PluginLike plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused, updateBlacklist
|
||||
removeUnused,
|
||||
ConfigType.YAML,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -42,12 +50,13 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||
final boolean removeUnused,
|
||||
@NotNull final PluginLike plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
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.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -14,7 +15,12 @@ import org.jetbrains.annotations.NotNull;
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
@@ -31,16 +37,18 @@ public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
ConfigType.YAML,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param configName The name of the config
|
||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||
|
||||
@@ -3,12 +3,18 @@ package com.willfp.eco.core.config.yaml;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginLike;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Non-updatable yaml config that exists within a plugin jar.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||
@@ -20,7 +26,7 @@ public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||
*/
|
||||
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||
@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;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.config.ConfigType;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -11,26 +12,31 @@ import java.io.StringReader;
|
||||
* Config implementation for passing YamlConfigurations.
|
||||
* <p>
|
||||
* Does not automatically update.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public class YamlTransientConfig extends YamlConfigWrapper {
|
||||
/**
|
||||
* @param config The YamlConfiguration handle.
|
||||
*/
|
||||
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
||||
super(Eco.getHandler().getConfigFactory().createYamlConfig(config));
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param contents The contents of the config.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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.LoadableConfig;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Wrapper to handle the backend loadable yaml config implementations.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
@@ -48,4 +55,9 @@ public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implem
|
||||
public String 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.
|
||||
*
|
||||
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
|
||||
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
|
||||
* These configs will be removed eventually.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0")
|
||||
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
||||
/**
|
||||
* Create a config wrapper.
|
||||
|
||||
@@ -60,7 +60,7 @@ public final class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
@Nullable final Player player) {
|
||||
return finalize(display(itemStack, player));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Manages listeners for a plugin.
|
||||
@@ -11,14 +12,14 @@ public interface EventManager {
|
||||
*
|
||||
* @param listener The listener to register.
|
||||
*/
|
||||
void registerListener(Listener listener);
|
||||
void registerListener(@NotNull Listener listener);
|
||||
|
||||
/**
|
||||
* Unregister a listener with bukkit.
|
||||
*
|
||||
* @param listener The listener to unregister.
|
||||
*/
|
||||
void unregisterListener(Listener listener);
|
||||
void unregisterListener(@NotNull Listener listener);
|
||||
|
||||
/**
|
||||
* Unregister all listeners associated with the plugin.
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.apache.commons.lang.Validate;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Logger getLogger() {
|
||||
return this.plugin.getLogger();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin for the extension.
|
||||
*
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
package com.willfp.eco.core.integrations;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
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.
|
||||
* <p>
|
||||
@@ -9,7 +15,15 @@ import org.jetbrains.annotations.NotNull;
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -22,7 +36,7 @@ public class IntegrationLoader {
|
||||
* Create a new Integration Loader.
|
||||
*
|
||||
* @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,
|
||||
@NotNull final Runnable onLoad) {
|
||||
@@ -30,6 +44,15 @@ public class IntegrationLoader {
|
||||
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.
|
||||
*/
|
||||
|
||||
@@ -24,7 +24,7 @@ public final class AnticheatManager {
|
||||
* @param anticheat The anticheat to register.
|
||||
*/
|
||||
public static void register(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final AnticheatWrapper anticheat) {
|
||||
@NotNull final AnticheatWrapper anticheat) {
|
||||
if (anticheat instanceof Listener) {
|
||||
plugin.getEventManager().registerListener((Listener) anticheat);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public final class EconomyManager {
|
||||
* @return If the player has the amount.
|
||||
*/
|
||||
public static boolean hasAmount(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.hasAmount(player, amount);
|
||||
}
|
||||
@@ -57,7 +57,7 @@ public final class EconomyManager {
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public static boolean giveMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.giveMoney(player, amount);
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public final class EconomyManager {
|
||||
* @return If the transaction was a success.
|
||||
*/
|
||||
public static boolean removeMoney(@NotNull final OfflinePlayer player,
|
||||
final double amount) {
|
||||
final double amount) {
|
||||
for (EconomyWrapper wrapper : REGISTERED) {
|
||||
return wrapper.removeMoney(player, amount);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public final class HologramManager {
|
||||
* @return The hologram.
|
||||
*/
|
||||
public static Hologram createHologram(@NotNull final Location location,
|
||||
@NotNull final List<String> contents) {
|
||||
@NotNull final List<String> contents) {
|
||||
for (HologramWrapper wrapper : REGISTERED) {
|
||||
return wrapper.createHologram(location, contents);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.args;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
|
||||
*
|
||||
* @deprecated Moved to internals.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||
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
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.args;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
|
||||
*
|
||||
* @deprecated Moved to internals.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||
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
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.args;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
|
||||
*
|
||||
* @deprecated Moved to internals.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||
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
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.args;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
|
||||
*
|
||||
* @deprecated Moved to internals.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
||||
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
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.builder;
|
||||
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Material;
|
||||
@@ -43,6 +44,15 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
||||
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.
|
||||
*
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.items.builder;
|
||||
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@@ -26,4 +27,13 @@ public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemSta
|
||||
public ItemStackBuilder(@NotNull final ItemStack 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;
|
||||
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -30,6 +31,15 @@ public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMe
|
||||
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.
|
||||
*
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
package com.willfp.eco.core.proxy;
|
||||
|
||||
/**
|
||||
* All proxies must implement this interface.
|
||||
* <p>
|
||||
* A proxy is an NMS implementation of a proxy interface.
|
||||
* <p>
|
||||
* This allows for cross-version support.
|
||||
* <p>
|
||||
* See the core-spigot and core-nms modules of eco to see an example.
|
||||
* Prior to 6.17.0, all proxies were required to implement this interface,
|
||||
* however it produced no functionality and was not even used internally.
|
||||
*
|
||||
* @deprecated Unused class, not required. Will be removed in a subsequent release.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
||||
public interface AbstractProxy {
|
||||
|
||||
}
|
||||
|
||||
@@ -13,5 +13,5 @@ public interface ProxyFactory {
|
||||
* @param <T> The proxy class.
|
||||
* @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 ItemStack output,
|
||||
@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++) {
|
||||
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.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -31,6 +32,7 @@ public interface CraftingRecipe {
|
||||
*
|
||||
* @return The parts.
|
||||
*/
|
||||
@NotNull
|
||||
List<TestableItem> getParts();
|
||||
|
||||
/**
|
||||
@@ -38,6 +40,7 @@ public interface CraftingRecipe {
|
||||
*
|
||||
* @return The key.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKey getKey();
|
||||
|
||||
/**
|
||||
@@ -45,6 +48,7 @@ public interface CraftingRecipe {
|
||||
*
|
||||
* @return The key.
|
||||
*/
|
||||
@NotNull
|
||||
NamespacedKey getDisplayedKey();
|
||||
|
||||
/**
|
||||
@@ -52,5 +56,16 @@ public interface CraftingRecipe {
|
||||
*
|
||||
* @return The output.
|
||||
*/
|
||||
@NotNull
|
||||
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.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -44,16 +45,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*/
|
||||
private final ItemStack output;
|
||||
|
||||
/**
|
||||
* The permission.
|
||||
*/
|
||||
private final String permission;
|
||||
|
||||
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String key,
|
||||
@NotNull final List<TestableItem> parts,
|
||||
@NotNull final ItemStack output) {
|
||||
@NotNull final ItemStack output,
|
||||
@Nullable final String permission) {
|
||||
super(plugin);
|
||||
|
||||
this.parts = parts;
|
||||
this.key = plugin.getNamespacedKeyFactory().create(key);
|
||||
this.displayedKey = plugin.getNamespacedKeyFactory().create(key + "_displayed");
|
||||
this.output = output;
|
||||
this.permission = permission;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -140,6 +148,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*
|
||||
* @return The parts.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public List<TestableItem> getParts() {
|
||||
return this.parts;
|
||||
}
|
||||
@@ -149,6 +159,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*
|
||||
* @return The key.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public NamespacedKey getKey() {
|
||||
return this.key;
|
||||
}
|
||||
@@ -158,6 +170,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*
|
||||
* @return The displayed key.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public NamespacedKey getDisplayedKey() {
|
||||
return this.displayedKey;
|
||||
}
|
||||
@@ -167,10 +181,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*
|
||||
* @return The output.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public ItemStack getOutput() {
|
||||
return this.output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the permission.
|
||||
*
|
||||
* @return The permission.
|
||||
*/
|
||||
@Nullable
|
||||
@Override
|
||||
public String getPermission() {
|
||||
return permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for recipes.
|
||||
*/
|
||||
@@ -185,6 +212,11 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*/
|
||||
private ItemStack output = null;
|
||||
|
||||
/**
|
||||
* The permission for the recipe.
|
||||
*/
|
||||
private String permission = null;
|
||||
|
||||
/**
|
||||
* The key of the recipe.
|
||||
*/
|
||||
@@ -244,6 +276,17 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
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.
|
||||
*
|
||||
@@ -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,
|
||||
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.
|
||||
*
|
||||
@@ -30,6 +44,22 @@ public interface Scheduler {
|
||||
long delay,
|
||||
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.
|
||||
*
|
||||
@@ -42,6 +72,22 @@ public interface Scheduler {
|
||||
long delay,
|
||||
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.
|
||||
*
|
||||
@@ -70,6 +116,22 @@ public interface Scheduler {
|
||||
long delay,
|
||||
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}.
|
||||
*/
|
||||
|
||||
@@ -92,7 +92,7 @@ public class Paste {
|
||||
conn.setRequestMethod("GET");
|
||||
try (var reader = new BufferedReader(
|
||||
new InputStreamReader(conn.getInputStream()))) {
|
||||
for (String line; (line = reader.readLine()) != null;) {
|
||||
for (String line; (line = reader.readLine()) != null; ) {
|
||||
result.append(line);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -55,6 +57,40 @@ public final class ListUtils {
|
||||
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;
|
||||
}
|
||||
|
||||
private ListUtils() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -16,30 +16,45 @@ public final class PotionUtils {
|
||||
public static int getDuration(@NotNull final PotionData data) {
|
||||
if (data.isExtended()) {
|
||||
return switch (data.getType()) {
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
||||
case POISON, REGEN: yield 1800;
|
||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 4800;
|
||||
case TURTLE_MASTER: yield 800;
|
||||
default: yield 9600;
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||
yield 0;
|
||||
case POISON, REGEN:
|
||||
yield 1800;
|
||||
case SLOW_FALLING, WEAKNESS, SLOWNESS:
|
||||
yield 4800;
|
||||
case TURTLE_MASTER:
|
||||
yield 800;
|
||||
default:
|
||||
yield 9600;
|
||||
};
|
||||
}
|
||||
|
||||
if (data.isUpgraded()) {
|
||||
return switch (data.getType()) {
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
||||
case POISON, REGEN: yield 420;
|
||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 440;
|
||||
case TURTLE_MASTER: yield 400;
|
||||
default: yield 1800;
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||
yield 0;
|
||||
case POISON, REGEN:
|
||||
yield 420;
|
||||
case SLOW_FALLING, WEAKNESS, SLOWNESS:
|
||||
yield 440;
|
||||
case TURTLE_MASTER:
|
||||
yield 400;
|
||||
default:
|
||||
yield 1800;
|
||||
};
|
||||
}
|
||||
|
||||
return switch (data.getType()) {
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
|
||||
case POISON, REGEN: yield 900;
|
||||
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 400;
|
||||
case TURTLE_MASTER: yield 1800;
|
||||
default: yield 3600;
|
||||
case INSTANT_DAMAGE, INSTANT_HEAL:
|
||||
yield 0;
|
||||
case POISON, REGEN:
|
||||
yield 900;
|
||||
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.
|
||||
*/
|
||||
public static void setSkullTexture(@NotNull final SkullMeta meta,
|
||||
@NotNull final String base64) {
|
||||
@NotNull final String base64) {
|
||||
Validate.isTrue(initialized, "Must be initialized!");
|
||||
Validate.notNull(metaSetConsumer, "Must be initialized!");
|
||||
|
||||
@@ -64,7 +64,7 @@ public final class SkullUtils {
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
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!");
|
||||
|
||||
metaSetConsumer = function;
|
||||
|
||||
@@ -1,87 +1,93 @@
|
||||
package com.willfp.eco.internal.config
|
||||
|
||||
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.JSONConfig
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||
import com.willfp.eco.core.config.wrapper.ConfigFactory
|
||||
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.EcoUpdatableJSONConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.StringReader
|
||||
|
||||
class EcoConfigFactory : ConfigFactory {
|
||||
override fun createUpdatableYamlConfig(
|
||||
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 {
|
||||
override fun createConfig(config: YamlConfiguration): Config {
|
||||
return EcoYamlConfigSection(config)
|
||||
}
|
||||
|
||||
override fun createJSONConfig(values: Map<String, Any>): JSONConfig {
|
||||
override fun createConfig(values: MutableMap<String, Any>): Config {
|
||||
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
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class EcoJSONConfigSection(values: Map<String, Any?>) : EcoJSONConfigWrapper() {
|
||||
init {
|
||||
init(values)
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
@file:Suppress("DEPRECATION")
|
||||
|
||||
package com.willfp.eco.internal.config.json
|
||||
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.willfp.eco.core.config.ConfigType
|
||||
import com.willfp.eco.core.config.interfaces.JSONConfig
|
||||
import com.willfp.eco.util.StringUtils
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.util.Objects
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
open class EcoJSONConfigWrapper : JSONConfig {
|
||||
val handle: Gson = GsonBuilder()
|
||||
.setPrettyPrinting()
|
||||
.disableHtmlEscaping()
|
||||
.create()
|
||||
companion object {
|
||||
val gson: Gson = GsonBuilder()
|
||||
.setPrettyPrinting()
|
||||
.disableHtmlEscaping()
|
||||
.create()
|
||||
}
|
||||
|
||||
val values = ConcurrentHashMap<String, Any?>()
|
||||
|
||||
@@ -28,14 +34,14 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
}
|
||||
|
||||
override fun toPlaintext(): String {
|
||||
return this.handle.toJson(this.values)
|
||||
return gson.toJson(this.values)
|
||||
}
|
||||
|
||||
override fun has(path: String): Boolean {
|
||||
return getOfKnownType(path, Any::class.java) != null
|
||||
}
|
||||
|
||||
private fun <T: Any?> getOfKnownType(
|
||||
private fun <T : Any?> getOfKnownType(
|
||||
path: String,
|
||||
clazz: Class<T>
|
||||
): T? {
|
||||
@@ -173,7 +179,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
}
|
||||
|
||||
override fun getInts(path: String): MutableList<Int> {
|
||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Int>()) as List<Int>).toMutableList()
|
||||
return (Objects.requireNonNullElse(
|
||||
getOfKnownType(path, Any::class.java),
|
||||
emptyList<Int>()
|
||||
) as List<Int>).toMutableList()
|
||||
}
|
||||
|
||||
override fun getIntsOrNull(path: String): MutableList<Int>? {
|
||||
@@ -197,7 +206,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
}
|
||||
|
||||
override fun getBools(path: String): MutableList<Boolean> {
|
||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Boolean>()) as List<Boolean>).toMutableList()
|
||||
return (Objects.requireNonNullElse(
|
||||
getOfKnownType(path, Any::class.java),
|
||||
emptyList<Boolean>()
|
||||
) as List<Boolean>).toMutableList()
|
||||
}
|
||||
|
||||
override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
|
||||
@@ -235,7 +247,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
option: StringUtils.FormatOption
|
||||
): MutableList<String> {
|
||||
val strings =
|
||||
(Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<String>()) as List<String>).toMutableList()
|
||||
(Objects.requireNonNullElse(
|
||||
getOfKnownType(path, Any::class.java),
|
||||
emptyList<String>()
|
||||
) as List<String>).toMutableList()
|
||||
return if (format) StringUtils.formatList(strings, option) else strings
|
||||
}
|
||||
|
||||
@@ -264,7 +279,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
}
|
||||
|
||||
override fun getDoubles(path: String): MutableList<Double> {
|
||||
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Double>()) as List<Double>).toMutableList()
|
||||
return (Objects.requireNonNullElse(
|
||||
getOfKnownType(path, Any::class.java),
|
||||
emptyList<Double>()
|
||||
) as List<Double>).toMutableList()
|
||||
}
|
||||
|
||||
override fun getDoublesOrNull(path: String): MutableList<Double>? {
|
||||
@@ -275,6 +293,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
|
||||
}
|
||||
}
|
||||
|
||||
override fun getType(): ConfigType {
|
||||
return ConfigType.JSON
|
||||
}
|
||||
|
||||
override fun clone(): JSONConfig {
|
||||
return EcoJSONConfigSection(this.values.toMutableMap())
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.willfp.eco.internal.config.json
|
||||
|
||||
import com.willfp.eco.core.PluginLike
|
||||
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.File
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.FileOutputStream
|
||||
@@ -69,7 +70,7 @@ open class EcoLoadableJSONConfig(
|
||||
|
||||
@Throws(FileNotFoundException::class)
|
||||
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 {
|
||||
@@ -80,6 +81,10 @@ open class EcoLoadableJSONConfig(
|
||||
return configFile
|
||||
}
|
||||
|
||||
override fun getBukkitHandle(): YamlConfiguration? {
|
||||
return null
|
||||
}
|
||||
|
||||
init {
|
||||
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
||||
if (!directory.exists()) {
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@file:Suppress("DEPRECATION")
|
||||
|
||||
package com.willfp.eco.internal.config.yaml
|
||||
|
||||
import com.willfp.eco.core.PluginLike
|
||||
@@ -60,10 +62,6 @@ open class EcoLoadableYamlConfig(
|
||||
handle.save(getConfigFile())
|
||||
}
|
||||
|
||||
override fun getBukkitHandle(): YamlConfiguration {
|
||||
return handle
|
||||
}
|
||||
|
||||
override fun getName(): String {
|
||||
return name
|
||||
}
|
||||
@@ -72,6 +70,10 @@ open class EcoLoadableYamlConfig(
|
||||
return configFile
|
||||
}
|
||||
|
||||
override fun getBukkitHandle(): YamlConfiguration? {
|
||||
return handle
|
||||
}
|
||||
|
||||
init {
|
||||
val directory = File(this.plugin.dataFolder, subDirectoryPath)
|
||||
if (!directory.exists()) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
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.util.StringUtils
|
||||
import org.bukkit.configuration.ConfigurationSection
|
||||
@@ -286,6 +287,10 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
|
||||
}
|
||||
}
|
||||
|
||||
override fun getType(): ConfigType {
|
||||
return ConfigType.JSON
|
||||
}
|
||||
|
||||
override fun clone(): Config {
|
||||
return EcoYamlConfigSection(
|
||||
YamlConfiguration.loadConfiguration(
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.extensions
|
||||
|
||||
import com.google.common.collect.ImmutableSet
|
||||
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.ExtensionLoader
|
||||
import com.willfp.eco.core.extensions.ExtensionMetadata
|
||||
@@ -54,7 +54,7 @@ class EcoExtensionLoader(
|
||||
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
||||
?: 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")
|
||||
var name = extensionYml.getStringOrNull("name")
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.willfp.eco.internal.proxy
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import com.willfp.eco.core.proxy.ProxyConstants
|
||||
import com.willfp.eco.core.proxy.ProxyFactory
|
||||
import com.willfp.eco.core.proxy.exceptions.ProxyError
|
||||
@@ -13,9 +12,9 @@ class EcoProxyFactory(
|
||||
private val plugin: EcoPlugin
|
||||
) : ProxyFactory {
|
||||
private val proxyClassLoader: ClassLoader = plugin::class.java.classLoader
|
||||
private val cache: MutableMap<Class<out AbstractProxy>, AbstractProxy> = IdentityHashMap()
|
||||
private val cache: MutableMap<Class<out Any>, Any> = IdentityHashMap()
|
||||
|
||||
override fun <T : AbstractProxy> getProxy(proxyClass: Class<T>): T {
|
||||
override fun <T : Any> getProxy(proxyClass: Class<T>): T {
|
||||
try {
|
||||
val cachedProxy: T? = attemptCache(proxyClass)
|
||||
if (cachedProxy != null) {
|
||||
@@ -53,7 +52,7 @@ class EcoProxyFactory(
|
||||
}
|
||||
}
|
||||
|
||||
private fun <T : AbstractProxy> attemptCache(proxyClass: Class<T>): T? {
|
||||
private fun <T : Any> attemptCache(proxyClass: Class<T>): T? {
|
||||
val proxy = cache[proxyClass] ?: return null
|
||||
|
||||
if (proxyClass.isInstance(proxy)) {
|
||||
|
||||
@@ -16,7 +16,9 @@ dependencies {
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.17.1'
|
||||
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
|
||||
compileOnly 'com.github.cryptomorin:kingdoms:1.11.9'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.97.2.6'
|
||||
compileOnly('com.github.TownyAdvanced:Towny:0.97.2.6') {
|
||||
exclude group: 'com.zaxxer', module: 'HikariCP'
|
||||
}
|
||||
compileOnly 'com.github.angeschossen:LandsAPI:5.15.2'
|
||||
compileOnly 'fr.neatmonster:nocheatplus:3.16.1-SNAPSHOT'
|
||||
compileOnly 'com.github.jiangdashao:matrix-api-repo:317d4635fd'
|
||||
@@ -30,8 +32,9 @@ dependencies {
|
||||
compileOnly 'org.jetbrains.exposed:exposed-dao:0.36.2'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
|
||||
compileOnly 'mysql:mysql-connector-java:8.0.25'
|
||||
compileOnly 'com.zaxxer:HikariCP:5.0.0'
|
||||
compileOnly 'com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0'
|
||||
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
|
||||
compileOnly 'com.github.EssentialsX:Essentials:2.19.0'
|
||||
compileOnly 'com.bgsoftware:SuperiorSkyblockAPI:latest'
|
||||
compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
|
||||
compileOnly 'world.bentobox:bentobox:1.17.3-SNAPSHOT'
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
|
||||
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
|
||||
import org.bukkit.Keyed;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@@ -28,6 +29,29 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
private void allow(@NotNull final Event event,
|
||||
@NotNull final CraftingRecipe recipe) {
|
||||
if (event instanceof PrepareItemCraftEvent) {
|
||||
((PrepareItemCraftEvent) event).getInventory().setResult(recipe.getOutput());
|
||||
}
|
||||
|
||||
if (event instanceof CraftItemEvent) {
|
||||
((CraftItemEvent) event).getInventory().setResult(recipe.getOutput());
|
||||
}
|
||||
}
|
||||
|
||||
private void deny(@NotNull final Event event) {
|
||||
if (event instanceof PrepareItemCraftEvent) {
|
||||
((PrepareItemCraftEvent) event).getInventory().setResult(new ItemStack(Material.AIR));
|
||||
}
|
||||
|
||||
if (event instanceof CraftItemEvent) {
|
||||
((CraftItemEvent) event).getInventory().setResult(new ItemStack(Material.AIR));
|
||||
((CraftItemEvent) event).setResult(Event.Result.DENY);
|
||||
((CraftItemEvent) event).setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void complexRecipeListener(@NotNull final PrepareItemCraftEvent event) {
|
||||
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
|
||||
@@ -38,18 +62,30 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(event.getInventory().getViewers().get(0) instanceof Player player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack[] matrix = event.getInventory().getMatrix();
|
||||
CraftingRecipe matched = Recipes.getMatch(matrix);
|
||||
|
||||
if (matched == null) {
|
||||
event.getInventory().setResult(new ItemStack(Material.AIR));
|
||||
deny(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (matched.test(matrix)) {
|
||||
event.getInventory().setResult(matched.getOutput());
|
||||
if (matched.getPermission() != null) {
|
||||
if (player.hasPermission(matched.getPermission())) {
|
||||
allow(event, matched);
|
||||
} else {
|
||||
deny(event);
|
||||
}
|
||||
} else {
|
||||
allow(event, matched);
|
||||
}
|
||||
} else {
|
||||
event.getInventory().setResult(new ItemStack(Material.AIR));
|
||||
deny(event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,25 +99,33 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(event.getInventory().getViewers().get(0) instanceof Player player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack[] matrix = event.getInventory().getMatrix();
|
||||
CraftingRecipe matched = Recipes.getMatch(matrix);
|
||||
|
||||
if (matched == null) {
|
||||
event.getInventory().setResult(new ItemStack(Material.AIR));
|
||||
event.setResult(Event.Result.DENY);
|
||||
event.setCancelled(true);
|
||||
deny(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (matched.test(matrix)) {
|
||||
event.getInventory().setResult(matched.getOutput());
|
||||
if (matched.getPermission() != null) {
|
||||
if (player.hasPermission(matched.getPermission())) {
|
||||
allow(event, matched);
|
||||
} else {
|
||||
deny(event);
|
||||
}
|
||||
} else {
|
||||
allow(event, matched);
|
||||
}
|
||||
} else {
|
||||
event.getInventory().setResult(new ItemStack(Material.AIR));
|
||||
event.setResult(Event.Result.DENY);
|
||||
event.setCancelled(true);
|
||||
deny(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void stackedRecipeListener(@NotNull final CraftItemEvent event) {
|
||||
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
|
||||
@@ -199,7 +243,7 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void preventUsingComplexPartInEcoRecipe(@NotNull final CraftItemEvent event) {
|
||||
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
|
||||
@@ -243,7 +287,7 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void preventUsingComplexPartInVanillaRecipe(@NotNull final PrepareItemCraftEvent event) {
|
||||
if (!(event.getRecipe() instanceof Keyed recipe)) {
|
||||
|
||||
@@ -31,7 +31,7 @@ import org.bukkit.inventory.ItemStack
|
||||
import java.util.logging.Logger
|
||||
|
||||
@Suppress("UNUSED")
|
||||
class EcoHandler : com.willfp.eco.internal.spigot.EcoSpigotPlugin(), Handler {
|
||||
class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
private val cleaner = EcoCleaner()
|
||||
private val requirementFactory = EcoRequirementFactory()
|
||||
private var adventure: BukkitAudiences? = null
|
||||
|
||||
@@ -39,7 +39,8 @@ import com.willfp.eco.internal.spigot.display.frame.clearFrames
|
||||
import com.willfp.eco.internal.spigot.drops.CollatedRunnable
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListeners
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListeners
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersSpigot
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
|
||||
import com.willfp.eco.internal.spigot.gui.GUIListener
|
||||
@@ -243,17 +244,24 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
}
|
||||
|
||||
override fun loadListeners(): List<Listener> {
|
||||
return listOf(
|
||||
val listeners = mutableListOf(
|
||||
NaturalExpGainListeners(),
|
||||
ArmorListener(),
|
||||
EntityDeathByEntityListeners(this),
|
||||
ShapedRecipeListener(this),
|
||||
PlayerJumpListeners(),
|
||||
GUIListener(this),
|
||||
ArrowDataListener(this),
|
||||
ArmorChangeEventListeners(this),
|
||||
DataListener(this),
|
||||
PlayerBlockListener(this)
|
||||
)
|
||||
|
||||
if (Prerequisite.HAS_PAPER.isMet) {
|
||||
listeners.add(PlayerJumpListenersPaper())
|
||||
} else {
|
||||
listeners.add(PlayerJumpListenersSpigot())
|
||||
}
|
||||
|
||||
return listeners
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.util.PlayerUtils
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.player.PlayerJoinEvent
|
||||
import org.bukkit.event.player.PlayerLoginEvent
|
||||
@@ -12,19 +13,19 @@ import org.bukkit.event.player.PlayerQuitEvent
|
||||
class DataListener(
|
||||
private val plugin: EcoPlugin
|
||||
) : Listener {
|
||||
@EventHandler
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
fun onLeave(event: PlayerQuitEvent) {
|
||||
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun onJoin(event: PlayerJoinEvent) {
|
||||
plugin.scheduler.runLater({
|
||||
plugin.scheduler.runLater(5) {
|
||||
PlayerUtils.updateSavedDisplayName(event.player)
|
||||
}, 5)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
fun onLogin(event: PlayerLoginEvent) {
|
||||
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package com.willfp.eco.internal.data
|
||||
package com.willfp.eco.internal.spigot.data
|
||||
|
||||
import com.willfp.eco.core.data.PlayerProfile
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
||||
import java.util.UUID
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
class EcoPlayerProfile(
|
||||
val data: MutableMap<PersistentDataKey<*>, Any>,
|
||||
val uuid: UUID
|
||||
val uuid: UUID,
|
||||
private val handler: DataHandler
|
||||
) : PlayerProfile {
|
||||
override fun <T : Any> write(key: PersistentDataKey<T>, value: T) {
|
||||
this.data[key] = value
|
||||
@@ -19,7 +21,12 @@ class EcoPlayerProfile(
|
||||
|
||||
override fun <T : Any> read(key: PersistentDataKey<T>): T {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return this.data[key] as T? ?: key.defaultValue
|
||||
if (this.data.containsKey(key)) {
|
||||
return this.data[key] as T
|
||||
}
|
||||
|
||||
this.data[key] = handler.read(uuid, key.key) ?: key.defaultValue
|
||||
return read(key)
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
@@ -3,7 +3,6 @@ package com.willfp.eco.internal.spigot.data
|
||||
import com.willfp.eco.core.data.PlayerProfile
|
||||
import com.willfp.eco.core.data.PlayerProfileHandler
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.internal.data.EcoPlayerProfile
|
||||
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
||||
import java.util.UUID
|
||||
|
||||
@@ -20,11 +19,7 @@ class EcoPlayerProfileHandler(
|
||||
|
||||
val data = mutableMapOf<PersistentDataKey<*>, Any>()
|
||||
|
||||
for (key in PersistentDataKey.values()) {
|
||||
data[key] = handler.read(uuid, key.key) ?: key.defaultValue
|
||||
}
|
||||
|
||||
val profile = EcoPlayerProfile(data, uuid)
|
||||
val profile = EcoPlayerProfile(data, uuid, handler)
|
||||
loaded[uuid] = profile
|
||||
return profile
|
||||
}
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
package com.willfp.eco.internal.spigot.data
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.util.BlockUtils
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.block.BlockBreakEvent
|
||||
import org.bukkit.event.block.BlockMultiPlaceEvent
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent
|
||||
import org.bukkit.event.block.BlockPlaceEvent
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
|
||||
@@ -36,9 +40,59 @@ class PlayerBlockListener(
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
fun onExtend(event: BlockPistonExtendEvent) {
|
||||
val locs = mutableListOf<Location>()
|
||||
val toRemove = mutableListOf<Location>()
|
||||
|
||||
for (block in event.blocks) {
|
||||
if (BlockUtils.isPlayerPlaced(block)) {
|
||||
locs.add(block.getRelative(event.direction).location)
|
||||
toRemove.add(block.location)
|
||||
}
|
||||
}
|
||||
|
||||
this.plugin.scheduler.run {
|
||||
for (loc in toRemove) {
|
||||
removeKey(loc)
|
||||
}
|
||||
|
||||
for (loc in locs) {
|
||||
writeKey(loc)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
fun onRetract(event: BlockPistonRetractEvent) {
|
||||
val locs = mutableListOf<Location>()
|
||||
val toRemove = mutableListOf<Location>()
|
||||
|
||||
for (block in event.blocks) {
|
||||
if (BlockUtils.isPlayerPlaced(block)) {
|
||||
locs.add(block.getRelative(event.direction).location)
|
||||
toRemove.add(block.location)
|
||||
}
|
||||
}
|
||||
|
||||
this.plugin.scheduler.run {
|
||||
for (loc in toRemove) {
|
||||
removeKey(loc)
|
||||
}
|
||||
|
||||
for (loc in locs) {
|
||||
writeKey(loc)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun writeKey(block: Block) {
|
||||
val loc = block.location.hashCode().toString(16)
|
||||
block.chunk.persistentDataContainer.set(
|
||||
writeKey(block.location)
|
||||
}
|
||||
|
||||
private fun writeKey(location: Location) {
|
||||
val loc = location.hashCode().toString(16)
|
||||
location.chunk.persistentDataContainer.set(
|
||||
plugin.namespacedKeyFactory.create(loc.lowercase()),
|
||||
PersistentDataType.INTEGER,
|
||||
1
|
||||
@@ -46,7 +100,11 @@ class PlayerBlockListener(
|
||||
}
|
||||
|
||||
private fun removeKey(block: Block) {
|
||||
val loc = block.location.hashCode().toString(16)
|
||||
block.chunk.persistentDataContainer.remove(plugin.namespacedKeyFactory.create(loc.lowercase()))
|
||||
removeKey(block.location)
|
||||
}
|
||||
|
||||
private fun removeKey(location: Location) {
|
||||
val loc = location.hashCode().toString(16)
|
||||
location.chunk.persistentDataContainer.remove(plugin.namespacedKeyFactory.create(loc.lowercase()))
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,8 @@ import com.willfp.eco.core.data.PlayerProfile
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKeyType
|
||||
import com.willfp.eco.internal.spigot.EcoSpigotPlugin
|
||||
import com.zaxxer.hikari.HikariConfig
|
||||
import com.zaxxer.hikari.HikariDataSource
|
||||
import org.apache.logging.log4j.Level
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.jetbrains.exposed.dao.id.UUIDTable
|
||||
@@ -35,15 +37,18 @@ class MySQLDataHandler(
|
||||
private val executor = Executors.newFixedThreadPool(plugin.configYml.getInt("mysql.threads"), threadFactory)
|
||||
|
||||
init {
|
||||
Database.connect(
|
||||
"jdbc:mysql://" +
|
||||
"${plugin.configYml.getString("mysql.host")}:" +
|
||||
"${plugin.configYml.getString("mysql.port")}/" +
|
||||
plugin.configYml.getString("mysql.database"),
|
||||
driver = "com.mysql.cj.jdbc.Driver",
|
||||
user = plugin.configYml.getString("mysql.user"),
|
||||
password = plugin.configYml.getString("mysql.password")
|
||||
)
|
||||
val config = HikariConfig()
|
||||
config.driverClassName = "com.mysql.cj.jdbc.Driver"
|
||||
config.username = plugin.configYml.getString("mysql.user")
|
||||
config.password = plugin.configYml.getString("mysql.password")
|
||||
config.jdbcUrl = "jdbc:mysql://" +
|
||||
"${plugin.configYml.getString("mysql.host")}:" +
|
||||
"${plugin.configYml.getString("mysql.port")}/" +
|
||||
plugin.configYml.getString("mysql.database")
|
||||
config.maximumPoolSize = plugin.configYml.getInt("mysql.connections")
|
||||
|
||||
Database.connect(HikariDataSource(config))
|
||||
|
||||
|
||||
transaction {
|
||||
SchemaUtils.create(Players)
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.spigot.data.storage
|
||||
|
||||
import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.internal.data.EcoPlayerProfile
|
||||
import com.willfp.eco.internal.spigot.data.EcoPlayerProfile
|
||||
|
||||
class ProfileSaver(plugin: EcoPlugin) {
|
||||
init {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.internal.spigot.data.storage
|
||||
|
||||
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.core.data.PlayerProfile
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.internal.spigot.EcoSpigotPlugin
|
||||
@@ -43,9 +44,10 @@ class YamlDataHandler(
|
||||
|
||||
class DataYml(
|
||||
plugin: EcoSpigotPlugin
|
||||
) : YamlBaseConfig(
|
||||
) : BaseConfig(
|
||||
"data",
|
||||
plugin,
|
||||
false,
|
||||
plugin
|
||||
ConfigType.YAML
|
||||
)
|
||||
}
|
||||
@@ -30,9 +30,9 @@ class EntityDeathByEntityListeners(
|
||||
builtEvent.victim = victim
|
||||
builtEvent.damager = event.damager
|
||||
events.add(builtEvent)
|
||||
this.plugin.scheduler.runLater({
|
||||
this.plugin.scheduler.run {
|
||||
events.remove(builtEvent)
|
||||
}, 1)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.text.DecimalFormat
|
||||
import java.util.UUID
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
class PlayerJumpListeners : Listener {
|
||||
class PlayerJumpListenersSpigot : Listener {
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onJump(event: PlayerMoveEvent) {
|
||||
if (McmmoManager.isFake(event)) {
|
||||
@@ -43,4 +43,15 @@ class PlayerJumpListeners : Listener {
|
||||
private val PREVIOUS_PLAYERS_ON_GROUND: MutableSet<UUID> = HashSet()
|
||||
private val FORMAT = DecimalFormat("0.00")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PlayerJumpListenersPaper : Listener {
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onJump(event: com.destroystokyo.paper.event.player.PlayerJumpEvent) {
|
||||
Bukkit.getPluginManager().callEvent(
|
||||
PlayerJumpEvent(
|
||||
PlayerMoveEvent(event.player, event.from, event.to)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,16 +10,12 @@ import java.io.File
|
||||
import java.io.InputStreamReader
|
||||
import java.net.URL
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.Arrays
|
||||
import java.util.Objects
|
||||
import java.util.UUID
|
||||
import java.util.concurrent.Executors
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.function.BiConsumer
|
||||
import java.util.function.Consumer
|
||||
import java.util.function.Supplier
|
||||
import java.util.logging.Level
|
||||
import java.util.stream.Collectors
|
||||
import java.util.zip.GZIPOutputStream
|
||||
import javax.net.ssl.HttpsURLConnection
|
||||
|
||||
@@ -54,13 +50,10 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
private val appendServiceDataConsumer: Consumer<JsonObjectBuilder>,
|
||||
private val submitTaskConsumer: Consumer<Runnable>?,
|
||||
private val checkServiceEnabledSupplier: Supplier<Boolean>,
|
||||
private val errorLogger: BiConsumer<String?, Throwable?>,
|
||||
private val infoLogger: Consumer<String>,
|
||||
private val logErrors: Boolean,
|
||||
private val logSentData: Boolean,
|
||||
private val logResponseStatusText: Boolean
|
||||
) {
|
||||
private val customCharts: MutableSet<CustomChart> = HashSet()
|
||||
|
||||
private fun startSubmitting() {
|
||||
val submitTask = Runnable {
|
||||
@@ -97,20 +90,8 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
appendPlatformDataConsumer.accept(baseJsonBuilder)
|
||||
val serviceJsonBuilder = JsonObjectBuilder()
|
||||
appendServiceDataConsumer.accept(serviceJsonBuilder)
|
||||
val chartData = customCharts.stream()
|
||||
.map { customChart: CustomChart ->
|
||||
customChart.getRequestJsonObject(
|
||||
errorLogger, logErrors
|
||||
)
|
||||
}
|
||||
.filter { obj: JsonObjectBuilder.JsonObject? -> Objects.nonNull(obj) }
|
||||
.toArray()
|
||||
|
||||
serviceJsonBuilder.appendField("id", serviceId)
|
||||
serviceJsonBuilder.appendField(
|
||||
"customCharts",
|
||||
chartData as Array<JsonObjectBuilder.JsonObject>
|
||||
)
|
||||
baseJsonBuilder.appendField("service", serviceJsonBuilder.build())
|
||||
baseJsonBuilder.appendField("serverUUID", serverUuid)
|
||||
baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION)
|
||||
@@ -173,36 +154,6 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
abstract class CustomChart protected constructor(chartId: String?) {
|
||||
private val chartId: String
|
||||
fun getRequestJsonObject(
|
||||
errorLogger: BiConsumer<String?, Throwable?>, logErrors: Boolean
|
||||
): JsonObjectBuilder.JsonObject? {
|
||||
val builder = JsonObjectBuilder()
|
||||
builder.appendField("chartId", chartId)
|
||||
try {
|
||||
val data = chartData
|
||||
?: // If the data is null we don't send the chart.
|
||||
return null
|
||||
builder.appendField("data", data)
|
||||
} catch (t: Throwable) {
|
||||
if (logErrors) {
|
||||
errorLogger.accept("Failed to get data for custom chart with id $chartId", t)
|
||||
}
|
||||
return null
|
||||
}
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
protected abstract val chartData: JsonObjectBuilder.JsonObject?
|
||||
|
||||
init {
|
||||
requireNotNull(chartId) { "chartId must not be null" }
|
||||
this.chartId = chartId
|
||||
}
|
||||
}
|
||||
|
||||
class JsonObjectBuilder {
|
||||
private var builder: StringBuilder? = StringBuilder()
|
||||
private var hasAtLeastOneField = false
|
||||
@@ -224,14 +175,6 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
return this
|
||||
}
|
||||
|
||||
fun appendField(key: String?, values: Array<JsonObject>?): JsonObjectBuilder {
|
||||
requireNotNull(values) { "JSON values must not be null" }
|
||||
val escapedValues = Arrays.stream(values).map { obj: JsonObject -> obj.toString() }
|
||||
.collect(Collectors.joining(","))
|
||||
appendFieldUnescaped(key, "[$escapedValues]")
|
||||
return this
|
||||
}
|
||||
|
||||
private fun appendFieldUnescaped(key: String?, escapedValue: String) {
|
||||
checkNotNull(builder) { "JSON has already been built" }
|
||||
requireNotNull(key) { "JSON key must not be null" }
|
||||
@@ -310,7 +253,6 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
}
|
||||
// Load the data
|
||||
val serverUUID = config.getString("serverUuid")!!
|
||||
val logErrors = config.getBoolean("logFailedRequests", false)
|
||||
val logSentData = config.getBoolean("logSentData", false)
|
||||
val logResponseStatusText = config.getBoolean("logResponseStatusText", false)
|
||||
metricsBase = MetricsBase(
|
||||
@@ -321,9 +263,7 @@ class Metrics(private val plugin: EcoPlugin) {
|
||||
{ builder: JsonObjectBuilder -> appendServiceData(builder) },
|
||||
{ submitDataTask: Runnable? -> Bukkit.getScheduler().runTask(plugin, submitDataTask!!) },
|
||||
{ plugin.isEnabled },
|
||||
{ message: String?, error: Throwable? -> this.plugin.logger.log(Level.WARNING, message, error) },
|
||||
{ message: String? -> this.plugin.logger.log(Level.INFO, message) },
|
||||
logErrors,
|
||||
logSentData,
|
||||
logResponseStatusText
|
||||
)
|
||||
|
||||
@@ -9,6 +9,8 @@ mysql:
|
||||
# very high numbers can cause issues with OS configuration. If writes are taking
|
||||
# too long, increase this value.
|
||||
threads: 2
|
||||
# The maximum number of MySQL connections.
|
||||
connections: 10
|
||||
# If read operations should be ran in the thread pool. Runs on main thread by default.
|
||||
async-reads: false
|
||||
host: localhost
|
||||
|
||||
@@ -51,4 +51,5 @@ libraries:
|
||||
- 'org.jetbrains.exposed:exposed-dao:0.36.2'
|
||||
- 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
|
||||
- 'mysql:mysql-connector-java:8.0.25'
|
||||
- 'com.google.guava:guava:31.0.1-jre'
|
||||
- 'com.google.guava:guava:31.0.1-jre'
|
||||
- 'com.zaxxer:HikariCP:5.0.0'
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
|
||||
interface AutoCraftProxy : AbstractProxy {
|
||||
interface AutoCraftProxy {
|
||||
fun modifyPacket(packet: Any)
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
interface BlockBreakProxy : AbstractProxy {
|
||||
interface BlockBreakProxy {
|
||||
fun breakBlock(
|
||||
player: Player,
|
||||
block: Block
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
interface ChatComponentProxy : AbstractProxy {
|
||||
interface ChatComponentProxy {
|
||||
fun modifyComponent(
|
||||
obj: Any,
|
||||
player: Player
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
interface FastItemStackFactoryProxy : AbstractProxy {
|
||||
interface FastItemStackFactoryProxy {
|
||||
fun create(itemStack: ItemStack): FastItemStack
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import org.bukkit.inventory.meta.SkullMeta
|
||||
|
||||
interface SkullProxy : AbstractProxy {
|
||||
interface SkullProxy {
|
||||
fun setSkullTexture(
|
||||
meta: SkullMeta,
|
||||
base64: String
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
|
||||
interface TPSProxy : AbstractProxy {
|
||||
interface TPSProxy {
|
||||
fun getTPS(): Double
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
package com.willfp.eco.internal.spigot.proxy
|
||||
|
||||
import com.willfp.eco.core.proxy.AbstractProxy
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.MerchantRecipe
|
||||
|
||||
interface VillagerTradeProxy : AbstractProxy {
|
||||
interface VillagerTradeProxy {
|
||||
fun displayTrade(
|
||||
recipe: MerchantRecipe,
|
||||
player: Player
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version = 6.16.1
|
||||
version = 6.17.2
|
||||
plugin-name = eco
|
||||
kotlin.code.style = official
|
||||
Reference in New Issue
Block a user