水力泵(Hydro Pump)

基本信息

属性 值
实现类 blocks/HEHydroPumpTileEntity.java(464 行,abstract)
电压型号数 14(LV ~ MAX),每档一个静态内部类
注册 ID HEConfig.blockIdOffset + 1(默认 17001),14 档共用同一个方块 ID,靠 metadata 区分
多方块尺寸 3 × 3 × 3(tt.beginStructureBlock(3, 3, 3, true),HEHydroPumpTileEntity.java:434)
控制器位置 正面中心(x+1, y+1, z+0),tt.addController("Front Center")(HEHydroPumpTileEntity.java:435)
壳体 按档位不同,见 各档位壳体
核心空腔 中心 1 格 (1, 1, 1) 为空气
必需舱室 能源舱 ×1、输入舱 ×1、输出舱 ×1、维护舱 ×1

语义(HEHydroPumpTileEntity.java:428-429): Consumes EU to pressurize water / Output is pressurized water for Hydro Dams ——吃电,把普通水变成加压水,产出的加压水供 水力坝 吸水。

结构定义

HETieredTileEntity.java:189-204(泵与涡轮共用):

.addShape(
        HETags.mainStructure,
        transpose(
                new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C C", "CCC" },
                        { "CCC", "CCC", "CCC" } }))
.addElement('C', ofChain(
        ofHatchAdder(HETieredTileEntity::addClassicToMachineList, getCasingTextureId(),
                casingBlock, casingMeta),
        ofBlock(casingBlock, casingMeta)))
y 层 z=0 z=1 z=2
2 CCC CCC CCC
1 C~C ← 控制器 x=1 C C ← 中心 x=1 为空气 CCC
0 CCC CCC CCC

checkPiece(HETags.mainStructure, 1, 1, 0, errors)(HETieredTileEntity.java:165) 与 buildPiece(..., 1, 1, 0)(HETieredTileEntity.java:181)偏移 (1, 1, 0)。

结构定义无对称性声明 → 固定朝向,控制器必须在 z+0 面。 源码中没有任何旋转支持。

舱室校验

HETieredTileEntity.checkMachine(HETieredTileEntity.java:163-170):

checkPiece(HETags.mainStructure, 1, 1, 0, errors);
checkHasOne(errors, InputHatch);
checkHasOne(errors, OutputHatch);
checkOneMaintenanceHatch(errors);

checkHasOne 要求恰好 1 个,0 个或 2 个都报 ErrorType.NOT_MATCH (HETieredTileEntity.java:172-177)。

泵额外加 checkOneEnergyHatch(errors)(HEHydroPumpTileEntity.java:421)。

舱室可放在任意 C 位置(tt.addXxxHatch("Any Casing", 1), HEHydroPumpTileEntity.java:436-439)。

每 tick 逻辑 onTick(HEHydroPumpTileEntity.java:369-389)

int requiredWater = (int) (GTValues.V[getTier()] * HEConfig.milliBucketPerEU);
for (FluidStack fluidStack : getStoredFluids()) {
    if (fluidStack.getFluid().getID() == FluidRegistry.WATER.getID()) {
        final int consumedWater = Math.min(fluidStack.amount, requiredWater);
        requiredWater -= consumedWater;
        fluidStack.amount -= consumedWater;
    }
}
if (requiredWater > 0) {
    stopMachine(ShutDownReasonRegistry.NONE);
    return;
}

float pumpedWater = getVoltage() * HEConfig.milliBucketPerEU;
pumpedWater *= getEfficiencyModifier();
pumpedWater *= ((float) getCurrentEfficiency(null)) / 100_00.0f;
final FluidStack fluidStack = new FluidStack(HE.pressurizedWater, (int) pumpedWater);
HE.pressurizedWater.setPressure(fluidStack, getPressure());
addOutput(fluidStack);
步骤 行为
1 按 V[档位] × milliBucketPerEU 计算本 tick 需消耗的普通水(mB)
2 只吸收 FluidRegistry.WATER(原版水,不是加压水)
3 水不够 → stopMachine(ShutDownReasonRegistry.NONE) 并 return(不产出)
4 产量 = 电压 × milliBucketPerEU × 效率系数 × GT 机器效率
5 产出 HE.pressurizedWater,压力 NBT 写 getPressure()
6 addOutput(fluidStack) 送入输出舱

📌 第 4 步用 getVoltage()(GTValues.V[getTier()]), 第 1 步用 GTValues.V[getTier()] 直接写死——两者数值相同, 但一个是封装方法、一个是裸数组,可维护性不一致。

档位参数公式(HETieredTileEntity.java)

