GTSU 能量储存单元

本页描述 8 个 GTSU 方块共用的注册、放置、朝向、能量流动与红石行为。各阶的容量/速率差异见对应阶条目。

基本信息

属性 值
注册名 GTSU:GTSU_Tier_0 … GTSU:GTSU_Tier_7(8 个独立注册,非 metadata 子类型)
未本地化名 tile.GTSU_Tier_0.name … tile.GTSU_Tier_7.name
方块类 eu.usrv.gtsu.blocks.GTSUBlock(构造参数为阶数)
TileEntity eu.usrv.gtsu.tileentity.TileEntityGTSU(继承 IC2 TileEntityInventory)
硬度 1.5
材质 Material.iron(爆炸抗性继承自铁,未单独设置)
脚步声 soundTypeMetal
创造标签 IC2.tabIC2
实现接口 IEnergySink、IEnergySource(均为 IC2 API)
内部物品栏 2 个 IC2 能量槽(充能槽 mChargeSlot、放电槽 mDischargeSlot)

8 个阶的注册方式

GTSUMod.registerSingleIC2StorageBlocks() 在 preInit 阶段循环 TierHelper.V.length(8)次:

GameRegistry.registerTileEntity(TileEntityGTSU.class, "GTSU_TE");
for (int i = 0; i < TierHelper.V.length; i++)
    GameRegistry.registerBlock(new GTSUBlock(i), ItemBlockGTSU.class, String.format("GTSU_Tier_%d", i));

每个 GTSUBlock 实例持有私有的 _mTier 字段,createTileEntity 忽略传入的 metadata,始终 new TileEntityGTSU(_mTier); hasTileEntity(int) 对任意 metadata 都返回 true。因此放置后的阶数只由方块种类决定。

各阶的容量、传输速率与 IC2 电压等级:

内部 tier 方块 传输速率 容量 IC2 tier
0 GTSU Tier 1 (MV) 128 EU/t 2,097,152 EU 2
1 GTSU Tier 2 (HV) 512 EU/t 134,217,728 EU 3
2 GTSU Tier 3 (EV) 2048 EU/t 8,589,934,592 EU 4
3 GTSU Tier 4 (IV) 8192 EU/t 549,755,813,888 EU 5
4 GTSU Tier 5 (LuV) 32768 EU/t 35,184,372,088,832 EU 6
5 GTSU Tier 6 (ZPM) 131072 EU/t 2,251,799,813,685,248 EU 7
6 GTSU Tier 7 (UV) 524288 EU/t 144,115,188,075,855,872 EU 8
7 GTSU Tier 8 (MAX) 2097152 EU/t 9,223,372,036,854,775,806 EU 9

能量流动

TileEntityGTSU 以**方块朝向面(facing)**区分输入与输出:

方法 行为
emitsEnergyTo(receiver, direction) 仅当 direction.ordinal() == getFacing() 时为 true — 只有朝向面向输出
acceptsEnergyFrom(emitter, direction) 与上式相反(!facingMatchesDirection)— 其余 5 个面都可输入
getOfferedEnergy() 满足条件时返回 min(mEnergy, mOutput),否则 0.0D
getDemandedEnergy() mMaxStorage - mEnergy
getSourceTier() / getSinkTier() 均为 2 + mTier
injectEnergy(dir, amount, voltage) 满仓时原样返回 amount(表示全部拒绝);否则 mEnergy += amount 并返回 0
drawEnergy(amount) mEnergy -= amount

mEnergy 是 long,mOutput 是 int(=TierHelper.V[mTier])。注意 injectEnergy 直接累加传入的 amount, 不做 min(amount, mMaxStorage - mEnergy) 截断。

