GT++ 机器

GregTech++(MiscUtils)的 6 个机器脚本 API,共 10 个 ZenMethod。双重门控:@ModOnly("miscutils") + GTPlusPlus.isModLoaded()。

⚠️ 本条目是全 mod 唯一使用非 gregtech 门控 modid 的分组。

全表

ZenClass ModOnly 方法数 目标 RecipeMap
mods.gtpp.BlastSmelter miscutils 5 alloyBlastSmelterRecipes
mods.gtpp.CokeOven miscutils 1 cokeOvenRecipes
mods.gtpp.Dehydrator miscutils 1 centrifugeNonCellRecipes
mods.gtpp.MultiblockCentrifuge miscutils 1 chemicalDehydratorRecipes
mods.gtpp.MultiblockElectrolyzer miscutils 1 electrolyzerNonCellRecipes
mods.gtpp.MatterFabricator miscutils 1 multiblockMassFabricatorRecipes

双重门控

GTTweaker.init(GTTweaker.java:129-136):

if (GTPlusPlus.isModLoaded()) {
    MineTweakerAPI.registerClass(BlastSmelter.class);
    MineTweakerAPI.registerClass(CokeOven.class);
    MineTweakerAPI.registerClass(Dehydrator.class);
    MineTweakerAPI.registerClass(MatterFabricator.class);
    MineTweakerAPI.registerClass(MultiblockCentrifuge.class);
    MineTweakerAPI.registerClass(MultiblockElectrolyzer.class);
}

import static gregtech.api.enums.Mods.GTPlusPlus; —— 判定方法来自 GT5 的 Mods 枚举(检查 modid miscutils),而 @ModOnly("miscutils") 是 CraftTweaker 侧的门控。两者独立生效。

编译期依赖里没有 GT++:只有 GT5-Unofficial 与 CraftTweaker。这 6 个类不 import 任何 miscutils 包,只用 RecipeMaps.* 中 GT5 提供的 GT++ 兼容 map。

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

BlastSmelter.addRecipe(ILiquidStack fluidOutput, IIngredient[] inputs, int chance, int durationTicks, int euPerTick)
BlastSmelter.addRecipe(ILiquidStack fluidOutput, ILiquidStack fluidInput, IIngredient[] inputs, int chance, int durationTicks, int euPerTick)
BlastSmelter.addRecipe(IIngredient[] outputs, ILiquidStack fluidOutput, ILiquidStack fluidInput, IIngredient[] inputs, int[] chance, int durationTicks, int euPerTick)
BlastSmelter.addRecipe(ILiquidStack fluidOutput, ILiquidStack fluidInput, IIngredient[] inputs, int chance, int durationTicks, int euPerTick, int Special)
BlastSmelter.addRecipe(IIngredient[] outputs, ILiquidStack fluidOutput, ILiquidStack fluidInput, IIngredient[] inputs, int[] chance, int durationTicks, int euPerTick, int Special)

CokeOven.addRecipe(IItemStack output, ILiquidStack fluidOutput, IIngredient input1, IIngredient input2, ILiquidStack fluidInput, int durationTicks, int euPerTick)
Dehydrator.addRecipe(IItemStack[] outputs, ILiquidStack fluidOutput, IIngredient[] inputs, ILiquidStack fluidInput, int[] chanses, int durationTicks, int euPerTick)
MatterFabricator.addRecipe(ILiquidStack fluidOutput, ILiquidStack fluidInput, int durationTicks, int euPerTick)
MultiblockCentrifuge.addRecipe(IItemStack[] outputs, ILiquidStack[] fluidOutput, ILiquidStack[] fluidInput, IItemStack[] inputs, int[] chances, int durationTicks, int euPerTick, int Special)
MultiblockElectrolyzer.addRecipe(IItemStack[] inputs, ILiquidStack[] fluidInput, ILiquidStack[] fluidOutput, IItemStack[] outputs, int[] chances, int durationTicks, int euPerTick, int Special)

BlastSmelter 的 5 个重载:3 个参数被吞

5 个重载的 applySingleRecipe 中,源码反复出现这一行:

i.nextInt(); // stupid code that asked for an output chance with no output added

第 1、2、4 个重载接收了 chance 参数但从不下发(RA.stdBuilder() 没有调 outputChances),因为它们没有物品输出槽 —— 概率参数在这 3 个重载中完全无效。

第 4 个重载接收 int Special 后只 i.nextInt() 读取再丢弃:

