//玩家退出房间 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(); }
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 }); } }