编写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
相关产品推荐
相关产品推荐

