//玩家退出房间 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(); }
private string PlayerExitHall(string playerID) { PlayerToIP.Remove(playerID); PlayersProxy.Remove(playerID); string result = string.Format("player {0} quit.", playerID); log.Debug(result); Thread.Sleep(500); Thread thr = new Thread(new ThreadStart(this.UpdateGameHall)); thr.Start(); return(result); }
public void PlayerEnterHall(string playerID) { string clientIP = GetClientIP(); LogClientInfo(clientIP, playerID, false); IPlayer player = OperationContext.Current.GetCallbackChannel <IPlayer>(); if (!PlayersProxy.Keys.Contains(playerID)) { this.PlayerToIP.Add(playerID, clientIP); PlayersProxy.Add(playerID, player); if (this.SessionIDGameRoom.ContainsKey(playerID)) { //断线重连 log.Debug(string.Format("player {0} re-entered hall from offline.", playerID)); player.NotifyMessage(new string[] { CommonMethods.reenterRoomSignal }); Thread.Sleep(2000); GameRoom gameRoom = this.SessionIDGameRoom[playerID]; lock (gameRoom) { bool entered = gameRoom.PlayerReenterRoom(playerID, clientIP, player, AllowSameIP); if (entered) { Thread.Sleep(500); Thread thr = new Thread(new ThreadStart(this.UpdateGameHall)); thr.Start(); } } } else { log.Debug(string.Format("player {0} entered hall.", playerID)); UpdateGameHall(); } } else if (this.PlayerToIP.ContainsValue(clientIP)) { player.NotifyMessage(new string[] { "之前非正常退出", "请重启游戏后再尝试进入大厅" }); } else { player.NotifyMessage(new string[] { "玩家昵称重名", "请更改昵称后重试" }); } }
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 }); } }