diff --git a/build.gradle b/build.gradle index 84e3d61..f5afd41 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ allprojects { } dependencies { - compileOnly 'com.willfp:eco:2.0.0' + compileOnly 'com.willfp:eco:3.0.0' compileOnly 'org.jetbrains:annotations:19.0.0' diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java index 21b6598..3cf9a7c 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/TalismansPlugin.java @@ -25,6 +25,7 @@ import com.willfp.talismans.talismans.util.TalismanCraftListener; import com.willfp.talismans.talismans.util.WatcherTriggers; import com.willfp.talismans.talismans.util.equipevent.SyncTalismanEquipEventTask; import com.willfp.talismans.talismans.util.equipevent.TalismanEquipEventListeners; +import lombok.Getter; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; @@ -33,11 +34,18 @@ import java.util.List; @SuppressWarnings("unused") public class TalismansPlugin extends AbstractEcoPlugin { + /** + * Instance of the plugin. + */ + @Getter + private static TalismansPlugin instance; + /** * Internal constructor called by bukkit on plugin load. */ public TalismansPlugin() { super("Talismans", 87377, 9865, "com.willfp.talismans.proxy", "&6"); + instance = this; } /** diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalgive.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalgive.java index 92e511c..dbee585 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalgive.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalgive.java @@ -2,7 +2,6 @@ package com.willfp.talismans.commands; import com.willfp.eco.util.command.AbstractCommand; import com.willfp.eco.util.command.AbstractTabCompleter; -import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.talismans.talismans.Talisman; import com.willfp.talismans.talismans.Talismans; @@ -33,12 +32,12 @@ public class CommandTalgive extends AbstractCommand { public void onExecute(@NotNull final CommandSender sender, @NotNull final List args) { if (args.isEmpty()) { - sender.sendMessage(Configs.LANG.getMessage("needs-player")); + sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player")); return; } if (args.size() == 1) { - sender.sendMessage(Configs.LANG.getMessage("needs-talisman")); + sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-talisman")); return; } @@ -46,18 +45,18 @@ public class CommandTalgive extends AbstractCommand { Player reciever = Bukkit.getPlayer(recieverName); if (reciever == null) { - sender.sendMessage(Configs.LANG.getMessage("invalid-player")); + sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player")); return; } String talismanName = args.get(1); Talisman talisman = Talismans.getByKey(this.getPlugin().getNamespacedKeyFactory().create(talismanName)); if (talisman == null) { - sender.sendMessage(Configs.LANG.getMessage("invalid-talisman")); + sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-talisman")); return; } - String message = Configs.LANG.getMessage("give-success"); + String message = this.getPlugin().getLangYml().getMessage("give-success"); message = message.replace("%talisman%", talisman.getFormattedName()).replace("%recipient%", reciever.getName()); sender.sendMessage(message); reciever.getInventory().addItem(talisman.getItemStack()); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalreload.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalreload.java index b6d1e1c..694635d 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalreload.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/commands/CommandTalreload.java @@ -1,7 +1,6 @@ package com.willfp.talismans.commands; import com.willfp.eco.util.command.AbstractCommand; -import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -23,6 +22,6 @@ public class CommandTalreload extends AbstractCommand { @NotNull final List args) { this.getPlugin().reload(); this.getPlugin().reload(); // Aids - 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/talismans/config/TalismanYamlConfig.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/config/TalismanYamlConfig.java index ece2bba..f726b04 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/config/TalismanYamlConfig.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/config/TalismanYamlConfig.java @@ -3,6 +3,7 @@ package com.willfp.talismans.config; import com.willfp.eco.util.config.ValueGetter; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.talismans.TalismansPlugin; import com.willfp.talismans.talismans.meta.TalismanStrength; import lombok.AccessLevel; import lombok.Getter; @@ -64,7 +65,7 @@ public abstract class TalismanYamlConfig extends PluginDependent implements Valu protected TalismanYamlConfig(@NotNull final String name, @NotNull final TalismanStrength strength, @NotNull final Class source) { - super(AbstractEcoPlugin.getInstance()); + super(TalismansPlugin.getInstance()); this.name = name; this.source = source; this.strength = strength; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/TalismanDisplay.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/TalismanDisplay.java index 33f63b8..faadbbf 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/TalismanDisplay.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/TalismanDisplay.java @@ -1,9 +1,10 @@ package com.willfp.talismans.display; -import com.willfp.eco.util.ProxyUtils; +import com.willfp.talismans.TalismansPlugin; import com.willfp.talismans.proxy.proxies.SkullProxy; import com.willfp.talismans.talismans.Talisman; import com.willfp.talismans.talismans.util.TalismanChecks; +import com.willfp.talismans.util.ProxyUtils; import lombok.experimental.UtilityClass; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -16,6 +17,11 @@ import java.util.List; @UtilityClass public class TalismanDisplay { + /** + * Instance of Talismans. + */ + private static final TalismansPlugin PLUGIN = TalismansPlugin.getInstance(); + /** * The prefix for all talisman lines to have in lore. */ diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketAutoRecipe.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketAutoRecipe.java index fc1649e..22c057b 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketAutoRecipe.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketAutoRecipe.java @@ -3,10 +3,10 @@ package com.willfp.talismans.display.packets; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; -import com.willfp.eco.util.ProxyUtils; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.protocollib.AbstractPacketAdapter; import com.willfp.talismans.proxy.proxies.AutoCraftProxy; +import com.willfp.talismans.util.ProxyUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketChat.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketChat.java index 90af977..a56f056 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketChat.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketChat.java @@ -4,10 +4,10 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.willfp.eco.util.ProxyUtils; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.protocollib.AbstractPacketAdapter; import com.willfp.talismans.proxy.proxies.ChatComponentProxy; +import com.willfp.talismans.util.ProxyUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -33,7 +33,7 @@ public class PacketChat extends AbstractPacketAdapter { if (component.getHandle() == null) { return; } - WrappedChatComponent newComponent = WrappedChatComponent.fromHandle(ProxyUtils.getProxy(ChatComponentProxy.class).modifyComponent(component.getHandle())); + WrappedChatComponent newComponent = WrappedChatComponent.fromHandle(ProxyUtils.getProxy( ChatComponentProxy.class).modifyComponent(component.getHandle())); packet.getChatComponents().write(i, newComponent); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketOpenWindowMerchant.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketOpenWindowMerchant.java index a182b17..3173f30 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketOpenWindowMerchant.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/display/packets/PacketOpenWindowMerchant.java @@ -2,10 +2,10 @@ package com.willfp.talismans.display.packets; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; -import com.willfp.eco.util.ProxyUtils; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.protocollib.AbstractPacketAdapter; import com.willfp.talismans.proxy.proxies.VillagerTradeProxy; +import com.willfp.talismans.util.ProxyUtils; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.MerchantRecipe; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java index 266933f..be91bdf 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java @@ -1,13 +1,13 @@ package com.willfp.talismans.talismans; -import com.willfp.eco.common.recipes.lookup.RecipePartUtils; -import com.willfp.eco.common.recipes.parts.ComplexRecipePart; import com.willfp.eco.util.StringUtils; -import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.optional.Prerequisite; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.recipe.EcoShapedRecipe; +import com.willfp.eco.util.recipe.lookup.RecipePartUtils; +import com.willfp.eco.util.recipe.parts.ComplexRecipePart; +import com.willfp.talismans.TalismansPlugin; import com.willfp.talismans.config.TalismansConfigs; import com.willfp.talismans.config.configs.TalismanConfig; import com.willfp.talismans.display.TalismanDisplay; @@ -45,7 +45,7 @@ public abstract class Talisman implements Listener, Watcher { * Instance of Talismans for talismans to be able to access. */ @Getter(AccessLevel.PROTECTED) - private final AbstractEcoPlugin plugin = AbstractEcoPlugin.getInstance(); + private final AbstractEcoPlugin plugin = TalismansPlugin.getInstance(); /** * The key to store talismans in meta. @@ -173,8 +173,8 @@ public abstract class Talisman implements Listener, Watcher { disabledWorldNames.addAll(config.getStrings(Talismans.GENERAL_LOCATION + "disabled-in-worlds")); disabledWorlds.clear(); - formattedDescription = Arrays.stream(WordUtils.wrap(description, Configs.CONFIG.getInt("description.wrap"), "\n", false).split("\\r?\\n")) - .map(s -> TalismanDisplay.PREFIX + StringUtils.translate(Configs.LANG.getString("description-color") + s)).collect(Collectors.toList()); + formattedDescription = Arrays.stream(WordUtils.wrap(description, this.getPlugin().getConfigYml().getInt("description.wrap"), "\n", false).split("\\r?\\n")) + .map(s -> TalismanDisplay.PREFIX + StringUtils.translate(this.getPlugin().getLangYml().getString("description-color") + s)).collect(Collectors.toList()); List worldNames = Bukkit.getWorlds().stream().map(World::getName).map(String::toLowerCase).collect(Collectors.toList()); List disabledExistingWorldNames = disabledWorldNames.stream().filter(s -> worldNames.contains(s.toLowerCase())).collect(Collectors.toList()); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/meta/TalismanStrength.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/meta/TalismanStrength.java index 8b2076a..792eb27 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/meta/TalismanStrength.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/meta/TalismanStrength.java @@ -1,27 +1,29 @@ package com.willfp.talismans.talismans.meta; -import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.config.updating.annotations.ConfigUpdater; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.talismans.TalismansPlugin; import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public enum TalismanStrength { + /** * Weakest. */ - TALISMAN(() -> Configs.CONFIG.getString("strengths.talisman.color")), + TALISMAN(() -> TalismansPlugin.getInstance().getConfigYml().getString("strengths.talisman.color")), /** * Middle. */ - RING(() -> Configs.CONFIG.getString("strengths.ring.color")), + RING(() -> TalismansPlugin.getInstance().getConfigYml().getString("strengths.ring.color")), /** * Strongest. */ - RELIC(() -> Configs.CONFIG.getString("strengths.relic.color")); + RELIC(() -> TalismansPlugin.getInstance().getConfigYml().getString("strengths.relic.color")); /** * The color. diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java index c7621f2..40837d8 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java @@ -1,9 +1,8 @@ package com.willfp.talismans.talismans.util; - -import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.config.updating.annotations.ConfigUpdater; import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.talismans.TalismansPlugin; import com.willfp.talismans.talismans.Talisman; import com.willfp.talismans.talismans.Talismans; import lombok.experimental.UtilityClass; @@ -50,7 +49,7 @@ public class TalismanChecks { /** * The associated plugin instance. */ - private static final AbstractEcoPlugin PLUGIN = AbstractEcoPlugin.getInstance(); + private static final AbstractEcoPlugin PLUGIN = TalismansPlugin.getInstance(); /** * Does the specified ItemStack have a certain Talisman present? @@ -201,7 +200,7 @@ public class TalismanChecks { @ConfigUpdater public static void reload() { - readEnderChest = Configs.CONFIG.getBool("read-enderchest"); - readShulkerBoxes = Configs.CONFIG.getBool("read-shulkerboxes"); + readEnderChest = PLUGIN.getConfigYml().getBool("read-enderchest"); + readShulkerBoxes = PLUGIN.getConfigYml().getBool("read-shulkerboxes"); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/WatcherTriggers.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/WatcherTriggers.java index a0742cd..03e0581 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/WatcherTriggers.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/WatcherTriggers.java @@ -1,12 +1,12 @@ package com.willfp.talismans.talismans.util; import com.google.common.collect.Sets; -import com.willfp.eco.util.ProxyUtils; import com.willfp.eco.util.integrations.antigrief.AntigriefManager; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.talismans.integrations.mcmmo.McmmoManager; import com.willfp.talismans.proxy.proxies.TridentStackProxy; +import com.willfp.talismans.util.ProxyUtils; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Arrow; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/util/ProxyUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/util/ProxyUtils.java new file mode 100644 index 0000000..9c4461f --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/util/ProxyUtils.java @@ -0,0 +1,21 @@ +package com.willfp.talismans.util; + +import com.willfp.eco.util.proxy.AbstractProxy; +import com.willfp.talismans.TalismansPlugin; +import com.willfp.talismans.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<>(TalismansPlugin.getInstance(), proxyClass).getProxy(); + } +} diff --git a/eco-core/core-plugin/src/main/resources/plugin.yml b/eco-core/core-plugin/src/main/resources/plugin.yml index 40530a2..59adfa6 100644 --- a/eco-core/core-plugin/src/main/resources/plugin.yml +++ b/eco-core/core-plugin/src/main/resources/plugin.yml @@ -51,7 +51,7 @@ permissions: default: op talismans.give: description: Allows the use of /talgive. - default: true + default: op talismans.fromtable.*: description: Allows crafting all talismans default: true \ No newline at end of file diff --git a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/BlockBreakProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/BlockBreakProxy.java index c130c70..dd602b6 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/BlockBreakProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/BlockBreakProxy.java @@ -1,6 +1,5 @@ package com.willfp.talismans.proxy.proxies; - import com.willfp.eco.util.proxy.AbstractProxy; import org.bukkit.block.Block; import org.bukkit.entity.Player; diff --git a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/ChatComponentProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/ChatComponentProxy.java index c5cde0e..684a14c 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/ChatComponentProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/ChatComponentProxy.java @@ -1,6 +1,5 @@ package com.willfp.talismans.proxy.proxies; - import com.willfp.eco.util.proxy.AbstractProxy; import org.jetbrains.annotations.NotNull; diff --git a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/CooldownProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/CooldownProxy.java index 57d3250..70e1445 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/CooldownProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/CooldownProxy.java @@ -1,6 +1,5 @@ package com.willfp.talismans.proxy.proxies; - import com.willfp.eco.util.proxy.AbstractProxy; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/TridentStackProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/TridentStackProxy.java index 7d4c71a..55cc5db 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/TridentStackProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/proxies/TridentStackProxy.java @@ -1,6 +1,5 @@ package com.willfp.talismans.proxy.proxies; - import com.willfp.eco.util.proxy.AbstractProxy; import org.bukkit.entity.Trident; import org.bukkit.inventory.ItemStack; diff --git a/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/util/ProxyFactory.java b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/util/ProxyFactory.java new file mode 100644 index 0000000..66dbb17 --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/talismans/proxy/util/ProxyFactory.java @@ -0,0 +1,75 @@ +package com.willfp.talismans.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; + } +}