Skip to content

Commit 2259965

Browse files
committed
fix(null): 修复物品可能为空导致的报错问题
1 parent 629bdbe commit 2259965

5 files changed

Lines changed: 67 additions & 51 deletions

File tree

pom.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
<groupId>cc.carm.plugin</groupId>
2020
<artifactId>scriptitems</artifactId>
21-
<version>1.1.0</version>
21+
<version>1.1.1</version>
2222

2323
<name>ScriptItems</name>
2424
<description>物品操作绑定插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。</description>
@@ -99,6 +99,14 @@
9999
<optional>true</optional>
100100
</dependency>
101101

102+
<dependency>
103+
<groupId>cc.carm.lib</groupId>
104+
<artifactId>easyplugin-listener</artifactId>
105+
<version>${deps.easyplugin.version}</version>
106+
<scope>compile</scope>
107+
<optional>true</optional>
108+
</dependency>
109+
102110
<dependency>
103111
<groupId>cc.carm.lib</groupId>
104112
<artifactId>easyplugin-githubchecker</artifactId>

src/main/java/cc/carm/plugin/scriptitems/Main.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import cc.carm.plugin.scriptitems.conf.PluginConfig;
99
import cc.carm.plugin.scriptitems.conf.PluginMessages;
1010
import cc.carm.plugin.scriptitems.listener.ItemListener;
11+
import cc.carm.plugin.scriptitems.listener.ProtectListener;
1112
import cc.carm.plugin.scriptitems.manager.ItemsManager;
1213
import org.bstats.bukkit.Metrics;
1314
import org.bukkit.Bukkit;
@@ -45,6 +46,7 @@ protected boolean initialize() {
4546

4647
info("注册监听器...");
4748
registerListener(new ItemListener());
49+
registerListener(new ProtectListener(this));
4850

4951
if (PluginConfig.METRICS.getNotNull()) {
5052
info("启用统计数据...");

src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,15 @@
99
import cc.carm.plugin.scriptitems.item.ScriptItem;
1010
import cc.carm.plugin.scriptitems.item.ScriptRestrictions;
1111
import org.bukkit.entity.Entity;
12-
import org.bukkit.entity.EntityType;
13-
import org.bukkit.entity.Item;
1412
import org.bukkit.entity.Player;
1513
import org.bukkit.event.EventHandler;
1614
import org.bukkit.event.Listener;
1715
import org.bukkit.event.block.Action;
18-
import org.bukkit.event.entity.EntityDamageEvent;
19-
import org.bukkit.event.entity.EntityPickupItemEvent;
20-
import org.bukkit.event.inventory.CraftItemEvent;
2116
import org.bukkit.event.player.PlayerInteractEvent;
2217
import org.bukkit.event.player.PlayerQuitEvent;
2318
import org.bukkit.inventory.ItemStack;
2419
import org.jetbrains.annotations.NotNull;
2520

26-
import java.util.Arrays;
2721
import java.util.UUID;
2822

2923
public class ItemListener implements Listener {
@@ -72,48 +66,6 @@ public void onClick(PlayerInteractEvent event) {
7266
actions.execute(player);
7367
}
7468

75-
/**
76-
* 监听玩家合成,阻止玩家将指令物品合成浪费掉。
77-
*
78-
* @param event 合成事件
79-
*/
80-
@EventHandler
81-
public void onCraft(CraftItemEvent event) {
82-
boolean shouldCancel = Arrays.stream(event.getInventory().getMatrix())
83-
.anyMatch(matrix -> ScriptItemsAPI.getItemsManager().isScriptItem(matrix));
84-
85-
if (shouldCancel) event.setCancelled(true);
86-
}
87-
88-
/**
89-
* 阻止非玩家捡起指令物品
90-
*
91-
* @param event 捡起事件
92-
*/
93-
@EventHandler
94-
public void onPickup(EntityPickupItemEvent event) {
95-
if (event.getEntity().getType() == EntityType.PLAYER) return;
96-
97-
ItemStack item = event.getItem().getItemStack();
98-
if (ScriptItemsAPI.getItemsManager().isScriptItem(item)) {
99-
event.setCancelled(true);
100-
}
101-
}
102-
103-
/**
104-
* 阻止物品被烧掉
105-
*
106-
* @param event 伤害事件
107-
*/
108-
@EventHandler
109-
public void onEntityDamage(EntityDamageEvent event) {
110-
if (event.getEntity().getType() != EntityType.DROPPED_ITEM) return;
111-
Item droppedItem = ((org.bukkit.entity.Item) event.getEntity());
112-
ItemStack item = droppedItem.getItemStack();
113-
if (ScriptItemsAPI.getItemsManager().isScriptItem(item)) {
114-
event.setCancelled(true);
115-
}
116-
}
11769

11870
@EventHandler
11971
public void onLeave(PlayerQuitEvent event) {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package cc.carm.plugin.scriptitems.listener;
2+
3+
import cc.carm.lib.easyplugin.listener.EasyListener;
4+
import cc.carm.plugin.scriptitems.ScriptItemsAPI;
5+
import org.bukkit.entity.EntityType;
6+
import org.bukkit.entity.Item;
7+
import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
8+
import org.bukkit.event.entity.EntityDamageEvent;
9+
import org.bukkit.event.entity.EntityPickupItemEvent;
10+
import org.bukkit.event.inventory.CraftItemEvent;
11+
import org.bukkit.event.inventory.PrepareAnvilEvent;
12+
import org.bukkit.inventory.ItemStack;
13+
import org.bukkit.plugin.Plugin;
14+
15+
import java.util.Arrays;
16+
17+
public class ProtectListener extends EasyListener {
18+
19+
public ProtectListener(Plugin plugin) {
20+
super(plugin);
21+
22+
//监听玩家合成,阻止玩家将指令物品合成浪费掉。
23+
cancel(CraftItemEvent.class, event -> isScriptItem(event.getInventory().getMatrix()));
24+
25+
// 阻止铁砧和附魔台对指令物品的操作
26+
cancel(PrepareItemEnchantEvent.class, event -> isScriptItem(event.getItem()));
27+
handleEvent(PrepareAnvilEvent.class)
28+
.filter(e -> isScriptItem(e.getResult()))
29+
.handle(e -> e.setResult(null));
30+
31+
// 阻止非玩家捡起指令物品
32+
handleEvent(EntityPickupItemEvent.class)
33+
.filter(e -> e.getEntity().getType() != EntityType.PLAYER)
34+
.filter(e -> isScriptItem(e.getItem().getItemStack()))
35+
.cancel();
36+
37+
// 阻止物品被烧掉
38+
handleEvent(EntityDamageEvent.class)
39+
.filter(e -> e.getEntity().getType() == EntityType.DROPPED_ITEM)
40+
.filter(e -> isScriptItem(((Item) e.getEntity()).getItemStack()))
41+
.cancel();
42+
43+
}
44+
45+
public boolean isScriptItem(ItemStack item) {
46+
return ScriptItemsAPI.getItemsManager().isScriptItem(item);
47+
}
48+
49+
public boolean isScriptItem(ItemStack... items) {
50+
return Arrays.stream(items).anyMatch(this::isScriptItem);
51+
}
52+
53+
}

src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,9 @@ public ItemStack applyTag(@NotNull ItemStack originalItem, String identifier, UU
118118
return new ScriptItem(UUID.fromString(itemUUID), settings, item);
119119
}
120120

121-
public boolean isScriptItem(ItemStack item) {
122-
return item.hasItemMeta() && item.getItemMeta() != null
121+
public boolean isScriptItem(@Nullable ItemStack item) {
122+
return item != null && item.getType() != Material.AIR
123+
&& item.hasItemMeta() && item.getItemMeta() != null
123124
&& item.getItemMeta().getCustomTagContainer().hasCustomTag(idKey, ItemTagType.STRING);
124125
}
125126

0 commit comments

Comments
 (0)