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 疑问 DehydratorcentrifugeNonCellRecipesGT5 的「离心机(无容器)」不是「脱水机」 MultiblockCentrifugechemicalDehydratorRecipes名字里是「脱水机」,类名是「多方块离心机」 MultiblockElectrolyzerelectrolyzerNonCellRecipes对应关系较合理 这三对名称的对应关系无法仅从本仓库源码确定(需要 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 个重载的参数个数与消费个数不匹配(
:188vs: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 存在能力落差。
相关条目
- 化学类机器 - GT 5 侧的
Centrifuge/Electrolyzer(不同 map) - 冶炼类机器 - GT 5 侧的
AlloySmelter/PyrolyseOven(不同 map) - 注册时序 -
GTPlusPlus.isModLoaded()的门控位置 - OreDict greggedItem - 只识别
gregtech前缀