From b7b01a931dc6dae13844e54b347a0647a696c232 Mon Sep 17 00:00:00 2001 From: YufiriaMazenta Date: Thu, 30 May 2024 18:51:49 +0800 Subject: [PATCH] =?UTF-8?q?[1.9.4-dev5]=E5=B0=9D=E8=AF=95=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=BD=B1=E5=93=8D=E5=88=B0=E5=85=B6=E4=BB=96=E6=8F=92?= =?UTF-8?q?=E4=BB=B6UI=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 4 +- .../craftorithm/Craftorithm.java | 3 + .../listener/OtherPluginsListenerHandler.java | 177 ++++++++++++++---- 3 files changed, 142 insertions(+), 42 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 15c7ad7b..7fd34254 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ import java.text.SimpleDateFormat -version = "1.9.4-dev4" +version = "1.9.4-dev5" plugins { `java-library` @@ -43,7 +43,7 @@ dependencies { compileOnly("io.lumine:MythicLib-dist:1.6.2-SNAPSHOT") compileOnly("net.Indyuce:MMOItems-API:6.9.5-SNAPSHOT") compileOnly("com.willfp:EcoEnchants:12.5.1") - implementation("com.crypticlib:CrypticLib:0.17.8") + implementation("com.crypticlib:CrypticLib:0.17.9") } group = "com.github.yufiriamazenta" diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java b/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java index 3d5d7bab..7385bced 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java @@ -6,6 +6,7 @@ import com.github.yufiriamazenta.craftorithm.config.PluginConfigs; import com.github.yufiriamazenta.craftorithm.item.ItemManager; import com.github.yufiriamazenta.craftorithm.listener.ItemsAdderHandler; +import com.github.yufiriamazenta.craftorithm.listener.OtherPluginsListenerHandler; import com.github.yufiriamazenta.craftorithm.recipe.RecipeManager; import com.github.yufiriamazenta.craftorithm.util.LangUtil; import com.github.yufiriamazenta.craftorithm.util.PluginHookUtil; @@ -33,6 +34,7 @@ public void enable() { initArcenciel(); loadBStat(); + Bukkit.getPluginManager().registerEvents(OtherPluginsListenerHandler.INSTANCE, this); PluginHookUtil.hookPlugins(); LangUtil.info(Languages.LOAD_FINISH); } @@ -76,6 +78,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { public void onServerLoad(ServerLoadEvent event) { if (!PluginHookUtil.isItemsAdderLoaded()) { RecipeManager.INSTANCE.reloadRecipeManager(); + OtherPluginsListenerHandler.INSTANCE.reloadOtherPluginsListener(); return; } Bukkit.getPluginManager().registerEvents(ItemsAdderHandler.INSTANCE, this); diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/listener/OtherPluginsListenerHandler.java b/src/main/java/com/github/yufiriamazenta/craftorithm/listener/OtherPluginsListenerHandler.java index 52785bdf..f20a8a0d 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/listener/OtherPluginsListenerHandler.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/listener/OtherPluginsListenerHandler.java @@ -1,10 +1,10 @@ package com.github.yufiriamazenta.craftorithm.listener; import com.github.yufiriamazenta.craftorithm.recipe.RecipeManager; -import crypticlib.listener.BukkitListener; import crypticlib.util.ReflectUtil; import org.bukkit.NamespacedKey; import org.bukkit.event.*; +import org.bukkit.event.block.BlockCookEvent; import org.bukkit.event.inventory.*; import org.bukkit.inventory.Recipe; import org.bukkit.plugin.EventExecutor; @@ -16,63 +16,68 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -@BukkitListener public enum OtherPluginsListenerHandler implements Listener { INSTANCE; private final Field executorField = ReflectUtil.getDeclaredField(RegisteredListener.class, "executor"); private final Map> prepareItemCraftEventListeners = new ConcurrentHashMap<>(); - private final Map> craftItemEventListeners = new ConcurrentHashMap<>(); + //因为CraftItemEvent与SmithItemEvent的handler list与InventoryClickEvent共享,所以只能放在一起 + private final Map> inventoryClickEventListeners = new ConcurrentHashMap<>(); private final Map> prePareSmithingItemEventListeners = new ConcurrentHashMap<>(); - private final Map> smithingItemEventListeners = new ConcurrentHashMap<>(); private final Map> furnaceSmeltListeners = new ConcurrentHashMap<>(); + private final Map> blockCookListeners = new ConcurrentHashMap<>(); public void reloadOtherPluginsListener() { loadProxyPrepareItemCraftEventListeners(); - loadProxyCraftItemEventListeners(); + loadProxyInventoryClickEventListeners(); loadProxyPrepareSmithingItemEventListeners(); - loadProxySmithingItemEventListeners(); loadProxyFurnaceSmeltListeners(); + loadBlockCookListeners(); + } + + private void loadBlockCookListeners() { + for (RegisteredListener registeredListener : BlockCookEvent.getHandlerList().getRegisteredListeners()) { + if (addListenerCache(registeredListener, blockCookListeners)) { + BlockCookEvent.getHandlerList().unregister(registeredListener); + } + } } private void loadProxyPrepareItemCraftEventListeners() { for (RegisteredListener registeredListener : PrepareItemCraftEvent.getHandlerList().getRegisteredListeners()) { - addListenerCache(registeredListener, prepareItemCraftEventListeners); - PrepareItemCraftEvent.getHandlerList().unregister(registeredListener); + if (addListenerCache(registeredListener, prepareItemCraftEventListeners)) { + PrepareItemCraftEvent.getHandlerList().unregister(registeredListener); + } } } - private void loadProxyCraftItemEventListeners() { - for (RegisteredListener registeredListener : CraftItemEvent.getHandlerList().getRegisteredListeners()) { - addListenerCache(registeredListener, craftItemEventListeners); - CraftItemEvent.getHandlerList().unregister(registeredListener); + private void loadProxyInventoryClickEventListeners() { + for (RegisteredListener registeredListener : InventoryClickEvent.getHandlerList().getRegisteredListeners()) { + if (addListenerCache(registeredListener, inventoryClickEventListeners)) { + InventoryClickEvent.getHandlerList().unregister(registeredListener); + } } } private void loadProxyPrepareSmithingItemEventListeners() { for (RegisteredListener registeredListener : PrepareSmithingEvent.getHandlerList().getRegisteredListeners()) { - addListenerCache(registeredListener, prePareSmithingItemEventListeners); - PrepareSmithingEvent.getHandlerList().unregister(registeredListener); - } - } - - private void loadProxySmithingItemEventListeners() { - for (RegisteredListener registeredListener : SmithItemEvent.getHandlerList().getRegisteredListeners()) { - addListenerCache(registeredListener, smithingItemEventListeners); - SmithItemEvent.getHandlerList().unregister(registeredListener); + if (addListenerCache(registeredListener, prePareSmithingItemEventListeners)) { + PrepareSmithingEvent.getHandlerList().unregister(registeredListener); + } } } private void loadProxyFurnaceSmeltListeners() { for (RegisteredListener registeredListener : FurnaceSmeltEvent.getHandlerList().getRegisteredListeners()) { - addListenerCache(registeredListener, furnaceSmeltListeners); - FurnaceSmeltEvent.getHandlerList().unregister(registeredListener); + if (addListenerCache(registeredListener, furnaceSmeltListeners)) { + FurnaceSmeltEvent.getHandlerList().unregister(registeredListener); + } } } - private void addListenerCache(RegisteredListener registeredListener, Map> listenerMap) { + private boolean addListenerCache(RegisteredListener registeredListener, Map> listenerMap) { if (registeredListener.getPlugin().getName().equals("Craftorithm")) { - return; + return false; } EventPriority priority = registeredListener.getPriority(); if (listenerMap.containsKey(priority)) { @@ -85,6 +90,7 @@ private void addListenerCache(RegisteredListener registeredListener, Map registeredListeners = craftItemEventListeners.get(eventPriority); + List registeredListeners = inventoryClickEventListeners.get(eventPriority); if (registeredListeners == null) { return; } @@ -238,37 +244,37 @@ private void proxyPrepareSmithing(PrepareSmithingEvent event, EventPriority even } @EventHandler(priority = EventPriority.LOWEST) - public void proxyLowestSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.LOWEST); + public void proxyLowestSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.LOWEST); } @EventHandler(priority = EventPriority.LOW) - public void proxyLowSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.LOW); + public void proxyLowSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.LOW); } @EventHandler(priority = EventPriority.NORMAL) - public void proxyNormalSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.NORMAL); + public void proxyNormalSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.NORMAL); } @EventHandler(priority = EventPriority.HIGH) - public void proxyHighSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.HIGH); + public void proxyHighSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.HIGH); } @EventHandler(priority = EventPriority.HIGHEST) - public void proxyHighestSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.HIGHEST); + public void proxyHighestSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.HIGHEST); } @EventHandler(priority = EventPriority.MONITOR) - public void proxyMonitorSmithingItem(SmithItemEvent event) { - proxySmithingItem(event, EventPriority.MONITOR); + public void proxyMonitorSmithItem(SmithItemEvent event) { + proxySmithItem(event, EventPriority.MONITOR); } - private void proxySmithingItem(SmithItemEvent event, EventPriority eventPriority) { - List registeredListeners = smithingItemEventListeners.get(eventPriority); + private void proxySmithItem(SmithItemEvent event, EventPriority eventPriority) { + List registeredListeners = inventoryClickEventListeners.get(eventPriority); if (registeredListeners == null) { return; } @@ -333,6 +339,97 @@ private void proxyFurnaceSmelt(FurnaceSmeltEvent event, EventPriority eventPrior } } + @EventHandler(priority = EventPriority.LOWEST) + public void proxyLowestBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.LOWEST); + } + + @EventHandler(priority = EventPriority.LOW) + public void proxyLowBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.LOW); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void proxyNormalBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.NORMAL); + } + + @EventHandler(priority = EventPriority.HIGH) + public void proxyHighBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.HIGH); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void proxyHighestBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.HIGHEST); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void proxyMonitorBlockCook(BlockCookEvent event) { + proxyBlockCook(event, EventPriority.MONITOR); + } + + private void proxyBlockCook(BlockCookEvent event, EventPriority eventPriority) { + List registeredListeners = blockCookListeners.get(eventPriority); + if (registeredListeners == null) { + return; + } + if (registeredListeners.isEmpty()) { + return; + } + Recipe recipe = event.getRecipe(); + if (recipe == null) { + executeListener(event, registeredListeners); + } + NamespacedKey recipeKey = RecipeManager.INSTANCE.getRecipeKey(recipe); + if (recipeKey == null || !recipeKey.getNamespace().equals(RecipeManager.INSTANCE.PLUGIN_RECIPE_NAMESPACE)) { + executeListener(event, registeredListeners); + } + } + + //因为CraftItemEvent与SmithItemEvent的handler list与InventoryClickEvent共享,所以必须也代理此事件 + //否则将会影响其他插件操作页面 + @EventHandler(priority = EventPriority.LOWEST) + public void proxyLowestInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.LOWEST); + } + + @EventHandler(priority = EventPriority.LOW) + public void proxyLowInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.LOW); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void proxyNormalInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.NORMAL); + } + + @EventHandler(priority = EventPriority.HIGH) + public void proxyHighInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.HIGH); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void proxyHighestInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.HIGHEST); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void proxyMonitorInventoryClick(InventoryClickEvent event) { + proxyInventoryClick(event, EventPriority.MONITOR); + } + + private void proxyInventoryClick(InventoryClickEvent event, EventPriority eventPriority) { + List registeredListeners = inventoryClickEventListeners.get(eventPriority); + if (registeredListeners == null) { + return; + } + if (registeredListeners.isEmpty()) { + return; + } + executeListener(event, registeredListeners); + } + public void executeListener(Event event, List registeredListeners) { for (RegisteredListener prepareCraftIAListener : registeredListeners) { try {