加压水与能量换算

基本信息

属性 值
实现类 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 时数值巧合相同, 改配置就会让流体量与能量不匹配。详见 水力坝 的对应标注。

关联

  • 写入压力的机器见 水力泵
  • 读取压力的机器见 水力坝
  • 换算系数的配置项见 配置项
  • 完整生产链:水 →(泵,吃电)→ 加压水 →(坝,蓄能)→ 压力水 →(涡轮,发电)→ 普通水 + EU