网络与封包
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 通道名 | 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)注册了但永远不会被发送。 证据:
- 全仓
grep -rn 'BlockUpdatePacket' src/main/java只有 5 处命中,全部在该类自身或CommonProxy的 import / 注册行 - 两个构造函数都已实现(
BlockUpdatePacket.java:14无参、:16三参),Handler也完整(:36-39) - 没有任何
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 相关的封包触发方已在表中列出,可据此定位。
相关条目
- 实体一览 - 5 处 GenericParticlePacket 广播的来源实体
- TileEntity 一览 - TileObjectPacket / BlockUpdatePacket 的宿主
- 工具与武器 - ToolModePacket、KeyInputHandler 的按键
- 错位器与抑制器 - DislocatorInhibitorButtonPacket / SlotFakeClickPacket
- 能量塔结构 - TileEnergyPylon 的 256 格广播