Fuels

基本信息

属性 值
类 gttweaker.mods.gregtech.Fuels
ZenClass mods.gregtech.Fuels
ModOnly @ModOnly("gregtech")
ZenMethod 数 6
目标 RecipeMap GTRecipeConstants.Fuel(注意:不是 RecipeMaps,是 GTRecipeConstants 里的常量)
动作类型 私有 AddRecipeAction extends AddMultipleRecipeAction → OneWayAction(不可撤销)
提交字段 metadata(FUEL_VALUE, ...) + metadata(FUEL_TYPE, ...),duration(0),eut(0)
作者 Stan Hebben

6 个 ZenMethod

# ZenMethod type 对应发电机
0 addDieselFuel(IItemStack output, IIngredient input, int euPerMillibucket) 0 柴油机
1 addGasTurbineFuel(IItemStack output, IIngredient input, int euPerMillibucket) 1 燃气轮机
2 addThermalGeneratorFuel(IItemStack output, IIngredient input, int euPerMillibucket) 2 Thermal Generator
3 addDenseFluidFuel(IItemStack output, IIngredient input, int euPerMillibucket) 3 高能流体发电机
4 addPlasmaGeneratorFuel(IItemStack output, IIngredient input, int euPerMillibucket) 4 等离子发电机
5 addMagicGeneratorFuel(IItemStack output, IIngredient input, int euPerMillibucket) 5 魔法发电机

6 个方法签名完全相同,仅 type 不同(Fuels.java:107-113)。type 既是 FUEL_TYPE metadata 的值,也是 GENERATORS 数组的索引。

提交逻辑(Fuels.java:116-126)

GTValues.RA.stdBuilder()
    .itemInputs(i.nextItem())      // input(IIngredient 展开后的第一个)
    .itemOutputs(i.nextItem())     // output(可为 null)
    .metadata(FUEL_VALUE, i.nextInt())   // euPerMillibucket
    .metadata(FUEL_TYPE, i.nextInt())    // type
    .duration(0)
    .eut(0)
    .addTo(GTRecipeConstants.Fuel);

duration 与 eut 被硬编码为 0 —— 燃料配方不需要这两项。

数值

数值 值
ZenMethod 数 6
FUEL_TYPE 取值域 0–5
GENERATORS 数组 {"diesel", "gas turbine", "thermal", "dense fluid", "plasma", "magic"}
duration 恒 0
eut 恒 0
FUEL_VALUE 脚本参数 euPerMillibucket 直传
目标 map GTRecipeConstants.Fuel
可撤销 否
describe() "Adding " + GENERATORS[type] + " fuel " + input

源码缺陷

  • 文档承诺的行为无实现:6 个方法的 Javadoc 都写「If the given item does not contain any liquid, it will generate the equivalent of 1000 millibuckets.」(Fuels.java:27-28 等),但 applySingleRecipe 完全没读 GTUtility.getFluidForFilledItem —— 只有 itemInputs / itemOutputs 两个物品字段,没有 fluidInputs / fluidOutputs。容器装液体的行为由 GT5 本体处理,本方法只注册物品侧的燃料值。文档描述的是本类之外的兜底行为,容易被误读为本类实现。
  • output 参数可为 null(Javadoc 明示「optional, can be null」):itemOutputs(null) 的行为依赖 GTRecipeBuilder,源码无保护。AddMultipleRecipeAction 中 IItemStack 分支调 MineTweakerMC.getItemStack(ILiquidStack...)——若 internal 为 null 可能 NPE。
  • GENERATORS[type] 索引无边界检查(:113):type 由 6 个方法硬编码传入(0–5),当前安全;但构造器是 public,若被反射以其他 type 调用即 ArrayIndexOutOfBoundsException。
  • GENERATORS 是 private static final String[] 可变数组:final 只保证引用不变,数组内容仍可被反射改写。
  • AddRecipeAction 是 private static class:与 RA2Builder.RecipeAddAction / RecipeRemover.RecipeRemoveAction 的 public static 风格不一致,但因不对外暴露故无实际影响。
  • 6 个方法全部委托同一个私有 Action,无差异化逻辑 —— 6 倍代码量换来 1 个 type 参数,属可直接用循环注册的样板。

相关条目