i.nextInt(); // unused
// special value is useless in ABS recipes

Special(所需温度)在全部 5 个 Alloy Blast Smelter 配方中被丢弃:第 4 重载读取后弃用,第 5 重载连读都不读(applySingleRecipe 只消耗 7 个参数,而 Action 构造时传了 8 个),源码注释 // special value is useless in ABS recipes 挂在第 5 重载的 int eut 之后。

只有第 3、5 个重载(带 IIngredient[] outputs)真正下发 outputChances(chances)。

数值

数值 值
ZenClass 数 6
ZenMethod 数 10(BlastSmelter 占 5)
涉及 RecipeMap 数 6
@ModOnly 值 miscutils(6 个全部)
Java 包名 gttweaker.mods.gtpp.machines(不是 gregtech.machines)
ZenClass 前缀 mods.gtpp.*(不是 mods.gregtech.*)
BlastSmelter 被吞参数 chance × 3 重载(第 1/2/4)、Special × 2 重载(第 4 读取后弃用 / 第 5 完全未读)
编译期 GT++ 依赖 无(仅用 GT5 提供的兼容 map)
可撤销 全部否
注册条件 GTPlusPlus.isModLoaded()

源码缺陷

  • 3 个 ZenClass 名与目标 map 名疑似错配:

    ZenClass 目标 map 疑问
    Dehydrator centrifugeNonCellRecipes GT5 的「离心机(无容器)」不是「脱水机」
    MultiblockCentrifuge chemicalDehydratorRecipes 名字里是「脱水机」,类名是「多方块离心机」
    MultiblockElectrolyzer electrolyzerNonCellRecipes 对应关系较合理

    这三对名称的对应关系无法仅从本仓库源码确定(需要 GT5 源码中 RecipeMaps 的语义),可能是正确的历史命名遗留,也可能是笔误。本条目只记录实测的映射关系,不下结论。同类问题见 冶炼类机器 的 benderRecipes / hammerRecipes。

  • BlastSmelter 的 chance 参数在 3 个重载中静默失效(:56、:88、:159):脚本传了概率却被静默丢弃,RA.stdBuilder() 不调 outputChances。源码注释承认是历史包袱(// stupid code that asked for an output chance with no output added),但脚本侧无任何提示。

  • Special(温度)参数在 5 个重载中全部丢弃:第 4 重载 i.nextInt(); // unused,第 5 重载完全不读。源码注释 // special value is useless in ABS recipes。这意味着无法通过脚本设置合金高炉的熔炼温度。

  • 第 5 个重载的参数个数与消费个数不匹配(:188 vs :191-199):Action 构造传 8 个参数,applySingleRecipe 只 next 了 7 个(inputs / input / output / outputs / chances / duration / eut)。Special 留在迭代器中未被消费 —— 由于这是最后且无后续读取,当前不产生异常,但属明确的参数契约不一致。

  • 参数名拼写错误(Dehydrator.java:21):int[] chanses(应为 chances)。与 MultiblockCentrifuge / MultiblockElectrolyzer 的 chances 不一致。属复制粘贴残留。

  • BlastSmelter 5 个重载的 fluidOutput / fluidInput 位置不一致:第 1 个是 (fluidOutput, inputs, ...),第 2 个是 (fluidOutput, fluidInput, inputs, ...),第 3 个是 (outputs, fluidOutput, fluidInput, inputs, ...)。同名参数在 3 个重载中处于 3 个不同位置,极难记忆,且 ZenScript 的重载解析依赖参数类型,可能产生歧义。

  • MultiblockCentrifuge / MultiblockElectrolyzer 的 Special 参数同样被吞:两个类的最后一个 int Special 在 applySingleRecipe 中只读取不使用(与 BlastSmelter 一致)。

  • 参数命名首字母大小写不一致:int Special 首字母大写(不符合 Java 规范),而其他参数小写。

  • 6 个类的 Javadoc 全部缺失或极简:只有 BlastSmelter 有一段 10 行的 @param 注释(含一句未完成的 @return 混在 @param 中间,:26),其余 5 个完全无注释。

  • GT++ 门控 modid miscutils 与类名 GTPlusPlus 不一致:脚本作者看到 mods.gtpp.X 会去找 modid 为 gtpp 的 mod,但门控是 miscutils。源码无注释。

  • OreDict greggedItem 识别不到 GT++ 物品(见 OreDict greggedItem):startsWith("gregtech") 永不匹配 miscutils:*,本分组与该 getter 存在能力落差。

相关条目