/// <summary> /// Raised when a player joins the session /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnLivePlayerJoined(object sender, GamerJoinedEventArgs e) { IdentifiedPlayer identifiedPlayer = null; if (e.Gamer.IsLocal) { var localNetworkGamer = (LocalNetworkGamer)e.Gamer; IdentifiedPlayer[] localPlayersArray = new IdentifiedPlayer[SessionManager.LocalPlayers.Count]; SessionManager.LocalPlayers.Values.CopyTo(localPlayersArray, 0); for (int i = 0; i < localPlayersArray.Length; i++) { var localPlayer = localPlayersArray[i]; if (localPlayer.UniqueId == e.Gamer.Gamertag) { identifiedPlayer = new LiveIdentifiedPlayer(localPlayer.Input, localNetworkGamer); _localPlayers.Add(identifiedPlayer); _allPlayers.Add(identifiedPlayer); break; } } } else { NetworkGamer networkGamer = e.Gamer; identifiedPlayer = new LiveIdentifiedPlayer(networkGamer); _remotePlayers.Add(identifiedPlayer); _allPlayers.Add(identifiedPlayer); } OnPlayerJoined(identifiedPlayer); }
/// <summary> /// Raised when a player leaves /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnLivePlayerLeft(object sender, GamerLeftEventArgs e) { IdentifiedPlayer identifiedPlayer = null; if (e.Gamer.IsLocal) { SignedInGamer signedInGamer = ((LocalNetworkGamer)e.Gamer).SignedInGamer; _localPlayers.ForEach(action => { if (action.UniqueId == signedInGamer.Gamertag) { identifiedPlayer = action; _localPlayers.Remove(action); _allPlayers.Remove(action); } }); } else { _remotePlayers.ForEach(action => { if (action.UniqueId == e.Gamer.Gamertag) { identifiedPlayer = action; _remotePlayers.Remove(action); _allPlayers.Remove(action); } }); } OnPlayerLeft(identifiedPlayer); }
/// <summary> /// Raised when the Live player signed out /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnLiveGamerSignedOut(object sender, SignedOutEventArgs e) { IdentifiedPlayer identifiedPlayer = LocalPlayers[e.Gamer.PlayerIndex]; LocalPlayers.Remove(e.Gamer.PlayerIndex); OnPlayerLogoff(identifiedPlayer); }
private void RetrieveDisconnectedPlayersFromServer() { int numberOfDisconnectedPlayers = _incomingMessage.ReadVariableInt32(); for (int i = 0; i < numberOfDisconnectedPlayers; i++) { string playerUniqueId = _incomingMessage.ReadString(); IdentifiedPlayer player = _remotePlayers.Find(match => match.UniqueId == playerUniqueId); _remotePlayers.Remove(player); _remotePlayerIpEndPoints.Remove(player); _allPlayers.Remove(player); OnPlayerLeft(player); } }
public void Start(List <ClientInfo> ConnectedClients, Action <string> loger, Action <string> resultReport) { try { while (IsTerminated == false) { List <ClientInfo> playerList = null; try { //выбираем клиентов playerList = SelectPlayers(ConnectedClients); if (playerList.Count < 2) { Thread.Sleep(TimeSpan.FromMilliseconds(10)); continue; } List <IPlayer> players = playerList.ConvertAll <IPlayer>(x => new NetworkPlayer(x)); while (players.Count < 4) { players.Add(new SmartPlayer2()); } List <IdentifiedPlayer> identifiedPlayers = new List <IdentifiedPlayer>(); foreach (var client in playerList) { var identifiedPlayer = new IdentifiedPlayer(new NetworkPlayer(client), client.ClientId); identifiedPlayers.Add(identifiedPlayer); } while (identifiedPlayers.Count < 4) { var player = new SmartPlayer2(); identifiedPlayers.Add(new IdentifiedPlayer(player, player.GetType().Name)); } loger("Начался новый раунд, участники:\r\n" + string.Join("\r\n", identifiedPlayers.ConvertAll(x => x.Id))); GameOrganizer organizer = new GameOrganizer(null, identifiedPlayers); while (IsTerminated == false) { organizer.PlayNextGame(); string message = string.Format("Число игр {0}\r\n", organizer.Results.GamesCount); message += string.Format("Текущая карта {0}/{1}\r\n", organizer.Results.MapId, organizer.Results.PermutationId); message += organizer.Results.GetState(); resultReport(message); } } catch (Exception exp) { loger("Error: " + exp.Message); } finally { if (playerList != null) { foreach (ClientInfo client in playerList) { client.InGame = false; } } } for (int i = 1; i <= 50; i++) { if (IsTerminated) { break; } Thread.Sleep(TimeSpan.FromSeconds(0.1)); } } } catch (Exception exp) { loger(exp.Message); } }