如何为多输入槽位的Minecraft方块实体实现Recipe匹配逻辑?
多输入槽Recipe匹配逻辑实现方案
你需要修改matches方法,让它遍历配方中的每一个原料,逐一对应检查容器里的输入槽位。以下是适配四个输入槽的实现代码:
@Override public boolean matches(SimpleContainer pContainer, Level pLevel) { if(pLevel.isClientSide()) { return false; } // 先校验配方原料数量与输入槽数量是否匹配,避免数组越界 if (this.recipeItems.size() != 4) { return false; } // 逐一检查每个配方原料是否匹配对应槽位的物品 // 注意:这里的槽位索引(1、2、3、4)需要根据你实际的方块实体槽位定义调整 return this.recipeItems.get(0).test(pContainer.getItem(1)) && this.recipeItems.get(1).test(pContainer.getItem(2)) && this.recipeItems.get(2).test(pContainer.getItem(3)) && this.recipeItems.get(3).test(pContainer.getItem(4)); }
关键说明:
- 槽位索引确认:代码里的
pContainer.getItem(1)这类索引,要和你方块实体中定义的四个输入槽的实际索引一致。比如如果你的槽位是从0开始编号,就要改成0、1、2、3。 - 无序配方适配(可选):如果你的配方允许四个原料放在任意输入槽(无需固定顺序),可以改用以下逻辑:
这个逻辑会检查输入槽中是否包含所有配方原料,不限制原料放置的顺序。@Override public boolean matches(SimpleContainer pContainer, Level pLevel) { if(pLevel.isClientSide()) { return false; } if (this.recipeItems.size() != 4) { return false; } // 收集所有输入槽的物品(假设四个槽是1-4) List<ItemStack> inputStacks = Arrays.asList( pContainer.getItem(1), pContainer.getItem(2), pContainer.getItem(3), pContainer.getItem(4) ); // 遍历配方原料,逐一匹配并移除已匹配的输入物品 List<ItemStack> remainingInputs = new ArrayList<>(inputStacks); for (Ingredient ingredient : this.recipeItems) { boolean matched = false; for (Iterator<ItemStack> iterator = remainingInputs.iterator(); iterator.hasNext();) { ItemStack stack = iterator.next(); if (ingredient.test(stack)) { iterator.remove(); matched = true; break; } } if (!matched) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者321Nathango
相关产品推荐
相关产品推荐

