网络与封包

基本信息

属性 值 来源
通道名 DEvolutionNC DraconicEvolution.java:52 public static final String networkChannelName = "DEvolutionNC"
网络类型 SimpleNetworkWrapper CommonProxy.java:186 NetworkRegistry.INSTANCE.newSimpleChannel(...)
封包类总数 21 ls common/network/*.java | wc -l
注册条目数 25(ID 0–24) CommonProxy.java:187-211,grep -c registerMessage = 25
注册时机 随 initializeNetwork() 在 preInit 阶段完成 CommonProxy.java:144 调用,方法体 :184-212
GUI 处理器 NetworkRegistry.INSTANCE.registerGuiHandler(DraconicEvolution.instance, this) client/gui/GuiHandler.java:62(仅客户端)

21 类 / 25 条 的差异来自双向注册:TileObjectPacket、MountUpdatePacket、SpeedRequestPacket、ContributorPacket 四个类各注册两次(一次 CLIENT、一次 SERVER),共多出 4 条。

所有封包都用内部 Handler 静态类注册(XxxPacket.Handler.class, XxxPacket.class, ID, Side),这是 1.7.10 FML 的标准写法。

全部 25 条注册

ID 封包类 方向 触发方(new XxxPacket() 站点,不含 network/ 自身)
0 ButtonPacket → SERVER KeyInputHandler、GUIDraconiumChest、GUIDissEnchanter、GUIWeatherController、GUIToolConfig(共 10 处)
1 ParticleGenPacket → SERVER GUIParticleGenerator(2 处)
2 PlacedItemPacket → SERVER KeyInputHandler(1 处)
3 PlayerDetectorButtonPacket → SERVER GUIPlayerDetector(4 处)
4 PlayerDetectorStringPacket → SERVER GUIPlayerDetector(1 处)
5 TeleporterPacket → SERVER KeyInputHandler、GUISunDial、GUITeleporter(共 18 处)
6 TileObjectPacket → CLIENT TileObjectSync、ContainerDataSync(4 处)
7 MountUpdatePacket → CLIENT MinecraftForgeEventHandler、ClientEventHandler(2 处)
8 MountUpdatePacket → SERVER 同上
9 ItemConfigPacket → SERVER ItemConfigField、GUIToolConfig(2 处)
10 TileObjectPacket → SERVER 同 ID 6
11 BlockUpdatePacket → SERVER 无任何发送点 —— 见「死注册」
12 SpeedRequestPacket → SERVER MinecraftForgeEventHandler(1 处)
13 SpeedRequestPacket → CLIENT 同 ID 12
14 ToolModePacket → SERVER ToolBase、DraconicSword、WyvernSword(3 处)
15 GenericParticlePacket → CLIENT EntityDragonProjectile、EntityChaosVortex、EntityCustomArrow(5 处)
16 ShieldHitPacket → CLIENT CustomArmorHandler(1 处)
17 ContributorPacket → CLIENT ContributorHandler、GUIToolConfig(2 处)
18 ContributorPacket → SERVER 同 ID 17
19 MagnetTogglePacket → SERVER KeyInputHandler(1 处)
20 MagnetToggleAckPacket → CLIENT 由 ID 19 的接收端回发,见下
21 DislocatorInhibitorButtonPacket → SERVER GUIDislocatorInhibitor(4 处)
22 SlotFakeClickPacket → SERVER GUIDislocatorInhibitor(2 处)
23 MagnetToggleSelfPickupPacket → SERVER KeyInputHandler(1 处)
24 MagnetToggleSelfPickupAckPacket → CLIENT 由 ID 23 的接收端回发,见下

ID 0–24 的连续性与 TeleporterPacket 内部用的 11 个 public static final int 动作常量(TeleporterPacket.ADDFUEL = 6 等,TeleporterPacket.java:22-28)是两套独立编号,不要混淆。

Ack 类封包由兄弟封包回发

MagnetToggleAckPacket(ID 20)与 MagnetToggleSelfPickupAckPacket(ID 24)没有自己的 new 调用点 —— 在 common/network/ 之外 grep 不到。它们是在各自的请求封包的处理函数里构造并 sendTo 回客户端的:

Ack 封包 回发位置 载荷
MagnetToggleAckPacket MagnetTogglePacket.java:40 Magnet.isEnabled(itemStack)
MagnetToggleSelfPickupAckPacket MagnetToggleSelfPickupPacket.java:41 Magnet.getSelfPickupStatusShort(itemStack)

这是「new X( grep 无命中 ≠ 不存在」的典型例子:封包确实在运行时被发出,只是构造点位于另一个封包类内部。

MagnetToggleSelfPickup 这一对(ID 23/24)还受 Hodgepodge 加载条件约束 —— 对应的按键绑定同样只在 ModHelper.isHodgepodgeLoaded 时才创建(KeyInputHandler.java:58-63)。

死注册:BlockUpdatePacket

BlockUpdatePacket(ID 11)注册了但永远不会被发送。 证据:

  1. 全仓 grep -rn 'BlockUpdatePacket' src/main/java 只有 5 处命中,全部在该类自身或 CommonProxy 的 import / 注册行
  2. 两个构造函数都已实现(BlockUpdatePacket.java:14 无参、:16 三参),Handler 也完整(:36-39)
  3. 没有任何 new BlockUpdatePacket(...) 站点,也没有任何地方以其他方式构造它

也就是说它占着 ID 11 与一个 Handler 槽位,但线上永不出现。属于上游遗留代码,不影响功能。

广播封包与 TargetPoint

DE 不只用具名通道发包,还大量使用 SimpleNetworkWrapper.sendToServer / sendToAllAround 配合 NetworkRegistry.TargetPoint 做定向广播。TargetPoint 的半径是硬编码的:

站点 半径
EntityDragonProjectile.java:243,261,301 128
EntityChaosVortex.java:67 512
EntityCustomArrow.java:497 256
TileEnergyStorageCore.java:529 20
TileEnergyPylon.java:301,306 256
TileReactorCore.java:268 512
TileReactorCore.java:454-458 128
CustomArmorHandler.java:112 64

这些不属于 registerMessage 体系,因此不计入 25 条。

未在本条目覆盖的客户端代码

client/ 包共 118 个文件(占全仓 388 个源文件的三成),包含 GuiHandler、全部 GUI* 界面类、粒子与渲染器。本条目只记录服务端注册面(通道、25 条封包、TargetPoint 半径),不记录各 GUI 界面本身。GUI 相关的封包触发方已在表中列出,可据此定位。

相关条目