private bool CheckGameAbnormalEnd() { //判断还剩下多少玩家,如果玩家少于2,则表示至少有玩家主动退出 if (m_ListPlayer.Count < 2) { //直接进入GameEnd状态 SetGameState(FSPGameState.GameEnd, (int)FSPGameEndReason.AllOtherExit); AddCmdToCurrentFrame(FSPVKeyBase.GAME_END, (int)FSPGameEndReason.AllOtherExit); return(true); } // 检测玩家在线状态 for (int i = 0; i < m_ListPlayer.Count; i++) { FSPPlayer player = m_ListPlayer[i]; if (player.IsLose()) { m_ListPlayer.RemoveAt(i); FSPServer.Instance.DelSession(player.Sid); player.Dispose(); --i; } } //判断还剩下多少玩家,如果玩家少于2,则表示有玩家掉线了 if (m_ListPlayer.Count < 2) { //直接进入GameEnd状态 SetGameState(FSPGameState.GameEnd, (int)FSPGameEndReason.AllOtherLost); AddCmdToCurrentFrame(FSPVKeyBase.GAME_END, (int)FSPGameEndReason.AllOtherLost); return(true); } return(false); }
public bool AddPlayer(uint playerId, uint sid) { if (m_eState != FSPGameState.Create) { return(false); } FSPPlayer player = null; for (int i = 0; i < m_ListPlayer.Count; i++) { player = m_ListPlayer[i]; if (player.Id == playerId) { m_ListPlayer.RemoveAt(i); FSPServer.Instance.DelSession(player.Sid); player.Dispose(); break; } } if (m_ListPlayer.Count >= MaxPlayerNum) { return(false); } FSPSession session = FSPServer.Instance.AddSession(sid); player = new FSPPlayer(playerId, m_aFSPParam.serverTimeout, session, OnPlayerReceive); m_ListPlayer.Add(player); return(true); }
/// <summary> /// 处理来自客户端的 Cmd /// 对其中的关键VKey进行处理 /// 并且收集业务VKey /// </summary> /// <param name="player"></param> /// <param name="cmd"></param> protected virtual void HandleClientCmd(FSPPlayer player, FSPVKey cmd) { uint playerId = player.Id; if (!player.HasAuth) { if (cmd.vkey == FSPVKeyBase.AUTH) { player.SetAuth(cmd.args[0]); } return; } switch (cmd.vkey) { case FSPVKeyBase.GAME_BEGIN: { SetFlag(playerId, ref m_GameBeginFlag, "m_GameBeginFlag"); break; } case FSPVKeyBase.ROUND_BEGIN: { SetFlag(playerId, ref m_RoundBeginFlag, "m_RoundBeginFlag"); break; } case FSPVKeyBase.CONTROL_START: { SetFlag(playerId, ref m_ControlStartFlag, "m_ControlStartFlag"); break; } case FSPVKeyBase.ROUND_END: { SetFlag(playerId, ref m_RoundEndFlag, "m_RoundEndFlag"); break; } case FSPVKeyBase.GAME_END: { SetFlag(playerId, ref m_GameEndFlag, "m_GameEndFlag"); break; } case FSPVKeyBase.GAME_EXIT: { HandleGameExit(playerId, cmd); break; } default: { AddCmdToCurrentFrame(playerId, cmd); break; } } }
private void OnPlayerReceive(FSPPlayer player, FSPVKey cmd) { if (UseDelayGC) { m_ListObjectsForDelayGC.Add(cmd); } HandleClientCmd(player, cmd); }
public void EnterFrame() { for (int i = 0; i < m_ListPlayersExitOnNextFrame.Count; i++) { FSPPlayer player = m_ListPlayersExitOnNextFrame[i]; FSPServer.Instance.DelSession(player.Sid); player.Dispose(); } m_ListPlayersExitOnNextFrame.Clear(); }
private void HandleGameExit(uint playerId, FSPVKey cmd) { AddCmdToCurrentFrame(playerId, cmd); FSPPlayer player = GetPlayer(playerId); if (player != null) { player.WaitForExit = true; if (onGameExit != null) { onGameExit(playerId); } } }
private FSPPlayer GetPlayer(uint playerId) { FSPPlayer aPlayer = null; for (int i = 0; i < m_ListPlayer.Count; ++i) { aPlayer = m_ListPlayer[i]; if (aPlayer.Id == playerId) { return(aPlayer); } } return(null); }
public void Dispose() { SetGameState(FSPGameState.None); for (int i = 0; i < m_ListPlayer.Count; i++) { FSPPlayer player = m_ListPlayer[i]; FSPServer.Instance.DelSession(player.Sid); player.Dispose(); } m_ListPlayer.Clear(); m_ListObjectsForDelayGC.Clear(); GC.Collect(); onGameExit = null; onGameEnd = null; }