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; }
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)); }
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; }
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); } }