能量系统
基本信息
| 属性 | 值 |
|---|---|
| 核心单位 | energyDrainUnit = 0.12F,minSignificantEnergy = 0.0001F(mechanics/energy/EnergyChunkData.java:14-15) |
| 定价表 | EnergyValues:32 个物品 + 7 个生物类 |
| 能量簇状态 | 4 档(EnergyClusterHealth 枚举) |
| 能量储存方块 | energy_cluster / corrupted_energy_high / corrupted_energy_low |
| 数据源 | mechanics/energy/(7 个类) |
功能
末地是一块持续「充电」的区域。EnergyChunkData 把末地按区块(16×16)划分为能量格,每格有自己的能量上下限,会自然回充、也会自然泄放,泄放时在末地随机高度生成 corrupted_energy_low 方块。玩家用 energy_wand 从能量簇抽取能量,再把物品丢进 energy_extraction_table 按 EnergyValues 定价换成 essence。
区块能量模型(EnergyChunkData.java:23-55)
区块最大能量按到末地原点的距离 dist 线性取值(EnergyChunkData.java:27-31):
float dist = (float) MathUtil.distance(x, z);
float lowerBound = 4F + 2F * (dist / 6000F), upperBound = 10F + 6F * (dist / 6000F);
maxEnergyLevel = lowerBound + rand.nextFloat() * (upperBound - lowerBound);
energyLevel = maxEnergyLevel - maxEnergyLevel * rand.nextFloat() * rand.nextFloat();
回充(:35-40):
- 增量
min(0.025F, sqrt(maxEnergyLevel) * 0.007F) - 下一次回充冷却
9 + rand(12 + rand(6)) + floor(16 × 当前/最大 + 最大 × 0.2)tick
泄放(:42-54):
- 触发条件:
energyLevel > maxEnergyLevel,或energyLevel > 0.8 × maxEnergyLevel且rand.nextInt(10) == 0 - 泄放量
(0.2F + rand.nextFloat() * 0.5F) * maxEnergyLevel * 0.0625F - 泄放冷却
4 + rand(7)tick - 在
x + rand(16), 8 + rand(116), z + rand(16)处放置corrupted_energy_low,meta 为clamp(floor(1 + release × 12), 2, 8)
相邻区块互相作用:onAdjacentInteract 在 rand.nextInt(42) == 0 且双方能量差 > 0.4F + rand.nextFloat() * 2.5F 时触发(EnergyChunkData.java:57-60)。主世界另有一份数据类 EnergyChunkDataOverworld。
数值
能量簇状态(mechanics/energy/EnergyClusterHealth.java:8-11)
| 常量 | 颜色 | 生成权重 | 回充冷却 | 回充倍率 | 转弱概率 | lang key |
|---|---|---|---|---|---|---|
HEALTHY |
0x54ff54 |
10 | 15 | 1.0F | 90 | energy.status.healthy |
WEAKENED |
0xffc454 |
7 | 32 | 0.75F | 40 | energy.status.weakened |
TIRED |
0xff7a54 |
3 | 58 | 0.4F | 10 | energy.status.tired |
UNSTABLE |
0xff5454 |
1 | −1 | 0.0F | 0 | energy.status.unstable |
字段与构造签名见 EnergyClusterHealth.java:16-31(color, spawnWeight, regenTimer, regenMultiplier, chanceToWeaken, translationText)。UNSTABLE 的 regenTimer 为 -1、regenMultiplier 为 0 —— 不回充。
WeightedList<EnergyClusterHealth> spawnWeightedList = new WeightedList<>(values)(:14)用于按权重随机初始状态。
完整物品定价表(mechanics/energy/EnergyValues.java:29-60)
实际能量 = 0.12F × energyUnits。
| energyUnits | 对象 | 行 |
|---|---|---|
| 0.40 | Blocks.end_stone |
29 |
| 0.50 | BlockList.end_terrain |
30 |
| 0.50 | adventurers_diary |
31 |
| 0.55 | persegrit |
32 |
| 0.65 | silverfish_blood |
33 |
| 0.75 | stardust |
34 |
| 0.80 | end_powder |
35 |
| 0.90 | igneous_rock |
36 |
| 1.10 | endium_ingot |
37 |
| 1.20 | knowledge_note |
38 |
| 1.50 | Items.ender_pearl |
39 |
| 1.65 | enhanced_ender_pearl |
40 |
| 1.65 | BlockList.enhanced_brewing_stand |
41 |
| 1.65 | BlockList.enhanced_tnt |
42 |
| 1.95 | Items.ender_eye |
43 |
| 2.60 | instability_orb |
44 |
| 3.10 | BlockList.spooky_log |
45 |
| 3.10 | BlockList.spooky_leaves |
46 |
| 3.25 | rune |
47 |
| 3.40 | auricion |
48 |
| 3.75 | Blocks.ender_chest |
49 |
| 4.00 | temple_caller |
50 |
| 4.20 | ectoplasm |
51 |
| 4.20 | spectral_tear |
52 |
| 4.30 | BlockList.void_chest |
53 |
| 4.80 | charm |
54 |
| 5.50 | spatial_dash_gem |
55 |
| 6.20 | energy_wand_core |
56 |
| 6.40 | energy_wand |
57 |
| 7.80 | transference_gem |
58 |
| 10.10 | BlockList.endium_block |
59 |
| 10.50 | living_matter |
60 |
定价 API:getItemEnergy(ItemStack) 遍历 items 的 key 调 idp.check(is)(EnergyValues.java:86-92),未命中返回 0F。IMC 可通过 setItemEnergy(ItemDamagePair, float) 追加定价,但只在原值为 0 时才允许写入(EnergyValues.java:79-84)。生物侧 setMobEnergy 拒绝重复 key(:94-98)。
交互
- 能量转化粒子:
C10ParticleEnergyTransfer(packets/client/) - 事件:
EnergyEvents,注册于HardcoreEnderExpansion.java:143 - 相关类:
EnergyClusterData(簇状态持久化)、EnergyChunkDataOverworld(主世界版) essence祭坛与抽取台共享TileEntityAbstractEnergyInventory基类(tileentity/TileEntityAbstractEnergyInventory.java)
合成配方
| 产物 | 配方 | 位置 |
|---|---|---|
energy_wand_core |
3×3 auricion,中心 endium_block |
mechanics/RecipeList.java:243-251 |
energy_wand |
" C" / " R " / "R "(C=energy_wand_core R=obsidian_rod) |
mechanics/RecipeList.java:253-261 |
energy_extraction_table |
PBP / SCS / INI,中心 C=living_matter |
mechanics/RecipeList.java:116-132 |
energy_cluster 与 corrupted_energy_high / corrupted_energy_low 没有合成配方:前者由 WorldGenEnergyCluster 生成,后两者由 EnergyChunkData.onUpdate 泄放与战斗逻辑放置。