You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从键中取值?需获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:50:23