水力涡轮(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:66euPerMilliBucket = 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。
配方
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
(涡轮用向下箭头,泵用向上)。