关于PrepareItemCraftEvent物品重复BUG的技术求助
这个问题我之前也碰到过!PrepareItemCraftEvent里的物品数量异常其实是因为这个事件的设计特性导致的——它触发的时候,游戏正在准备合成结果的预览,此时合成槽里的ItemStack是临时生成的副本,数量会被设置成和物品堆叠特性相关的值(比如8、16、64这些常见的堆叠阈值),根本不是玩家实际放进去的数量。
你现在的代码直接读取getAmount(),自然会得到错误的数值,导致判断逻辑失效。
解决办法:换用正确的事件来处理
不要在PrepareItemCraftEvent里做物品数量检查或者消耗操作,改用ItemCraftEvent——这个事件是在合成实际完成的时候触发的,此时合成槽里的物品数量就是玩家真实放置的数量,完全可靠。
给你调整后的代码示例:
@EventHandler public void onItemCraft(ItemCraftEvent e) { Player player = (Player) e.getWhoClicked(); Inventory craftInventory = e.getInventory(); // 这里替换成你需要的需求数量 int requiredCountA = 2; int requiredCountB = 3; int requiredCountC = 1; ItemStack slot1Item = craftInventory.getItem(1); ItemStack slot2Item = craftInventory.getItem(2); ItemStack slot3Item = craftInventory.getItem(3); // 先检查物品是否存在,再检查数量是否满足 if (slot1Item != null && slot1Item.getAmount() >= requiredCountA && slot2Item != null && slot2Item.getAmount() >= requiredCountB && slot3Item != null && slot3Item.getAmount() >= requiredCountC) { // 执行你的逻辑,比如扣除对应数量的物品 slot1Item.setAmount(slot1Item.getAmount() - requiredCountA); slot2Item.setAmount(slot2Item.getAmount() - requiredCountB); slot3Item.setAmount(slot3Item.getAmount() - requiredCountC); } else { // 如果不满足条件,取消合成并提示玩家 e.setCancelled(true); player.sendMessage("合成所需物品数量不足!"); } }
为什么Prepare阶段不能用?
再啰嗦两句:PrepareItemCraftEvent的核心作用是修改合成结果的预览(比如自定义配方的输出),而不是处理实际的物品消耗或数量验证。游戏在这个阶段会复制玩家的物品栈来生成预览,并且会临时调整数量来适配堆叠显示,所以你读到的数值都是假的。
如果你的需求是修改合成结果(比如根据条件改变输出物品),那可以在Prepare阶段做,但数量检查一定要放到Craft阶段来做,两者分开处理就不会有问题了。
内容的提问来源于stack exchange,提问作者Ziomkeee
相关产品推荐
相关产品推荐

