Exemple #1
0
        private void TunnelHandler_TunnelPinged(int tunnelIndex)
        {
            XNAListBoxItem lbItem = lbTunnelList.GetItem(2, tunnelIndex);
            CnCNetTunnel   tunnel = tunnelHandler.Tunnels[tunnelIndex];

            if (tunnel.PingInMs == -1)
            {
                lbItem.Text = "Unknown";
            }
            else
            {
                lbItem.Text = tunnel.PingInMs + " ms";
                int rating = GetTunnelRating(tunnel);

                if (isManuallySelectedTunnel)
                {
                    return;
                }

                if ((tunnel.Recommended || tunnel.Official) && rating < lowestTunnelRating)
                {
                    bestTunnelIndex            = tunnelIndex;
                    lowestTunnelRating         = rating;
                    lbTunnelList.SelectedIndex = tunnelIndex;
                }
            }
        }
        private void HandleTunnelServerChangeMessage(string sender, string tunnelAddressAndPort)
        {
            if (sender != hostName)
            {
                return;
            }

            string[] split         = tunnelAddressAndPort.Split(':');
            string   tunnelAddress = split[0];
            int      tunnelPort    = int.Parse(split[1]);

            CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort);

            if (tunnel == null)
            {
                AddNotice("The game host has selected an invalid tunnel server! " +
                          "The game host needs to change the server or you will be unable " +
                          "to participate in the match.",
                          Color.Yellow);
                btnLoadGame.AllowClick = false;
                return;
            }

            HandleTunnelServerChange(tunnel);
            btnLoadGame.AllowClick = true;
        }
Exemple #3
0
 public GameCreationEventArgs(string roomName, int maxPlayers,
                              string password, CnCNetTunnel tunnel)
 {
     GameRoomName = roomName;
     MaxPlayers   = maxPlayers;
     Password     = password;
     Tunnel       = tunnel;
 }
        private void BtnApply_LeftClick(object sender, EventArgs e)
        {
            Disable();
            if (!lbTunnelList.IsValidIndexSelected())
            {
                return;
            }

            CnCNetTunnel tunnel = tunnelHandler.Tunnels[lbTunnelList.SelectedIndex];

            TunnelSelected?.Invoke(this, new TunnelEventArgs(tunnel));
        }
Exemple #5
0
        private int GetTunnelRating(CnCNetTunnel tunnel)
        {
            double usageRatio = (double)tunnel.Clients / (double)tunnel.MaxClients;

            if (usageRatio == 0)
            {
                usageRatio = 0.1;
            }

            usageRatio *= 100.0;

            return(Convert.ToInt32(Math.Pow(tunnel.PingInMs, 2.0) * usageRatio));
        }
        /// <summary>
        /// Sets up events and information before joining the channel.
        /// </summary>
        public void SetUp(bool isHost, CnCNetTunnel tunnel, Channel channel,
                          string hostName)
        {
            this.channel  = channel;
            this.tunnel   = tunnel;
            this.hostName = hostName;

            channel.MessageAdded += Channel_MessageAdded;
            channel.UserAdded    += Channel_UserAdded;
            channel.UserLeft     += Channel_UserLeft;
            channel.UserQuitIRC  += Channel_UserQuitIRC;
            channel.CTCPReceived += Channel_CTCPReceived;

            started = false;

            Refresh(isHost);
        }
 /// <summary>
 /// Changes the tunnel server used for the game.
 /// </summary>
 /// <param name="tunnel">The new tunnel server to use.</param>
 private void HandleTunnelServerChange(CnCNetTunnel tunnel)
 {
     tunnelHandler.CurrentTunnel = tunnel;
     AddNotice($"The game host has changed the tunnel server to: {tunnel.Name}");
     //UpdatePing();
 }
 public TunnelEventArgs(CnCNetTunnel tunnel)
 {
     Tunnel = tunnel;
 }
