网络协议
基本信息
| 属性 | 值 |
|---|---|
| 源码目录 | src/main/java/mcp/mobius/waila/network/ |
| 封包类数 | 5(Message0x00 – Message0x04) |
| 通道注册 | WailaPacketHandler.INSTANCE(Waila.java:63) |
| 事件注册 | FMLCommonHandler.bus().register(new NetworkHandler())(Waila.java:73) |
| 消息接口 | mcp.mobius.waila.network.IWailaMessage |
| 判别器 ID 范围 | 0–4(WailaPacketHandler.java:61-65) |
Waila 用一条自定义 SimpleNetworkWrapper 通道在客户端与服务端之间传递 TileEntity / 实体的 NBT,供 HUD provider 在服务端生成 tip。
功能
5 个封包
| 判别器 | 类 | 通道名 | 方向 | 行 |
|---|---|---|---|---|
| 0 | Message0x00ServerPing |
ServerPing |
C→S | WailaPacketHandler.java:45、WailaPacketHandler.java:61 |
| 1 | Message0x01TERequest |
TERequest |
C→S | WailaPacketHandler.java:54、WailaPacketHandler.java:62 |
| 2 | Message0x02TENBTData |
TENBTData |
S→C | WailaPacketHandler.java:46、WailaPacketHandler.java:63 |
| 3 | Message0x03EntRequest |
EntRequest |
C→S | WailaPacketHandler.java:55、WailaPacketHandler.java:64 |
| 4 | Message0x04EntNBTData |
EntNBTData |
S→C | WailaPacketHandler.java:47、WailaPacketHandler.java:65 |
管道组装分两组(WailaPacketHandler.java:45-47 为 S→C 组,:54-55 为 C→S 组),每组都以 codec 为锚点用 addAfter 串联;随后统一 addDiscriminator 绑定 ID(WailaPacketHandler.java:61-65)。
请求-应答配对
TileEntity 与实体各构成一对「请求 → 数据」:
| 目标 | 请求 | 应答 |
|---|---|---|
| TileEntity | Message0x01TERequest |
Message0x02TENBTData |
| Entity | Message0x03EntRequest |
Message0x04EntNBTData |
Message0x00ServerPing 独立于这两对,用于客户端探测服务端是否存在 Waila。
与 provider 的关系
应答封包携带的 NBT 会经过 IWailaDataProvider 的 getNBTData(服务端,IWailaDataProvider.java:126-127)与 IWailaEntityProvider 的 getNBTData(服务端,IWailaEntityProvider.java:93)。这两个回调的 javadoc 都强调实现方须返回修改后的入参 tag,因为同一 tag 可能已被其他 provider 处理过(IWailaDataProvider.java:114-124、IWailaEntityProvider.java:87-92)。
因此本协议是 addon 实现跨端一致性的唯一通道——addon 注册的 NBT provider 若不在两侧都注册,客户端会缺少数据。
数值
| 项 | 值 | 来源 |
|---|---|---|
| 封包类数 | 5 | src/main/java/mcp/mobius/waila/network/ |
| 判别器 ID 数 | 5(0–4) | WailaPacketHandler.java:61-65 |
| C→S 封包数 | 3 | WailaPacketHandler.java:45、WailaPacketHandler.java:54-55 |
| S→C 封包数 | 2 | WailaPacketHandler.java:46-47 |
| 请求-应答配对数 | 2 | 见上表 |
判别器 ID 与类名的
0xNN前缀一一对应(Message0x00→ 0,Message0x04→ 4),但这是命名约定,源码中判别器由addDiscriminator(0..4, ...)显式指定(WailaPacketHandler.java:61-65)。
交互
客户端版本门禁由 @NetworkCheckHandler checkModList 执行:若客户端带 Waila 且版本低于 1.7.3 则拒绝加入(Waila.java:55、Waila.java:130-137),注释说明这是为了保证原版 vanilla.show_invisible_players 属性被正确尊重(Waila.java:127-129)。服务端声明 acceptableRemoteVersions = "*"(Waila.java:43)。
HUD 消费 NBT 后的渲染见 HUD 渲染管线。vanilla.show_invisible_players 是少数通过 addConfigRemote 声明、因而受本协议版本门禁保护的配置项(HUDHandlerVanilla.java:238),见 模块配置项。
相关条目
- IWailaDataProvider -
getNBTData的 TileEntity 侧契约 - IWailaEntityProvider -
getNBTData的实体侧契约 - 内置集成 - 各 addon 模块的 NBT provider
- HUD 渲染管线 - NBT 在客户端的消费位置
- 模块配置项 -
vanilla.show_invisible_players远程配置