public override void Initialize() { ClientRectangle = new Rectangle(0, 0, WindowManager.RenderResolutionX - 64, WindowManager.RenderResolutionY - 64); Name = "CnCNetLobby"; BackgroundTexture = AssetLoader.LoadTexture("cncnetlobbybg.png"); localGameID = ClientConfiguration.Instance.LocalGame; localGame = gameCollection.GameList.Find(g => g.InternalName.ToUpper() == localGameID.ToUpper()); btnNewGame = new XNAClientButton(WindowManager); btnNewGame.Name = "btnNewGame"; btnNewGame.ClientRectangle = new Rectangle(12, ClientRectangle.Height - 29, 133, 23); btnNewGame.Text = "Create Game"; btnNewGame.AllowClick = false; btnNewGame.LeftClick += BtnNewGame_LeftClick; btnJoinGame = new XNAClientButton(WindowManager); btnJoinGame.Name = "btnJoinGame"; btnJoinGame.ClientRectangle = new Rectangle(btnNewGame.ClientRectangle.Right + 12, btnNewGame.ClientRectangle.Y, 133, 23); btnJoinGame.Text = "Join Game"; btnJoinGame.AllowClick = false; btnJoinGame.LeftClick += BtnJoinGame_LeftClick; btnLogout = new XNAClientButton(WindowManager); btnLogout.Name = "btnLogout"; btnLogout.ClientRectangle = new Rectangle(ClientRectangle.Width - 145, btnNewGame.ClientRectangle.Y, 133, 23); btnLogout.Text = "Log Out"; btnLogout.LeftClick += BtnLogout_LeftClick; lbGameList = new GameListBox(WindowManager, localGameID); lbGameList.Name = "lbGameList"; lbGameList.ClientRectangle = new Rectangle(btnNewGame.ClientRectangle.X, 41, btnJoinGame.ClientRectangle.Right - btnNewGame.ClientRectangle.X, btnNewGame.ClientRectangle.Top - 47); lbGameList.DrawMode = PanelBackgroundImageDrawMode.STRETCHED; lbGameList.BackgroundTexture = AssetLoader.CreateTexture(new Color(0, 0, 0, 128), 1, 1); lbGameList.DoubleLeftClick += LbGameList_DoubleLeftClick; lbGameList.AllowMultiLineItems = false; lbPlayerList = new XNAListBox(WindowManager); lbPlayerList.Name = "lbPlayerList"; lbPlayerList.ClientRectangle = new Rectangle(ClientRectangle.Width - 202, 20, 190, btnLogout.ClientRectangle.Top - 26); lbPlayerList.DrawMode = PanelBackgroundImageDrawMode.STRETCHED; lbPlayerList.BackgroundTexture = AssetLoader.CreateTexture(new Color(0, 0, 0, 128), 1, 1); lbPlayerList.LineHeight = 16; lbPlayerList.DoubleLeftClick += LbPlayerList_DoubleLeftClick; lbPlayerList.RightClick += LbPlayerList_RightClick; playerContextMenu = new PlayerContextMenu(WindowManager); playerContextMenu.Name = "playerContextMenu"; playerContextMenu.ClientRectangle = new Rectangle(0, 0, 150, 2); playerContextMenu.Enabled = false; playerContextMenu.Visible = false; playerContextMenu.AddItem("Private Message"); playerContextMenu.AddItem("Add Friend"); playerContextMenu.OptionSelected += PlayerContextMenu_OptionSelected; lbChatMessages = new ChatListBox(WindowManager); lbChatMessages.Name = "lbChatMessages"; lbChatMessages.ClientRectangle = new Rectangle(lbGameList.ClientRectangle.Right + 12, lbGameList.ClientRectangle.Y, lbPlayerList.ClientRectangle.Left - lbGameList.ClientRectangle.Right - 24, lbPlayerList.ClientRectangle.Height); lbChatMessages.DrawMode = PanelBackgroundImageDrawMode.STRETCHED; lbChatMessages.BackgroundTexture = AssetLoader.CreateTexture(new Color(0, 0, 0, 128), 1, 1); lbChatMessages.LineHeight = 16; tbChatInput = new XNATextBox(WindowManager); tbChatInput.Name = "tbChatInput"; tbChatInput.ClientRectangle = new Rectangle(lbChatMessages.ClientRectangle.X, btnNewGame.ClientRectangle.Y, lbChatMessages.ClientRectangle.Width, btnNewGame.ClientRectangle.Height); tbChatInput.Enabled = false; tbChatInput.MaximumTextLength = 200; tbChatInput.EnterPressed += TbChatInput_EnterPressed; lblColor = new XNALabel(WindowManager); lblColor.Name = "lblColor"; lblColor.ClientRectangle = new Rectangle(lbChatMessages.ClientRectangle.X, 14, 0, 0); lblColor.FontIndex = 1; lblColor.Text = "YOUR COLOR:"; ddColor = new XNAClientDropDown(WindowManager); ddColor.Name = "ddColor"; ddColor.ClientRectangle = new Rectangle(lblColor.ClientRectangle.X + 95, 12, 150, 21); chatColors = connectionManager.GetIRCColors(); foreach (IRCColor color in connectionManager.GetIRCColors()) { if (!color.Selectable) { continue; } XNADropDownItem ddItem = new XNADropDownItem(); ddItem.Text = color.Name; ddItem.TextColor = color.XnaColor; ddItem.Tag = color; ddColor.AddItem(ddItem); } int selectedColor = UserINISettings.Instance.ChatColor; ddColor.SelectedIndex = selectedColor >= ddColor.Items.Count || selectedColor < 0 ? ClientConfiguration.Instance.DefaultPersonalChatColorIndex: selectedColor; SetChatColor(); ddColor.SelectedIndexChanged += DdColor_SelectedIndexChanged; ddCurrentChannel = new XNAClientDropDown(WindowManager); ddCurrentChannel.Name = "ddCurrentChannel"; ddCurrentChannel.ClientRectangle = new Rectangle( lbChatMessages.ClientRectangle.Right - 200, ddColor.ClientRectangle.Y, 200, 21); ddCurrentChannel.SelectedIndexChanged += DdCurrentChannel_SelectedIndexChanged; ddCurrentChannel.AllowDropDown = false; lblCurrentChannel = new XNALabel(WindowManager); lblCurrentChannel.Name = "lblCurrentChannel"; lblCurrentChannel.ClientRectangle = new Rectangle( ddCurrentChannel.ClientRectangle.X - 150, ddCurrentChannel.ClientRectangle.Y + 2, 0, 0); lblCurrentChannel.FontIndex = 1; lblCurrentChannel.Text = "CURRENT CHANNEL:"; InitializeGameList(); AddChild(btnNewGame); AddChild(btnJoinGame); AddChild(btnLogout); AddChild(lbPlayerList); AddChild(lbChatMessages); AddChild(lbGameList); AddChild(tbChatInput); AddChild(lblColor); AddChild(ddColor); AddChild(lblCurrentChannel); AddChild(ddCurrentChannel); AddChild(playerContextMenu); base.Initialize(); WindowManager.CenterControlOnScreen(this); PostUIInit(); }
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); } }