水力涡轮(Hydro Turbine)

基本信息

属性 值
实现类 blocks/HEHydroTurbineTileEntity.java(461 行,abstract)
电压型号数 14(LV ~ MAX)
注册 ID HEConfig.blockIdOffset + 17(默认 17017),14 档共用同一个方块 ID
多方块尺寸 3 × 3 × 3(tt.beginStructureBlock(3, 3, 3, **false**),HEHydroTurbineTileEntity.java:425)
控制器位置 正面中心(x+1, y+1, z+0)
核心空腔 中心 1 格 (1, 1, 1) 为空气
必需舱室 发电机舱(Dynamo)×1、输入舱 ×1、输出舱 ×1、维护舱 ×1

语义(HEHydroTurbineTileEntity.java:419-420): Consumes pressurized water to produce EU / Input is pressurized water from Hydro Dams ——水力泵的逆过程:吃加压水,产电,并把水还原成普通水排出。

⚠️ 与泵的一个实质差异:涡轮用 beginStructureBlock(3, 3, 3, false) (HEHydroTurbineTileEntity.java:425),泵用 true(HEHydroPumpTileEntity.java:434)。 第四个参数是「是否含控制器」,两者含义相反: 泵的那一格 C(z=0 中心)实际就是控制器所在位置,却被当成普通壳体处理。 源码没有解释这个不一致,不要臆断为笔误。

结构定义

与泵完全共用 HETieredTileEntity.getStructure_EM() (HETieredTileEntity.java:185-207),壳体按档位决定:

{ "CCC", "CCC", "CCC" },
{ "C~C", "C C", "CCC" },
{ "CCC", "CCC", "CCC" }

C = 档位壳体或任意舱室,~ = 控制器(x+1, y+1, z+0), C C 的中间格 (1, 1, 1) 是空气。

详见 水力泵 · 结构定义(同源,不再重复)。

结构定义无对称性声明 → 固定朝向,不支持旋转。

舱室校验

HETieredTileEntity.checkMachine 要求 Input ×1、Output ×1、Maintenance ×1 (HETieredTileEntity.java:167-169)。

涡轮额外要求恰好 1 个发电机舱:

@Override
public void checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack, List<StructureError> errors) {
    super.checkMachine(aBaseMetaTileEntity, aStack, errors);
    checkHasOne(errors, gregtech.api.enums.HatchElement.Dynamo);
}

(HEHydroTurbineTileEntity.java:437-440)

对比:泵要求的是 checkOneEnergyHatch(能源舱,HEHydroPumpTileEntity.java:421), 涡轮是 checkHasOne(Dynamo)(发电机舱)。两者不是同一种舱。

每 tick 逻辑 onTick(HEHydroTurbineTileEntity.java:368-385)

final int consumableWaterPerTick = (int) (getVoltage() * HEConfig.milliBucketPerEU);
int consumedWater = 0;
for (FluidStack fluidStack : getStoredFluids()) {
    if (fluidStack.getFluidID() == HE.pressurizedWater.getID()) {
        final int consumableWater = Math.max(0, consumableWaterPerTick - consumedWater);
        final int processedWater = Math.min(fluidStack.amount, consumableWater);
        fluidStack.amount -= processedWater;
        consumedWater += processedWater;
    }
}
float producedEU = consumedWater * HEConfig.euPerMilliBucket;
producedEU *= getEfficiencyModifier();
producedEU *= (float) getCurrentEfficiency(null) / 100_00.0f;
addEnergyOutput_EM((int) producedEU, 1);

addOutput(new FluidStack(FluidRegistry.WATER, consumedWater));
步骤 行为
1 每 tick 可处理量 = 电压 × milliBucketPerEU(mB 加压水)
2 只吸收 HE.pressurizedWater
3 不检查压力——直接吞下任何压力的加压水
4 产 EU = 消耗量 × euPerMilliBucket × 档位效率 × GT 机器效率
5 addEnergyOutput_EM(producedEU, 1) 输出到发电机舱
6 把同样数量的普通水(FluidRegistry.WATER)排回输出舱

