TileEntityEnergyStorageModule(能量储存模块)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Energy Storage Module |
GalacticraftCore.java:728 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 GalacticraftCore.java:160-161 |
| 关联方块(旧版) | BlockMachine |
core/blocks/BlockMachine.java:225(metadata 4) |
| 关联方块(分体版) | BlockMachineTiered |
core/blocks/BlockMachineTiered.java:268(按 metadata / 8 + 1 决定 tier) |
| 父类 | TileBaseUniversalElectricalSource |
core/energy/tile/TileBaseUniversalElectricalSource.java:29-30 |
| 实现接口 | ISidedInventory / IConnector |
core/tile/TileEntityEnergyStorageModule.java:23-24 |
| 槽位数 | 2(getSizeInventory() 见 core/tile/TileEntityEnergyStorageModule.java:162-164) |
同上 |
⚠ 它自己实现 ISidedInventory,不实现 IInventory 也不实现 IInventory 之外的容器接口——
所以没有 getContainingItems() 抽象层,直接用 containingItems。
槽位与字段
core/tile/TileEntityEnergyStorageModule.java:28:
private ItemStack[] containingItems = new ItemStack[2];
getSizeInventory()(:162-164)返回 this.containingItems.length → 恒为 2。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 电池输入(充电) | core/tile/TileEntityEnergyStorageModule.java:245-247 canInsertItem 判 getTransfer(...) > 0;updateEntity :94 调 recharge(...) |
| 1 | 电池输出(放电) | core/tile/TileEntityEnergyStorageModule.java:248-250 判 getElectricityStored(...) > 0;updateEntity :95 调 discharge(...) |
isItemValidForSlot(:233-235)对两格一律放行 ItemElectricBase.isElectricItem。
getAccessibleSlotsFromSide 返回 {0, 1}(:238-240),六面全开放。
能量容量与传输速率(本篇核心常量)
core/tile/TileEntityEnergyStorageModule.java:26-27:
private static final float BASE_CAPACITY = 500000;
private static final float TIER2_CAPACITY = 2500000;
| 常量 | Tier 1 | Tier 2 | 来源 |
|---|---|---|---|
| 容量 | 500000 | 2500000 | core/tile/TileEntityEnergyStorageModule.java:48、:57 |
maxExtract |
300 | 1800 | core/tile/TileEntityEnergyStorageModule.java:49、:58 |
tierGC |
1(父类默认) | 2 | core/energy/tile/EnergyStorageTile.java:23、core/tile/TileEntityEnergyStorageModule.java:59 |
maxReceive |
25 | 25 | 本类从不调 setMaxReceive,沿用 core/energy/tile/EnergyStorageTile.java:21(new EnergyStorage(STANDARD_CAPACITY, 10),两参构造见 core/energy/tile/EnergyStorage.java:19-21,展开为 maxReceive = 2.5F * 10 = 25、maxExtract = 10) |
⚠ maxReceive 一直是默认的 25,两个 tier 都一样——只进 25、出 300/1800。
这个类不是「充放电对称」的电池。单位是 gJ,不是 RF、不是 EU。
构造器 :37-60:无参构造器(:37-39)委托 this(1)(Tier 1);tier != 1 一律走 setTier2()(:44-54)。
满载时的额外损耗
core/tile/TileEntityEnergyStorageModule.java:78-82:
if (this.getTierGC() == 1 && !this.worldObj.isRemote
&& this.lastEnergy - energy > this.storage.getMaxExtract() - 1) {
this.storage.extractEnergyGC(25, false);
}
仅 Tier 1:当一个 tick 内掉电超过 maxExtract - 1(即 299)时,
额外白扣 25 gJ。源码注释(:80)写明这是为了让 Tier 1 撑起 10 台 Tier 1 机器。
NBT 兼容性陷阱
core/tile/TileEntityEnergyStorageModule.java:142-144:tierGC == 1 时若实际存量
> BASE_CAPACITY 就强制截到 500000 再写盘。readFromNBT(:115-122)
反向用存量是否超 BASE_CAPACITY 来判定是否升到 Tier 2。
updateEntity(:64-77)还会在首次 tick 时把旧的 machineBase 方块替换为
machineTiered(:69-73)。
电力方向
| 方法 | 返回 | 来源 |
|---|---|---|
getElectricalInputDirections() |
背向方块朝向的一侧 + UNKNOWN |
core/tile/TileEntityEnergyStorageModule.java:271-275 |
getElectricalOutputDirections() |
朝向的一侧 + UNKNOWN |
core/tile/TileEntityEnergyStorageModule.java:278-280 |
getElectricalOutputDirectionMain() |
ForgeDirection.getOrientation((metadata & 3) + 2) |
core/tile/TileEntityEnergyStorageModule.java:283-285 |
canConnect(...) |
只接电力网;方向须为本体朝向或它的反向 | core/tile/TileEntityEnergyStorageModule.java:288-297 |
canConnect 在 direction == null / UNKNOWN / type != NetworkType.POWER 时返回 false
(:289-291)。
GUI / Container
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiEnergyStorageModule |
core.inventory.ContainerEnergyStorageModule |
Container :133-134、Gui :223-224 |
网络封包
playersUsing(:30)为 final Set<EntityPlayer>;
storage 字段继承自 core/energy/tile/EnergyStorageTile.java:20-21(@NetworkedField,同步到客户端)。
scaledEnergyLevel 变化时触发方块更新(:87-92)。
封包范围与冷却继承 TileBaseUniversalElectrical:12.0 / 3
(core/energy/tile/TileBaseUniversalElectrical.java:45-51)。无独立封包 ID。