大蒜配方修复

基本信息

属性 值
实现类 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):

  1. Utils.removeAllCraftingRecipesByOutputItem(新产品) —— 删掉 Witchery 原版全部产出该物品的配方
  2. 对 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)。

关联