⚠️ 与泵的关键语义差异:泵把加压水的压力写进 NBT (HE.pressurizedWater.setPressure(fluidStack, getPressure())), 而涡轮完全不读压力——高压水与压力 0 的水产出完全相同。 压力只对 水力坝 的吸入门槛有意义。

📌 第 4 步用 euPerMilliBucket,泵的第 4 步用 milliBucketPerEU—— 二者互为倒数(HEConfig.java:66 euPerMilliBucket = 1.0f / milliBucketPerEU), 配对正确。

与泵的效率差异

机器 耗水判定 不够时
泵 先算 requiredWater,不足则 stopMachine 并 return(HEHydroPumpTileEntity.java:378-381) 停机,不产出
涡轮 无判定,有多少吃多少(HEHydroTurbineTileEntity.java:371-378) 照常按实际消耗量产电

即涡轮可以「吃半饱」继续发电,泵不行。

档位参数

与泵共用 HETieredTileEntity 的全部公式,唯一区别是能耗符号:

方法 涡轮 泵
getEnergyConsumption() getVoltage()(HEHydroTurbineTileEntity.java:443-445) -getVoltage()(HEHydroPumpTileEntity.java:446-448)

getPressure() / getEfficiencyModifier() / getMilliBucketsPerTick() 定义在 HETieredTileEntity.java:126-140,涡轮并不使用 getPressure()(只写不用)。

各档位压力 / 效率表见 水力泵 · 档位参数公式(同源)。

⚠️ 壳体缺陷同样存在

getCasingBlock() / getCasingMeta() 定义在 HETieredTileEntity, 涡轮继承同一实现,因此 UEV(10)、UMV(12)、UXV(13)、MAX(14) 同样落到 default 分支, 使用 LV 同款 sBlockCasings2 meta 0。

详见 水力泵 · ⚠️ 源码缺陷:4 个档位壳体未实现。

配方

14 档共用一套配方模板,与泵的配方唯一差别是电路数量:

机器 电路 行
泵 GTUtility.getIntegratedCircuit(1) HEBlockRecipes.java:117
涡轮 GTUtility.getIntegratedCircuit(2) HEBlockRecipes.java:128

其余材料完全相同。详见 装配机配方。

结构提示文本(HEHydroTurbineTileEntity.java:416-433)

tt.addMachineType("Hydro Turbine");
tt.addInfo("Consumes pressurized water to produce EU");
tt.addInfo("Input is pressurized water from Hydro Dams");
tt.addInfo("Requires a Dynamo, Input, Output and Maintenance Hatch anywhere!");
tt.addInfo("Produces up to " + getMilliBucketsPerTick() + "mB Water per Tick");
tt.addInfo("Efficiency: " + getEfficiencyModifierInPercent());
tt.addInfo("Use Redstone to automate!");
tt.beginStructureBlock(3, 3, 3, false);
tt.addController("Front Center");
tt.addDynamoHatch("Any Casing", 1);
tt.addInputHatch("Any Casing", 1);
tt.addOutputHatch("Any Casing", 1);
tt.addMaintenanceHatch("Any Casing", 1);
tt.addStructureInfo("Fill the rest with " + getCasingName());

📌 第 5 行 tooltip 写 Produces up to N mB Water per Tick, 实际指的是处理的加压水量,产出物是普通水——文案不精确但不影响逻辑。

按钮(HEHydroTurbineTileEntity.java:448-460):与泵相同, isPowerPassButtonEnabled / isSafeVoidButtonEnabled = false, isAllowedToWorkButtonEnabled = true。

贴图

registerIcons(HEHydroTurbineTileEntity.java:387-393,@SideOnly(Side.CLIENT)): iconsets/he_turbine、iconsets/he_turbine_active、iconsets/he_arrow_down_animated (涡轮用向下箭头,泵用向上)。

关联