服务端快照与接收者
S2C 数据用于重建客户端展示。一次快照应足够让新加入的客户端理解当前状态,不应要求它已经收到之前所有事件。
从展示需求选择字段
比分 HUD 需要地图身份、比分和阶段;它不需要完整 BaseMap、队伍玩家实体或回合规则。传输小型不可变值,能使界面与服务器实现分别演进。
教程的 ScoreS2CPacket 就是一个 Java record,完整编码和接收实现见第八章。
选择接收者
附属模组独立频道可以这样向一位玩家发送:
EliminationNetwork.PACKETS.getChannel().send(
PacketDistributor.PLAYER.with(() -> player), packet);
player 为 ServerPlayer,packet 必须已注册在这个频道上。群发时先取得需要接收的玩家集合。比分通常包含观察者;私有商店、队伍战术信息则只发给有权接收的人。
FPSMatch 的 BaseMap.sendPacketToAllPlayer 等工具使用框架频道。独立频道注册的包应通过自己的频道发送,避免出现消息未注册错误。
初始与增量同步
进入房间、加入地图和重连时发送完整快照。后续可以只在分数、阶段或设置发生变化时发送。脏标记表示“尚未广播的变化”,不应被给单个新玩家的初始快照清除。
倒计时可以发送服务器确定的阶段信息与时间基准,由客户端做视觉插值。客户端预测只影响显示,超时胜负仍由服务器判断。
离场与旧数据
客户端退出地图或断开连接时,应清理旧快照。多个地图使用相同 HUD 时,最好同时携带游戏类型和地图 ID,并在换图时替换状态。
教程采用周期全量快照和两秒失效时间,便于理解整个链路;需要即时切换的产品界面可增加明确的加入、离场或订阅消息。
协议变化
编码和解码字段顺序必须一致。更改字段类型、删除字段或调整顺序时更新协议版本。新增字段也不是天然兼容,应定义旧客户端读取方式或拒绝不支持的协议版本。