public FSPPlayer AddPlayer(uint playerId, FSPSession session) { if (state != FSPGameState.Create) { Debuger.LogError("当前状态下无法AddPlayer! State = {0}", state); return(null); } FSPPlayer player = null; for (int i = 0; i < listPlayer.Count; i++) { player = listPlayer[i]; if (player.ID == playerId) { Debuger.LogWarning("PlayerId已经存在!用新的替代旧的! PlayerId = " + playerId); listPlayer.RemoveAt(i); player.Release(); break; } } if (listPlayer.Count >= MaxPlayerNum) { Debuger.LogError("已经达到最大玩家数了! MaxPlayerNum = {0}", MaxPlayerNum); return(null); } player = new FSPPlayer(); player.Create(playerId, authID, session, OnRecvFromPlayer); listPlayer.Add(player); return(player); }
private bool CheckGameAbnormalEnd() { if (listPlayer.Count < 1) { SetGameState(FSPGameState.GameEnd, (int)FSPGameEndReason.AllOtherExit); AddBasicCmdToCurrentFrame(FSPProtoCmd.GameEnd, (int)FSPGameEndReason.AllOtherExit); return(true); } for (int i = 0; i < listPlayer.Count; i++) { FSPPlayer player = listPlayer[i]; if (player.IsLose()) { listPlayer.RemoveAt(i); player.Release(); --i; } } if (listPlayer.Count < 1) { SetGameState(FSPGameState.GameEnd, (int)FSPGameEndReason.AllOtherLost); AddBasicCmdToCurrentFrame(FSPProtoCmd.GameEnd, (int)FSPGameEndReason.AllOtherLost); return(true); } return(false); }
private void HandleGameExit(uint playerId, FSPMessage msg) { AddCmdToCurrentFrame(playerId, msg); FSPPlayer player = GetPlayer(playerId); if (player != null) { player.WaitForExit = true; onGameExit?.Invoke(player.ID); } }
public void EnterFrame() { foreach (var player in listPlayersExitOnNextFrame) { player.Release(); } listPlayersExitOnNextFrame.Clear(); HandleGameState(); if (state == FSPGameState.None) { return; } if (lockedFrame.frameID != 0 || !lockedFrame.IsEmpty()) { for (int i = 0; i < listPlayer.Count; i++) { FSPPlayer player = listPlayer[i]; player.SendToClient(lockedFrame); if (player.WaitForExit) { listPlayersExitOnNextFrame.Add(player); listPlayer.RemoveAt(i); --i; } } } if (lockedFrame.frameID == 0) { lockedFrame = new FSPFrameData(); } if (state == FSPGameState.RoundBegin || state == FSPGameState.ControlStart) { curFrameId++; lockedFrame = new FSPFrameData { frameID = curFrameId }; } }
protected virtual void HandleClientCmd(FSPPlayer player, FSPMessage msg) { uint playerId = player.ID; if (!player.HasAuthed) { if (msg.cmd == FSPProtoCmd.Auth) { player.SetAuth(msg.args[0]); } else { Debuger.LogWarning("当前Player未鉴权,无法处理该Cmd:{0}", msg.cmd); } return; } switch (msg.cmd) { case FSPProtoCmd.GameBegin: { Debuger.Log("GAME_BEGIN, playerId = {0}, cmd = {1}", playerId, msg); SetFlag(playerId, ref gameBeginFlag, "GameBeginFlag"); break; } case FSPProtoCmd.RoundBegin: { Debuger.Log("ROUND_BEGIN, playerId = {0}, cmd = {1}", playerId, msg); SetFlag(playerId, ref roundBeginFlag, "RoundBeginFlag"); break; } case FSPProtoCmd.ControlStart: { Debuger.Log("CONTROL_START, playerId = {0}, cmd = {1}", playerId, msg); SetFlag(playerId, ref controlStartFlag, "ControlStartFlag"); break; } case FSPProtoCmd.RoundEnd: { Debuger.Log("ROUND_END, playerId = {0}, cmd = {1}", playerId, msg); SetFlag(playerId, ref roundEndFlag, "RoundEndFlag"); break; } case FSPProtoCmd.GameEnd: { Debuger.Log("GAME_END, playerId = {0}, cmd = {1}", playerId, msg); SetFlag(playerId, ref gameEndFlag, "GameEndFlag"); break; } case FSPProtoCmd.GameExit: { Debuger.Log("GAME_EXIT, playerId = {0}, cmd = {1}", playerId, msg); HandleGameExit(playerId, msg); break; } default: { Debuger.Log("playerId = {0}, cmd = {1}", playerId, msg); AddCmdToCurrentFrame(playerId, msg); break; } } }
private void OnRecvFromPlayer(FSPPlayer player, FSPMessage msg) { HandleClientCmd(player, msg); }