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。

相关条目