Exemple #9
0
        private void GameBroadcastChannel_CTCPReceived(object sender, ChannelCTCPEventArgs e)
        {
            var channel = (Channel)sender;

            var channelUser = channel.Users.Find(u => u.IRCUser.Name == e.UserName);

            if (channelUser == null)
            {
                return;
            }

            if (localGame != null &&
                channel.ChannelName == localGame.GameBroadcastChannel &&
                !updateDenied &&
                channelUser.IsAdmin &&
                !isInGameRoom &&
                e.Message.StartsWith("UPDATE ") &&
                e.Message.Length > 7)
            {
                string version = e.Message.Substring(7);
                if (version != ProgramConstants.GAME_VERSION)
                {
                    var updateMessageBox = XNAMessageBox.ShowYesNoDialog(WindowManager, "Update available",
                                                                         "An update is available. Do you want to perform the update now?");
                    updateMessageBox.NoClickedAction  = UpdateMessageBox_NoClicked;
                    updateMessageBox.YesClickedAction = UpdateMessageBox_YesClicked;
                }
            }

            if (!e.Message.StartsWith("GAME "))
            {
                return;
            }

            string msg = e.Message.Substring(5); // Cut out GAME part

            string[] splitMessage = msg.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            if (splitMessage.Length < 11 || splitMessage.Length > 12) // Support for optional isRA2Mode param
            {
                Logger.Log("Ignoring CTCP game message because of an invalid amount of parameters.");
                return;
            }

            try
            {
                string revision = splitMessage[0];
                if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION)
                {
                    return;
                }
                string   gameVersion         = splitMessage[1];
                int      maxPlayers          = Conversions.IntFromString(splitMessage[2], 0);
                string   gameRoomChannelName = splitMessage[3];
                string   gameRoomDisplayName = splitMessage[4];
                bool     locked           = Conversions.BooleanFromString(splitMessage[5].Substring(0, 1), true);
                bool     isCustomPassword = Conversions.BooleanFromString(splitMessage[5].Substring(1, 1), false);
                bool     isClosed         = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true);
                bool     isLoadedGame     = Conversions.BooleanFromString(splitMessage[5].Substring(3, 1), false);
                bool     isLadder         = Conversions.BooleanFromString(splitMessage[5].Substring(4, 1), false);
                string[] players          = splitMessage[6].Split(new char[1] {
                    ','
                }, StringSplitOptions.RemoveEmptyEntries);
                List <string> playerNames   = players.ToList();
                string        mapName       = splitMessage[7];
                string        gameMode      = splitMessage[8];
                string        tunnelAddress = splitMessage[9];
                string        loadedGameId  = splitMessage[10];
                bool          isRA2Mode     = 11 < splitMessage.Length ? Conversions.BooleanFromString(splitMessage[11], false) : false;

                CnCNetGame cncnetGame = gameCollection.GameList.Find(g => g.GameBroadcastChannel == channel.ChannelName);

                CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress);

                if (tunnel == null)
                {
                    return;
                }

                if (cncnetGame == null)
                {
                    return;
                }

                HostedCnCNetGame game = new HostedCnCNetGame(gameRoomChannelName, revision, gameVersion, maxPlayers,
                                                             gameRoomDisplayName, isCustomPassword, true, players,
                                                             e.UserName, mapName, gameMode);
                game.IsLoadedGame    = isLoadedGame;
                game.MatchID         = loadedGameId;
                game.LastRefreshTime = DateTime.Now;
                game.IsLadder        = isLadder;
                game.Game            = cncnetGame;
                game.Locked          = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME));
                game.Incompatible    = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION;
                game.TunnelServer    = tunnel;

                if (isClosed)
                {
                    int index = lbGameList.HostedGames.FindIndex(hg => hg.HostName == e.UserName);

                    if (index > -1)
                    {
                        lbGameList.RemoveGame(index);
                    }

                    return;
                }

                // Seek for the game in the internal game list based on the name of its host;
                // if found, then refresh that game's information, otherwise add as new game
                int gameIndex = lbGameList.HostedGames.FindIndex(hg => hg.HostName == e.UserName);

                if (gameIndex > -1)
                {
                    lbGameList.HostedGames[gameIndex] = game;
                    lbGameList.SortAndRefreshHostedGames();
                }
                else
                {
                    if (UserINISettings.Instance.PlaySoundOnGameHosted &&
                        cncnetGame.InternalName == localGameID.ToLower() &&
                        !ProgramConstants.IsInGame && !game.Locked)
                    {
                        SoundPlayer.Play(sndGameCreated);
                    }

                    lbGameList.AddGame(game);
                }
            }
            catch (Exception ex)
            {
                Logger.Log("Game parsing error:" + ex.Message);
            }
        }