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

合成配方

本条目描述通信层,不含物品配方。

相关条目