加压水与能量换算
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | fluids/HEPressurizedWater.java(extends net.minecraftforge.fluids.Fluid) |
| 流体名 | pressurized_water(HEPressurizedWater.java:16 super("pressurized_water")) |
| 注册 | FluidRegistry.registerFluid(HE.pressurizedWater)(hooks/HEHooksShared.java:85) |
| 单例 | HE.pressurizedWater = new HEPressurizedWater()(HE.java,public static final) |
| 压力 NBT 键 | HETags.pressure = "pres"(float) |
完全借用原版水的外观
| 方法 | 行 | 返回 |
|---|---|---|
getColor() |
20-23 |
FluidRegistry.WATER.getColor() |
getStillIcon() |
25-28 |
FluidRegistry.WATER.getStillIcon() |
getFlowingIcon() |
30-33 |
FluidRegistry.WATER.getFlowingIcon() |
加压水与原版水视觉上完全无法区分——这是设计选择,不是缺陷。
唯一区别是它带一个 pres NBT 键。
⚠️ lang 键与流体名不一致:
setUnlocalizedName("Pressurized Water")(HEPressurizedWater.java:17) 产生的键是fluid.Pressurized Water=Pressurized Water(en_US.lang第 1 行), 带空格;而注册名是pressurized_water(下划线)。 Forge 实际查找用的是后者,中文客户端无对应翻译(见 配置项)。
压力的读写
public void setPressure(FluidStack fluidStack, float pressure) {
if (fluidStack.tag == null) {
fluidStack.tag = new NBTTagCompound();
}
fluidStack.tag.setFloat(HETags.pressure, pressure);
}
public float getPressure(FluidStack fluidStack) {
if (fluidStack.tag != null && fluidStack.tag.hasKey(HETags.pressure)) {
return fluidStack.tag.getFloat(HETags.pressure);
} else {
return -1;
}
}
(HEPressurizedWater.java:35-48)
| 要点 | 说明 |
|---|---|
| 压力存在流体 NBT 上 | 随 FluidStack 在管道中传递 |
| 缺省值 | -1(不是 0)——可与「压力为 0」区分 |
setPressure 会自动创建 NBTTagCompound |
传 new FluidStack(...) 进去即可 |
压力只有一处被真正使用
只有 水力坝 读压力:
final int waterLevelOverController = (int) (HEServer.instance.getWaterLevel(waterId) - getYCoord());
getStoredFluids().forEach(fluidStack -> {
if (fluidStack.getFluidID() == HE.pressurizedWater.getID()
&& HE.pressurizedWater.getPressure(fluidStack) >= waterLevelOverController) {
(HEHydroDamTileEntity.java:156-160)
语义:进水压力必须 ≥ 水面高出控制器的格数。
水头越高,需要的压力越大——泵的档位决定能压多高
(getPressure() = tierId × pressureIncreasePerTier,见 水力泵)。
| 机器 | 是否读压力 |
|---|---|
| 水力泵 | 写(setPressure(fluidStack, getPressure()),HEHydroPumpTileEntity.java:387) |
| 水力涡轮 | 不读——直接吞下任何压力的加压水 |
| 水力坝 | 读,作为吸水门槛 |
| 管道 | 透明传递 NBT |
📌 由此可见:低档位泵产出的水无法被高坝吸走。 坝的档位(靠电路)决定门槛,泵的档位决定产出压力——两者需匹配。
两个换算系数
| 常量 | 定义 | 默认 | 含义 |
|---|---|---|---|
HEConfig.milliBucketPerEU |
HEConfig.java:35、65 |
1.0f | 每 EU 对应多少毫桶(容量侧) |
HEConfig.euPerMilliBucket |
HEConfig.java:66 euPerMilliBucket = 1.0f / Defaults.milliBucketPerEU |
1.0f | 每毫桶对应多少 EU(产出侧) |
⚠️ 这两个是互逆关系,且是本 mod 最容易配错的一对:
euPerMilliBucket在syncronizeConfiguration里被重算:euPerMilliBucket = 1.0f / milliBucketPerEU;(HEConfig.java:225) ——所以改milliBucketPerEU会同时改euPerMilliBucket,两者不会脱节。- 静态初始化时也用同一公式(
HEConfig.java:66)保证首次加载一致。
使用位置:
| 位置 | 用途 | 行 |
|---|---|---|
泵 onTick 耗水 |
V[tier] × milliBucketPerEU |
HEHydroPumpTileEntity.java:370 |
泵 onTick 产量 |
getVoltage() × milliBucketPerEU |
HEHydroPumpTileEntity.java:383 |
泵 getMilliBucketsPerTick() |
(int)(getVoltage() × milliBucketPerEU) |
HETieredTileEntity.java:138-140 |
| 涡轮耗水 | getVoltage() × milliBucketPerEU |
HEHydroTurbineTileEntity.java:369 |
| 涡轮产 EU | consumedWater × euPerMilliBucket |
HEHydroTurbineTileEntity.java:379 |
| 坝吸 EU | fluidStack.amount × euPerMilliBucket |
HEHydroDamTileEntity.java:161 |
| 坝出 EU | distributedFluid × euPerMilliBucket |
HEHydroDamTileEntity.java:173 |
| 坝容量 | blocksPerY[y] × 1000 × euPerMilliBucket × 深度 |
HEDam.java:323-325、340-342 |
单位常量(HE.java):
| 常量 | 值 |
|---|---|
bucketToMilliBucket |
1 000 |
kiloBucketToMilliBucket |
1 000 000 |
⚠️
kiloBucketToMilliBucket(HE.java)在全代码库中没有读取点—— 是一个未被使用的常量。
📌 单位不一致(已核对):
HEHydroDamTileEntity.java:163写fluidStack.amount -= storableEnergy;,其中storableEnergy是按euPerMilliBucket换算出的能量。默认值1.0时数值巧合相同, 改配置就会让流体量与能量不匹配。详见 水力坝 的对应标注。