mirror of
https://github.com/CarmJos/ScriptItems
synced 2024-09-18 21:05:51 +00:00
fix(null): 修复物品可能为空导致的报错问题
This commit is contained in:
parent
629bdbeac9
commit
2259965496
10
pom.xml
10
pom.xml
@ -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>
|
||||
|
@ -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("启用统计数据...");
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user