Galacticraft 配方体系:3 个 RecipeManager + 4 个 API 级配方库
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。 不逐条抄配方表(合计数百条),只写清体系、类别、数量分布与关键配方族。
注册时机
| RecipeManager | 所在模块 | 入口方法 | 源码 |
|---|---|---|---|
RecipeManagerGC |
核心(月球 / 太空) | loadRecipes(...) + setConfigurableRecipes() |
core/recipe/RecipeManagerGC.java |
RecipeManagerAsteroids |
小行星带 | loadRecipes(...) |
planets/asteroids/recipe/RecipeManagerAsteroids.java |
RecipeManagerMars |
火星 | loadRecipes(...) |
planets/mars/recipe/RecipeManagerMars.java |
另有 4 个 API 级配方库(供第三方 addon 写入,不是本 mod 的配方表):
| 类 | 用途 | 源码 |
|---|---|---|
micdoodle8.mods.galacticraft.api.recipe.CompressorRecipes |
压缩机配方 | api/recipe/CompressorRecipes.java |
micdoodle8.mods.galacticraft.api.recipe.CircuitFabricatorRecipes |
电路制造台配方 | api/recipe/CircuitFabricatorRecipes.java |
micdoodle8.mods.galacticraft.api.recipe.SpaceStationRecipe |
空间站配方 | api/recipe/SpaceStationRecipe.java |
micdoodle8.mods.galacticraft.api.recipe.INasaWorkbenchRecipe |
NASA 工作台配方接口 | api/recipe/INasaWorkbenchRecipe.java |
外加两个实现类:core/recipe/NasaWorkbenchRecipe.java、
planets/asteroids/recipe/CanisterRecipes.java。
配方数量分布(静态计数,来源见下)
| RecipeManager | RecipeUtil.addRecipe |
CompressorRecipes.addShapelessRecipe |
CompressorRecipes.addRecipe |
CircuitFabricatorRecipes.addRecipe |
静态调用合计 |
|---|---|---|---|---|---|
RecipeManagerGC |
116 | 7 | 1 | 3 | 127 |
RecipeManagerAsteroids |
34 | 4 | 0 | 0 | 38 |
RecipeManagerMars |
31 | 0 | 0 | 0 | 31 |
| 合计 | 181 | 11 | 1 | 3 | 196 |
计数方法:对每个文件做 ^\s*(<类名>)\s*\.\s*(addRecipe|addShapelessRecipe|addShapedRecipe|addRecipeAlt)\s*\(
的正则匹配并按 (类名, 方法名) 归类求和。
⚠ 196 是「源码中的调用点个数」,不是「游戏里的配方条数」。
setConfigurableRecipes() 内部还有 15 个 addRecipe + 2 个 addShapelessRecipe 调用点
被循环 / 条件放大,见下节。
📌 196 不是全部配方调用。 上表只统计
addRecipe/addShapelessRecipe两个方法名,源码里另有 3 类同族调用未被计入(同样去注释后静态计数):
类 方法 调用点 CompressorRecipesaddRecipeAdventure5(全在 RecipeManagerAsteroids)CompressorRecipesaddShapelessAdventure4( RecipeManagerGC1 +RecipeManagerAsteroids3)RecipeUtiladdBlockRecipe3(全在 RecipeManagerGC)CircuitFabricatorRecipesremoveRecipe3( RecipeManagerGC,删除类调用)CompressorRecipesremoveRecipe1( RecipeManagerGC:783)另有
RocketFuels.addFuel11 处(RecipeManagerGC),属于燃料登记不是配方。 把上表 4 类add*方法全部算上是 208(RecipeUtil.addRecipe181 +addShapelessRecipe11 +CompressorRecipes.addRecipe1 +addRecipeAdventure5 +addShapelessAdventure4 +addBlockRecipe3 +CircuitFabricatorRecipes.addRecipe3)。
运行时可变的配方数(集合运算的关键陷阱)
core/recipe/RecipeManagerGC.java:749 起的 setConfigurableRecipes():
CircuitFabricatorRecipes.removeRecipe(solarPanels); // :754
CircuitFabricatorRecipes.removeRecipe(basicWafers); // :755
CircuitFabricatorRecipes.removeRecipe(advancedWafers); // :756
final ArrayList<ItemStack> silicons = OreDictionary.getOres(ConfigManagerCore.otherModsSilicon); // :757
final int siliconCount = silicons.size(); // :758
for (int j = 0; j <= siliconCount; j++) { // :759 ← 循环
if (j == 0) { silicon = new ItemStack(GCItems.basicItem, 1, 2); } // :761-762
else {
silicon = silicons.get(j - 1);
if (silicon.getItem() == GCItems.basicItem && silicon.getItemDamage() == 2) continue; // :765-767
}
CircuitFabricatorRecipes.addRecipe(solarPanels, ...); // :769
CircuitFabricatorRecipes.addRecipe(basicWafers, ...); // :773
CircuitFabricatorRecipes.addRecipe(advancedWafers, ...); // :777 (第三处)
}
| 事实 | 值 | 源码 |
|---|---|---|
| 循环上界 | j <= siliconCount,比 ore-dict 条目数多 1 次 |
:759 |
j == 0 分支 |
固定用 GC 自带硅(basicItem meta 2) |
:761-762 |
| 跳过条件 | 硅就是 GC 自带硅时 continue(避免重复) |
:765-767 |
| 每次迭代注册 | 3 条电路制造台配方 | :769、:773、:777 |
所以「太阳能板 / 基础晶圆 / 高级晶圆」这 3 个产物的配方条数 =
3 × (有效硅种类数),随环境中装了几个 mod 的硅而变。
⚠ 本条目不给这个数字写死值——它依赖运行时 ore-dict,
在裸 GC 环境下是 3 × 1 = 3 条,装了额外硅 mod 后更多。
任何声称「GC 共有 196 条配方」的写法都忽略了这一段。
钢锭的兼容引用(hardMode 分支)
core/recipe/RecipeManagerGC.java:783-800:
CompressorRecipes.removeRecipe(new ItemStack(GCItems.basicItem, 1, 9)); // :783 先撤掉默认配方
boolean steelDone = false; // :784
if (OreDictionary.getOres("ingotSteel").size() > 0) { // :785
CompressorRecipes.addShapelessRecipe(
new ItemStack(GCItems.basicItem, 1, 9), "ingotSteel", "ingotSteel"); // :786
steelDone = true; // :787
}
if (!ConfigManagerCore.hardMode || !steelDone) { // :789
CompressorRecipes.addShapelessRecipe(..., Items.coal, ..., Items.coal); // :790
} else {
CompressorRecipes.addShapelessAdventure(..., Items.coal, ..., Items.coal); // :796
}
| 条件 | 走哪条 | 结果 |
|---|---|---|
有 ingotSteel 且 hardMode = false |
:789 条件成立 |
走煤 + 煤的默认配方(:790) |
有 ingotSteel 且 hardMode = true |
:789 为假 |
走 else 的 addShapelessAdventure(:796) |
无 ingotSteel |
steelDone = false |
:789 因 !steelDone 成立 → 走默认煤配方(:790) |
⚠ 注意两条分支的方法名不同:默认分支是 addShapelessRecipe(:790),
else 分支是 addShapelessAdventure(:796)——
⚠ 后者是「进阶 / 冒险模式」配方,不是普通配方,
把它当成同一条配方的另一种写法即为误读。
⚠ 钢锭来自 ore-dict ingotSteel,典型由 GregTech 提供——
这是兼容引用,不是 Galacticraft 拥有的物品。
未安装提供钢锭的 mod 时,steelDone 保持 false,自动回落到煤配方,安全降级。
依赖的前置 mod 与跳过安全性
| 依赖 | 判定方式 | 未安装时 |
|---|---|---|
| 钢锭类配方 | OreDictionary.getOres("ingotSteel").size() > 0(:785) |
安全降级——steelDone 保持 false,自动改走煤 + 煤的默认配方(:789-795) |
| 硅类配方 | OreDictionary.getOres(ConfigManagerCore.otherModsSilicon)(:757) |
安全降级——silicons 为空时只走 j == 0 分支,用 GC 自带硅 |
| 额外硅 mod | ore-dict 名字由 ConfigManagerCore.otherModsSilicon 配置 |
不影响启动 |
⚠ 这些都是 ore-dict 层面的软依赖,没有任何 Loader.isModLoaded() 的硬判断
→ 未安装前置 mod 时全部安全跳过,不会崩。
配方族(按用途,不逐条列举)
| 配方族 | 载体 | 典型产物 |
|---|---|---|
| 基础材料 | RecipeUtil |
铝锭、粉笔、机器框架 |
| 压缩机(Compressor) | CompressorRecipes |
压缩气体 / 罐装物 |
| 电路制造台 | CircuitFabricatorRecipes |
硅片(wafer)、太阳能板、晶圆 |
| 火箭(T1/T2/T3/货船) | RecipeUtil + NEI 处理器 |
火箭部件与整机 |
| 空间站 | SpaceStationRecipe |
空间站模块 |
| NASA 工作台 | INasaWorkbenchRecipe / NasaWorkbenchRecipe |
工作台图纸 |
| 小行星带 | RecipeManagerAsteroids |
小行星带专属材料 |
| 火星 | RecipeManagerMars |
火星专属材料 |
NEI 处理器
每个有配方的机器都有对应的 NEI 展示类,例如
core/nei/RocketT1RecipeHandler.java、planets/mars/nei/RocketT2RecipeHandler.java、
planets/asteroids/nei/RocketT3RecipeHandler.java、planets/mars/nei/CargoRocketRecipeHandler.java。
⚠ NEI 处理器不是配方本身,只是配方的可视化;
1.7.10 源码中不存在「火箭多方块」(火箭是 Entity),
RocketT1RecipeHandler 展示的是 SchematicRocketT1 的方块清单。