能量系统换算

基本信息

属性 值
类型 跨模组能量制式换算工具(枚举)
类 eu.usrv.gtsu.helper.EnergySystemConverter.PowerSystem
枚举值 GT5、RF、IC2、Joule
当前调用方 无 — 全 mod 源码中没有任何位置引用该类(已用 grep 确认)

[!WARNING] 该枚举在当前提交(a8df273)中是遗留代码。资源目录虽有 textures/blocks/powersystems/gt5_acceptor.png 与 gt5_producer.png, lang 文件也有 gtsu.multiblock.* 文案键,但没有任何方块、机器或多方块结构使用它。 下面的换算比例是源码中硬编码的常量,供对照参考,不代表游戏内已生效的换算规则。

换算比例

public static enum PowerSystem {
    GT5(5),    // 5 GT 单位 = 1 本制单位
    RF(20),    // 20 RF = 1 本制单位
    IC2(5),    // 5 EU = 1 本制单位
    Joule(50); // 50 J = 1 本制单位
}
制式 比例 _mRatio 含义(源码注释语义)
GT5 5 1 个本制单位 = 5 GT EU
RF 20 1 个本制单位 = 20 RF
IC2 5 1 个本制单位 = 5 EU
Joule 50 1 个本制单位 = 50 焦耳

GT5 与 IC2 比例相同(都是 5),因此 GT5.convertTo(IC2, x) == x — 两个制式在本换算器中互相等价。 这也是该枚举被设计成"EU 家族共用比例"的原因:GT 的 EU 与 IC2 的 EU 在本模组作者的假设下是 1:1。

getRatio() 是公开的取比例方法。

换算公式

两个方法都做向上取整(Math.ceil),即换算总是向"更多能量"一侧偏保守地取整。

getEnergyUnits(long pValue) — 换算成"本制单位"

return new Double(Math.ceil((double)pValue / (double)_mRatio)).longValue();
调用 输入 结果
GT5.getEnergyUnits(1000) 1000 GT ceil(1000/5) = 200
RF.getEnergyUnits(1000) 1000 RF ceil(1000/20) = 50
IC2.getEnergyUnits(1000) 1000 EU ceil(1000/5) = 200
Joule.getEnergyUnits(1000) 1000 J ceil(1000/50) = 20
GT5.getEnergyUnits(4) 4 GT ceil(4/5) = 1(不足 1 单位仍记 1)
GT5.getEnergyUnits(0) 0 0

convertTo(PowerSystem pTarget, long pAmount) — 跨制式换算

double tBaseEnergy = (double)pAmount / (double)_mRatio;   // 先转成本制单位
tBaseEnergy = Math.ceil(tBaseEnergy);                     // 向上取整
return new Double(tBaseEnergy * pTarget.getRatio()).longValue();  // 再转成目标制

算法是两步走:先归一化到"本制单位"(一次向上取整),再乘目标比例。

换算 计算 结果
GT5.convertTo(RF, 1000) ceil(1000/5) × 20 = 200 × 20 4000
RF.convertTo(GT5, 1000) ceil(1000/20) × 5 = 50 × 5 250
GT5.convertTo(IC2, 1000) ceil(1000/5) × 5 = 200 × 5 1000(无损)
IC2.convertTo(Joule, 1000) ceil(1000/5) × 50 = 200 × 50 10000
Joule.convertTo(GT5, 1000) ceil(1000/50) × 5 = 20 × 5 100
RF.convertTo(GT5, 4) ceil(4/20) = 1,1 × 5 5(不足 1 单位先补到 1)

换算的非对称性

由于两次向上取整,降向换算会放大误差:RF.convertTo(GT5, 4) 把 4 RF 变成 5 GT 等价值。 反过来 GT5.convertTo(RF, 4) 则是 ceil(4/5) × 20 = 1 × 20 = 20 RF。 小额换算在两个方向上都不是精确守恒的,误差随取整累积。

相关枚举

eu.usrv.gtsu.helper.Enums 定义了两个同样未被引用的枚举:

枚举 值 语义
EN_EnergyType GT5(唯一值) 能量类型标识,暗示作者原计划只支持 GT5 能量制式
EDataLoadState NoData、Loaded、LoadedVerified 数据加载三态:无数据 / 已加载 / 已加载并校验

EN_EnergyType 只有 GT5 一个值,与 PowerSystem 同时存在但未与 PowerSystem 建立任何关联, 说明这两套枚举是同一设计思路的两份未收敛的草稿。

与 GTSU 方块能量系统的关系

GTSU 方块本身不使用本换算器。TileEntityGTSU 直接以 EU 为单位工作:

项目 值 来源
存储能量 mEnergy(long),单位 EU NBTVAL_ENERGY
传输速率 mOutput(int)= TierHelper.V[mTier] 源码常量
IC2 接口 IEnergySink / IEnergySource,getSourceTier() = getSinkTier() = 2 + mTier IC2 API

因此 GT5 的 EU 与 IC2 的 EU 之间的换算由其他 mod / 整合包机制负责, GTSU 自身只在 PowerSystem 枚举里预留了 1:1(比例同为 5)的换算表。

相关条目