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(每秒)

相关