protected new void HandlePlayerTeam(object sender, PlayerTeamEventArgs e) { if (e.Swapped == null || e.Swapped.SteamID == 0) { return; } Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.Swapped.SteamID); if (player != null) { player.IsConnected = true; player.Side = e.NewTeam.ToSide(); } if (!IsMatchStarted) { return; } if (e.Silent) { _playerTeamCount++; } if (IsOvertime && e.Silent && _playerTeamCount == 10) { IsHalfMatch = !IsHalfMatch; } }
private void InitPlayers() { // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { if (player.SteamID != 0) { Application.Current.Dispatcher.Invoke(delegate { Player pl = Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID); if (pl == null) { pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Demo.Players.Add(pl); } if (pl.Side == Side.CounterTerrorist) { pl.TeamName = Demo.TeamCT.Name; // Check swap if (Demo.TeamT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(Demo.TeamT.Players.First(p => p.Equals(pl))); Demo.TeamT.Players.Remove(pl); } else { if (!Demo.TeamCT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(pl); } } } if (pl.Side == Side.Terrorist) { pl.TeamName = Demo.TeamT.Name; // Check swap if (Demo.TeamCT.Players.Contains(pl)) { Demo.TeamT.Players.Add(Demo.TeamCT.Players.First(p => p.Equals(pl))); Demo.TeamCT.Players.Remove(pl); } else { if (!Demo.TeamT.Players.Contains(pl)) { Demo.TeamT.Players.Add(pl); } } } }); } } }
public async void WatchPlayerStuff(Player player, string selectedType) { EquipmentElement type = EquipmentElement.Unknown; switch (selectedType) { case "smokes": type = EquipmentElement.Smoke; break; case "flashbangs": type = EquipmentElement.Flash; break; case "he": type = EquipmentElement.HE; break; case "molotovs": type = EquipmentElement.Molotov; break; case "decoys": type = EquipmentElement.Decoy; break; } GeneratePlayerStuffVdm(player, type); _config.DeleteVdmFileAtStratup = false; await StartGame(); }
internal void WatchPlayerStuff(Player player, string selectedType) { EquipmentElement type = EquipmentElement.Unknown; switch (selectedType) { case "smokes": type = EquipmentElement.Smoke; break; case "flashbangs": type = EquipmentElement.Flash; break; case "he": type = EquipmentElement.HE; break; case "molotovs": type = EquipmentElement.Molotov; break; case "decoys": type = EquipmentElement.Decoy; break; } GeneratePlayerStuffVdm(player, type); StartGame(); }
/// <summary> /// Check if there are banned players and update their banned flags /// </summary> /// <param name="demo"></param> /// <returns></returns> public async Task <Demo> AnalyzeBannedPlayersAsync(Demo demo) { List <string> ids = demo.Players.Select(playerExtended => playerExtended.SteamId.ToString()).ToList(); IEnumerable <Suspect> suspects = await _steamService.GetBanStatusForUserList(ids); var enumerableSuspects = suspects as IList <Suspect> ?? suspects.ToList(); if (enumerableSuspects.Any()) { List <string> whitelistIds = await _cacheService.GetPlayersWhitelist(); // Update player's flag foreach (Suspect suspect in enumerableSuspects) { Player cheater = demo.Players.FirstOrDefault(p => p.SteamId.ToString() == suspect.SteamId); if (cheater != null && !whitelistIds.Contains(cheater.SteamId.ToString())) { if (IgnoreLaterBan && DateTime.Now.AddDays(-suspect.DaySinceLastBanCount) < demo.Date) { continue; } if (suspect.GameBanCount > 0 || suspect.VacBanned) { demo.CheaterCount++; } cheater.IsOverwatchBanned = suspect.GameBanCount > 0; cheater.IsVacBanned = suspect.VacBanned; } } } return(demo); }
protected new void HandlePlayerTeam(object sender, PlayerTeamEventArgs e) { if (e.Swapped == null || e.Swapped.SteamID == 0) return; // Keep track of the number team_player events to detect teams swap if (e.OldTeam != e.NewTeam && e.NewTeam != DemoInfo.Team.Spectate && e.OldTeam != DemoInfo.Team.Spectate) { PlayerTeamCount++; if (PlayerTeamCount > 7) { PlayerTeamCount = 0; IsSwapTeamRequired = true; // detect MR overtimes to be able to add OT at the right time if (IsOvertime) { if (MrOvertime == 0) MrOvertime = Demo.ScoreTeamT + Demo.ScoreTeamCt - 30; IsHalfMatch = !IsHalfMatch; } } } Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.Swapped.SteamID); if (player != null) { player.IsConnected = true; player.Side = e.NewTeam.ToSide(); } if (!IsMatchStarted) return; if (e.Silent) _playerTeamCount++; }
protected new void HandlePlayerTeam(object sender, PlayerTeamEventArgs e) { if (e.Swapped == null || e.Swapped.SteamID == 0) { return; } Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.Swapped.SteamID); if (player == null) { return; } player.IsConnected = true; player.Side = e.NewTeam.ToSide(); // add the player to his team if he is not if (!Demo.TeamCT.Players.Contains(player) && !Demo.TeamT.Players.Contains(player)) { if (Demo.TeamCT.Players.Count > Demo.TeamT.Players.Count) { Application.Current.Dispatcher.Invoke(() => Demo.TeamT.Players.Add(player)); } else { Application.Current.Dispatcher.Invoke(() => Demo.TeamCT.Players.Add(player)); } } }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (!IsMatchStarted) { return; } _suicideCount = 0; IsLastRoundHalf = false; // Check players count to prevent missing players who was connected after the match started event if (Demo.Players.Count < 10) { // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { // don't add bot and already known players if (player.SteamID != 0 && Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID) == null) { Player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Application.Current.Dispatcher.Invoke(delegate { Demo.Players.Add(pl); pl.TeamName = pl.Side == Side.CounterTerrorist ? Demo.TeamCT.Name : Demo.TeamT.Name; }); } } } CreateNewRound(); }
private void StartMatch() { RoundCount = 0; IsMatchStarted = true; if (!string.IsNullOrWhiteSpace(Parser.CTClanName)) { Demo.TeamCT.Name = Parser.CTClanName; } if (!string.IsNullOrWhiteSpace(Parser.TClanName)) { Demo.TeamT.Name = Parser.TClanName; } // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { // don't add bot if (player.SteamID != 0) { Player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; if (!Demo.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(delegate { Demo.Players.Add(pl); if (pl.Side == Side.CounterTerrorist && !Demo.TeamCT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(pl); if (!Demo.TeamCT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(pl); } pl.TeamName = Demo.TeamCT.Name; } if (pl.Side == Side.Terrorist && !Demo.TeamT.Players.Contains(pl)) { Demo.TeamT.Players.Add(pl); if (!Demo.TeamT.Players.Contains(pl)) { Demo.TeamT.Players.Add(pl); } pl.TeamName = Demo.TeamT.Name; } }); } } } // First round handled here because round_start is raised before begin_new_match CreateNewRound(); }
private void HandleServerRankUpdate(object sender, RankUpdateEventArgs e) { Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.SteamId); if (player != null) { player.RankNumberOld = e.RankOld; player.RankNumberNew = e.RankNew; player.WinCount = e.WinCount; } }
private void HandleBotTakeOver(object sender, BotTakeOverEventArgs e) { if (!IsMatchStarted) { return; } Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.Taker.SteamID); if (player != null) { player.IsControllingBot = true; } }
public async Task <Rank> GetLastRankAccountStatsAsync(long steamId) { Rank lastRank = AppSettings.RankList[0]; List <string> folders = await _cacheService.GetFoldersAsync(); // Get only the demos header to have access to the demo's date List <Demo> demos = await GetDemosHeader(folders); if (demos.Any()) { if (steamId == 0) { steamId = SelectedStatsAccountSteamId; } if (steamId == 0) { return(lastRank); } // keep only demos from valve where the account played List <Demo> newDemoList = demos.Where(d => d.SourceName == "valve" && d.Players.FirstOrDefault(p => p.SteamId == steamId) != null) .ToList(); if (newDemoList.Any()) { // Sort by date and keep the more recent newDemoList.Sort((d1, d2) => d1.Date.CompareTo(d2.Date)); Demo lastDemo = newDemoList.Last(); // Get the new rank Player player = lastDemo.Players.First(p => p.SteamId == steamId); lastRank = AppSettings.RankList.FirstOrDefault(r => r.Number == player.RankNumberNew); // Save it to the cache RankInfo rankInfo = new RankInfo { Number = player.RankNumberNew, SteamId = player.SteamId, LastDate = lastDemo.Date }; await _cacheService.SaveLastRankInfoAsync(rankInfo); } } return(lastRank); }
protected new void HandlePlayerTeam(object sender, PlayerTeamEventArgs e) { if (e.Swapped == null || e.Swapped.SteamID == 0) { return; } Player player = Demo.Players.FirstOrDefault(p => p.SteamId == e.Swapped.SteamID); if (player == null) { return; } player.IsConnected = true; player.Side = e.NewTeam.ToSide(); Console.Write("adding player "); Console.Write(player.Name + " "); Console.WriteLine(player.Side == Side.CounterTerrorist ? "CT" : "T"); Console.WriteLine(Demo.TeamCT.Players.Contains(player) ? "inCT" : Demo.TeamT.Players.Contains(player) ? "inT" : "None"); // add the player to his team if he is not if (!Demo.TeamCT.Players.Contains(player) && !Demo.TeamT.Players.Contains(player)) { Application.Current.Dispatcher.Invoke(() => { if (player.Side == Demo.TeamCT.CurrentSide && !Demo.TeamCT.Players.Contains(player)) { Demo.TeamCT.Players.Add(player); player.TeamName = Demo.TeamCT.Name; } if (player.Side == Demo.TeamT.CurrentSide && !Demo.TeamT.Players.Contains(player)) { Demo.TeamT.Players.Add(player); player.TeamName = Demo.TeamT.Name; } }); } }
private void AddTeams() { // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { Player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Application.Current.Dispatcher.Invoke(delegate { if (!Demo.Players.Contains(pl)) { Demo.Players.Add(pl); } if (pl.Side == Side.CounterTerrorist) { pl.TeamName = Demo.TeamCT.Name; if (!Demo.TeamCT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(pl); } } if (pl.Side == Side.Terrorist) { pl.TeamName = Demo.TeamT.Name; if (!Demo.TeamT.Players.Contains(pl)) { Demo.TeamT.Players.Add(pl); } } pl.EnableUpdates(); }); } }
public Task <Demo> AnalyzeDemo(Demo demo, CancellationToken token, Action <string, float> progressCallback = null) { Random random = new Random(); ObservableCollection <Player> players = new ObservableCollection <Player>(); for (int i = 0; i < 10; i++) { Player player = new Player { Name = "player" + (i + 1), HeadshotCount = random.Next(14), OneKillCount = random.Next(10, 30), TwoKillCount = random.Next(10, 20), ThreeKillCount = random.Next(0, 10), FourKillCount = random.Next(0, 5), FiveKillCount = random.Next(0, 2), BombDefusedCount = random.Next(0, 2), BombPlantedCount = random.Next(0, 2), DeathCount = random.Next(0, 32), KillCount = random.Next(30), AssistCount = random.Next(15), Score = random.Next(10, 80), RoundMvpCount = random.Next(6), RankNumberNew = 5, RankNumberOld = 4, RatingHltv = (float)random.NextDouble(), SteamId = random.Next(1000, 800000), IsOverwatchBanned = random.Next(100) < 40, IsVacBanned = random.Next(100) < 40, TeamKillCount = random.Next(0, 1), WinCount = random.Next(10, 687), MolotovThrownCount = random.Next(0, 10), DecoyThrownCount = random.Next(0, 10), IncendiaryThrownCount = random.Next(20), SmokeThrownCount = random.Next(20), FlashbangThrownCount = random.Next(20), HeGrenadeThrownCount = random.Next(20), BombExplodedCount = random.Next(5), AvatarUrl = string.Empty, KillDeathRatio = (decimal)random.NextDouble(), MatchCount = random.Next(100), RoundPlayedCount = random.Next(100) }; players.Add(player); } Team teamCt = new Team { Name = "Team 1", Players = new ObservableCollection <Player>(players.Take(5)), Score = 6, ScoreFirstHalf = 6, ScoreSecondHalf = 1, }; Team teamT = new Team { Name = "Team 2", Players = new ObservableCollection <Player>(players.Skip(5).Take(5)), Score = 16, ScoreFirstHalf = 10, ScoreSecondHalf = 5, }; ObservableCollection <Round> rounds = new ObservableCollection <Round>(); for (int i = 0; i < 32; i++) { ObservableCollection <KillEvent> kills = new ObservableCollection <KillEvent>(); for (int j = 0; j < random.Next(1, 9); j++) { Player killer = players.ElementAt(random.Next(9)); Player killed = players.ElementAt(random.Next(9)); kills.Add(new KillEvent(random.Next(1, 10000), random.Next(1, 100)) { KillerName = killer.Name, KillerSteamId = killer.SteamId, KillerSide = killer.Side, KilledName = killed.Name, KilledSteamId = killed.SteamId, KilledSide = killed.Side, RoundNumber = i, Weapon = Weapon.WeaponList.ElementAt(random.Next(44)) }); } // generate open / entry kills for this round Round round = new Round { Number = i + 1, OneKillCount = random.Next(5), TwoKillCount = random.Next(2), ThreeKillCount = random.Next(1), FourKillCount = random.Next(1), FiveKillCount = random.Next(1), EquipementValueTeamCt = random.Next(4200, 30000), EquipementValueTeamT = random.Next(4200, 30000), StartMoneyTeamCt = random.Next(4200, 50000), StartMoneyTeamT = random.Next(4200, 50000), Tick = random.Next(7000, 100000), EndTick = random.Next(7000, 100000), FreezetimeEndTick = random.Next(7000, 100000), WinnerName = teamCt.Name, WinnerSide = Side.CounterTerrorist, BombDefused = null, BombPlanted = null, BombExploded = null, Type = RoundType.NORMAL, EndReason = RoundEndReason.CTWin, EntryKillEvent = new EntryKillEvent(random.Next(1, 10000), random.Next(1, 100)) { HasWon = random.Next(100) < 50, KillerSteamId = players.ElementAt(random.Next(9)).SteamId, KillerName = players.ElementAt(random.Next(9)).Name, KilledSteamId = players.ElementAt(random.Next(9)).SteamId, KilledName = players.ElementAt(random.Next(9)).Name, Weapon = Weapon.WeaponList.ElementAt(random.Next(44)), KilledSide = Side.CounterTerrorist, KillerSide = Side.Terrorist }, SideTrouble = Side.None, Kills = kills }; rounds.Add(round); } demo.Id = "de_dust25445648778447878"; demo.Source = new Valve(); demo.Name = "esea_nip_vs_titan.dem"; demo.Tickrate = 15; demo.ServerTickrate = 128; demo.MapName = "de_dust2"; demo.ClientName = "localhost"; demo.Hostname = "local"; demo.OneKillCount = 90; demo.TwoKillCount = 30; demo.ThreeKillCount = 25; demo.FourKillCount = 3; demo.FiveKillCount = 1; demo.Path = "C:\\mydemo.dem"; demo.Type = "GOTV"; demo.Comment = "comment"; demo.TeamCT = teamCt; demo.TeamT = teamT; demo.Players = players; demo.Rounds = rounds; demo.MostKillingWeapon = Weapon.WeaponList[random.Next(44)]; foreach (KillEvent e in rounds.SelectMany(round => round.Kills)) { demo.Kills.Add(e); } return(Task.FromResult(demo)); }
private static Demo GenerateDemo() { int currentTick = 1; ObservableCollection <Player> players = new ObservableCollection <Player>(); Random random = new Random(); ObservableCollection <EntryKillEvent> entryKills = new ObservableCollection <EntryKillEvent>(); for (int indexEntryKill = 0; indexEntryKill < random.Next(5); indexEntryKill++) { currentTick *= indexEntryKill; Player killer = players.ElementAt(random.Next(0, 9)); Player killed = players.ElementAt(random.Next(0, 9)); EntryKillEvent entryKill = new EntryKillEvent(currentTick, random.Next(1, 50000)) { KilledSteamId = killed.SteamId, KilledName = killed.Name, KilledSide = killed.Side, KillerSteamId = killer.SteamId, KillerName = killer.Name, KillerSide = killer.Side }; entryKills.Add(entryKill); } for (int j = 0; j < 10; j++) { Player player = new Player { Name = "player" + (j + 1), HeadshotCount = random.Next(14), OneKillCount = random.Next(10, 30), TwoKillCount = random.Next(10, 20), ThreeKillCount = random.Next(0, 10), FourKillCount = random.Next(0, 5), FiveKillCount = random.Next(0, 2), BombDefusedCount = random.Next(0, 2), BombPlantedCount = random.Next(0, 2), EntryKills = entryKills, DeathCount = random.Next(0, 32), KillCount = random.Next(30), AssistCount = random.Next(15), Score = random.Next(10, 80), RoundMvpCount = random.Next(6) }; players.Add(player); } currentTick = 1; ObservableCollection <Round> rounds = new ObservableCollection <Round>(); for (int k = 0; k < 32; k++) { Round round = new Round { Number = k + 1, OneKillCount = random.Next(5), TwoKillCount = random.Next(2), ThreeKillCount = random.Next(1), FourKillCount = random.Next(1), FiveKillCount = random.Next(1), EquipementValueTeamCt = random.Next(4200, 30000), EquipementValueTeamT = random.Next(4200, 30000), StartMoneyTeamCt = random.Next(4200, 50000), StartMoneyTeamT = random.Next(4200, 50000), Tick = currentTick * k, EndTick = currentTick + 5000, }; currentTick += 5000; rounds.Add(round); } Demo demo = new Demo { Id = "de_dust25445648778447878", Name = "mydemo.dem", Tickrate = 32, ServerTickrate = 64, MapName = "de_dust2", ClientName = "localhost", Hostname = "local", OneKillCount = random.Next(50, 90), TwoKillCount = random.Next(20, 50), ThreeKillCount = random.Next(10), FourKillCount = random.Next(3), FiveKillCount = random.Next(1), Path = "C:\\mydemo.dem", Type = "GOTV", Comment = "comment", Players = players, MostBombPlantedPlayer = players.ElementAt(random.Next(10)), MostHeadshotPlayer = players.ElementAt(random.Next(10)), Rounds = rounds, Duration = 2651.65625f, }; Team teamCt = new Team { Name = "Team 1", Players = new ObservableCollection <Player>(players.Take(5)), Score = 6, ScoreFirstHalf = 6, ScoreSecondHalf = 1, }; Team teamT = new Team { Name = "Team 2", Players = new ObservableCollection <Player>(players.Skip(5).Take(5)), Score = 16, ScoreFirstHalf = 10, ScoreSecondHalf = 5, }; demo.TeamT = teamT; demo.TeamCT = teamCt; return(demo); }
public Task <List <Demo> > GetDemosHeader(List <string> folders, List <Demo> currentDemos = null, bool limit = false) { List <Demo> demos = new List <Demo>(); for (int i = 0; i < 20; i++) { ObservableCollection <Player> players = new ObservableCollection <Player>(); Random random = new Random(); ObservableCollection <EntryKillEvent> entryKills = new ObservableCollection <EntryKillEvent>(); for (int indexEntryKill = 0; indexEntryKill < random.Next(5); indexEntryKill++) { Player killer = players.ElementAt(random.Next(0, 9)); Player killed = players.ElementAt(random.Next(0, 9)); EntryKillEvent entryKill = new EntryKillEvent(random.Next(7000, 100000), random.Next(1, 50000)) { KilledSteamId = killed.SteamId, KilledName = killed.Name, KilledSide = killed.Side, KillerSteamId = killer.SteamId, KillerName = killer.Name, KillerSide = killer.Side }; entryKills.Add(entryKill); } for (int j = 0; j < 10; j++) { Player player = new Player { Name = "player" + (j + 1), HeadshotCount = random.Next(14), OneKillCount = random.Next(10, 30), TwoKillCount = random.Next(10, 20), ThreeKillCount = random.Next(0, 10), FourKillCount = random.Next(0, 5), FiveKillCount = random.Next(0, 2), BombDefusedCount = random.Next(0, 2), BombPlantedCount = random.Next(0, 2), EntryKills = entryKills, DeathCount = random.Next(0, 32), KillCount = random.Next(30), AssistCount = random.Next(15), Score = random.Next(10, 80), RoundMvpCount = random.Next(6) }; players.Add(player); } ObservableCollection <Round> rounds = new ObservableCollection <Round>(); for (int k = 0; k < 32; k++) { Round round = new Round { Number = k + 1, OneKillCount = random.Next(5), TwoKillCount = random.Next(2), ThreeKillCount = random.Next(1), FourKillCount = random.Next(1), FiveKillCount = random.Next(1), EquipementValueTeam1 = random.Next(4200, 30000), EquipementValueTeam2 = random.Next(4200, 30000), StartMoneyTeam1 = random.Next(4200, 50000), StartMoneyTeam2 = random.Next(4200, 50000), Tick = random.Next(7000, 100000) }; rounds.Add(round); } Demo demo = new Demo { Id = "de_dust25445648778447878", Name = "mydemo" + (i + 1) + ".dem", Tickrate = 128, MapName = "de_dust2", ClientName = "localhost", Hostname = "local", OneKillCount = random.Next(50, 90), TwoKillCount = random.Next(20, 50), ThreeKillCount = random.Next(10), FourKillCount = random.Next(3), FiveKillCount = random.Next(1), Path = "C:\\mydemo.dem", ScoreTeam1 = 16, ScoreTeam2 = 6, Type = "GOTV", Comment = "comment", ScoreFirstHalfTeam1 = 10, ScoreFirstHalfTeam2 = 5, ScoreSecondHalfTeam1 = 6, ScoreSecondHalfTeam2 = 1, Players = players, MostBombPlantedPlayer = players.ElementAt(random.Next(10)), MostHeadshotPlayer = players.ElementAt(random.Next(10)), Rounds = rounds }; demos.Add(demo); } return(Task.FromResult(demos)); }
/// <summary> /// Update players and their team relation /// </summary> protected void UpdatePlayers() { Team teamCt = GetTeamBySide(Side.CounterTerrorist); Team teamT = GetTeamBySide(Side.Terrorist); foreach (DemoInfo.Player player in Parser.PlayingParticipants) { if (player.SteamID != 0) { Player pl = Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID); if (pl != null) { pl.Side = player.Team.ToSide(); if (player.Team == DemoInfo.Team.CounterTerrorist) { if (teamT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => teamT.Players.Remove(pl)); } if (!teamCt.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => teamCt.Players.Add(pl)); } } else if (player.Team == DemoInfo.Team.Terrorist) { if (teamCt.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => teamCt.Players.Remove(pl)); } if (!teamT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => teamT.Players.Add(pl)); } } } else { // new player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Application.Current.Dispatcher.Invoke(() => Demo.Players.Add(pl)); if (player.Team == DemoInfo.Team.CounterTerrorist) { pl.TeamName = Demo.TeamCT.Name; // Check swap if (Demo.TeamT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(delegate { Demo.TeamCT.Players.Add(Demo.TeamT.Players.First(p => p.Equals(pl))); Demo.TeamT.Players.Remove(pl); }); } else { if (!Demo.TeamCT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => Demo.TeamCT.Players.Add(pl)); } } } else if (player.Team == DemoInfo.Team.Terrorist) { pl.TeamName = Demo.TeamT.Name; // Check swap if (Demo.TeamCT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(delegate { Demo.TeamT.Players.Add(Demo.TeamCT.Players.First(p => p.Equals(pl))); Demo.TeamCT.Players.Remove(pl); }); } else { if (!Demo.TeamT.Players.Contains(pl)) { Application.Current.Dispatcher.Invoke(() => Demo.TeamT.Players.Add(pl)); } } } } } } }
private void AddTeams() { // Detect possible swap by teams name, work for some demos if (Parser.TClanName == Demo.TeamCT.Name || Parser.CTClanName == Demo.TeamT.Name) { Team tmp = Demo.TeamT; Demo.TeamT = Demo.TeamCT; Demo.TeamCT = tmp.Clone(); } // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { if (player.SteamID != 0) { Player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Application.Current.Dispatcher.Invoke(delegate { if (!Demo.Players.Contains(pl)) { Demo.Players.Add(pl); } if (pl.Side == Side.CounterTerrorist) { pl.TeamName = Demo.TeamCT.Name; // Check swap if (Demo.TeamT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(Demo.TeamT.Players.First(p => p.Equals(pl))); Demo.TeamT.Players.Remove(pl); } else { if (!Demo.TeamCT.Players.Contains(pl)) { Demo.TeamCT.Players.Add(pl); } } } if (pl.Side == Side.Terrorist) { pl.TeamName = Demo.TeamT.Name; // Check swap if (Demo.TeamCT.Players.Contains(pl)) { Demo.TeamT.Players.Add(Demo.TeamCT.Players.First(p => p.Equals(pl))); Demo.TeamCT.Players.Remove(pl); } else { if (!Demo.TeamT.Players.Contains(pl)) { Demo.TeamT.Players.Add(pl); } } } }); } } }
private void GeneratePlayerStuffVdm(Player player, EquipmentElement type) { string generated = string.Empty; int actionCount = 0; int lastTick = 0; int beginTickDelayCount = (int)(_demo.ServerTickrate * STUFF_BEGIN_DELAY); int endTickDelayCount = (int)(_demo.ServerTickrate * STUFF_END_DELAY); int lastSuffSartedTick = 0; // max delay between 2 stuffs int maxTickDelayCount = (int)(_demo.ServerTickrate * MAX_NEXT_STUFF_DELAY); int nextActionDelayCount = (int)(_demo.ServerTickrate * NEXT_ACTION_DELAY); string message = GetFastForwardMessage(type); foreach (WeaponFireEvent e in _demo.WeaponFired) { if (e.ShooterSteamId == player.SteamId && e.Weapon.Element == type || (e.ShooterSteamId == player.SteamId && type == EquipmentElement.Molotov && (e.Weapon.Element == EquipmentElement.Molotov || e.Weapon.Element == EquipmentElement.Incendiary))) { int startToTick = actionCount == 0 ? 0 : lastTick; int skipToTick = 0; switch (type) { case EquipmentElement.Smoke: // check if the player thrown an other smoke just after the previous one if (e.Tick - lastTick > maxTickDelayCount) { skipToTick = e.Tick - beginTickDelayCount; // if a smoke has been thrown previously, we skip ahead just after its popped if (lastSuffSartedTick != 0) { startToTick = lastSuffSartedTick + endTickDelayCount; } generated += string.Format(Properties.Resources.text_message_start, ++actionCount, startToTick - nextActionDelayCount, message); generated += string.Format(Properties.Resources.screen_fade_start, ++actionCount, startToTick - nextActionDelayCount); generated += string.Format(Properties.Resources.skip_ahead, ++actionCount, startToTick, skipToTick); generated += string.Format(Properties.Resources.spec_player, ++actionCount, startToTick, e.ShooterSteamId); } // find the tick where the smoke popped foreach (Round round in _demo.Rounds.Where(round => round.Number == e.RoundNumber)) { foreach ( SmokeNadeStartedEvent smokeNadeStartedEvent in round.SmokeStarted.Where( smokeNadeStartedEvent => smokeNadeStartedEvent.ThrowerSteamId == player.SteamId && smokeNadeStartedEvent.Tick > lastSuffSartedTick)) { lastSuffSartedTick = smokeNadeStartedEvent.Tick; break; } } break; case EquipmentElement.Molotov: if (e.Tick - lastTick > maxTickDelayCount) { skipToTick = e.Tick - beginTickDelayCount; if (lastSuffSartedTick != 0) { startToTick = lastSuffSartedTick + endTickDelayCount; } generated += string.Format(Properties.Resources.text_message_start, ++actionCount, startToTick - nextActionDelayCount, message); generated += string.Format(Properties.Resources.screen_fade_start, ++actionCount, startToTick - nextActionDelayCount); generated += string.Format(Properties.Resources.skip_ahead, ++actionCount, startToTick, skipToTick); generated += string.Format(Properties.Resources.spec_player, ++actionCount, startToTick, e.ShooterSteamId); // the molotov may have not burned, use time average instead lastSuffSartedTick = e.Tick + (int)(_demo.ServerTickrate * MOLOTOV_TIME); } break; case EquipmentElement.Flash: case EquipmentElement.Decoy: case EquipmentElement.HE: if (e.Tick - lastTick > maxTickDelayCount) { skipToTick = e.Tick - beginTickDelayCount; if (lastSuffSartedTick != 0) { startToTick = lastSuffSartedTick + endTickDelayCount; } generated += string.Format(Properties.Resources.text_message_start, ++actionCount, startToTick - nextActionDelayCount, message); generated += string.Format(Properties.Resources.screen_fade_start, ++actionCount, startToTick - nextActionDelayCount); generated += string.Format(Properties.Resources.skip_ahead, ++actionCount, startToTick, skipToTick); generated += string.Format(Properties.Resources.spec_player, ++actionCount, startToTick, e.ShooterSteamId); } switch (type) { case EquipmentElement.Flash: foreach (Round round in _demo.Rounds.Where(round => round.Number == e.RoundNumber)) { foreach ( FlashbangExplodedEvent flashEvent in round.FlashbangsExploded.Where( flashExplodedEvent => flashExplodedEvent.ThrowerSteamId == player.SteamId && flashExplodedEvent.Tick > lastSuffSartedTick)) { lastSuffSartedTick = flashEvent.Tick; break; } } break; case EquipmentElement.Decoy: foreach (DecoyStartedEvent decoyEvent in _demo.DecoyStarted) { if (decoyEvent.ThrowerSteamId == player.SteamId && decoyEvent.RoundNumber == e.RoundNumber && decoyEvent.Tick > lastSuffSartedTick) { lastSuffSartedTick = decoyEvent.Tick; break; } } break; case EquipmentElement.HE: foreach (Round round in _demo.Rounds.Where(round => round.Number == e.RoundNumber)) { foreach ( ExplosiveNadeExplodedEvent heEvent in round.ExplosiveGrenadesExploded.Where( heExplodedEvent => heExplodedEvent.ThrowerSteamId == player.SteamId && heExplodedEvent.Tick > lastSuffSartedTick)) { lastSuffSartedTick = heEvent.Tick; break; } } break; } break; } lastTick = e.Tick; } } generated += string.Format(Properties.Resources.stop_playback, ++actionCount, lastTick + nextActionDelayCount); string content = string.Format(Properties.Resources.main, generated); File.WriteAllText(_demo.GetVdmFilePath(), content); }
protected new void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted || e.Victim == null) { return; } Weapon weapon = Weapon.WeaponList.FirstOrDefault(w => w.Element == e.Weapon.Weapon); if (weapon == null) { return; } Player killed = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); Player killer = null; KillEvent killEvent = new KillEvent(Parser.IngameTick, Parser.CurrentTime) { KillerSteamId = e.Killer?.SteamID ?? 0, KillerName = e.Killer?.Name ?? "World", KillerSide = e.Killer?.Team.ToSide() ?? Side.None, Weapon = weapon, KillerVelocityX = e.Killer?.Velocity.X ?? 0, KillerVelocityY = e.Killer?.Velocity.Y ?? 0, KillerVelocityZ = e.Killer?.Velocity.Z ?? 0, KilledSteamId = e.Victim.SteamID, KilledName = e.Victim.Name, KilledSide = e.Victim.Team.ToSide(), RoundNumber = CurrentRound.Number, IsKillerCrouching = e.Killer?.IsDucking ?? false, IsHeadshot = e.Headshot, Point = new KillHeatmapPoint { KillerX = e.Killer?.Position.X ?? 0, KillerY = e.Killer?.Position.Y ?? 0, VictimX = e.Victim.Position.X, VictimY = e.Victim.Position.Y } }; bool killerIsBot = e.Killer != null && e.Killer.SteamID == 0; bool victimIsBot = e.Victim.SteamID == 0; bool assisterIsBot = e.Assister != null && e.Assister.SteamID == 0; if (e.Killer != null) { killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); } if (killer != null) { if (e.Victim.SteamID != killer.SteamId) { if (!killer.RoundsMoneyEarned.ContainsKey(CurrentRound.Number)) { killer.RoundsMoneyEarned[CurrentRound.Number] = weapon.KillAward; } else { killer.RoundsMoneyEarned[CurrentRound.Number] += weapon.KillAward; } } ProcessTradeKill(killEvent); } // Human killed human if (!killerIsBot && !victimIsBot) { if (killer != null && killed != null) { killed.IsAlive = false; // TK if (e.Killer.Team == e.Victim.Team) { killer.Kills.Add(killEvent); killed.Deaths.Add(killEvent); } else { // Regular kill if (!killer.IsControllingBot) { killer.Kills.Add(killEvent); } if (!killed.IsControllingBot) { killed.Deaths.Add(killEvent); } } } } // Human killed a bot if (!killerIsBot && victimIsBot) { killer?.Kills.Add(killEvent); } // A bot killed a human if (killerIsBot && !victimIsBot) { // TK or not we add a death to the human killed?.Deaths.Add(killEvent); } // Add assist if there was one if (e.Assister != null && !assisterIsBot && e.Assister.Team != e.Victim.Team) { Player assister = Demo.Players.FirstOrDefault(player => player.SteamId == e.Assister.SteamID); if (assister != null) { killEvent.AssisterSteamId = e.Assister.SteamID; killEvent.AssisterName = e.Assister.Name; assister.Assists.Add(killEvent); } } // If the killer isn't a bot we can update individual kill, open and entry kills if (e.Killer != null && e.Killer.Team != e.Victim.Team && killer != null && !killer.IsControllingBot) { if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; ProcessOpenAndEntryKills(killEvent); } ProcessClutches(); CurrentRound.Kills.Add(killEvent); Demo.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, PlayerSteamId = e.Killer?.SteamID ?? 0, PlayerName = e.Killer?.Name ?? string.Empty, Team = e.Killer?.Team.ToSide() ?? Side.None, Event = killEvent, RoundNumber = CurrentRound.Number }; Demo.PositionPoints.Add(positionPoint); } }
protected new void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted || IsFreezetime || e.Victim == null) { return; } Weapon weapon = Weapon.WeaponList.FirstOrDefault(w => w.Element == e.Weapon.Weapon); if (weapon == null) { return; } Player killed = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); Player killer = null; KillEvent killEvent = new KillEvent(Parser.IngameTick, Parser.CurrentTime) { KillerSteamId = e.Killer?.SteamID ?? 0, KillerName = e.Killer?.Name ?? "World", KillerSide = e.Killer?.Team.ToSide() ?? Side.None, Weapon = weapon, KillerVelocityX = e.Killer?.Velocity.X ?? 0, KillerVelocityY = e.Killer?.Velocity.Y ?? 0, KillerVelocityZ = e.Killer?.Velocity.Z ?? 0, KilledSteamId = e.Victim.SteamID, KilledName = e.Victim.Name, KilledSide = e.Victim.Team.ToSide(), RoundNumber = CurrentRound.Number, IsKillerCrouching = e.Killer?.IsDucking ?? false, IsHeadshot = e.Headshot, Point = new KillHeatmapPoint { KillerX = e.Killer?.Position.X ?? 0, KillerY = e.Killer?.Position.Y ?? 0, VictimX = e.Victim.Position.X, VictimY = e.Victim.Position.Y } }; if (!killed.RoundsLifetime.ContainsKey(CurrentRound.Number)) { killed.RoundsLifetime[CurrentRound.Number] = ((Parser.IngameTick - CurrentRound.Tick) / Parser.TickRate); } else { killed.RoundsLifetime[CurrentRound.Number] += ((Parser.IngameTick - CurrentRound.Tick) / Parser.TickRate); } bool killerIsBot = e.Killer != null && e.Killer.SteamID == 0; bool victimIsBot = e.Victim.SteamID == 0; bool assisterIsBot = e.Assister != null && e.Assister.SteamID == 0; if (e.Killer != null) { killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); } if (killer != null) { if (e.Victim.SteamID != killer.SteamId) { if (!killer.RoundsMoneyEarned.ContainsKey(CurrentRound.Number)) { killer.RoundsMoneyEarned[CurrentRound.Number] = weapon.KillAward; } else { killer.RoundsMoneyEarned[CurrentRound.Number] += weapon.KillAward; } } else { // Player suicide, hack to detect pause forced during a match // Happended during the match SK vs VP on train during Atlanta 2017 // All players are killed and the game is paused (freeze time) if (++_suicideCount == 6) { BackupToLastRound(); } return; } killEvent.KillerIsControllingBot = e.Killer.SteamID != 0 && killer.IsControllingBot; ProcessTradeKill(killEvent); } if (killed != null) { // suicide, probably because he missed the jump from upper B on train :) if (e.Killer == null) { killed.SuicideCount++; } killEvent.KilledIsControllingBot = e.Victim.SteamID != 0 && killed.IsControllingBot; } // Human killed human if (!killerIsBot && !victimIsBot) { if (killer != null && killed != null) { killed.IsAlive = false; // TK if (e.Killer.Team == e.Victim.Team) { killer.Kills.Add(killEvent); killed.Deaths.Add(killEvent); } else { // Regular kill if (!killer.IsControllingBot) { killer.Kills.Add(killEvent); } if (!killed.IsControllingBot) { killed.Deaths.Add(killEvent); } } } } // Human killed a bot if (!killerIsBot && victimIsBot) { killer?.Kills.Add(killEvent); } // A bot killed a human if (killerIsBot && !victimIsBot) { // TK or not we add a death to the human killed?.Deaths.Add(killEvent); } // Add assist if there was one if (e.Assister != null && !assisterIsBot && e.Assister.Team != e.Victim.Team) { Player assister = Demo.Players.FirstOrDefault(player => player.SteamId == e.Assister.SteamID); if (assister != null) { killEvent.AssisterSteamId = e.Assister.SteamID; killEvent.AssisterName = e.Assister.Name; killEvent.AssisterIsControllingBot = e.Assister.SteamID != 0 && assister.IsControllingBot; assister.Assists.Add(killEvent); } } // If the killer isn't a bot we can update individual kill, open and entry kills if (e.Killer != null && e.Killer.Team != e.Victim.Team && killer != null && !killer.IsControllingBot) { if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; ProcessOpenAndEntryKills(killEvent); } ProcessClutches(); CurrentRound.Kills.Add(killEvent); Demo.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, PlayerSteamId = e.Killer?.SteamID ?? 0, PlayerName = e.Killer?.Name ?? string.Empty, Team = e.Killer?.Team.ToSide() ?? Side.None, Event = killEvent, RoundNumber = CurrentRound.Number }; Demo.PositionPoints.Add(positionPoint); } }