巫师烤炉配方表

基本信息

属性 值
实现类 core/crafting/OvenRecipes.java(443 行)
对外门面 core/types/Witchery_Oven.java(21 行,3 个方法纯转发)
生成时机 init 阶段,WitcheryExtras.java:73 OvenRecipes.generateDefaultOvenRecipes()
默认配方数 11
存储 private static final ArrayList<OvenRecipe> mRecipeMap(OvenRecipes.java:17)

这是本 mod 唯一真正新增的玩法内容——11 条烤炉配方。 烤炉方块本身是 Witchery 的,本 mod 只换掉它的配方查找表 (见 机器容器与 TileEntity 补丁)。

11 条默认配方

调用点:OvenRecipes.java:23-88 generateDefaultOvenRecipes()。 全部 11 条的 jars 参数都是 1。

原版树苗(6 条,OvenRecipes.java:31-61)

统一产出 Witchery.Items.GENERIC.itemAshWood.createStack(1)(灰烬木材)+ 1 个装罐产物:

meta 树苗 装罐产物
0 Oak itemExhaleOfTheHornedOne
1 Spruce itemHintOfRebirth
2 Birch itemBreathOfTheGoddess
3 Jungle itemFoulFume
4 Acacia itemHintOfRebirth
5 Dark Oak itemBreathOfTheGoddess

Witchery 树苗(3 条,OvenRecipes.java:63-78)

同样产出灰烬木材 + 1 个装罐产物:

meta 装罐产物
0 itemWhiffOfMagic
1 itemReekOfMisfortune
2 itemOdourOfPurity

矿石字典原料(2 条,OvenRecipes.java:80-82)

走 addRecipe(String, int, ItemStack) 重载,产物只有装罐罐(无自定义产物):

矿石字典名 装罐产物
logWood itemFoulFume
meatRaw itemFoulFume

logWood / meatRaw 会展开成注册表里所有匹配项, 展开发生在 OvenRecipes.java:196-204。 若 Utils.getAllItemsFromOreDictEntry() 找不到任何条目, 会打 LOGGER.error("Found no entries in OreDict for {}", inputString1) (OvenRecipes.java:206)并导致该配方添加失败(OvenRecipes.java:245 返回 null)。 因此实际可用配方数取决于其它 mod 是否注册了这两个矿石字典名。

四个 addRecipe 重载

签名 行 产物构成
addRecipe(ItemStack input1, int jars, ItemStack jarOutput) OvenRecipes.java:111-113 仅装罐产物(走自定义产物 = null)
addRecipe(ItemStack input1, int jars, ItemStack customOutput, ItemStack jarOutput) OvenRecipes.java:123-126 自定义产物,数量 = customOutput.stackSize
addRecipe(String input1, int jars, ItemStack jarOutput) OvenRecipes.java:135-137 矿石字典输入 + 仅装罐产物
addRecipe(ItemStack, String, int, ItemStack, int, ItemStack, int) OvenRecipes.java:163-247 完整核心实现

添加成功需两半产物同时成立(OvenRecipes.java:220):

if (y[0] && y[1]) { ... mRecipeMap.add(recipe); return recipe; }
else { LOGGER.error("Failed when trying to add an Oven Recipe for {}", ...); return null; }

其中 y[1](装罐产物)的条件是 outputJarStack != null && (amt2 > 0 && amt2 == jars)(OvenRecipes.java:215)—— 装罐产物数量必须等于所需罐数。

空罐与 Witchery 物品取用

private static ItemStack createStack(final int stackSize) {
    return new ItemStack((Item) Witchery.Items.GENERIC, stackSize, 27);
}
public static ItemStack getEmptyJar(int amount) { return createStack(amount); }
public static ItemStack getWitcheryItemByID(int id, int stackSize) {
    return new ItemStack((Item) Witchery.Items.GENERIC, stackSize, id);
}

(OvenRecipes.java:90-100)

空罐 = Witchery.Items.GENERIC 的 meta 27(硬编码在 createStack 中)。

⚠️ 也就是说 addRecipe 的全部 11 条默认配方产物与空罐都是 Witchery 的 ItemGeneric 子物品,本 mod 自己没有引入任何物品。

查询 API

方法 行 行为
getOvenResult(ItemStack, int jars) OvenRecipes.java:256-263 返回第一个 isInputMatch 命中的配方;无则 null
findRecipeFor(ItemStack result) OvenRecipes.java:271-278 返回第一个 resultsIn 命中的配方
findRecipeUsing(ItemStack ingredient) OvenRecipes.java:286+ 按原料反查
getRecipeMap() OvenRecipes.java:19-21 直接返回可变 mRecipeMap 引用(未做防御性拷贝)

OvenRecipe 内部类在 OvenRecipes.java:295+,含 OvenOutputs 子类(OvenRecipes.java:432+)。 isMatch 提供两个重载,其中一个接受 oreName(OvenRecipes.java:367-373)。

⚠️ getRecipeMap() 把私有可变列表直接暴露,外部可任意 add / remove。 这是插件 API 有意为之(见 插件注册 API),非缺陷。

插件扩展

第三方可通过 RecipeManager.WitchesOven.addRecipe(...) / .removeRecipe(OvenRecipe) 增删烤炉配方 (api/RecipeManager.java:106-131 → core/util/WitcheryRecipeHandlerInternal.java:36-41)。

NEI 集成

5 个 NEI 配方处理器(nei/NEI_Handler_*.java)经 NEIWitcheryConfigMixin 挂到 API.registerRecipeHandler: Oven / Distillery / Kettle / Cauldron / SpinningWheel (NEIWitcheryConfigMixin.java:49-57),受配置 enablePatchNEI 门控 (mixins/Mixins.java:44-47)。 lang 里还有一条 WitcheryExtras.nei.power=Power required: %s / 能量要求: %s (这条已翻译),但 zh_CN.lang 中没有对应的方块名条目。

关联