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();
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
		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++;
		}
Beispiel #7
0
        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));
                }
            }
        }
Beispiel #8
0
        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();
        }
Beispiel #10
0
        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;
            }
        }
Beispiel #11
0
        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;
            }
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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;
                    }
                });
            }
        }
Beispiel #14
0
        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);
        }
Beispiel #17
0
        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));
        }
Beispiel #18
0
		/// <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);
                                }
                            }
                        }
                    });
                }
            }
        }
Beispiel #20
0
        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);
            }
        }
Beispiel #22
0
        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);
            }
        }