Beispiel #1
0
    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);
    }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    /// <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;
        }
        }
    }
Beispiel #4
0
    private void OnPlayerReceive(FSPPlayer player, FSPVKey cmd)
    {
        if (UseDelayGC)
        {
            m_ListObjectsForDelayGC.Add(cmd);
        }

        HandleClientCmd(player, cmd);
    }
Beispiel #5
0
 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();
 }
Beispiel #6
0
    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);
            }
        }
    }
Beispiel #7
0
    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);
    }
Beispiel #8
0
 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;
 }