修复1.16.5版本EasierCrafting模组蜂蜜块合成异常问题
解决EasierCrafting 1.16.5版本蜂蜜块合成后空瓶残留问题
问题根源分析
- 原修复的槽位索引错误:1.16.5的
CraftingScreenHandler中,合成输入槽的索引从0开始,2x2配方的4个蜂蜜瓶对应索引为0、1、3、4,而非原代码中的1、2、4、3/5。 - 客户端操作未同步服务端:直接调用
slotClick如果是在客户端执行,仅会修改本地界面显示,不会同步到服务端,导致物品实际仍留在槽中。 clearCraftingSlots()方法在1.16.5中仅清空客户端显示,未触发服务端的物品状态更新,因此无法解决实际残留问题。
可行修复方案
方案1:修正槽位索引+确保服务端执行
修改原点击逻辑,修正槽位索引,并将操作放到服务端线程执行,保证状态同步:
if (underMouse.getOutput().getItem() == Items.HONEY_BLOCK) { // 强制在服务端线程执行操作,确保物品状态同步 player.getServer().execute(() -> { // 2x2配方的四个输入槽正确索引:0(左上)、1(右上)、3(左下)、4(右下) slotClick(0, 0, SlotActionType.QUICK_MOVE); slotClick(1, 0, SlotActionType.QUICK_MOVE); slotClick(3, 0, SlotActionType.QUICK_MOVE); slotClick(4, 0, SlotActionType.QUICK_MOVE); }); }
方案2:直接操作服务端槽位(更可靠)
跳过模拟点击,直接操作服务端的合成槽,清空空瓶并移回背包,彻底避免槽位索引依赖问题:
if (underMouse.getOutput().getItem() == Items.HONEY_BLOCK && player.currentScreenHandler instanceof CraftingScreenHandler craftingHandler) { player.getServer().execute(() -> { // 遍历所有合成输入槽(0-8对应3x3网格) for (int i = 0; i < 9; i++) { Slot slot = craftingHandler.getSlot(i); ItemStack stack = slot.getStack(); // 判断槽内是否为空瓶 if (stack.getItem() == Items.GLASS_BOTTLE) { // 将空瓶移回玩家背包,背包满则掉落 if (!player.getInventory().addStack(stack)) { player.dropItem(stack, false); } // 清空合成槽 slot.setStack(ItemStack.EMPTY); } } // 标记界面状态需要同步到客户端 craftingHandler.sendContentUpdates(); }); }
额外注意事项
- 所有物品操作必须在服务端线程执行,MC的物品状态由服务端维护,客户端仅负责显示,本地操作无法改变实际物品位置。
- 建议绑定到
PlayerCraftedItemEvent事件中触发逻辑,而非界面点击时执行,更贴合MC的事件流程,避免界面交互时序问题。
内容的提问来源于stack exchange,提问作者Pairman
相关产品推荐
相关产品推荐

