配方注册与矿辞门控

基本信息

属性 值
入口 CommonProxy.postInit → addToRecipeInput()(:756-781)
前置短路 if (craftingOnly) return;(:757,读 Avaritia Config.craftingOnly)
涉及 Avaritia API CompressorManager.addOreRecipe、Grinder.catalyst

触发条件

每个分组 × 每个变体,依次判定三道门(:762-778):

1. 该变体在 allowed 集合里吗?        → 否:跳过(若开 NEI 隐藏则隐藏)
2. OreDictionary.getOres(oreName, false) 非空吗? → 否:跳过(若开 NEI 隐藏则隐藏)
3. 都通过 → 注册压缩配方 + 加入 Grinder 催化输入

注册内容

CompressorManager.addOreRecipe(
    new ItemStack(singularity, 1, i),        // 产物:该奇点的第 i 个 meta
    universalSingularityWrapper.recipeBaseValue,   // 所需数量
    universalSingularityWrapper.oreName);   // 矿辞名

Grinder.catalyst.getInput().add(new ItemStack(singularity, 1, i));

产物数量固定为 1 个奇点;recipeBaseValue 是所需矿辞数量。

recipeBaseValue 的真实含义

CompressOreRecipe(output, amount, lex) → CompressorRecipe(output, amount, null, exact=false),把 amount 存进 cost。而 Avaritia 的 CompressorRecipe.getCost():

public int getCost() {
    if (specific) return cost;
    else return Gregorizer.balanceCost(cost);   // specific == false
}

因为 CompressOreRecipe 构造时 exact=false,实际消耗量是 Gregorizer.balanceCost(recipeBaseValue),不等于源码里写的那个数字。源码第 41 行的注释也印证了这一点:

// Base Values were Generated by random.org [Min: 65, Max: 95]

即 recipeBaseValue 只是平衡前的基值,随机取值区间 65–95(少数超出,如 gangue 为 444444、bigReactors 五项为 9999,均是刻意设置)。

Grinder 催化

Grinder.catalyst.getInput().add(...) 把每种启用的奇点都加为 Grinder 的催化输入。注意这里没有像压缩配方那样检查矿辞是否存在——只要通过了 allowed 判定就加入。

无副作用的一点

CompressorManager.addOreRecipe 内部会检查 Avaritia.isDreamCraftLoaded,若 DreamCraft 存在则直接 return(CompressorManager.java:19)。

限制

  • oreName 大量复用:rubber、toxic、circuit、circuit2 四个分组的全部 29 个变体都用 blockArdite(或 blockArdite 系的 blockEnderPearl)。源码注释说明原因(:634): // the blocks on the recipe don't matter; they get overwritten in Core mod 即这些奇点由 Avaritia 的核心逻辑改写配方,矿辞仅作占位。
  • 同理 vanilla.water 也用 blockDiamond(CommonProxy.java:73)作为矿辞。
  • oreName 对不上时该奇点静默不可得(除非开启 NEI 隐藏,否则玩家只会看到无配方物品)。

相关条目