private void JoinGame(HostedCnCNetGame hg, string password) { connectionManager.MainChannel.AddMessage(new ChatMessage(null, Color.White, DateTime.Now, "Attempting to join game " + hg.RoomName + "...")); isJoiningGame = true; Channel gameChannel = connectionManager.CreateChannel(hg.RoomName, hg.ChannelName, false, password); connectionManager.AddChannel(gameChannel); if (hg.IsLoadedGame) { gameLoadingLobby.SetUp(false, hg.TunnelServer, gameChannel, hg.HostName); gameChannel.UserAdded += GameLoadingChannel_UserAdded; //gameChannel.MessageAdded += GameLoadingChannel_MessageAdded; gameChannel.InvalidPasswordEntered += GameChannel_InvalidPasswordEntered_LoadedGame; } else { gameLobby.SetUp(gameChannel, false, hg.MaxPlayers, hg.TunnelServer, hg.HostName, hg.Passworded); gameChannel.UserAdded += GameChannel_UserAdded; gameChannel.InvalidPasswordEntered += GameChannel_InvalidPasswordEntered_NewGame; gameChannel.InviteOnlyErrorOnJoin += GameChannel_InviteOnlyErrorOnJoin; gameChannel.ChannelFull += GameChannel_ChannelFull; gameChannel.TargetChangeTooFast += GameChannel_TargetChangeTooFast; } connectionManager.SendCustomMessage(new QueuedMessage("JOIN " + hg.ChannelName + " " + password, QueuedMessageType.INSTANT_MESSAGE, 0)); }
public PasswordEventArgs(string password, HostedCnCNetGame hostedGame) { Password = password; HostedGame = hostedGame; }
public void SetHostedGame(HostedCnCNetGame hostedGame) { this.hostedGame = hostedGame; }
private void LbGameList_DoubleLeftClick(object sender, EventArgs e) { if (isInGameRoom) { topBar.SwitchToPrimary(); return; } if (lbGameList.SelectedIndex < 0 || lbGameList.SelectedIndex >= lbGameList.Items.Count) { return; } if (isJoiningGame) { return; } var mainChannel = connectionManager.MainChannel; HostedCnCNetGame hg = (HostedCnCNetGame)lbGameList.Items[lbGameList.SelectedIndex].Tag; if (hg.Game.InternalName.ToUpper() != localGameID.ToUpper()) { mainChannel.AddMessage(new ChatMessage(null, Color.White, DateTime.Now, "The selected game is for " + gameCollection.GetGameNameFromInternalName(hg.Game.InternalName) + "!")); return; } if (hg.Locked) { mainChannel.AddMessage(new ChatMessage(null, Color.White, DateTime.Now, "The selected game is locked!")); return; } if (hg.IsLoadedGame) { if (!hg.Players.Contains(ProgramConstants.PLAYERNAME)) { mainChannel.AddMessage(new ChatMessage(null, Color.White, DateTime.Now, "You do not exist in the saved game!")); return; } } if (hg.GameVersion != ProgramConstants.GAME_VERSION) { // TODO Show warning } string password = string.Empty; if (hg.Passworded) { passwordRequestWindow.SetHostedGame(hg); passwordRequestWindow.Enable(); return; } else { if (!hg.IsLoadedGame) { password = Rampastring.Tools.Utilities.CalculateSHA1ForString (hg.ChannelName + hg.RoomName).Substring(0, 10); } else { IniFile spawnSGIni = new IniFile(ProgramConstants.GamePath + "Saved Games\\spawnSG.ini"); password = Rampastring.Tools.Utilities.CalculateSHA1ForString( spawnSGIni.GetStringValue("Settings", "GameID", string.Empty)).Substring(0, 10); } } JoinGame(hg, password); }
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); } }