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 类同族调用未被计入(同样去注释后静态计数):

类 方法 调用点
CompressorRecipes addRecipeAdventure 5(全在 RecipeManagerAsteroids)
CompressorRecipes addShapelessAdventure 4(RecipeManagerGC 1 + RecipeManagerAsteroids 3)
RecipeUtil addBlockRecipe 3(全在 RecipeManagerGC)
CircuitFabricatorRecipes removeRecipe 3(RecipeManagerGC,删除类调用)
CompressorRecipes removeRecipe 1(RecipeManagerGC:783)

另有 RocketFuels.addFuel 11 处(RecipeManagerGC),属于燃料登记不是配方。 把上表 4 类 add* 方法全部算上是 208(RecipeUtil.addRecipe 181 + addShapelessRecipe 11 + CompressorRecipes.addRecipe 1 + addRecipeAdventure 5 + addShapelessAdventure 4 + addBlockRecipe 3 + CircuitFabricatorRecipes.addRecipe 3)。

运行时可变的配方数(集合运算的关键陷阱)

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 的方块清单。

相关条目