Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        private void HandleGameExit(uint playerId, FSPMessage msg)
        {
            AddCmdToCurrentFrame(playerId, msg);
            FSPPlayer player = GetPlayer(playerId);

            if (player != null)
            {
                player.WaitForExit = true;
                onGameExit?.Invoke(player.ID);
            }
        }
Example #4
0
        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
                };
            }
        }
Example #5
0
        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;
            }
            }
        }
Example #6
0
 private void OnRecvFromPlayer(FSPPlayer player, FSPMessage msg)
 {
     HandleClientCmd(player, msg);
 }