巫师烤炉配方表
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | 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 中没有对应的方块名条目。
关联
- 烤炉 TileEntity 的槽位与
@Overwrite见 机器容器与 TileEntity 补丁 - 大蒜配方修复(另一组配方改动)见 大蒜配方修复