配方注册与矿辞门控
基本信息
| 属性 | 值 |
|---|---|
| 入口 | 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 隐藏,否则玩家只会看到无配方物品)。
相关条目
- 配置文件 -
allowed集合的构建来源 - NEI 隐藏禁用奇点 - 第 1、2 道门失败时的表现
- UniversalSingularityItem - 产物 ItemStack 的 metadata 取值