Exemple #1
0
        //玩家退出房间
        public void PlayerExitRoom(string playerID)
        {
            if (!this.SessionIDGameRoom.ContainsKey(playerID))
            {
                return;
            }

            GameRoom gameRoom = this.SessionIDGameRoom[playerID];
            //如果退出的是正常玩家,先记录旁观玩家和离线玩家
            List <string> obs         = new List <string>();
            List <string> quitPlayers = new List <string>()
            {
                playerID
            };

            if (gameRoom.IsActualPlayer(playerID))
            {
                obs = gameRoom.ObserversProxy.Keys.ToList <string>();
                foreach (var player in gameRoom.CurrentRoomState.CurrentGameState.Players)
                {
                    if (player == null)
                    {
                        continue;
                    }
                    if (player.IsOffline)
                    {
                        quitPlayers.Add(player.PlayerId);
                    }
                }
                foreach (PlayerEntity p in gameRoom.CurrentRoomState.CurrentGameState.Players)
                {
                    if (p != null && !PlayersProxy.ContainsKey(p.PlayerId) && !obs.Contains(p.PlayerId) && !quitPlayers.Contains(p.PlayerId))
                    {
                        obs.Add(p.PlayerId);
                    }
                }
            }

            //先将退出的玩家和离线玩家移出房间
            gameRoom.PlayerQuit(quitPlayers);
            foreach (string qp in quitPlayers)
            {
                SessionIDGameRoom.Remove(qp);
            }

            //再将旁观玩家移出房间,这样旁观玩家才能得到最新的handstep的更新
            gameRoom.PlayerQuit(obs);
            foreach (string ob in obs)
            {
                SessionIDGameRoom.Remove(ob);
            }

            log.Debug(string.Format("player {0} exited room.", playerID));
            Thread.Sleep(500);
            Thread thr = new Thread(new ThreadStart(this.UpdateGameHall));

            thr.Start();
        }
Exemple #2
0
        public void UpdateGameHall()
        {
            List <string> namesToCall = new List <string>();

            lock (PlayersProxy)
            {
                List <string> names = PlayersProxy.Keys.ToList <string>();
                foreach (var name in names)
                {
                    bool isInRoom = false;
                    foreach (GameRoom room in this.GameRooms)
                    {
                        if (!PlayersProxy.ContainsKey(name))
                        {
                            continue;
                        }
                        if (room.PlayersProxy.ContainsValue(PlayersProxy[name]) ||
                            room.ObserversProxy.ContainsValue(PlayersProxy[name]))
                        {
                            isInRoom = true;
                            break;
                        }
                    }

                    if (!isInRoom)
                    {
                        namesToCall.Add(name);
                    }
                }
            }
            if (namesToCall.Count > 0)
            {
                IPlayerInvokeForAll(PlayersProxy, namesToCall, "NotifyGameHall", new List <object>()
                {
                    this.RoomStates, namesToCall
                });
            }
        }