From 22599654961e490fb34f46c4a4a617db76601dc1 Mon Sep 17 00:00:00 2001 From: carm Date: Wed, 8 Feb 2023 20:11:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(null):=20=E4=BF=AE=E5=A4=8D=E7=89=A9?= =?UTF-8?q?=E5=93=81=E5=8F=AF=E8=83=BD=E4=B8=BA=E7=A9=BA=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 +++- .../java/cc/carm/plugin/scriptitems/Main.java | 2 + .../scriptitems/listener/ItemListener.java | 48 ----------------- .../scriptitems/listener/ProtectListener.java | 53 +++++++++++++++++++ .../scriptitems/manager/ItemsManager.java | 5 +- 5 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 src/main/java/cc/carm/plugin/scriptitems/listener/ProtectListener.java diff --git a/pom.xml b/pom.xml index a77a968..448d5b9 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ cc.carm.plugin scriptitems - 1.1.0 + 1.1.1 ScriptItems 物品操作绑定插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。 @@ -99,6 +99,14 @@ true + + cc.carm.lib + easyplugin-listener + ${deps.easyplugin.version} + compile + true + + cc.carm.lib easyplugin-githubchecker diff --git a/src/main/java/cc/carm/plugin/scriptitems/Main.java b/src/main/java/cc/carm/plugin/scriptitems/Main.java index 4acc515..db640d0 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/Main.java +++ b/src/main/java/cc/carm/plugin/scriptitems/Main.java @@ -8,6 +8,7 @@ import cc.carm.plugin.scriptitems.command.MainCommand; import cc.carm.plugin.scriptitems.conf.PluginConfig; import cc.carm.plugin.scriptitems.conf.PluginMessages; import cc.carm.plugin.scriptitems.listener.ItemListener; +import cc.carm.plugin.scriptitems.listener.ProtectListener; import cc.carm.plugin.scriptitems.manager.ItemsManager; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; @@ -45,6 +46,7 @@ public class Main extends EasyPlugin { info("注册监听器..."); registerListener(new ItemListener()); + registerListener(new ProtectListener(this)); if (PluginConfig.METRICS.getNotNull()) { info("启用统计数据..."); diff --git a/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java b/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java index d6f8380..ad2c21e 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java +++ b/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java @@ -9,21 +9,15 @@ import cc.carm.plugin.scriptitems.item.ScriptConfiguration; import cc.carm.plugin.scriptitems.item.ScriptItem; import cc.carm.plugin.scriptitems.item.ScriptRestrictions; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityPickupItemEvent; -import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import java.util.Arrays; import java.util.UUID; public class ItemListener implements Listener { @@ -72,48 +66,6 @@ public class ItemListener implements Listener { actions.execute(player); } - /** - * 监听玩家合成,阻止玩家将指令物品合成浪费掉。 - * - * @param event 合成事件 - */ - @EventHandler - public void onCraft(CraftItemEvent event) { - boolean shouldCancel = Arrays.stream(event.getInventory().getMatrix()) - .anyMatch(matrix -> ScriptItemsAPI.getItemsManager().isScriptItem(matrix)); - - if (shouldCancel) event.setCancelled(true); - } - - /** - * 阻止非玩家捡起指令物品 - * - * @param event 捡起事件 - */ - @EventHandler - public void onPickup(EntityPickupItemEvent event) { - if (event.getEntity().getType() == EntityType.PLAYER) return; - - ItemStack item = event.getItem().getItemStack(); - if (ScriptItemsAPI.getItemsManager().isScriptItem(item)) { - event.setCancelled(true); - } - } - - /** - * 阻止物品被烧掉 - * - * @param event 伤害事件 - */ - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (event.getEntity().getType() != EntityType.DROPPED_ITEM) return; - Item droppedItem = ((org.bukkit.entity.Item) event.getEntity()); - ItemStack item = droppedItem.getItemStack(); - if (ScriptItemsAPI.getItemsManager().isScriptItem(item)) { - event.setCancelled(true); - } - } @EventHandler public void onLeave(PlayerQuitEvent event) { diff --git a/src/main/java/cc/carm/plugin/scriptitems/listener/ProtectListener.java b/src/main/java/cc/carm/plugin/scriptitems/listener/ProtectListener.java new file mode 100644 index 0000000..cd90cd4 --- /dev/null +++ b/src/main/java/cc/carm/plugin/scriptitems/listener/ProtectListener.java @@ -0,0 +1,53 @@ +package cc.carm.plugin.scriptitems.listener; + +import cc.carm.lib.easyplugin.listener.EasyListener; +import cc.carm.plugin.scriptitems.ScriptItemsAPI; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.event.enchantment.PrepareItemEnchantEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.util.Arrays; + +public class ProtectListener extends EasyListener { + + public ProtectListener(Plugin plugin) { + super(plugin); + + //监听玩家合成,阻止玩家将指令物品合成浪费掉。 + cancel(CraftItemEvent.class, event -> isScriptItem(event.getInventory().getMatrix())); + + // 阻止铁砧和附魔台对指令物品的操作 + cancel(PrepareItemEnchantEvent.class, event -> isScriptItem(event.getItem())); + handleEvent(PrepareAnvilEvent.class) + .filter(e -> isScriptItem(e.getResult())) + .handle(e -> e.setResult(null)); + + // 阻止非玩家捡起指令物品 + handleEvent(EntityPickupItemEvent.class) + .filter(e -> e.getEntity().getType() != EntityType.PLAYER) + .filter(e -> isScriptItem(e.getItem().getItemStack())) + .cancel(); + + // 阻止物品被烧掉 + handleEvent(EntityDamageEvent.class) + .filter(e -> e.getEntity().getType() == EntityType.DROPPED_ITEM) + .filter(e -> isScriptItem(((Item) e.getEntity()).getItemStack())) + .cancel(); + + } + + public boolean isScriptItem(ItemStack item) { + return ScriptItemsAPI.getItemsManager().isScriptItem(item); + } + + public boolean isScriptItem(ItemStack... items) { + return Arrays.stream(items).anyMatch(this::isScriptItem); + } + +} diff --git a/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java b/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java index ca6e05e..861b9aa 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java +++ b/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java @@ -118,8 +118,9 @@ public class ItemsManager { return new ScriptItem(UUID.fromString(itemUUID), settings, item); } - public boolean isScriptItem(ItemStack item) { - return item.hasItemMeta() && item.getItemMeta() != null + public boolean isScriptItem(@Nullable ItemStack item) { + return item != null && item.getType() != Material.AIR + && item.hasItemMeta() && item.getItemMeta() != null && item.getItemMeta().getCustomTagContainer().hasCustomTag(idKey, ItemTagType.STRING); }