金属与成型类机器
GT 5 金属加工 / 成型机器的脚本 API,共 11 个 ZenClass、15 个 ZenMethod。全部走 AddMultipleRecipeAction,不可撤销。
⚠️ 本条目含全 mod 最严重的一个缺陷:Extruder 是空操作。
全表
| ZenClass | 方法数 | 目标 RecipeMap | 备注 |
|---|---|---|---|
mods.gregtech.Wiremill |
1 | wiremillRecipes |
|
mods.gregtech.Lathe |
2 | latheRecipes |
|
mods.gregtech.PlateBender |
1 | benderRecipes |
map 名与类名不对应 |
mods.gregtech.Polarizer |
1 | polarizerRecipes |
|
mods.gregtech.CuttingSaw |
3 | cutterRecipes |
与 Slicer 共用 |
mods.gregtech.Slicer |
1 | cutterRecipes(与 CuttingSaw 共用) |
|
mods.gregtech.ForgeHammer |
1 | hammerRecipes |
map 名与类名不对应 |
mods.gregtech.VacuumFreezer |
1 | vacuumFreezerRecipes |
EUT 硬编码,单次可产 2 条 |
mods.gregtech.ImplosionCompressor |
2 | implosionRecipes |
无 duration / eut |
mods.gregtech.FormingPress |
1 | formingPressRecipes |
|
mods.gregtech.Extruder |
1 | 无(不提交) | ⚠️ 空操作 |
方法签名(全部实测自源码)
Wiremill.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
Lathe.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
Lathe.addRecipe(IItemStack[] outputs, IIngredient input, int durationTicks, int euPerTick)
PlateBender.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
Polarizer.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
CuttingSaw.addRecipe(IItemStack output1, IItemStack output2, IIngredient input, ILiquidStack lubricant, int durationTicks, int euPerTick)
CuttingSaw.addRecipe(IItemStack[] output, IIngredient input, ILiquidStack lubricant, int durationTicks, int euPerTick)
CuttingSaw.addRecipe(IItemStack output1, IItemStack output2, IIngredient input, IItemStack circuit, int durationTicks, int euPerTick)
Slicer.addRecipe(IItemStack output, IIngredient input, IItemStack blade, int durationTicks, int euPerTick)
ForgeHammer.addRecipe(IItemStack output, IIngredient input, int durationTicks, int euPerTick)
VacuumFreezer.addRecipe(IItemStack output, IIngredient input, int durationTicks) ← 无 euPerTick
ImplosionCompressor.addRecipe(IItemStack output, IIngredient input, int tnt)
ImplosionCompressor.addRecipe(IItemStack[] output, IIngredient input, int tnt) ← 无 duration / eut
FormingPress.addRecipe(IItemStack output, IIngredient input1, IIngredient input2, int durationTicks, int euPerTick)
Extruder.addRecipe(IItemStack output, IIngredient input, IItemStack shape, int durationTicks, int euPerTick) ← 不提交
⚠️ Extruder:配方被构造后丢弃(Extruder.java:44-50)
@Override
protected void applySingleRecipe(ArgIterator i) {
RA.stdBuilder()
.itemInputs(i.nextItem(), i.nextItem())
.itemOutputs(i.nextItem())
.duration(i.nextInt())
.eut(i.nextInt()); // ← 链在此终止,没有 .addTo(...)
}
RA.stdBuilder() 返回的 builder 被配置完后结果被丢弃。mods.gregtech.Extruder.addRecipe(...) 会正常返回、不报错、不打日志,但一条配方都不会被加入游戏。
applySingleRecipe 里没有 addTo(extruderRecipes),也没有 import static ... RecipeMaps.extruderRecipes(该文件的 import 只有 gregtech.api.enums.GTValues.RA)。全 mod 仅此一处如此。
VacuumFreezer:EUT 硬编码 + 单次产 2 条(VacuumFreezer.java:41-63)
RA.stdBuilder().itemInputs(input).itemOutputs(output)
.duration(duration).eut(TierEU.RECIPE_MV).addTo(vacuumFreezerRecipes);
FluidStack fluidInput = GTUtility.getFluidForFilledItem(input, true);
FluidStack fluidOutput = GTUtility.getFluidForFilledItem(output, true);
if (fluidInput != null && fluidOutput != null) {
RA.stdBuilder().fluidInputs(fluidInput).fluidOutputs(fluidOutput)
.duration(duration).eut(TierEU.RECIPE_MV).addTo(vacuumFreezerRecipes);
}
- 脚本无法指定 EUT,固定为
TierEU.RECIPE_MV(MV 级 EU/t)。 - 若输入与输出都是容器且能装液体,一次调用额外生成 1 条纯流体配方(无 item 输入输出)。
getFluidForFilledItem(x, true)的第二参为drain—— 传true意味着读取时会实际抽取容器内容(GTUtility侧行为,本类不直接可见)。
数值
| 数值 | 值 |
|---|---|
| ZenClass 数 | 11 |
| ZenMethod 数 | 15 |
| 涉及 RecipeMap 数 | 11(cutterRecipes 被 CuttingSaw + Slicer 共用;Extruder 无) |
Extruder 提交配方数 |
0 |
VacuumFreezer 硬编码 EUT |
TierEU.RECIPE_MV |
VacuumFreezer 单次最多产出 |
2 条 |
ImplosionCompressor 参数 |
只有 tnt(无 duration / eut) |
CuttingSaw 重载数 |
3(润滑液 / 多输出 / 电路) |
| 可撤销 | 全部否 |
@ModOnly |
全部 "gregtech" |
源码缺陷
Extruder.applySingleRecipe不调addTo(:44-50) —— 全 mod 最严重缺陷。脚本调用静默无效:不抛异常、不写日志、不改配方表。用户会以为配方已加、实际机器仍用原配方。修复需补.addTo(extruderRecipes)与对应 import。VacuumFreezer的 EUT 不可配置(:49、:59):TierEU.RECIPE_MV硬编码两次,而全 mod 其他 55 台机器都让脚本传euPerTick。Javadoc 也未提 EUT。VacuumFreezer单次调用可能写 2 条配方(:52-61):条件是输入输出都能装液体。源码无日志提示脚本作者「你刚才加了两条」。PlateBender→benderRecipes、ForgeHammer→hammerRecipes:map 名与 ZenClass 名不对应(GT5 的 map 沿用旧版命名)。检索源码时易误判为笔误,源码无注释。CuttingSaw与Slicer共用cutterRecipes:用mods.gregtech.Slicer.addRecipe写的配方也能在 CuttingSaw 里跑,反之亦然。用错类名不报错。同 冶炼类机器 中 ArcFurnace / PlasmaArcFurnace 的问题。CuttingSaw三个重载的第 3 个参数语义突变:前两个是ILiquidStack lubricant(流体),第三个是IItemStack circuit(物品)。同名位置类型不同,脚本极易传错。ImplosionCompressor无 duration / eut 参数(2 个重载都只有output, input, tnt):脚本完全无法控制时长与能耗,取RA.stdBuilder()未设置时的默认值。这正是「未调用 setter = 默认值」的典型位置,具体数值由 GT5 本体的 builder 决定,本条目不外推。ImplosionCompressor的tnt是裸 int:与Electrolyzer的IIngredient cells不同,炸药数量直接写 int 而非物品。PlateBender/Polarizer/Wiremill/ForgeHammer/FormingPress的签名与Lathe第 1 个重载完全相同(5 个类的第 1 重载均为(IItemStack output, IIngredient input, int durationTicks, int euPerTick)),但目标 map 不同。属可接受的一致性。- 11 个类中 8 个只有 1 个方法,每个类 40–50 行几乎全是重复的
MineTweakerAPI.apply(new AddMultipleRecipeAction(...))样板。Extruder的缺失.addTo正是这种高度重复下的典型疏漏。
相关条目
- 冶炼类机器 - 同属金属加工链
- 装配与流体类机器 - 另一个共用 RecipeMap 的例子(
cannerRecipes) - 化学类机器 -
Electrolyzer/Centrifuge的流体侧对照 - AddMultipleRecipeAction - 全部方法的共同基类
- RA2 Builder - 替代方案:走 RA2 可为挤压机写配方(带可撤销)