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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:33