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)。

相关条目