方法 公式 行
getVoltage() GTValues.V[getTier()] 122-124
getPressure() getTier() * HEConfig.pressureIncreasePerTier 126-128
getEfficiencyModifier() 1.0f - getTier() * HEConfig.efficiencyLossPerTier 130-132
getEfficiencyModifierInPercent() String.format("%.0f", 效率 × 100) + "%" 134-136
getMilliBucketsPerTick() (int)(getVoltage() * HEConfig.milliBucketPerEU) 138-140
getEnergyConsumption()(泵覆写) -getVoltage()(负数 = 耗电) HEHydroPumpTileEntity.java:446-448

用配置默认值代入(pressureIncreasePerTier = 2.0、efficiencyLossPerTier = 0.03):

档位 tierId 压力 效率
LV 1 2.0 97%
MV 2 4.0 94%
HV 3 6.0 91%
EV 4 8.0 88%
IV 5 10.0 85%
LuV 6 12.0 82%
ZPM 7 14.0 79%
UV 8 16.0 76%
UHV 9 18.0 73%
UEV 10 20.0 70%
UIV 11 22.0 67%
UMV 12 24.0 64%
UXV 13 26.0 61%
MAX 14 28.0 58%

ULV 不存在(HEBlockRecipes.java:31 注释 // ULV is disabled!, 配方数组第 0 位是 null)。 不要编造 ULV 泵的数值。

各档位壳体

getCasingBlock()(HETieredTileEntity.java:47-64)与 getCasingMeta()(HETieredTileEntity.java:67-88):

档位 tierId getCasingBlock() getCasingMeta()
LV 1 sBlockCasings2 0
MV 2 sBlockCasings2 1
HV 3 sBlockCasings4 1
EV 4 sBlockCasings4 2
IV 5 sBlockCasings4 0
LuV 6 sBlockCasings8 6
ZPM 7 sBlockCasings8 7
UV 8 sBlockCasings4 14
UHV 9 sBlockCasings4 2
UEV 10 ⚠️ sBlockCasings2(default) ⚠️ 0(default)
UIV 11 sBlockCasings8 3
UMV 12 ⚠️ sBlockCasings2(default) ⚠️ 0(default)
UXV 13 ⚠️ sBlockCasings2(default) ⚠️ 0(default)
MAX 14 ⚠️ sBlockCasings2(default) ⚠️ 0(default)

⚠️ 源码缺陷:4 个档位壳体未实现

两个 switch 都只覆盖 case 1–9 和 11,源码自带 TODO:

// TODO: case 10, 12 - 15
protected Block getCasingBlock() {
    switch (getTier()) {
        default:
        case 1:
        case 2:
            return GregTechAPI.sBlockCasings2;
        ...
位置 问题
HETieredTileEntity.java:46 // TODO: case 10, 12 - 15
HETieredTileEntity.java:66 同一条 TODO 重复一次
HETieredTileEntity.java:47-64 UEV(10)、UMV(12)、UXV(13)、MAX(14) 落到 default → 用 LV 同款 sBlockCasings2 meta 0

TODO 写的是 12 - 15,但实际最大 tierId 是 14,15 不存在—— TODO 注释本身也写错了(HETieredTileEntity.java:46、66)。 上表已按 tierId 实测值(1–14)列出。

getCasingName()(HETieredTileEntity.java:117-120)用 GTLanguageManager.getTranslation(方块未本地化名 + "." + meta + ".name") 取壳体显示名,所以壳体错误会直接显示在结构提示里。

getCasingTextureId()(HETieredTileEntity.java:90-…)按 sBlockCasings1..6 分别加 0/16/32/48/64/80 偏移。

配方

14 档共用一套配方模板,仅在 enabledTiers 打开的档位生成。 见 装配机配方。

未打开的档位会被 NEI 隐藏(hooks/HEHooksShared.java:129-137): if (HEConfig.enabledTiers[tierId] == false) API.hideItem(...)。 注意方块仍然注册且可放置(源码注释 // Instantiate all variants in case a server has a different configuration the block is still available, hooks/HEHooksShared.java:93),只是 NEI 里看不到。

结构提示文本(HEHydroPumpTileEntity.java:426-442)

tt.addMachineType("Hydro Pump");
tt.addInfo("Consumes EU to pressurize water");
tt.addInfo("Output is pressurized water for Hydro Dams");
tt.addInfo("Requires a Energy, Input, Output and Maintenance Hatch anywhere!");
tt.addInfo("Requires " + getMilliBucketsPerTick() + "mB Water per Tick");
tt.addInfo("Efficiency: " + getEfficiencyModifierInPercent());
tt.addInfo("Use Redstone to automate!");

按钮(HEHydroPumpTileEntity.java:451-463): isPowerPassButtonEnabled = false、isSafeVoidButtonEnabled = false、 isAllowedToWorkButtonEnabled = true。

贴图

registerIcons(HEHydroPumpTileEntity.java:391-397,@SideOnly(Side.CLIENT)): iconsets/he_pump、iconsets/he_pump_active、iconsets/he_arrow_up_animated。

关联