水力泵(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。