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

编写Minecraft合成插件时遇GetType不接受ItemStack问题求助

解决Minecraft合成插件中ItemStack比较的问题

嘿,我一眼就揪出你代码里的问题啦!你现在的写法根本没法正常工作,核心原因很简单:

e.getInventory().getResult().getType() 返回的是 Material 类型(比如Material.DIAMOND、Material.WOOL这种代表物品材质的枚举),而你右边的its是一个完整的ItemStack对象——拿材质和整个物品栈比,就像拿“苹果”这个种类和“一个红苹果”实物比,肯定永远不相等呀!

正确的解决思路分两种情况:

情况1:只需要匹配材质和数据值(比如带颜色的羊毛、不同类型的石头)

这种是合成插件里最常用的场景,你需要分别对比材质和耐久度(也就是物品数据值),别忘了先判空避免空指针:

// 先把结果存下来,避免重复调用方法
ItemStack result = e.getInventory().getResult();
// 先判断结果不为null,再对比材质和数据值
if (result != null 
    && result.getType().equals(its.getType()) 
    && result.getDurability() == its.getDurability()) {
    // 这里写你的触发逻辑
}

情况2:需要精确匹配完整的ItemStack(包括ItemMeta、数量等)

如果你需要连物品的自定义标签、名称、lore这些都匹配,或者要严格对应数量,可以用ItemStack自带的equals()方法,但要注意细节:

  • Bukkit的ItemStack.equals()会同时比较材质、数据值、数量、ItemMeta
  • 如果合成结果的数量固定(比如大部分合成都是1个),可以先克隆结果栈并统一数量再对比:
ItemStack result = e.getInventory().getResult();
if (result != null) {
    // 克隆结果栈,避免修改原物品
    ItemStack tempResult = result.clone();
    // 把数量改成和你要匹配的its一致
    tempResult.setAmount(its.getAmount());
    if (tempResult.equals(its)) {
        // 触发你的逻辑
    }
}

额外小提示

从配置读取Material的时候,Material.getMaterial(s.getInt("item"))可能返回null(比如配置里的数字对应不上有效材质),建议加个判错逻辑:

Material targetMat = Material.getMaterial(s.getInt("item"));
if (targetMat == null) {
    // 这里可以打个日志提示配置错误
    getLogger().warning("配置文件里的物品ID无效!");
    return;
}
ItemStack its = new ItemStack(targetMat, 1, (byte) s.getInt("data"));

内容的提问来源于stack exchange,提问作者Ziomkeee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:51:09