TileEntityOxygenSealer(氧气密封器)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Air Sealer |
core/GalacticraftCore.java:718 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 core/GalacticraftCore.java:160-161 |
| 关联方块 | GCBlocks.oxygenSealer = new BlockOxygenSealer("sealer") |
core/blocks/GCBlocks.java:114 |
| 方块→TE 分派 | 无条件 new TileEntityOxygenSealer() |
core/blocks/BlockOxygenSealer.java:134-136 |
| 父类 | TileEntityOxygen(→ TileBaseElectricBlock → … → EnergyStorageTile) |
core/tile/TileEntityOxygenSealer.java:30、core/tile/TileEntityOxygen.java:19 |
| 实现接口 | IInventory / ISidedInventory |
core/tile/TileEntityOxygenSealer.java:30 |
| 槽位数 | 3 | 见下节 |
槽位与字段
core/tile/TileEntityOxygenSealer.java:42:
private ItemStack[] containingItems = new ItemStack[3];
getSizeInventory()(:229-232)返回 this.containingItems.length → 恒为 3(:199 等长重建)。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 电池槽(getBatteryInSlot() → getStackInSlot(0)) |
core/tile/TileEntityOxygenSealer.java:362-365 |
| 1 | 氧气供给物品(IItemOxygenSupply) |
core/tile/TileEntityOxygenSealer.java:130-138、:343 |
| 2 | 热控模块:GCItems.basicItem 且 getItemDamage() == 20 |
core/tile/TileEntityOxygenSealer.java:119-125、:345 |
| 可接受性 | 源码 |
|---|---|
侧面可达槽只有 {0, 1}——槽 2 不对机器开放 |
core/tile/TileEntityOxygenSealer.java:302-305 |
| 每槽堆叠上限 64 | core/tile/TileEntityOxygenSealer.java:283-286 |
canExtractItem 对槽 2 落到 default -> false |
core/tile/TileEntityOxygenSealer.java:320-327 |
能量
本类是本批唯一覆写了 setCapacity 的机器:
| 项目 | 值 | 来源 |
|---|---|---|
| 缓冲容量 | 32000 gJ(STANDARD_CAPACITY * 2 = 16000 × 2) |
core/tile/TileEntityOxygenSealer.java:65-67、core/energy/tile/EnergyStorageTile.java:18 |
| 最大输入 | 25 gJ/t(显式 setMaxReceive(25.0F),与默认两参构造展开值一致) |
core/tile/TileEntityOxygenSealer.java:64、core/energy/tile/EnergyStorage.java:19-21 |
| 最大输出(常态) | 5 gJ/t(注释自述「Half of a standard machine’s power draw」) | core/tile/TileEntityOxygenSealer.java:63 |
| 最大输出(开热控时) | 20 gJ/t,即四倍 | core/tile/TileEntityOxygenSealer.java:141-143 |
⚠ 热控模块(槽 2 的 basicItem damage 20)会把输出从 5 提到 20,
且切换到 5 时会顺带重置 setMaxReceive(25.0F)(:144-147)。
tick / 特殊机制(本篇核心)
密封是多线程 + 轮转队列算的,不是每 tick。
| 项目 | 值 | 源码 |
|---|---|---|
| 氧气容量 | 10000(super(10000, UNSEALED_OXYGENPERTICK)) |
core/tile/TileEntityOxygenSealer.java:61 |
| 未密封耗氧 | 12 / tick(UNSEALED_OXYGENPERTICK) |
core/tile/TileEntityOxygenSealer.java:58 |
| 已密封耗氧 | 2 / tick——密封后才省氧 | core/tile/TileEntityOxygenSealer.java:150 |
| 供给物品抽气 | 每 tick 12 × 2.5 = 30 |
core/tile/TileEntityOxygenSealer.java:133 |
| 找漏气点预算 | getFindSealChecks() 返回 1250;上方被非透气方块挡住时返回 0 |
core/tile/TileEntityOxygenSealer.java:102-117 |
| 轮转间隔 | threadCooldownTotal = 75 + countEntities(countEntities = 上一 tick 被更新的密封器总数) |
core/tile/TileEntityOxygenSealer.java:166、:188-192 |
| 初始冷却 | validate() 时 stopSealThreadCooldown = 126 + countEntities |
core/tile/TileEntityOxygenSealer.java:76 |
| 「正在算」标志 | threadSeal.looping → calculatingSealed = active;算完才写 sealed |
core/tile/TileEntityOxygenSealer.java:174-181 |
| 激活条件 | storedOxygen >= 1 && hasEnoughEnergyToRun && !disabled |
core/tile/TileEntityOxygenSealer.java:158 |
⚠ 本类构造时 noRedstoneControl = true(:62)——不受红石控制;
但 shouldUseEnergy() 又判 !getDisabled(0)(:353-355),即扳手仍可停机。
- 全局
loadedTiles列表在validate/invalidate/onChunkUnload三处增删(:70-93)。 - 氧气方向:输入 = 电力输入面的对面,输出空集(
:372-380)——密封器不出网。
GUI / Container
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiOxygenSealer |
core.inventory.ContainerOxygenSealer |
Container :123-124、Gui :211-212 |