TileEntityArclamp(弧光灯)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Arc Lamp |
GalacticraftCore.java:740 |
| 注册类 | micdoodle8.mods.galacticraft.core.tile.TileEntityArclamp |
同上 |
| 关联方块 | GCBlocks.brightLamp = new BlockBrightLamp("arclamp") |
core/blocks/GCBlocks.java:95 |
| 方块→TE 分派 | 不分 metadata,一律 new TileEntityArclamp() |
core/blocks/BlockBrightLamp.java:165-167 |
| 父类 | 原版 net.minecraft.tileentity.TileEntity(不是 GC 的 TileEntityAdvanced) |
core/tile/TileEntityArclamp.java:41 |
| 实现接口 | 无(不实现 IInventory、不实现任何 GC 接口) |
core/tile/TileEntityArclamp.java:41 |
| 所属 modid | GalacticraftCore |
core/GalacticraftCore.java:160-161、core/Constants.java:7 |
| 槽位数 | 无(不实现 IInventory,无 ItemStack[]) |
core/tile/TileEntityArclamp.java:41-486 |
槽位与字段
没有槽位。弧光灯是直接改世界方块的 TE,核心状态是「我点亮了哪些空气方块」:
| 字段 | 类型 | 语义 | 源码 |
|---|---|---|---|
airToRestore |
LongOpenHashSet |
已替换的空气坐标(打包成 long) | core/tile/TileEntityArclamp.java:55 |
facing |
int |
光束朝向 | core/tile/TileEntityArclamp.java:54,NBT 键 Facing(:385) |
sideRear |
int |
方块 metadata 记录的后向面 | core/tile/TileEntityArclamp.java:53 |
facingSide |
int |
换算后的有效光束面 | core/tile/TileEntityArclamp.java:59 |
isActive |
boolean |
是否点亮 | core/tile/TileEntityArclamp.java:56 |
thisAABB / thisPos |
AxisAlignedBB / Vec3 |
照明与驱赶范围 | core/tile/TileEntityArclamp.java:57-58 |
ticks |
int |
自有计数器 | core/tile/TileEntityArclamp.java:52 |
updateClientFlag |
boolean |
需要向客户端重发朝向 | core/tile/TileEntityArclamp.java:60 |
airToRestore 写盘为 NBT 列表 AirBlocks(core/tile/TileEntityArclamp.java:388-400),
读盘在 :368-378。
tick / 能量 / 网络
tick 周期
| 行为 | 频率 | 源码 |
|---|---|---|
| 照明 BFS 重算 | 每 100 tick(首次点亮立刻算一次) | core/tile/TileEntityArclamp.java:179-181 |
| 驱赶生物检查 | 每 tick 以 rand.nextInt(20) == 0 触发,平均 1/20 tick |
core/tile/TileEntityArclamp.java:183 |
| 客户端朝向广播 | updateClientFlag 为真时立即发一次 |
core/tile/TileEntityArclamp.java:77-84 |
照明范围(本篇核心常量)
lightArea()(core/tile/TileEntityArclamp.java:251-356)用分层 BFS 扩散,
最多 14 层(:289 for (int count = 0; count < 14; count++)),
初层 = 6 个侧面邻居(排除背面,:265-273)+ 光束正前方 5 格(:279-287)。
各朝面的搜索 AABB(getBlockMetadata() 0…5 对应 Down/Up/North/South/West/East):
| 面 | AABB(相对本方块) | 源码 |
|---|---|---|
| Down (0) | x±20、y−8…y+20、z±20 | core/tile/TileEntityArclamp.java:104-113 |
| Up (1) | x±20、y−20…y+8、z±20 | core/tile/TileEntityArclamp.java:114-123 |
| North (2) | x±20、y±20、z−8…z+20 | core/tile/TileEntityArclamp.java:124-136 |
| South (3) | x±20、y±20、z−20…z+8 | core/tile/TileEntityArclamp.java:137-149 |
| West (4) | x−8…x+20、y±20、z±20 | core/tile/TileEntityArclamp.java:150-159 |
| East (5) | x−20…x+8、y±20、z±20 | core/tile/TileEntityArclamp.java:160-172 |
⚠ West / East 两格的 AABB 不对称(一个 x−8..x+20,一个 x−20..x+8),
与其余四面「近端 −8、远端 +20」的写法不同。源码就这样写的,
无法从源码判断是刻意还是笔误,本条目不替它圆场。
方块替换规则(:333-344):Blocks.air → GCBlocks.brightAir、
GCBlocks.breatheableAir → GCBlocks.brightBreatheableAir。
解封 revertAir() 反向替换(:420-446),在 invalidate()(:240-246)
与断红石(:89)时调用。
红石
RedstoneUtil.isBlockReceivingRedstone(...) 为真时熄灭并 revertAir()(:86-91),
即高电平关灯。对外查询接口 getEnabled()(:448-450)同样返回「是否未受红石」。
朝向切换
扳手右键调 facingChanged()(core/tile/TileEntityArclamp.java:403-418,
方块侧入口 core/blocks/BlockBrightLamp.java:153-161):
facing -= 2,为负时 facing = 1 - facing,源码注释写明循环序列是
0 - 3 - 1 - 2(:407)——每次扳手转 90°,4 个面循环。
网络
本类不继承 TileEntityAdvanced,因此没有 @NetworkedField 同步机制,
改用 PacketSimple 两枚封包:
| 封包 | 方向 | 触发点 | 枚举定义 |
|---|---|---|---|
C_UPDATE_ARCLAMP_FACING |
服务端→客户端 | core/tile/TileEntityArclamp.java:410-414、:78-82 |
core/network/PacketSimple.java:173 |
S_REQUEST_ARCLAMP_FACING |
客户端→服务端 | core/tile/TileEntityArclamp.java:230-233(validate() 时) |
core/network/PacketSimple.java:132 |
能量
不耗电。类内无 EnergyStorage、无 IEnergyHandlerGC(core/tile/TileEntityArclamp.java:41-486),
只有红石开关。