能量系统换算
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 跨模组能量制式换算工具(枚举) |
| 类 | 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)的换算表。
相关条目
- GTSU 能量储存单元 - 实际以 EU 为单位运行的 8 个方块
- 红石模式 - 方块的红石输出设置