ThE 网络封包
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | thaumicenergistics.common.network.NetworkHandler |
| 调用时机 | ThaumicEnergistics.load() → NetworkHandler.registerPackets()(ThaumicEnergistics.java:126) |
| 注册的封包数 | 16(registerPackets() 内 16 次 registerPacket(...) 调用) |
| 通信频道数 | 2(客户端 / 服务端各一) |
| ID 映射 | HashMap<Short, Class<?>> IDToClass 与反向的 ClassToID(NetworkHandler.java:57-68) |
功能
ThE 用 Forge 的 SimpleNetworkWrapper 建立两条独立通道(registerPackets,:95-101):
channel.registerMessage(HandlerClient.class, WrapperPacket_C.class, 1, Side.CLIENT);
channel.registerMessage(HandlerServer.class, WrapperPacket_S.class, 2, Side.SERVER);
- ID 1 = 客户端通道(
WrapperPacket_C+HandlerClient) - ID 2 = 服务端通道(
WrapperPacket_S+HandlerServer)
在此之上,ThE 建立自己的 16 个封包 ID 映射。registerPacket(Class) 依次分配自增 short ID 并双向登记(:66-71);getPacketClassFromID(Short) 与 getPacketID(ThEBasePacket) 做查表,未命中分别返回 null 与 -1(:78、:89)。
16 个封包按功能分组
| 分组 | 封包 | 方向 | 用途 |
|---|---|---|---|
| 要素总线 | Packet_C_ExportBusVoidButtonUpdate |
C→S | 导出总线湮灭按钮状态(按下) |
| 要素总线 | Packet_S_ExportBusVoidButtonUpdate |
S→C | 导出总线湮灭按钮状态(回显) |
| 奥术合成终端 | Packet_C_ArcaneCraftingTerminal |
C→S | 终端内合成网格操作 |
| 奥术合成终端 | Packet_S_ArcaneCraftingTerminal |
S→C | 终端状态同步 |
| 奥术合成终端 | Packet_C_UpdatePlayerArmor |
C→S | 护甲交换(提示 Swaps your currently equipped armor with the armor stored in the terminal.) |
| 知识录入机 | Packet_C_KnowledgeInscriber |
C→S | 配方保存/擦除操作 |
| 知识录入机 | Packet_S_KnowledgeInscriber |
S→C | 录入机状态同步 |
| 粒子特效 | Packet_R_ParticleFX |
双向(R = 渲染) | 通用粒子反馈(如扳手聚焦) |
| 扳手聚焦 | Packet_S_WrenchFocus |
S→C | AE 扳手法杖动作 |
| 要素振动室 | Packet_C_EssentiaVibrationChamber |
C→S | 振动室操作 |
| 蒸馏编码器 | Packet_C_DistillationEncoder |
C→S | 蒸馏配方编码 |
| 蒸馏编码器 | Packet_S_DistillationEncoder |
S→C | 编码器状态同步 |
| 全局同步 | Packet_C_Sync |
C→S | 通用状态同步 |
| 电池显微镜 | Packet_C_CellMicroscopeScanFeedback |
C→S | 扫描失败提示的补发(见下) |
| NEI | Packet_S_NEIRecipe |
S→C | 向 NEI 发送配方信息 |
命名约定清晰:Packet_C_* = Client→Server,Packet_S_* = Server→Client,Packet_R_* = 渲染/双向。
电池显微镜的失败反馈补发
Packet_C_CellMicroscopeScanFeedback 存在的理由写在 Cell Microscope 的源码注释里:
Thaumcraft syncs successful scans to the client, but not failed ones. Run the client-side scan path manually so failure hints are shown. (
ItemCellMicroscope.java:142-143)
即 ThA 只同步成功的扫描,失败的不同步,因此 ThE 手动补发一份失败反馈封包让玩家看到失败原因。
区域封包
除逐个封包外还有 sendAreaPacketToClients(ThEAreaPacket, float range)(:138 起)—— 把一个 ThEAreaPacket 包装进 WrapperPacket_C 并按半径发送给范围内客户端。配合 ThEAreaPacket / ThEClientPacket / ThEServerPacket 三个基类,构成封包的类型体系。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 注册封包总数 | 16 | registerPackets() 中的 registerPacket 调用计数(:103-134) |
| 通信频道数 | 2 | registerMessage × 2(:97、:99) |
| 客户端封包数 | 9(Packet_C_* 与 Packet_R_* 中的客户端侧) |
见上表 |
| 服务端封包数 | 6(Packet_S_*) |
见上表 |
| 未命中 ID 的返回值 | null |
getPacketClassFromID(:78) |
| 未命中类的返回值 | -1 |
getPacketID(:89) |
交互
| 触发 | 行为 |
|---|---|
| 游戏加载(load 阶段) | 自动注册全部 16 个封包与 2 条通道 |
| 玩家点击导出总线湮灭按钮 | Packet_C_ExportBusVoidButtonUpdate 上报,服务端回 Packet_S_... 广播 |
| 玩家在奥术合成终端操作 | Packet_C/S_ArcaneCraftingTerminal 双向同步 |
| 玩家在奥术合成终端点击 Swap Armor | Packet_C_UpdatePlayerArmor,把身上护甲与终端内护甲互换 |
| 玩家在知识录入机保存/擦除配方 | Packet_C/S_KnowledgeInscriber |
| 使用 AE 扳手法杖聚焦 | 服务端 Packet_S_WrenchFocus + Packet_R_ParticleFX |
| 电池显微镜扫描失败 | Packet_C_CellMicroscopeScanFeedback 补发提示 |
| NEI 请求配方 | Packet_S_NEIRecipe |
合成配方
本条目描述通信层,不含物品配方。
相关条目
- Knowledge Inscriber - 通过封包完成配方录入
- Distillation Pattern Encoder - 通过封包完成配方编码
- Essentia Export Bus - 湮灭按钮的封包同步
- Arcane Crafting Terminal - 合成网格与护甲交换
- Cell Microscope - 扫描失败反馈的补发封包
- Wand Focus: AE Wrench - 粒子与动作封包