流固机配方

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 的流体型:

  1. 流体量 = new FluidStack(fluid, TConstruct.ingotLiquidValue)(TiC 的 1 锭液体量,144 mB);
  2. 箭头材料 ID 的来源分两种:
    • 是 TGregFluidType → 直接取它的 matID 字段(不需要真的有对应浇铸配方);
    • 否则去 TConstructRegistry.getTableCasting() 查"该流体 + 镐 pattern"的浇铸配方, 查不到就 continue 跳过,取 recipe.getResult().getItemDamage();
  3. 再遍历 TConstructRegistry.toolMaterials.keySet()(全部 TiC 材料,不只 GT 的):
    • 该材料 ID 在 materialIDMap 里 → TGregUtils.newItemStack(材料, PartTypes.ToolRod, 1);
    • 否则 new ItemStack(TinkerTools.toolRod, 1, id),getMaterialID 返回 -1 就 continue;
  4. 两道过滤(源码顺序):
    • if (!materialIDMap.containsKey(id) && !(fluidType instanceof TGregFluidType)) continue; ——手柄与流体必须至少有一个来自 GT;
    • if ((useNonGTToolRodsForBolts || 是GT手柄) && (useNonGTFluidsForBolts || 是GT流体)) ——两个开关都默认 true,故上一步实际上是最终过滤。
  5. 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。

相关条目