装配与流体类机器

GT 5 装配 / 流体封装类机器的脚本 API,共 19 个 ZenClass、26 个 ZenMethod。这是全 mod 最大的一个分组。全部走 AddMultipleRecipeAction,不可撤销。

全表

ZenClass 方法数 目标 RecipeMap 备注
mods.gregtech.Assembler 3 assemblerRecipes
mods.gregtech.CircuitAssembler 2 circuitAssemblerRecipes
mods.gregtech.AssemblyLine 1 GTRecipeConstants.AssemblyLine 常量不是 RecipeMap
mods.gregtech.Amplifabricator 1 amplifierRecipes addRecipe(input, duration, amount)
mods.gregtech.Packer 1 packagerRecipes map 名与类名不对应
mods.gregtech.Unpacker 1 unpackagerRecipes map 名与类名不对应
mods.gregtech.Printer 1 printerRecipes 用 dataStick + ink
mods.gregtech.Separator 1 electroMagneticSeparatorRecipes
mods.gregtech.Sifter 1 sifterRecipes
mods.gregtech.Pulverizer 1 maceratorRecipes map 名与类名不对应
mods.gregtech.OreWasher 2 oreWasherRecipes ⚠️ 1 个重载用裸 FluidStack
mods.gregtech.Extractor 1 extractorRecipes
mods.gregtech.Compressor 1 compressorRecipes
mods.gregtech.PrecisionLaser 2 laserEngraverRecipes map 名与类名不对应
mods.gregtech.FluidHeater 1 fluidHeaterRecipes 用 IItemStack circuit
mods.gregtech.FluidSolidifier 1 fluidSolidifierRecipes 用 IItemStack mold
mods.gregtech.FluidCanner 1 cannerRecipes(与 Canner 共用) 无 duration / eut
mods.gregtech.Canner 2 cannerRecipes(与 FluidCanner 共用)
mods.gregtech.Mixer 2 mixerRecipes

方法签名(全部实测自源码)

