旁观、离场与重连
FPSMatch 的地图包含观察者队伍,但“处于原版旁观模式”不意味着玩家一定属于观察者队伍。团队淘汰赛中,出局玩家仍属于红队或蓝队,只是暂时不能战斗。
三种身份
| 身份 | 队伍 | 比赛存活状态 |
|---|---|---|
| 正在战斗的参赛者 | 普通队伍 | 存活 |
| 本轮出局的参赛者 | 原来的普通队伍 | 非存活 |
| 只观看比赛的玩家 | 观察者队伍 | 不参与普通队伍胜负 |
发送比分或回合消息时,用 getOnlineWithSpec() 覆盖三种身份;分配出生装备时,用 getOnline() 避免给观察者发装备。
出局与重新入场
地图的死亡处理可以在调用父实现后设置 GameType.SPECTATOR。下一轮需要同时恢复游戏模式与比赛状态。只设置 PlayerData.setLiving(true) 不会让 Minecraft 的旁观者重新拥有碰撞或攻击能力。
BaseRoundMap.handleRespawn() 默认只更新存活标记并传送。需要恢复生命、镜头或装备的模式,应在自己的回合准备方法中组合这些操作。
临时断线
比赛进行中断线时,框架调用 handlePlayerDisconnect() 保留玩家数据,标记离线和非存活。重连后恢复记分板绑定、发送地图和队伍数据,并将玩家置为旁观状态。
这意味着重连不应默认立即复活。淘汰赛可以让玩家等到下一轮;死斗则需要自行定义复活延迟。再次调用 join() 或 leave() 会改变名单和关联,不能用它们替代所有重连处理。
主动离场
BaseMap.leave() 发布可取消的离开事件,清理关联和准备状态,并恢复为冒险模式。调用方应通过框架入口离场,不要只从内部 UUID 集合删除玩家。
HUD 还需要清理旧快照。教程使用离线清空与短暂超时;实时房间 UI 可以通过单独的离场消息立即清除展示。参见客户端状态。