网络封包

基本信息

属性 值
通道名 NetworkRegistry.INSTANCE.newSimpleChannel("ThaumicHorizons".toLowerCase()) → 实际为 thaumichorizons(common/lib/networking/PacketHandler.java:60)
通道创建位置 PacketHandler 的 static 块(:59-60)
注册调用位置 PacketHandler.init()(:25-57),由 ThaumicHorizons.preInit 的 PacketHandler.init() 触发(common/ThaumicHorizons.java:496)
已注册封包数 15
封包类文件数 17(common/lib/networking/,不含 PacketHandler.java)
序号分配 单调递增的局部变量 idx(:26 初始化为 0,逐次 idx++),显式指定而非自动分配
安全标记 private static final Marker SECURITY_MARKER = MarkerManager.getMarker("SuspiciousPackets")(:23)

通道名显式 .toLowerCase() 是本模组身份不一致的直接体现:modid 常量是 "ThaumicHorizons"(首字母大写),而 Forge 的 SimpleNetworkWrapper 要求通道名小写,故此处手动转换。见 第三方模组集成。

已注册封包(15)

序 封包类 方向 注册行
0 PacketLensChangeToServer SERVER 28
1 PacketFXEssentiaBubble CLIENT 30
2 PacketInfusionFX CLIENT 31
3 PacketFXInfusionDone CLIENT 33
4 PacketFXDeadCreature CLIENT 35
5 PacketFXContainment CLIENT 37
6 PacketNoMoreItems CLIENT 38
7 PacketFXBlocksplosion CLIENT 40
8 PacketRemoveNightvision CLIENT 42
9 PacketFingersToServer SERVER 44
10 PacketPlayerInfusionSync CLIENT 46
11 PacketMountNightmare CLIENT 48
12 PacketToggleClimbToServer SERVER 50
13 PacketToggleInvisibleToServer SERVER 51-55
14 PacketRainState CLIENT 56

方向分布:3 个到服务端(PacketLensChangeToServer、PacketFingersToServer、PacketToggleClimbToServer、PacketToggleInvisibleToServer),11 个到客户端。PacketToggleInvisibleToServer 的注册是唯一跨 4 行的(:51-55),其余均为单行或双行。

所有封包采用 IMessage + IMessageHandler<Self, Self> 的自处理模式,即收发两端共用同一个类。

功能

封包按用途可分四组:

客户端 → 服务端的请求(4 个)

封包 用途 依据
PacketLensChangeToServer 玩家切换透镜,请求服务端校验并应用 构造参数含 EntityPlayer, String lens(PacketLensChangeToServer.java:29)
PacketFingersToServer 变形手指能力的启用请求 构造参数含 EntityPlayer, int dim(PacketFingersToServer.java:25)
PacketToggleClimbToServer 攀爬能力开关 构造参数含 EntityPlayer, int dim(PacketToggleClimbToServer.java:25)
PacketToggleInvisibleToServer 隐身开关 构造参数含 EntityPlayer, int dim(PacketToggleInvisibleToServer.java:29)

服务端 → 客户端的纯表现 FX(6 个):PacketFXEssentiaBubble(要素气泡,由 TileVat 在 TileVat.java:1797 发出)、PacketInfusionFX(由 TileVat.java:1082 发出)、PacketFXInfusionDone(由 TileVat.java:1314 发出)、PacketFXDeadCreature、PacketFXContainment(禁锢光束)、PacketFXBlocksplosion(方块爆破)、PacketRemoveNightvision(撤销夜视,ItemLensFire 导入使用)。

状态同步(3 个):PacketPlayerInfusionSync(玩家注入属性同步,构造参数含玩家名与 int[] infusions、攀爬/隐形开关,PacketPlayerInfusionSync.java:35)、PacketMountNightmare(骑乘梦魇同步,构造参数含 Entity, EntityPlayer,PacketMountNightmare.java:24)、PacketRainState(下雨状态,由 TileCloud 发出,TileCloud.java:65)。

收尾通知(1 个):PacketNoMoreItems(由 EventHandlerEntity 导入使用)。

死代码:2 个未注册封包

PacketCowUpdate.java 与 PacketGetCowData.java 存在于源码但未在 PacketHandler.init() 中注册,因此在运行时不可达:

封包类 文件 证据
PacketGetCowData common/lib/networking/PacketGetCowData.java 类名在 PacketHandler.java 中 0 命中
PacketCowUpdate common/lib/networking/PacketCowUpdate.java 类名在 PacketHandler.java 中 0 命中

二者确实互相引用:PacketGetCowData.onMessage(...) 的 return 语句构造并返回一个 PacketCowUpdate(PacketGetCowData.java:51):

51:            return new PacketCowUpdate(types, amounts, type, mod, message.id);

但由于 PacketGetCowData 本身也未注册,这一对是封闭的死代码。按「死代码 ≠ 注册内容」的口径,本 wiki 只把上表 15 个计入「已注册封包」。

复核命令:

$ grep -c "registerMessage(" common/lib/networking/PacketHandler.java
15

数值

  • 通道名长度 15 字符,20 字节通道名阈值内。
  • 封包序号 0–14,共 15 个,与注册数一致。
  • SECURITY_MARKER 名为 SuspiciousPackets;该 Marker 的实际使用点未逐行核对。

相关条目

  • 配置 - 药水 ID 变更后由服务端经封包同步
  • 生物实体 - PacketMountNightmare、PacketPlayerInfusionSync 的作用对象
  • 第三方模组集成 - 通道名与 modid 的大小写差异