Assembler.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, ILiquidStack fluidInput, int durationTicks, int euPerTick)
Assembler.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
Assembler.addRecipe(IItemStack output, IIngredient[] inputs, ILiquidStack fluidInput, int durationTicks, int euPerTick)
CircuitAssembler.addRecipe(IItemStack output, IIngredient[] inputs, ILiquidStack fluidInput, int durationTicks, int euPerTick)
CircuitAssembler.addRecipe(IItemStack output, IIngredient[] inputs, int durationTicks, int euPerTick)
AssemblyLine.addRecipe(IItemStack aResearchItem, int aResearchTime, IItemStack[] aInputs, ILiquidStack[] aFluidInputs, IItemStack aOutput, int aDuration, int aEUt)
Amplifabricator.addRecipe(IIngredient input, int duration, int amount)
Packer.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
Unpacker.addRecipe(IItemStack output1, IItemStack output2, IIngredient input, int durationTicks, int euPerTick)
Printer.addRecipe(IItemStack output, IIngredient input, IItemStack dataStick, ILiquidStack ink, int durationTicks, int euPerTick)
Separator.addRecipe(IItemStack[] output, IIngredient input, int[] outChances, int durationTicks, int euPerTick)
Sifter.addRecipe(IItemStack[] outputs, IIngredient input, int[] outChances, int durationTicks, int euPerTick)
Pulverizer.addRecipe(IItemStack[] outputs, IIngredient input, int[] outChances, int durationTicks, int euPerTick)
OreWasher.addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input, FluidStack fluidInput, int durationTicks, int euPerTick)   ← 裸 FluidStack
OreWasher.addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input, int durationTicks, int euPerTick)                        ← 委托,1000mB 水
Extractor.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
Compressor.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
PrecisionLaser.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick, boolean cleanroom)
PrecisionLaser.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
FluidHeater.addRecipe(ILiquidStack fluidOutput, IItemStack circuit, ILiquidStack fluidInput, int durationTicks, int euPerTick)
FluidSolidifier.addRecipe(IItemStack output, IItemStack mold, ILiquidStack fluidInput, int durationTicks, int euPerTick)
FluidCanner.addRecipe(IItemStack output, IIngredient input, ILiquidStack fluidOutput, ILiquidStack fluidInput)     ← 无 duration / eut
Canner.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
Canner.addRecipe(IItemStack[] output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
Mixer.addRecipe(IItemStack output, ILiquidStack fluidOutput, IIngredient[] input, ILiquidStack fluidInput, int durationTicks, int euPerTick)
Mixer.addRecipe(IItemStack output, IIngredient[] input, int durationTicks, int euPerTick)

AssemblyLine:两个 metadata 常量 + TierEU 依赖(AssemblyLine.java:63-71)

RA.stdBuilder()
    .metadata(RESEARCH_ITEM, researchItem)
    .metadata(SCANNING, new Scanning(researchTime, TierEU.RECIPE_LV))   // ← 扫描等级固定 LV
    .itemInputs(inputs).itemOutputs(output).fluidInputs(fluidInputs)
    .duration(duration).eut(eut)
    .addTo(GTRecipeConstants.AssemblyLine);

Scanning(researchTime, TierEU.RECIPE_LV) 的扫描等级硬编码为 RECIPE_LV,脚本无法指定。

⚠️ OreWasher:第一个重载从脚本侧无法调用(OreWasher.java:21-46)

@ZenMethod
public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input,
    FluidStack fluidInput, int durationTicks, int euPerTick) {   // ← net.minecraftforge.fluids.FluidStack

全 mod 其他 54 台机器的流体参数都用 minetweaker.api.liquid.ILiquidStack(CraftTweaker 侧类型),只有这一个重载用裸 net.minecraftforge.fluids.FluidStack。ZenScript 无法构造裸 FluidStack,因此这个重载在脚本中实际不可达。

第二个重载(无 fluid 参数)委托给它,硬编码 1000 mB 水:

addRecipe(output1, output2, output3, input, FluidRegistry.getFluidStack("water", 1000), durationTicks, euPerTick);

数值

数值 值
ZenClass 数 19(全 mod 最大分组)
ZenMethod 数 26
涉及 RecipeMap 数 18(cannerRecipes 被 Canner + FluidCanner 共用)
AssemblyLine 硬编码扫描等级 TierEU.RECIPE_LV
OreWasher 默认流体 "water" × 1000 mB
OreWasher 不可达重载数 1(裸 FluidStack)
FluidCanner 参数数 4(无 duration / eut)
Amplifabricator 参数数 3(input, duration, amount)
可撤销 全部否
@ModOnly 全部 "gregtech"

源码缺陷

  • OreWasher 第 1 重载用裸 FluidStack 而非 ILiquidStack(:22-23):全 mod 唯一的类型不一致。ZenScript 无法传入裸 FluidStack,该重载从脚本侧不可达。结果是 OreWasher 只能用水洗矿,无法指定其他液体。
  • OreWasher 的 1000 mB 水硬编码(:56):FluidRegistry.getFluidStack("water", 1000) 写死,无法改量、无法换液体。
  • Canner 与 FluidCanner 共用 cannerRecipes:用错类名不报错,配方跑在别的机器上。同 冶炼类机器、金属与成型类机器 的模式,属本 mod 最普遍的设计瑕疵。
  • FluidCanner.addRecipe 无 durationTicks / euPerTick(:4 参):取值来自 RA.stdBuilder() 未设置时的默认值 —— 未调用 setter = 默认值的典型位置,具体数值由 GT5 本体 builder 决定,本条目不外推。
  • 6 个类的 map 名与 ZenClass 名不对应:Packer→packagerRecipes、Unpacker→unpackagerRecipes、Pulverizer→maceratorRecipes、PrecisionLaser→laserEngraverRecipes、Separator→electroMagneticSeparatorRecipes、AssemblyLine→GTRecipeConstants.AssemblyLine(常量而非 RecipeMap)。全部无注释说明。
  • AssemblyLine 的扫描等级硬编码(:65):new Scanning(researchTime, TierEU.RECIPE_LV),脚本无法指定 TierEU。
  • Amplifabricator.addRecipe(input, duration, amount) 参数顺序反直觉(全 mod 唯一):amount 在 duration 之后,且没有 output 参数(产出由 amount 决定)。其他 54 台机器都是 output 在最前。
  • PrecisionLaser 的 cleanroom 布尔(:2 重载):与其他机器的 hidden(Distillery / Fermenter / Brewery)机制不同,源码无注释。
  • FluidCanner 的 fluidOutput / fluidInput 命名与传统相反:常规理解是「输入流体 → 输出流体」,此处参数顺序为 output(物品), input(物品), fluidOutput, fluidInput,容易读反。
  • 19 个类中 13 个只有 1 个方法,大量重复样板。

相关条目