如何从键中取值?需获取executableitems:ie-id验证装备真实性
搞定
executableitems:ie-id标签获取问题 从你提供的物品截图来看,目标装备确实带有executableitems:ie-id自定义NBT标签,但你当前用ItemStack.serialize()读取的方式不靠谱,Bukkit自带的序列化对插件添加的自定义NBT支持有限,大概率拿不到正确值。下面给你两种可行方案:
方案一:直接读NBT标签(不依赖插件API)
如果不想依赖ExecutableItems的API,用NBT工具类直接读物品的NBT数据就行,注意要对应自己的服务器版本:
@EventHandler public void onItemClick(PlayerInteractEvent e) { Action action = e.getAction(); if (action != Action.RIGHT_CLICK_BLOCK && action != Action.RIGHT_CLICK_AIR) return; ItemStack item = e.getItem(); if (item == null || item.getType() != Material.NETHERITE_CHESTPLATE) return; e.getPlayer().sendMessage("开始验证装备..."); String ieId = getIEIdFromNBT(item); if (ieId != null) { e.getPlayer().sendMessage("装备有效,ID: " + ieId); } else { e.getPlayer().sendMessage("这装备没带有效的executableitems:ie-id标签"); } } // 读取NBT标签的工具方法(示例对应1.20.1版本,版本不同包名要改) private String getIEIdFromNBT(ItemStack item) { if (item.getItemMeta() == null) return null; try { // 转成NMS物品对象 net.minecraft.world.item.ItemStack nmsItem = org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack.asNMSCopy(item); net.minecraft.nbt.CompoundTag nbtTag = nmsItem.getTag(); if (nbtTag != null && nbtTag.contains("executableitems:ie-id")) { return nbtTag.getString("executableitems:ie-id"); } } catch (Exception ex) { ex.printStackTrace(); } return null; }
方案二:用ExecutableItems官方API(更稳定)
如果你的项目能依赖ExecutableItems插件,直接用官方API是最稳的,还能顺便验证物品是不是真的ExecutableItems装备:
import me.deecaad.executableitems.ExecutableItems; import me.deecaad.executableitems.items.ExecutableItem; @EventHandler public void onItemClick(PlayerInteractEvent e) { Action action = e.getAction(); if (action != Action.RIGHT_CLICK_BLOCK && action != Action.RIGHT_CLICK_AIR) return; ItemStack item = e.getItem(); if (item == null || item.getType() != Material.NETHERITE_CHESTPLATE) return; e.getPlayer().sendMessage("开始验证装备..."); ExecutableItems plugin = ExecutableItems.getPlugin(); ExecutableItem execItem = plugin.getSerializer().deserialize(item, ExecutableItem.class); if (execItem != null) { String ieId = execItem.getID(); e.getPlayer().sendMessage("装备有效,ID: " + ieId); } else { e.getPlayer().sendMessage("这不是有效的ExecutableItems装备"); } }
注意事项
- 方案一的NMS代码需匹配你的服务器版本,不同版本的CraftBukkit包名会有差异(比如1.19.4对应
org.bukkit.craftbukkit.v1_19_R3); - 方案二需确保服务器已安装ExecutableItems插件,且项目中引入了该插件的依赖包;
- 测试时可取消你代码中
serialize()的注释,确认物品序列化数据中是否存在目标标签,排除物品本身无标签的情况。
内容的提问来源于stack exchange,提问作者Xpeawey
相关产品推荐
相关产品推荐

