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);
}