TileEntityTelemetry(遥测装置)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Telemetry Unit |
GalacticraftCore.java:742 |
| 注册类 | micdoodle8.mods.galacticraft.core.tile.TileEntityTelemetry |
同上 |
| 关联方块 | GCBlocks.telemetry = new BlockTelemetry("telemetry") |
core/blocks/GCBlocks.java:130 |
| 方块→TE 分派 | createNewTileEntity 无条件返回本 TE |
core/blocks/BlockTelemetry.java:119-122 |
| 父类 | 原版 net.minecraft.tileentity.TileEntity |
core/tile/TileEntityTelemetry.java:38 |
| 实现接口 | 无 | 同上 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7 |
| 槽位数 | 无(不实现 IInventory) |
类声明 core/tile/TileEntityTelemetry.java:38 |
⚠ 遥测装置直接继承原版 TileEntity,不经 TileEntityAdvanced——
没有 @NetworkedField 同步(它靠自研 PacketSimple 推数据)。
槽位与字段
本类没有任何 ItemStack[] 字段,getSizeInventory() 不存在。
| 字段 | 类型 / 初值 | 含义 | 源码 |
|---|---|---|---|
clientClass |
Class<? extends Entity> |
客户端侧缓存的被追踪实体类 | core/tile/TileEntityTelemetry.java:40 |
clientData |
int[] = {-1} |
客户端缓存的 5 个数据槽初值 | core/tile/TileEntityTelemetry.java:41 |
clientName |
String |
客户端缓存的实体名 | core/tile/TileEntityTelemetry.java:42 |
clientGameProfile |
GameProfile = null |
客户端缓存的玩家档案 | core/tile/TileEntityTelemetry.java:43 |
loadedList |
static HashSet<BlockVec3Dim> |
仅客户端维护的已加载遥测装置表 | core/tile/TileEntityTelemetry.java:45、:52-66 |
linkedEntity |
Entity |
当前被追踪的实体 | core/tile/TileEntityTelemetry.java:46 |
toUpdate |
UUID = null |
读档后待绑定的 UUID | core/tile/TileEntityTelemetry.java:47 |
pulseRate |
int = 400 |
脉冲率,下限钳在 400、上限 2000 | core/tile/TileEntityTelemetry.java:48、:125-130 |
lastHurttime |
int = 0 |
上一次的 hurtTime |
core/tile/TileEntityTelemetry.java:49 |
ticks |
int = 0 |
tick 计数 | core/tile/TileEntityTelemetry.java:50 |
NBT 键:entityUUIDMost / entityUUIDLeast
(readFromNBT :179-180、writeToNBT :188-189)。
能量
无。 父类是原版 TileEntity(core/tile/TileEntityTelemetry.java:38),
不继承 EnergyStorageTile,没有 gJ 容量、不耗电。
⚠ 遥测装置不用电——它靠无线电波工作,把它写成耗电机器即为编造。
tick / 特殊机制
updateEntity()(core/tile/TileEntityTelemetry.java:68-174)的节流条件是
if (!this.worldObj.isRemote && ++this.ticks % 2 == 0)(:70):
| 行为 | 频率 | 源码 |
|---|---|---|
| 处理待绑定 UUID(读档后补绑) | 每 2 tick,服务端 | core/tile/TileEntityTelemetry.java:70-74 |
| 采集数据并广播 | 每 2 tick | core/tile/TileEntityTelemetry.java:76-173 |
| 广播半径 | 320.0 格(TargetPoint 末参) |
core/tile/TileEntityTelemetry.java:172 |
5 个数据槽(int[] data,core/tile/TileEntityTelemetry.java:77)
| 槽 | 含义 | 取值 | 源码 |
|---|---|---|---|
data[0] |
受伤计时 / 载具专用 | eLiving.hurtTime;ITelemetry 实现类由 transmitData(data) 自填 |
core/tile/TileEntityTelemetry.java:111、:108-109 |
data[1] |
生命值百分比 | (int)(getHealth() * 100 / getMaxHealth()) |
core/tile/TileEntityTelemetry.java:133 |
data[2] |
速度 → 脉冲 | 非生物:运动矢量模 × 2000;生物:pulseRate / 10 |
core/tile/TileEntityTelemetry.java:105-106、:131 |
data[3] |
实体类别相关(见下) | — | — |
data[4] |
实体类别相关 | — | — |
data[3] / data[4] 按被追踪实体的实际类型填(:134-161):
| 实体类型 | data[3] |
data[4] |
源码 |
|---|---|---|---|
EntityPlayerMP |
饱食度 × 5 | airRemaining * 4096 + airRemaining2(GC 氧气) |
core/tile/TileEntityTelemetry.java:134-141 |
EntityHorse |
马种 | 马变异 | core/tile/TileEntityTelemetry.java:142-144 |
EntityVillager |
职业 | 成长年龄 | core/tile/TileEntityTelemetry.java:145-147 |
EntityWolf |
项圈颜色 | 是否成年 | core/tile/TileEntityTelemetry.java:148-150 |
EntitySheep |
羊毛颜色 | 是否已剪 | core/tile/TileEntityTelemetry.java:151-153 |
EntityOcelot |
驯化皮肤 | — | core/tile/TileEntityTelemetry.java:154-156 |
EntitySkeleton |
骷髅类型 | — | core/tile/TileEntityTelemetry.java:157 |
EntityZombie |
是否村民化 | 是否幼年 | core/tile/TileEntityTelemetry.java:158-161 |
⚠ data 数组只在 EntityLivingBase 分支里填满 0–4;
非生物实体只填 data[2](速度),其余保持 -1(:77)。
脉冲率算法
core/tile/TileEntityTelemetry.java:113-131:
- 每 tick
pulseRate--(:114) - 检测到新受伤
pulseRate += 100(:115-117) - 骑乘载具时
data[2] /= 4(:119-120),否则data[2] > 1时pulseRate += 2(:121-123) pulseRate += max(data[2] - pulseRate, 0) / 4(:124)- 钳制在 400–2000(
:125-130)
绑定 / 解绑
| 操作 | 入口 | 源码 |
|---|---|---|
用频率模块(GCItems.basicItem metadata 19)右键绑定 |
BlockTelemetry.onMachineActivated |
core/blocks/BlockTelemetry.java:130-156,物品判定在 :137 |
| 绑定时把本机坐标写进模块 NBT | teCoordX/Y/Z + teDim |
core/blocks/BlockTelemetry.java:151-154 |
频率模块 NBT 已有 linkedUUIDMost/Least |
调 addTrackedEntity(uuid) + 提示 gui.telemetrySucceed.message |
core/blocks/BlockTelemetry.java:139-142 |
| NBT 里没有链接 | 提示 gui.telemetryFail.message 并就地建一个空 NBT |
core/blocks/BlockTelemetry.java:143-150 |
| 玩家佩戴模块时 | GCPlayerStats.frequencyModuleInSlot 分支 |
core/blocks/BlockTelemetry.java:158-162 |
| 解绑 | removeTrackedEntity() |
core/tile/TileEntityTelemetry.java:219-222 |
| 绑定飞船 | 目标若是 EntitySpaceshipBase 自动 addTelemetry(this) |
core/tile/TileEntityTelemetry.java:200-202、:214-216 |
静态工具
| 方法 | 作用 | 源码 |
|---|---|---|
getNearest(TileEntity) |
在 loadedList 里找同维度、平方距离 < 1025(≈32 格)的最近遥测装置 |
core/tile/TileEntityTelemetry.java:224-252(阈值 :230) |
frequencyModulePlayer(ItemStack, EntityPlayerMP) |
玩家戴模块时按 NBT 坐标回连 / 解连 | core/tile/TileEntityTelemetry.java:260-285 |
updateLinkedPlayer(EntityPlayerMP old, new) |
玩家死亡重生后转移链接 | core/tile/TileEntityTelemetry.java:287-294 |
GUI / Container
无 Container、无 GuiHandler 分派。 遥测装置不打开任何界面——
数据由客户端 TileEntityScreen(屏幕方块) 渲染,
入口是 core/client/gui/screen/GameScreenText.java:80 的
TileEntityTelemetry.getNearest(screen.driver)。