diff --git a/build.gradle b/build.gradle index 1d23d61..f5afd41 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ plugins { dependencies { implementation project(":eco-core").getSubprojects() - implementation 'com.willfp:eco:1.0.6' } allprojects { @@ -48,6 +47,8 @@ allprojects { } dependencies { + compileOnly 'com.willfp:eco:3.0.0' + compileOnly 'org.jetbrains:annotations:19.0.0' compileOnly 'org.projectlombok:lombok:1.18.16' @@ -81,9 +82,6 @@ clean.doLast { } shadowJar { - relocate('org.apache.maven', 'com.willfp.illusioner.eco.shaded.maven') - relocate('org.bstats', 'com.willfp.illusioner.eco.shaded.bstats') - relocate('com.willfp.eco.', 'com.willfp.illusioner.eco.') archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + ".jar" } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java index bb4dbdf..3f4aee2 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java @@ -11,6 +11,7 @@ import com.willfp.illusioner.illusioner.IllusionerManager; import com.willfp.illusioner.illusioner.listeners.AttackListeners; import com.willfp.illusioner.illusioner.listeners.DeathListeners; import com.willfp.illusioner.illusioner.listeners.SpawnListeners; +import lombok.Getter; import org.bukkit.event.Listener; import java.util.ArrayList; @@ -19,11 +20,18 @@ import java.util.List; @SuppressWarnings("unused") public class IllusionerPlugin extends AbstractEcoPlugin { + /** + * Instance of the plugin. + */ + @Getter + private static IllusionerPlugin instance; + /** * Internal constructor called by bukkit on plugin load. */ public IllusionerPlugin() { super("Illusioner", 86576, 9596, "com.willfp.illusioner.proxy", "&9"); + instance = this; } /** diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java index cb48ffd..c55765a 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java @@ -1,6 +1,7 @@ package com.willfp.illusioner.commands; import com.willfp.eco.util.command.AbstractCommand; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.illusioner.IllusionerPlugin; import com.willfp.illusioner.illusioner.IllusionerManager; import org.bukkit.Bukkit; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java index ec94a04..1958e27 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java @@ -1,7 +1,6 @@ package com.willfp.illusioner.commands; import com.willfp.eco.util.command.AbstractCommand; -import com.willfp.eco.util.config.Configs; import com.willfp.illusioner.IllusionerPlugin; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -22,6 +21,6 @@ public class CommandIlreload extends AbstractCommand { public void onExecute(@NotNull final CommandSender sender, @NotNull final List args) { this.getPlugin().reload(); - sender.sendMessage(Configs.LANG.getMessage("reloaded")); + sender.sendMessage(this.getPlugin().getLangYml().getMessage("reloaded")); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java index c8f49c0..6d7eea9 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java @@ -1,12 +1,14 @@ package com.willfp.illusioner.config.configs; import com.willfp.eco.util.config.BaseConfig; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.illusioner.IllusionerPlugin; public class Attacks extends BaseConfig { /** * Instantiate attacks.yml. */ public Attacks() { - super("attacks", false); + super("attacks", false, IllusionerPlugin.getInstance()); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java index 5a91888..e36bdcc 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java @@ -1,12 +1,14 @@ package com.willfp.illusioner.config.configs; import com.willfp.eco.util.config.BaseConfig; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.illusioner.IllusionerPlugin; public class Drops extends BaseConfig { /** * Instantiate drops.yml. */ public Drops() { - super("drops", false); + super("drops", false, IllusionerPlugin.getInstance()); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java index 4eb2ae4..e474a91 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java @@ -1,12 +1,14 @@ package com.willfp.illusioner.config.configs; import com.willfp.eco.util.config.BaseConfig; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.illusioner.IllusionerPlugin; public class Sounds extends BaseConfig { /** * Instantiate sounds.yml. */ public Sounds() { - super("sounds", false); + super("sounds", false, IllusionerPlugin.getInstance()); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java index 382c25f..cd294f7 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java @@ -1,10 +1,12 @@ package com.willfp.illusioner.illusioner; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.illusioner.IllusionerPlugin; import com.willfp.illusioner.illusioner.options.IllusionerOptions; public class IllusionerManager { /** * The options related to the illusioner. */ - public static final IllusionerOptions OPTIONS = new IllusionerOptions(); + public static final IllusionerOptions OPTIONS = new IllusionerOptions(IllusionerPlugin.getInstance()); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java index 6e7724a..6ecde24 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java @@ -1,12 +1,11 @@ package com.willfp.illusioner.illusioner.listeners; - -import com.willfp.eco.util.ProxyUtils; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.illusioner.illusioner.BlockStructure; import com.willfp.illusioner.illusioner.IllusionerManager; import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import com.willfp.illusioner.util.ProxyUtils; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Illusioner; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java index 2ad0171..11ff377 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java @@ -1,6 +1,7 @@ package com.willfp.illusioner.illusioner.options; -import com.willfp.eco.util.config.Configs; +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.illusioner.config.IllusionerConfigs; import com.willfp.illusioner.illusioner.OptionedSound; import lombok.Getter; @@ -14,7 +15,7 @@ import java.util.HashSet; import java.util.Set; @ToString -public class GameplayOptions { +public class GameplayOptions extends PluginDependent { /** * The sound played when the illusioner takes damage. */ @@ -57,6 +58,14 @@ public class GameplayOptions { @Getter private boolean ignoreExplosionDamage; + /** + * Gameplay options. + * @param plugin The plugin. + */ + public GameplayOptions(@NotNull final AbstractEcoPlugin plugin) { + super(plugin); + } + /** * Reload the options. */ @@ -77,7 +86,7 @@ public class GameplayOptions { shuffle = IllusionerConfigs.ATTACKS.getBool("shuffle.enabled"); shuffleChance = IllusionerConfigs.ATTACKS.getDouble("shuffle.chance"); - ignoreExplosionDamage = Configs.CONFIG.getBool("ignore-explosion-damage"); + ignoreExplosionDamage = this.getPlugin().getConfigYml().getBool("ignore-explosion-damage"); effectOptions.clear(); IllusionerConfigs.ATTACKS.getConfig().getConfigurationSection("effects").getKeys(false).forEach(key -> { diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java index 3ac905b..67dea00 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java @@ -1,7 +1,8 @@ package com.willfp.illusioner.illusioner.options; import com.willfp.eco.util.NumberUtils; -import com.willfp.eco.util.config.Configs; +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.tuplets.Pair; import com.willfp.illusioner.config.IllusionerConfigs; import com.willfp.illusioner.illusioner.BlockStructure; @@ -13,12 +14,13 @@ import org.bukkit.Sound; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.Set; @ToString -public class IllusionerOptions { +public class IllusionerOptions extends PluginDependent { /** * The boss bar color. */ @@ -82,7 +84,7 @@ public class IllusionerOptions { * The gameplay options. */ @Getter - private final GameplayOptions gameplayOptions = new GameplayOptions(); + private final GameplayOptions gameplayOptions = new GameplayOptions(this.getPlugin()); /** * If plugin-based illusioners should override vanilla illusioners. @@ -92,8 +94,11 @@ public class IllusionerOptions { /** * Create new illusioner options. + * + * @param plugin The plugin. */ - public IllusionerOptions() { + public IllusionerOptions(@NotNull final AbstractEcoPlugin plugin) { + super(plugin); reload(); } @@ -101,13 +106,13 @@ public class IllusionerOptions { * Reload options from config. */ public void reload() { - color = BarColor.valueOf(Configs.CONFIG.getString("bossbar.color")); - style = BarStyle.valueOf(Configs.CONFIG.getString("bossbar.style")); - name = Configs.CONFIG.getString("name"); - xpBounds = new Pair<>(Configs.CONFIG.getInt("xp.minimum"), Configs.CONFIG.getInt("xp.maximum")); - maxHealth = Configs.CONFIG.getDouble("max-health"); - attackDamage = Configs.CONFIG.getDouble("attack-damage"); - override = Configs.CONFIG.getBool("override"); + color = BarColor.valueOf(this.getPlugin().getConfigYml().getString("bossbar.color")); + style = BarStyle.valueOf(this.getPlugin().getConfigYml().getString("bossbar.style")); + name = this.getPlugin().getConfigYml().getString("name"); + xpBounds = new Pair<>(this.getPlugin().getConfigYml().getInt("xp.minimum"), this.getPlugin().getConfigYml().getInt("xp.maximum")); + maxHealth = this.getPlugin().getConfigYml().getDouble("max-health"); + attackDamage = this.getPlugin().getConfigYml().getDouble("attack-damage"); + override = this.getPlugin().getConfigYml().getBool("override"); spawnSounds = new HashSet<>(); IllusionerConfigs.SOUNDS.getConfig().getConfigurationSection("spawn").getKeys(false).forEach(key -> { @@ -128,9 +133,9 @@ public class IllusionerOptions { }); spawnStructure = new BlockStructure( - Material.valueOf(Configs.CONFIG.getString("spawn.bottom-block")), - Material.valueOf(Configs.CONFIG.getString("spawn.middle-block")), - Material.valueOf(Configs.CONFIG.getString("spawn.top-block")) + Material.valueOf(this.getPlugin().getConfigYml().getString("spawn.bottom-block")), + Material.valueOf(this.getPlugin().getConfigYml().getString("spawn.middle-block")), + Material.valueOf(this.getPlugin().getConfigYml().getString("spawn.top-block")) ); gameplayOptions.reload(); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/util/ProxyUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/util/ProxyUtils.java new file mode 100644 index 0000000..bb9f2fc --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/util/ProxyUtils.java @@ -0,0 +1,21 @@ +package com.willfp.illusioner.util; + +import com.willfp.eco.util.proxy.AbstractProxy; +import com.willfp.illusioner.IllusionerPlugin; +import com.willfp.illusioner.proxy.util.ProxyFactory; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.NotNull; + +@UtilityClass +public class ProxyUtils { + /** + * Get the implementation of a specified proxy. + * + * @param proxyClass The proxy interface. + * @param The type of the proxy. + * @return The proxy implementation. + */ + public @NotNull T getProxy(@NotNull final Class proxyClass) { + return new ProxyFactory<>(IllusionerPlugin.getInstance(), proxyClass).getProxy(); + } +} diff --git a/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/util/ProxyFactory.java b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/util/ProxyFactory.java new file mode 100644 index 0000000..4066638 --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/util/ProxyFactory.java @@ -0,0 +1,75 @@ +package com.willfp.illusioner.proxy.util; + +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.eco.util.proxy.AbstractProxy; +import com.willfp.eco.util.proxy.ProxyConstants; +import com.willfp.eco.util.proxy.UnsupportedVersionException; +import org.jetbrains.annotations.NotNull; + +import java.util.IdentityHashMap; +import java.util.Map; + +public class ProxyFactory extends PluginDependent { + /** + * Cached proxy implementations in order to not perform expensive reflective class-finding. + */ + private static final Map, AbstractProxy> CACHE = new IdentityHashMap<>(); + + /** + * The class of the proxy interface. + */ + private final Class proxyClass; + + /** + * Create a new Proxy Factory for a specific type. + * + * @param plugin The plugin to create proxies for. + * @param proxyClass The class of the proxy interface. + */ + public ProxyFactory(@NotNull final AbstractEcoPlugin plugin, + @NotNull final Class proxyClass) { + super(plugin); + this.proxyClass = proxyClass; + } + + /** + * Get the implementation of a proxy. + * + * @return The proxy implementation. + */ + public @NotNull T getProxy() { + try { + T cachedProxy = attemptCache(); + if (cachedProxy != null) { + return cachedProxy; + } + + String className = this.getPlugin().getProxyPackage() + "." + ProxyConstants.NMS_VERSION + "." + proxyClass.getSimpleName().replace("Proxy", ""); + final Class class2 = Class.forName(className); + Object instance = class2.getConstructor().newInstance(); + if (proxyClass.isAssignableFrom(class2) && proxyClass.isInstance(instance)) { + T proxy = proxyClass.cast(instance); + CACHE.put(proxyClass, proxy); + return proxy; + } + } catch (Exception e) { + // If not returned, then throw error + } + + throw new UnsupportedVersionException("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION); + } + + private T attemptCache() { + Object proxy = CACHE.get(proxyClass); + if (proxy == null) { + return null; + } + + if (proxyClass.isInstance(proxy)) { + return proxyClass.cast(proxy); + } + + return null; + } +} diff --git a/gradle.properties b/gradle.properties index bdc334a..5089039 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version = 2.0.3 +version = 2.1.0 plugin-name = Illusioner \ No newline at end of file