Recipe System
基本信息
| 属性 | 值 |
|---|---|
| 总入口 | openmodularturrets.handler.recipes.RecipeHandler.initRecipes() |
| 调用时机 | init(FMLInitializationEvent),在 ModCompatibility.performModCompat() 之后(ModularTurrets.java:64) |
| 处理器数 | 6 个(1 个选择器 + 5 个配方集 + 1 个集成配方集) |
| 配方类型 | net.minecraftforge.oredict.ShapedOreRecipe(全部为有序合成) |
| 选择配置 | miscellaneous/Which recipes should we do?,默认 auto |
配方处理器
RecipeHandler.initRecipes()(RecipeHandler.java:14-46)用 if-else 链选择恰好一个配方集:
| 配置值 | 条件 | 处理器 |
|---|---|---|
thermalexpansion |
ModCompatibility.ThermalExpansionLoaded |
ThermalExpansionRecipeHandler |
enderio |
ModCompatibility.EnderIOLoaded |
EnderIORecipeHandler |
mekanism |
ModCompatibility.MekanismLoaded |
MekanismRecipeHandler |
vanilla |
无条件 | VanillaRecipeHandler |
auto |
依次尝试 EnderIO → ThermalExpansion → Mekanism → Vanilla | 同上 |
兜底:若配置值非法或所选模组未加载(recipesDone 保持 false),最后无条件执行 VanillaRecipeHandler.init()(RecipeHandler.java:43-46)。因此永远存在一套可用的配方。
auto模式有分支覆盖问题(已核实):auto分支内部用的是独立的 if-else-if 链(RecipeHandler.java:31-39),当 EnderIO、ThermalExpansion、Mekanism 同时加载时只执行 EnderIO 一套,而外层if-else if链中 EnderIO 分支还额外要求ConfigHandler.recipes.equals("enderio")。这是源码的实际结构,不做推测性修正。
处理器规模
grep -c 'addRecipe|new ShapedOreRecipe' 实测:
| 处理器 | 命中数 | 覆盖内容 |
|---|---|---|
RecipeHandler |
61 | 不随模组变化的固定配方(见下) |
VanillaRecipeHandler |
69 | 纯原版材料的全部等级部件与炮塔 |
ThermalExpansionRecipeHandler |
73 | Thermal Expansion 材料版本 |
EnderIORecipeHandler |
73 | Ender IO 材料版本 |
MekanismRecipeHandler |
73 | Mekanism 材料版本 |
ComputerRecipeHandler |
3 | ComputerCraft / OpenComputers 专用 |
ThaumcraftRecipeHandler |
3 | Thaumcraft 专用 |
来源:逐文件 grep -c 实测。
与模组无关的固定配方
RecipeHandler.initRecipes() 在选择完配方集之后,无条件追加一批固定配方(RecipeHandler.java:48-459),确保低等级内容在任何整合包里都能合成。
Tier 1 部件与底座(:50-126)
| 产物 | 源码行 | 布局 |
|---|---|---|
| Barrel (Tier 1) | :50-59 |
AAA / ␣B␣ / AAA(A=圆石, B=木板) |
| Chamber (Tier 1) | :61-72 |
AAA / ␣BC / AAA(A=圆石, B=木板, C=红石粉) |
| Sensor (Tier 1) | :74-83 |
␣A␣ / ABA / ␣A␣(A=红石粉, B=木板) |
| Turret Base (Tier 1) | :85-96 |
ABA / BCB / ABA(A=圆石, B=木板, C=Sensor T1) |
| Base Power Expander (Tier 1) | :98-111 |
ABA / DCD / ADA(A=圆石, B=木板, C=红石粉, D=IO Bus) |
| Base Inventory Expander (Tier 1) | :113-126 |
ABA / DCD / ADA(A=圆石, B=木板, C=箱子, D=IO Bus) |
源码注释说明用意:“Tier 1 static recipes (Because they shouldn’t use expensive mod items, only redstone, cobblestone and planks)”(RecipeHandler.java:49)。
受配置开关保护的配方(:128-160)
| 产物 | 保护条件 |
|---|---|
| Disposable Item Turret | ConfigHandler.getDisposableTurretSettings().isEnabled() |
| Potato Cannon Turret | ConfigHandler.getPotatoCannonTurretSettings().isEnabled() |
炮塔被配置关闭时,其方块与配方同时消失,不会出现「有配方但没方块」或反之。
无条件追加的其余固定配方
| 产物组 | 源码行 |
|---|---|
| Basic Turret Base Crank | :162-168 |
| 4 种通用附加件(太阳能 / 红石反应堆 / 伤害放大 / 回收 / 伪装) | :170-242 |
| Fences Tier 1 – 5 | :244-298 |
| Hard Walls Tier 1 – 5 | :300-356 |
| 5 种升级件 | :368-432 |
| Ammo - Blazing Clay(产出 32 个) | :434-445 |
| IO Bus | :447-459 |
逐种布局见对应条目:Fences & Hard Walls、Upgrades、Addons、Turret Parts、Ammo、Crank。
跨模组配方
两个集成配方集在固定配方之后追加,各自带条件(RecipeHandler.java:358-366):
| 处理器 | 条件 |
|---|---|
ThaumcraftRecipeHandler |
ModCompatibility.ThaumcraftLoaded && ConfigHandler.shouldDoThaumcraftIntegration |
ComputerRecipeHandler |
(ComputercraftLoaded || OpenComputersLoaded) && ConfigHandler.shouldDoThaumcraftIntegration |
条件写错(已核实):
ComputerRecipeHandler的第二个条件用了shouldDoThaumcraftIntegration(泰拉的开关)而不是shouldDoComputerIntegration(计算机的开关)。后者是死配置,全仓 0 处读取。详见 Config 的「无读取者的死配置」。这意味着 ComputerCraft / OpenComputers 的专用配方(例如 Addon - Serial Port)被泰拉的配置项控制。
注意:EnderIORecipeHandler / ThermalExpansionRecipeHandler / MekanismRecipeHandler 只作为 Which recipes should we do? 的候选值出现,它们是「用哪家的材料做配方」,不是「给该模组加东西」;后者只有 Thaumcraft 与 ComputerCraft/OC 两家。
相关条目
- Config -
Which recipes should we do?的可选值 - Compatibility Mods - 各处理器依赖的前置模组