ActivateItemRequest 网络包

基本信息

属性 值
通道名 nohotbarneeded(NetworkRegistry.INSTANCE.newSimpleChannel(MODID))
消息类 network/ActivateItemRequest.java
处理器 network/ActivateItemHandler.java
判别符 0(唯一)
注册方向 Side.SERVER
载荷 1 个 int:slotIdx
通道创建位置 network/NetworkMessageService.java:15-16

注册

channel = NetworkRegistry.INSTANCE.newSimpleChannel(channelName);
channel.registerMessage(ActivateItemHandler.class, ActivateItemRequest.class, 0, Side.SERVER);

channelName 由 NoHotbarNeeded.init 传入 MODID,见 NoHotbarNeeded.java:27。NETWORK 字段在 NoHotbarNeeded.java:18 声明。

全模组只有这 1 条消息,且只有客户端→服务端方向,没有任何服务端→客户端回包。

序列化

ActivateItemRequest 只有一个 int 字段,字段初始值 -1(ActivateItemRequest.java:8),提供空构造器供网络栈反射实例化。

方向 代码
写 buf.writeInt(slotIdx)(:32)
读 slotIdx = buf.readInt()(:27)
读取 public int slotIdx()(:35)

发送

唯一发送点在客户端:NetworkMessageService.sentActivateItemMessage(:19-21)调用 channel.sendToServer(msg),由 KeyboardEventHandler.java:60 在玩家按下热键且鼠标所指物品实现目标接口时触发。

线程

处理器未指定线程,因此运行在 FML 默认的 main server 线程,onMessage 内可直接操作玩家背包与物品。

onMessage 末尾 return null(ActivateItemHandler.java:23)——因为方向是 Side.SERVER,本就不需要回复包。

限制

  • 服务端处理器没有对 slotIdx 做范围校验(客户端有 0–35 检查,服务端没有)。详见 API 条目中的说明。
  • 消息不携带物品本身,只携带槽位号,服务端完全依赖自己背包的当前状态。

相关条目