Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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);
            }
        }