TileEntityAirLockController(气闸控制器)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Air Lock Controller |
GalacticraftCore.java:736 |
| 注册类 | micdoodle8.mods.galacticraft.core.tile.TileEntityAirLockController |
同上 |
| 关联方块 | GCBlocks.airLockFrame = new BlockAirLockFrame("airLockFrame") |
core/blocks/GCBlocks.java:107 |
| 方块→TE 分派 | metadata >= METADATA_AIR_LOCK_CONTROLLER(=1)时返回本类 |
core/blocks/BlockAirLockFrame.java:223-224、:34 |
| 父类 | TileEntityAirLock(→ TileEntityAdvanced) |
core/tile/TileEntityAirLockController.java:18 |
| 实现接口 | 仅 IPacketReceiver(父类带入) |
core/tile/TileEntityAdvanced.java:23 |
| 所属 modid | GalacticraftCore |
core/GalacticraftCore.java:160-161、core/Constants.java:7 |
| 槽位数 | 无(不实现 IInventory,无 ItemStack[]) |
core/tile/TileEntityAirLockController.java:18-53 |
槽位与字段
没有任何槽位。它是纯逻辑 TE,配置全靠 GUI 点击写入内存/NBT,字段清单(:20-53):
| 字段 | 类型 | 语义 | 源码 |
|---|---|---|---|
redstoneActivation |
boolean |
是否用红石触发 | :20-21 |
playerDistanceActivation |
boolean |
是否用玩家距离触发 | :23-24 |
playerDistanceSelection |
int |
距离档位 | :26-27 |
playerNameMatches / playerToOpenFor |
boolean / String |
是否限定玩家名 | :29-33 |
invertSelection |
boolean |
取反输出 | :35-36 |
horizontalModeEnabled |
boolean |
水平气闸模式 | :38-39 |
ownerName / active |
String / boolean |
主人名 / 当前是否密封 | :43-47 |
otherAirLocks |
ArrayList<TileEntityAirLock> |
协议算出的气闸框架集合 | :50-51 |
protocol / lastProtocol |
AirLockProtocol |
几何计算结果 | :52-53 |
NBT 键名在 readFromNBT / writeToNBT(:241-253 / :256-268)里是驼峰大写形式
(OwnerName、RedstoneActivation、PlayerDistanceSelection …)。
tick / 能量 / 网络
逻辑周期 = 每 10 tick 一次:updateEntity() 的实际动作全在 if (this.ticks % 10 == 0) 里
(core/tile/TileEntityAirLockController.java:117)。
触发判定(服务端,:63-111)
| 条件 | 行为 | 源码 |
|---|---|---|
redstoneActivation |
active = !isBlockIndirectlyGettingPowered(...)(低电平触发) |
:66-68 |
playerDistanceActivation |
用 AABB 找玩家,找不到才 active = true |
:70-107 |
| 距离档位 | 0→1.0、1→2.0、2→5.0、3→10.0 格 |
:73-86 |
invertSelection |
最后统一取反 | :109-111 |
密封 / 解封
sealAirLock()(:146-189)与 unsealAirLock()(:191-238)在协议框内
minX..maxX / minY..maxY / minZ..maxZ 之间,把空气换成 GCBlocks.airLockSeal
(:163、:174、:184),解封时反向换成空气(:212、:223、:233)。
⚠ 只填空气,不覆盖实心方块(:162、:173、:183 都先判 isAir)。
播放音效 player.openairlock(:152)/ player.closeairlock(:201)。
⚠ horizontalModeEnabled 切换时直接 unsealAirLock()(:118-119),
即改模式会先破封,必须重新触发才会再封上。
网络
| 项目 | 值 | 来源 |
|---|---|---|
| 封包距离 | 20.0 |
core/tile/TileEntityAirLockController.java:271-273 |
| 封包冷却 | 3 tick |
core/tile/TileEntityAirLockController.java:276-278 |
| 是否同步 | true(8 个 @NetworkedField 字段) |
core/tile/TileEntityAirLockController.java:281-283、:20-47 |
| 能量 | 无 | core/tile/TileEntityAirLockController.java:18 |
⚠ otherAirLocks / lastOtherAirLocks / lastActive / lastHorizontalModeEnabled
不是 @NetworkedField,不参与封包同步。
GUI
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiAirLockController(core/client/gui/container/GuiAirLockController.java:41) |
无 Container(源码 core/inventory/ 下没有气闸容器类) |
Gui :222 |