ZZClientOnlySyncMessage
基本信息
| 属性 | 值 |
|---|---|
| 消息类 | com.dreammaster.network.msg.ZZClientOnlySyncMessage |
| 处理器 | 内嵌静态类 ZZClientOnlySyncMessageHandler(ZZClientOnlySyncMessage.java:31) |
| 网络通道 | SimpleNetworkWrapper(Refstrings.MODID) = modid dreamcraft(MainRegistry.java:180) |
| 消息 ID(discriminator) | 1(MainRegistry.java:184) |
| 允许接收端 | Side.CLIENT(MainRegistry.java:185) |
| 注册时机 | PreLoad(MainRegistry.java:181-185) |
| 载荷 | boolean enabled,1 bit |
| 消息总数 | 1 |
⚠️ 本 mod 唯一的网络消息
com.dreammaster.network 包下只有 msg/ZZClientOnlySyncMessage.java 一个文件(find src/main/java/com/dreammaster/network -name '*.java' 单条结果)。本 mod 没有实体同步包、没有区块数据、没有世界数据传输。
功能
一条服务端 → 客户端单向的布尔开关同步,服务端发 true/false,客户端据此开关某个功能。
注册
dispatcher = new SimpleNetworkWrapper(Refstrings.MODID);
dispatcher.registerMessage(
ZZClientOnlySyncMessage.ZZClientOnlySyncMessageHandler.class,
ZZClientOnlySyncMessage.class,
1,
Side.CLIENT);
(MainRegistry.java:180-185)
因为 discriminator 是 1 且方向为 Side.CLIENT,服务端不会处理来自客户端的同 ID 消息。
序列化
| 方向 | 实现 | 内容 |
|---|---|---|
客户端 → 服务端(toBytes) |
ZZClientOnlySyncMessage.java:27-29 |
buf.writeBoolean(enabled) |
服务端 → 客户端(fromBytes) |
ZZClientOnlySyncMessage.java:22-24 |
enabled = buf.readBoolean() |
toBytes 写 1 个布尔,fromBytes 读 1 个布尔,两个方向不对称:服务端只调用 sendTo(内部调 toBytes),客户端的 fromBytes 负责解包。字段 enabled 是包级私有(无修饰符,ZZClientOnlySyncMessage.java:12)。
处理器
public static class ZZClientOnlySyncMessageHandler implements IMessageHandler<ZZClientOnlySyncMessage, IMessage> {
@Override
public IMessage onMessage(ZZClientOnlySyncMessage message, MessageContext ctx) {
ScriptZZClientOnly.instance.handleServerMessage(message.enabled);
return null;
}
}
(ZZClientOnlySyncMessage.java:31-38)
处理器返回 null(ZZClientOnlySyncMessage.java:36),即不回发任何回复消息 —— 确认这是单向同步。副作用直接转交 ScriptZZClientOnly.instance 的静态单例(ScriptZZClientOnly.java:37 定义该单例)。
数值
| 数值名 | 值 |
|---|---|
| 消息数 | 1 |
| discriminator | 1 |
| 载荷大小 | 1 字节(writeBoolean / readBoolean) |
| 方向 | 服务端 → 客户端(单向,处理器返回 null) |
| 处理器返回值 | null(不回发) |
交互
| 触发 | 行为 |
|---|---|
服务端发出 enabled=true |
客户端调 stamps(true),并把每个 coins 配方置 mEnabled=true / mHidden=false,置 registered=true(ScriptZZClientOnly.java:440-446) |
服务端发出 enabled=false |
客户端调 stamps(false),并把每个 coins 配方置 mEnabled=false / mHidden=true,置 registered=false(ScriptZZClientOnly.java:447-453) |
消息到达但 initialized 为 false |
抛 RuntimeException("ZZClientOnly not initialized!")(ScriptZZClientOnly.java:439) |
| 玩家进入服务器 | 状态由服务端决定并推送,客户端不自行判断 |
玩家侧无任何直接交互 —— 没有指令、没有 GUI、没有物品。
相关条目
- 配方脚本 - 接收本消息的
ScriptZZClientOnly属于该体系