网络封包
基本信息
| 属性 | 值 |
|---|---|
| 通道名 | 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 的实际使用点未逐行核对。