PacketHandler
SimpleNetworkWrapper 注册(2 条消息)
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.network.PacketHandler |
| 行数 | 21 |
| 网络通道名 | ingameinfoxml(:14,= MODID.toLowerCase()) |
通道创建(:13-14)
public static final SimpleNetworkWrapper INSTANCE =
NetworkRegistry.INSTANCE.newSimpleChannel(Reference.MODID.toLowerCase());
⚠️ 在静态字段初始化时创建通道,即类加载即向
NetworkRegistry 注册。类加载时机由
CommonProxy.init(:19)的
PacketHandler.init() 触发。
⚠️ 通道名 ingameinfoxml 与资源域 ingameinfo 不同(差 xml)。
messageId 计数器(:15)
private static int messageId = 0;
非 final 的静态可变计数器,init() 里用 messageId++ 自增。
⚠️ init() 没有幂等保护 ——
若被调用两次,第二次的 registerMessage 会用 messageId = 2 和 3,
与第一次的 0 和 1 重复注册同一消息类,
FML 会抛 IllegalArgumentException(重复的 discriminator)。
CommonProxy.init 的 init 由
@Mod 的 FMLInitializationEvent 触发,FML 保证每侧只触发一次,
所以实际不会重复。但 PacketHandler.init() 是 public static,
任何 mod 都能再调一次。
两条消息(:17-20)
INSTANCE.registerMessage(MessageSeed.class, MessageSeed.class, messageId++, Side.CLIENT);
INSTANCE.registerMessage(MessageNextRain.class, MessageNextRain.class, messageId++, Side.CLIENT);
| id | 类 | 方向 | 载荷 |
|---|---|---|---|
| 0 | MessageSeed | → CLIENT | long |
| 1 | MessageNextRain | → CLIENT | int |
⚠️ 两条都是 Side.CLIENT,即只从服务端发往客户端。
本 mod 没有任何客户端 → 服务端的消息。
/igi 命令也是纯客户端命令(ClientCommandHandler),不与服务端通信。
⚠️ 两个消息类同时充当消息与处理器
(implements IMessage, IMessageHandler<Self, IMessage>),
所以 registerMessage 的 message 与 handler 参数传同一个 Class 对象。
这是 FML SimpleNetworkWrapper 支持的标准写法。
两条消息的触发方
| 消息 | 触发 |
|---|---|
MessageSeed |
PlayerHandler 的 PlayerLoggedInEvent |
MessageNextRain |
WorldHandler 的 WorldTickEvent(每秒) |
相关
- MessageSeed / MessageNextRain - 两条消息
- CommonProxy -
init()的调用方 - PlayerHandler / WorldHandler - 发送方