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 条目中的说明。 - 消息不携带物品本身,只携带槽位号,服务端完全依赖自己背包的当前状态。
相关条目
- ActivatableFromInventoryServerSide API - 处理器最终调用的接口
- 激活物品热键 - 唯一的发送触发点