diff --git a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/OpenInventoryWrapper.java b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/OpenInventoryWrapper.java new file mode 100644 index 00000000..c31e8e42 --- /dev/null +++ b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/OpenInventoryWrapper.java @@ -0,0 +1,7 @@ +package com.willfp.ecoenchants.nms.API; + +import org.bukkit.entity.Player; + +public interface OpenInventoryWrapper { + Object getOpenInventory(Player player); +} diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/OpenInventory.java b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/OpenInventory.java new file mode 100644 index 00000000..f5c73cd1 --- /dev/null +++ b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/OpenInventory.java @@ -0,0 +1,12 @@ +package com.willfp.ecoenchants.v1_15_R1; + +import com.willfp.ecoenchants.nms.API.OpenInventoryWrapper; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class OpenInventory implements OpenInventoryWrapper { + @Override + public Object getOpenInventory(Player player) { + return ((CraftPlayer) player).getHandle().activeContainer; + } +} diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/OpenInventory.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/OpenInventory.java new file mode 100644 index 00000000..ba2136f3 --- /dev/null +++ b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/OpenInventory.java @@ -0,0 +1,12 @@ +package com.willfp.ecoenchants.v1_16_R1; + +import com.willfp.ecoenchants.nms.API.OpenInventoryWrapper; +import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class OpenInventory implements OpenInventoryWrapper { + @Override + public Object getOpenInventory(Player player) { + return ((CraftPlayer) player).getHandle().activeContainer; + } +} diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/OpenInventory.java b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/OpenInventory.java new file mode 100644 index 00000000..9e7659c8 --- /dev/null +++ b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/OpenInventory.java @@ -0,0 +1,12 @@ +package com.willfp.ecoenchants.v1_16_R2; + +import com.willfp.ecoenchants.nms.API.OpenInventoryWrapper; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class OpenInventory implements OpenInventoryWrapper { + @Override + public Object getOpenInventory(Player player) { + return ((CraftPlayer) player).getHandle().activeContainer; + } +} diff --git a/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/v1_16_R3/OpenInventory.java b/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/v1_16_R3/OpenInventory.java new file mode 100644 index 00000000..86bb6676 --- /dev/null +++ b/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/v1_16_R3/OpenInventory.java @@ -0,0 +1,12 @@ +package com.willfp.ecoenchants.v1_16_R3; + +import com.willfp.ecoenchants.nms.API.OpenInventoryWrapper; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class OpenInventory implements OpenInventoryWrapper { + @Override + public Object getOpenInventory(Player player) { + return ((CraftPlayer) player).getHandle().activeContainer; + } +} diff --git a/Plugin/build.gradle b/Plugin/build.gradle index 63c17a9a..afce598c 100644 --- a/Plugin/build.gradle +++ b/Plugin/build.gradle @@ -28,6 +28,7 @@ dependencies { compileOnly 'com.destroystokyo.paper:paper-api:1.16.3-R0.1-SNAPSHOT' compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157' compileOnly 'me.clip:placeholderapi:2.10.9' + compileOnly 'com.github.WesJD.AnvilGUI:anvilgui:master-SNAPSHOT' } shadowJar { diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java index 9453eae8..6c323743 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java @@ -2,6 +2,7 @@ package com.willfp.ecoenchants.enchantments.support.merging.anvil; import com.willfp.ecoenchants.EcoEnchantsPlugin; import com.willfp.ecoenchants.config.ConfigManager; +import com.willfp.ecoenchants.integrations.anvilgui.AnvilGUIManager; import com.willfp.ecoenchants.nms.RepairCost; import com.willfp.ecoenchants.util.NumberUtils; import com.willfp.ecoenchants.util.tuplets.Pair; @@ -34,9 +35,7 @@ public class AnvilListeners implements Listener { if(event.getViewers().isEmpty()) return; // Prevent ArrayIndexOutOfBoundsException when using AnvilGUI Player player = (Player) event.getViewers().get(0); - if(player.getOpenInventory().getTitle().toLowerCase().contains("quest")) return; // Fix for QuestsGUI - if(event.getView().getTitle().toLowerCase().contains("quest")) return; // Maybe this will fix it? - if(event.getView().getTitle().toLowerCase().contains("contents")) return; // Fix for ticketGui + if(AnvilGUIManager.hasAnvilGUIOpen(player)) return; Pair newOut = AnvilMerge.doMerge(left, right, out, name, player); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIIntegration.java b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIIntegration.java new file mode 100644 index 00000000..8ccbf411 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIIntegration.java @@ -0,0 +1,7 @@ +package com.willfp.ecoenchants.integrations.anvilgui; + +import com.willfp.ecoenchants.integrations.Integration; + +public interface AnvilGUIIntegration extends Integration { + boolean isInstance(Object object); +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIManager.java b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIManager.java new file mode 100644 index 00000000..a4f11454 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/AnvilGUIManager.java @@ -0,0 +1,21 @@ +package com.willfp.ecoenchants.integrations.anvilgui; + +import com.willfp.ecoenchants.nms.OpenInventory; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; + +public class AnvilGUIManager { + private static final Set integrations = new HashSet<>(); + + public static void registerIntegration(AnvilGUIIntegration integration) { + integrations.add(integration); + } + + public static boolean hasAnvilGUIOpen(Player player) { + if(integrations.isEmpty()) + return false; + return integrations.stream().anyMatch(integration -> integration.isInstance(OpenInventory.getOpenInventory(player))); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/plugins/AnvilGUIImpl.java b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/plugins/AnvilGUIImpl.java new file mode 100644 index 00000000..bfda6f12 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/integrations/anvilgui/plugins/AnvilGUIImpl.java @@ -0,0 +1,21 @@ +package com.willfp.ecoenchants.integrations.anvilgui.plugins; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.integrations.anvilgui.AnvilGUIIntegration; + +public class AnvilGUIImpl implements AnvilGUIIntegration { + @Override + public boolean isInstance(Object object) { + try { + return object.getClass().equals(Class.forName("net.wesjd.anvilgui.version.Wrapper" + EcoEnchantsPlugin.NMS_VERSION.substring(1) + "$AnvilContainer")); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + return false; + } + } + + @Override + public String getPluginName() { + return "AnvilGUI"; + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java index 1349ecf5..9f34a79e 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java @@ -40,6 +40,8 @@ import com.willfp.ecoenchants.integrations.antigrief.plugins.AntigriefKingdoms; import com.willfp.ecoenchants.integrations.antigrief.plugins.AntigriefLands; import com.willfp.ecoenchants.integrations.antigrief.plugins.AntigriefTowny; import com.willfp.ecoenchants.integrations.antigrief.plugins.AntigriefWorldGuard; +import com.willfp.ecoenchants.integrations.anvilgui.AnvilGUIManager; +import com.willfp.ecoenchants.integrations.anvilgui.plugins.AnvilGUIImpl; import com.willfp.ecoenchants.integrations.essentials.EssentialsManager; import com.willfp.ecoenchants.integrations.essentials.plugins.IntegrationEssentials; import com.willfp.ecoenchants.integrations.mcmmo.McmmoManager; @@ -48,10 +50,8 @@ import com.willfp.ecoenchants.integrations.placeholder.PlaceholderManager; import com.willfp.ecoenchants.integrations.placeholder.plugins.PlaceholderIntegrationPAPI; import com.willfp.ecoenchants.listeners.ArrowListeners; import com.willfp.ecoenchants.listeners.PlayerJoinListener; -import com.willfp.ecoenchants.nms.BlockBreak; -import com.willfp.ecoenchants.nms.Cooldown; -import com.willfp.ecoenchants.nms.RepairCost; -import com.willfp.ecoenchants.nms.TridentStack; +import com.willfp.ecoenchants.nms.*; +import com.willfp.ecoenchants.util.ClassUtils; import com.willfp.ecoenchants.util.Logger; import com.willfp.ecoenchants.util.StringUtils; import com.willfp.ecoenchants.util.UpdateChecker; @@ -142,6 +142,14 @@ public class Loader { Logger.error("&cAborting..."); Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); } + + if(OpenInventory.init()) { + Logger.info("Open Inventory: &aSUCCESS"); + } else { + Logger.info("Open Inventory: &cFAILURE"); + Logger.error("&cAborting..."); + Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); + } Logger.info(""); @@ -437,6 +445,13 @@ public class Loader { Logger.info("mcMMO: &9DISABLED"); } + if(ClassUtils.exists("net.wesjd.anvilgui.AnvilGUI")) { + AnvilGUIManager.registerIntegration(new AnvilGUIImpl()); + Logger.info("AnvilGUI: &aENABLED"); + } else { + Logger.info("AnvilGUI: &9DISABLED"); + } + /* Check for paper diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/nms/OpenInventory.java b/Plugin/src/main/java/com/willfp/ecoenchants/nms/OpenInventory.java new file mode 100644 index 00000000..aa5f6244 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/nms/OpenInventory.java @@ -0,0 +1,29 @@ +package com.willfp.ecoenchants.nms; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.nms.API.BlockBreakWrapper; +import com.willfp.ecoenchants.nms.API.OpenInventoryWrapper; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +public class OpenInventory { + private static OpenInventoryWrapper openInventoryWrapper; + + public static boolean init() { + try { + final Class class2 = Class.forName("com.willfp.ecoenchants." + EcoEnchantsPlugin.NMS_VERSION + ".OpenInventory"); + if (OpenInventoryWrapper.class.isAssignableFrom(class2)) { + openInventoryWrapper = (OpenInventoryWrapper) class2.getConstructor().newInstance(); + } + } catch (Exception e) { + e.printStackTrace(); + openInventoryWrapper = null; + } + return openInventoryWrapper != null; + } + + public static Object getOpenInventory(Player player) { + assert openInventoryWrapper != null; + return openInventoryWrapper.getOpenInventory(player); + } +}