如何获取Minecraft配方食材的所有变体?自动合成插件技术问询
问题解答
不能直接通过getIngredientMap()返回的ItemStack获取所有木材变体,原因如下:
- Minecraft中木棍这类支持多变体的默认配方,实际是通过**物品标签(Tag
- )**来匹配所有符合条件的木材木板,而非单一指定橡木木板。
getIngredientMap()返回的映射表中,对应字符的ItemStack只是该物品标签的示例物品(通常是标签内排序第一的物品,也就是橡木木板),并不包含所有可替代的变体。
正确的获取方式
要拿到所有可用于合成的木材变体,需要从配方的Ingredient(原料)中提取对应的物品标签,步骤如下:
- 从配方中获取原料映射(注意部分旧版API返回的是
Map<Character, ItemStack>,但本质对应Ingredient实例); - 判断原料是否为标签类型的
Ingredient(如TagIngredient,不同MC版本类名可能略有差异); - 若为标签类型,调用
getTag()获取对应的物品标签,遍历标签内的所有物品即可得到所有变体。
代码示例
// 假设已获取ShapedRecipe实例recipe Map<Character, Ingredient> ingredientMap = recipe.getIngredientMap(); for (Map.Entry<Character, Ingredient> entry : ingredientMap.entrySet()) { Ingredient ingredient = entry.getValue(); // 检查是否为标签型原料 if (ingredient instanceof TagIngredient tagIngredient) { Tag<Item> woodPlankTag = tagIngredient.getTag(); // 遍历所有可替代的木板变体 for (Item plankItem : woodPlankTag.getValues()) { ItemStack variantStack = new ItemStack(plankItem); // 处理每个木材变体 } } else { // 非标签型原料,直接获取所有可用ItemStack ItemStack[] availableStacks = ingredient.getItems(); } }
版本兼容提示
- 若使用的是1.12及更早的MC版本,
Ingredient的实现逻辑略有不同,可通过ingredient.getStacks()方法直接获取所有可替代的ItemStack数组,里面会包含所有木材变体。
内容的提问来源于stack exchange,提问作者RIVERMAN2010
相关产品推荐
相关产品推荐

