1
mirror of https://github.com/CarmJos/ScriptItems synced 2024-09-18 21:05:51 +00:00

fix(null): 修复物品可能为空导致的报错问题

This commit is contained in:
Carm Jos 2023-02-08 20:11:00 +08:00
parent 629bdbeac9
commit 2259965496
5 changed files with 67 additions and 51 deletions

10
pom.xml
View File

@ -18,7 +18,7 @@
<groupId>cc.carm.plugin</groupId>
<artifactId>scriptitems</artifactId>
<version>1.1.0</version>
<version>1.1.1</version>
<name>ScriptItems</name>
<description>物品操作绑定插件给予玩家可执行对应操作的物品基于EasyPlugin实现。</description>
@ -99,6 +99,14 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-listener</artifactId>
<version>${deps.easyplugin.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-githubchecker</artifactId>

View File

@ -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("启用统计数据...");

View File

@ -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) {

View File

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

View File

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