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), 只有红石开关。

相关条目