流固机配方
TGregRecipeRegistry.addGregTechPartRecipes() 通过
GT_Values.RA.addFluidSolidifierRecipe(pattern, molten, output, duration, voltage) 注册,
以及 registerBoltRecipes() → addBoltRecipe() 的弩箭配方。
⚠️ 流固机这一整组配方默认全部关闭(solidifierRecipes / moltenToShardRecipe /
castSolidifierRecipes 三个开关默认 false),只有弩箭相关的
useNonGTFluidsForBolts / useNonGTToolRodsForBolts 默认 true。
配方矩阵
| # | 配方 | 数量 | 时长 | 开关 | 默认 |
|---|---|---|---|---|---|
| 1 | pattern + 熔融材料 → 部件 | 288 × price mB | max(80, mDurability × price) |
solidifierRecipes |
false |
| 2 | 碎片铸件 + 144 mB 熔融 → 1 碎片 | 144 mB | max(160, mDurability) |
moltenToShardRecipe |
false |
| 3 | pattern + 熔融黄铜/金 → 部件铸件 | GT_Values.L = 1000 mB |
800 | castSolidifierRecipes |
false |
| 4 | 碎片铸件 + 熔融黄铜/金 → 2 碎片 | 1000 mB | 800 | castSolidifierRecipes |
false |
| 5 | 手柄 + 流体 → 双材料弩箭 | TConstruct.ingotLiquidValue |
80 + (手柄耐久 + 箭头耐久) × 2 |
useNonGTFluidsForBolts 且 useNonGTToolRodsForBolts |
true |
配方 1–4 都在 if (molten != null && molten.getFluid() != null) 里——材料必须有熔融形态。
没有熔融流体的材料(绝大多数纯金属在 GT 里是 getMolten 返回 null 的情况)拿不到任何流固机配方。
配方 1:pattern 在第一个槽
addFluidSolidifierRecipe(pattern.copy(), molten.copy(), input.copy(), …) ——
GT 的流固机签名是 (input, fluid, output, …),所以pattern 占据输入槽、流体在中间。
与挤压机配方(input, pattern, output)槽位顺序不同:挤压机是"材料在前、pattern 在后",
流固机是"pattern 在前、材料在后"。写自动化时要注意。
配方 1 的 output 是 input(TGregUtils.newItemStack(m, p, 1))——注意变量名在源码里
和语义相反(input 其实是产出物),容易读错。
配方 5:双材料弩箭
registerBoltRecipes() 遍历 FluidType.fluidTypes,对每个 isToolpart == true 的流体型:
- 流体量 =
new FluidStack(fluid, TConstruct.ingotLiquidValue)(TiC 的 1 锭液体量,144 mB); - 箭头材料 ID 的来源分两种:
- 是
TGregFluidType→ 直接取它的matID字段(不需要真的有对应浇铸配方); - 否则去
TConstructRegistry.getTableCasting()查"该流体 + 镐 pattern"的浇铸配方, 查不到就continue跳过,取recipe.getResult().getItemDamage();
- 是
- 再遍历
TConstructRegistry.toolMaterials.keySet()(全部 TiC 材料,不只 GT 的):- 该材料 ID 在
materialIDMap里 →TGregUtils.newItemStack(材料, PartTypes.ToolRod, 1); - 否则
new ItemStack(TinkerTools.toolRod, 1, id),getMaterialID返回 -1 就continue;
- 该材料 ID 在
- 两道过滤(源码顺序):
if (!materialIDMap.containsKey(id) && !(fluidType instanceof TGregFluidType)) continue;——手柄与流体必须至少有一个来自 GT;if ((useNonGTToolRodsForBolts || 是GT手柄) && (useNonGTFluidsForBolts || 是GT流体))——两个开关都默认 true,故上一步实际上是最终过滤。
addBoltRecipe(toolRod, liquid, toolRodMaterialID, arrowheadMaterialID): 输出 =DualMaterialToolPart.createDualMaterial(TinkerWeaponry.partBolt, 手柄ID, 箭头ID), 时长 =80 + (手柄耐久 + 箭头耐久) × 2, 电压 =max(getPowerRequired(手柄材料), getPowerRequired(箭头材料))。
getPowerRequired(ToolMaterial t) = t.harvestLevel < 3 ? 30 : 120 × 倍率——
这里用的是 harvestLevel 而不是 Materials.mToolQuality,与部件配方不同。
移除 TiC 的动态弩箭配方
registerBoltRecipes() 结尾有一段主动删配方的逻辑:
castingRecipes = TConstructRegistry.getTableCasting().getCastingRecipes();
for (CastingRecipe cr : castingRecipes)
if (cr != null && cr.cast != null
&& cr.cast.getItem() == TinkerTools.toolRod
&& materialIDMap.containsKey(((IToolPart) TinkerTools.toolRod).getMaterialID(cr.cast)))
toRemove.add(cr);
castingRecipes.removeAll(toRemove);
即:TiC 在砧台动态生成的"用 TiC 手柄铸件浇铸弩箭"的配方,凡是手柄材料属于 TGregworks 的 统统删掉——因为 GT 流固机已经提供了更完整的弩箭配方,两条路径会产出重复物品。
这段代码需要 Tinkers' Smeltery 已加载(前一步的 isPulseLoaded 门控),否则整个方法提前 return。