大蒜配方修复
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | core/recipe/fixes/GarlicRecipes.java |
| 调用时机 | init 阶段,WitcheryExtras.java:72 new GarlicRecipes()(构造即执行) |
| 修复的配方组 | 2 组:猎人大蒜铠甲(4 件)+ 吸血鬼书(1 件) |
| 本 mod 新增物品 | 0(全部产物是 Witchery 既有物品) |
这组修复解决的是:Witchery 原版的大蒜配方只认自家的蒜物品,
而 GTNH 里大蒜来自其它 mod(通过矿石字典 cropGarlic)。
本 mod 把原配方先删掉再按矿石字典重建,于是任何来源的大蒜都能用。
构造即副作用
public GarlicRecipes() {
mGarlics = Utils.getAllItemsFromOreDictEntry("cropGarlic");
fixGarlicArmour();
fixVampireBook();
}
(GarlicRecipes.java:18-23)
private final ItemStack[] mGarlics 在构造时一次性快照矿石字典 cropGarlic 的全部条目。
⚠️ 构造器无参、无返回值、无成功失败返回,
new GarlicRecipes()的结果 在WitcheryExtras.java:72被直接丢弃,仅靠构造副作用生效。
⚠️ 若
cropGarlic未被任何 mod 注册,mGarlics是长度为 0 的数组, 两个for (ItemStack garlic : mGarlics)循环体一次都不执行 → 结果是原配方已被删除、新配方一条都没加回来, 猎人大蒜铠甲和吸血鬼书将无法合成。Utils.getAllItemsFromOreDictEntry用if (OreDictionary.doesOreNameExist(oreDictName))做了存在性检查 (Utils.java:41),不存在时安静返回空数组,不报错、不打日志。
修复 1:猎人大蒜铠甲(4 件)
fixGarlicArmour()(GarlicRecipes.java:25-41)
银化版 → 大蒜版的 4 对映射(GarlicRecipes.java:26-29):
| # | 银化版(基底) | 大蒜版(产物) |
|---|---|---|
| 1 | HUNTER_BOOTS_SILVERED |
HUNTER_BOOTS_GARLICKED |
| 2 | HUNTER_LEGS_SILVERED |
HUNTER_LEGS_GARLICKED |
| 3 | HUNTER_COAT_SILVERED |
HUNTER_COAT_GARLICKED |
| 4 | HUNTER_HAT_SILVERED |
HUNTER_HAT_GARLICKED |
每件的处理(GarlicRecipes.java:30-39):
Utils.removeAllCraftingRecipesByOutputItem(新产品)—— 删掉 Witchery 原版全部产出该物品的配方- 对
mGarlics里每一个大蒜条目,各注册 1 条合成配方
配方形状(GarlicRecipes.java:36-37):
" g "
"g#g"
" s "
| 符号 | 物品 |
|---|---|
# |
对应的银化版猎人大蒜装备(new ItemStack(items[0])) |
g |
该轮循环的大蒜(garlic.copy()) |
s |
Items.string(线) |
注意配方用
new ItemStack(items[0]),数量固定为 1(未指定 stackSize)。 实际加入数量为每种大蒜 1 条配方,若cropGarlic有 N 个条目则共 N 条。
修复 2:吸血鬼书
fixVampireBook()(GarlicRecipes.java:43-53)
同样先 removeAllCraftingRecipesByOutputItem(new ItemStack(Witchery.Items.VAMPIRE_BOOK))
删掉原配方,再按大蒜条目重建。配方形状(GarlicRecipes.java:49-50):
"#s#"
"#b#"
"#g#"
| 符号 | 物品 |
|---|---|
# |
Items.nether_wart(下界疣) |
s |
Items.nether_star(下界之星) |
b |
Items.book(书) |
g |
该轮循环的大蒜 |
本组用的是 GameRegistry.addShapedRecipe(GarlicRecipes.java:47),
而猎人大蒜铠甲组用的是 CraftingManager.getInstance().addRecipe(...) 后手动调
.func_92100_c()(GarlicRecipes.java:36-38)——两条路径都要让配方进注册表,
后者需显式调 func_92100_c()(MCP 映射名,即 IRecipe.func_92100_c)。
删配方的副作用范围
Utils.removeAllCraftingRecipesByOutputItem(Utils.java:71-78):
List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
return recipes.removeIf(s -> (s != null) && (s.getRecipeOutput() != null)
&& (s.getRecipeOutput().isItemEqual(I)));
- 对
CraftingManager的全局配方列表做removeIf - 条件是
isItemEqual(只看物品类型 + meta,不看 NBT、不看数量) - 因此其它 mod 为这 5 个物品提供的所有合成配方都会被一并删除,
不只是 Witchery 原版那一条。补回的只有本 mod 针对
cropGarlic的配方。
⚠️ 若某个
cropGarlic条目产出的ItemStack数量不为 1, 配方里写的是'g', garlic.copy(),数量原样带入——cropGarlic注册了什么数量 就按什么数量消耗,本仓库无法确定(取决于外部 mod)。
关联
- 本 mod 另一组配方改动(烤炉)见 巫师烤炉配方