摆放与朝向

  • 放置:onBlockPlacedBy 从物品的 NBT 读取 energy 与 tier 写入 TileEntity(实现"拆下再放回保留电量"), 朝向由 BlockPistonBase.determineOrientation(world, x, y, z, entityliving) 决定;若 entityliving == null 则固定朝下(facing = 1)。
  • 旋转:rotateBlock 通过 IC2 IWrenchable 接口旋转,仅在 axis != ForgeDirection.UNKNOWN 时生效; wrenchCanSetFacing 要求新朝向与当前朝向不同。setFacing 会先发 EnergyTileUnloadEvent、改朝向、再发 EnergyTileLoadEvent 重新挂回 EU 网络。
  • 邻接要求:无。
  • isNormalCube 返回 false、isBlockSolid 返回 true;canCreatureSpawn 永远返回 false。

交互

触发 行为
右键(空手,未潜行) 打开 GUI(GUI ID 0,GTSUMod.instance,坐标形式)
右键(持 IC2 扳手 / 电动扳手) 阻止 GUI 打开,返回 true 用于旋转朝向
右键(潜行) 阻止 GUI 打开,返回 false
扳手旋转 旋转输出面
比较器读取 round(map(mEnergy, mMaxStorage, 15.0)),即 0–15 的电量比例
破坏 breakBlock 遍历 TileEntity 物品栏,把 2 个能量槽内的物品随机散落到世界

弱充能:isProvidingWeakPower 返回 isEmittingRedstone() ? 15 : 0,而 TileEntityGTSU.isEmittingRedstone() 在源码中是硬编码 return false。因此该方块实际永不输出红石弱充能,红石模式只影响对外供电与比较器读数。 详见红石模式。

GUI

GuiHandler(NetworkRegistry.INSTANCE.registerGuiHandler 注册)负责在客户端/服务端构造 ContainerGTSU / GuiGTSU, 两者都先校验 world.getTileEntity(x, y, z) instanceof TileEntityGTSU。背景贴图 gtsu:textures/gui/gui_gtsu.png,尺寸 176 × 166。

区域 内容
左上 10,7(20×20) GuiIconButton(ID 0,图标为红石物品),点击切换红石模式
标题 按 tile.GTSU_Tier_<mTier>.name 本地化
文本 16,29 / 37,39 / 37,49 等级、当前能量(min(mEnergy, mMaxStorage),经 NumberPrettifier 缩写)、容量
文本 26,60 输出(ic2.EUStorage.gui.info.output + mOutput)
8,73(116 宽 × 5 高,纹理 y=251) 蓝色能量条,长度 = 116% × getChargePercentage()
10,7,29,26 区域 GuiTooltipHelper 绘制当前红石模式名
容器 152,5+i*18 4 个玩家护甲槽(SlotArmor)
容器 128,14 / 128,50 充能槽(InvSlotCharge)与放电槽(InvSlotDischarge,Access.IO)

ContainerGTSU 继承 IC2 ContainerFullInv(宽 179、高 166),getNetworkedFields 额外同步 mEnergy 与 mRedstoneMode。

创造标签变体

getSubBlocks 为每个阶提供两个变体(每阶共 16 个条目),均写入 NBT:

变体 metadata energy NBT tier NBT
空 _mTier 0 _mTier
满 _mTier + 100 TierHelper.getMaxStorageForTier(_mTier) _mTier

物品形态的 tooltip 与堆叠行为见GTSU 储存单元物品形态。

破坏掉落

getWrenchDrop 在扳手拆除时尝试把电量写入掉落物 NBT,比例取自 IC2 自身配置 ConfigUtil.getFloat(MainConfig.get(), "balance/energyRetainedInStorageBlockDrops")。

⚠️ 源码用 setDouble 写入 energy 键,而 readFromNBT 用 getLong 读取,二者类型不一致。 且该实现是 TileEntityInventory 的 IC2 覆写,本 mod 未覆盖 injectEnergy 之外的溢出保护。 实际保留效果取决于 IC2 版本行为,GTSU 源码本身不保证电量随扳手掉落保留。

相关条目