Waila 协议通道
基本信息
| 属性 | 值 |
|---|---|
| FML 通道名 | Waila(NetworkRegistry.INSTANCE.newChannel("Waila", new WailaCodec()),WailaPacketHandler.java:45) |
| 编解码器 | WailaPacketHandler.WailaCodec,继承 FMLIndexedMessageToMessageCodec<IWailaMessage>(WailaPacketHandler.java:86) |
| 封包数 | 5(discriminator 0–4) |
| 消息接口 | mcp.mobius.waila.network.IWailaMessage |
| 注册类 | WailaPacketHandler(enum 单例 INSTANCE) |
| 触发时机 | Waila.preInit 里以 WailaPacketHandler.INSTANCE.ordinal() 触发枚举构造(Waila.java:55) |
| 发送方向 | 客户端→服务端(请求)与 服务端→客户端(数据)成对 |
功能
WDMla 的提示信息采用「客户端请求、服务端取数」模型:客户端只知道看到了哪个方块/实体,具体 NBT 要向服务端索取。
通道名故意保留为 Waila 而非 WDMla,源码注释写明「在我们决定破坏 Waila 兼容之前不要改这里的通道名」(WailaPacketHandler.java:42-43)。
封包
| discriminator | 类 | 方向 | 说明 | 源码 |
|---|---|---|---|---|
| 0 | Message0x00ServerPing |
S→C | 玩家登录时服务端发的 ping,同时用于探测服务端是否装了 Waila | WailaPacketHandler.java:89 |
| 1 | Message0x01TERequest |
C→S | 客户端请求 TileEntity 数据 | WailaPacketHandler.java:90 |
| 2 | Message0x02TENBTData |
S→C | TileEntity NBT 回包 | WailaPacketHandler.java:91 |
| 3 | Message0x03EntRequest |
C→S | 客户端请求实体数据 | WailaPacketHandler.java:92 |
| 4 | Message0x04EntNBTData |
S→C | 实体 NBT 回包 | WailaPacketHandler.java:93 |
管线挂载是分侧的:
- 客户端侧(
addClientHandlers,WailaPacketHandler.java:54-76):ServerPing→TENBTData→EntNBTData - 服务端侧(
addServerHandlers,WailaPacketHandler.java:78-84):TERequest→EntRequest
交互
| 触发 | 行为 | 发送点 |
|---|---|---|
| 玩家登录 | 服务端发 Message0x00ServerPing |
NetworkHandler.onPlayerLoggedIn,NetworkHandler.java:18-21 |
| 客户端需要方块数据 | BlockAccessorClientHandler 发 Message0x01TERequest(accessor.getTileEntity(), keys) |
BlockAccessorClientHandler.java:65 |
| 服务端处理完请求 | 立即回 Message0x02TENBTData(tag) |
Message0x01TERequest.java:96 |
| 客户端需要实体数据 | EntityAccessorClientHandler 发 Message0x03EntRequest(accessor.getEntity(), keys) |
EntityAccessorClientHandler.java:50 |
| 服务端处理完请求 | 立即回 Message0x04EntNBTData(tag) |
Message0x03EntRequest.java:75 |
请求包携带一个 key 列表,服务端只回这些 provider 需要的数据——两个 *Request 处理器在回包时都用 WailaPacketHandler.getPlayer(ctx) 定位目标玩家(WailaPacketHandler.java:151-153)。
NBT 的编解码走 WailaPacketHandler.writeNBT / readNBT:先写 2 字节压缩长度,-1 表示无数据,否则用 CompressedStreamTools.compress 压缩后写入(WailaPacketHandler.java:120-138)。字符串用 writeString / readString,UTF-8 编码(WailaPacketHandler.java:140-149)。
相关条目
- 核心插件 - 注册了两个
AccessorClientHandler,是请求的发起方 - Waila 兼容层 - 旧版 Waila 封包类的兼容处理
- Minecraft 插件 - 服务端 data provider 的数据最终经此通道回传