Exemple #1
0
        public PvPPlayerStat(PvPPlayer player, DateTime startTime, DateTime endTime)
        {
            Player = player ?? throw new ArgumentNullException(nameof(player));

            Player.SetPropertysAt(startTime);

            var classHistory = new List <KeyValuePair <string, TimeSpan> >();

            var classTime = new Dictionary <string, TimeSpan>();

            var lastTime = startTime;

            foreach (var @event in player.Events)
            {
                if (@event.Time < startTime)
                {
                    continue;
                }
                else if (@event.Time > endTime)
                {
                    break;
                }

                if (@event is KillerEvent killerEvent)
                {
                    TotalDamage += killerEvent.Damage;
                    DamageCount++;

                    if (killerEvent.Type == Enums.EventType.KillPlayer)
                    {
                        KillCount++;
                    }
                    else if (killerEvent.Type == Enums.EventType.DealDamageToPlayer)
                    {
                        // Do nothing for now
                    }
                }
                else if (@event is VictimEvent victimEvent)
                {
                    TotalRecieveDamage += victimEvent.Damage;
                    RecieveDamageCount++;

                    if (victimEvent.Type == Enums.EventType.DeathByPlayer)
                    {
                        DeathCount++;
                    }
                    else if (victimEvent.Type == Enums.EventType.DamagedByPlayer)
                    {
                        // Do nothing for now
                    }
                }
                else if (@event is DeathByOtherEvent deathByOther)
                {
                    TotalRecieveDamage += deathByOther.Damage;
                    RecieveDamageCount++;
                    DeathCount++;
                }
                else if (@event is RecieveDamageByOtherEvent recieveDamage)
                {
                    TotalRecieveDamage += recieveDamage.Damage;
                    RecieveDamageCount++;
                }
                else if (@event.Type == Enums.EventType.TeleportPlayer)
                {
                    TeleportCount++;
                }
                else if (@event.Type == Enums.EventType.PlayerSpawn)
                {
                    SpawnCount++;
                }
                else if (@event is ChangeClassEvent changeClass)
                {
                    classHistory.Add(new KeyValuePair <string, TimeSpan>(changeClass.OldClass, changeClass.Time - lastTime));

                    if (!classTime.ContainsKey(changeClass.OldClass))
                    {
                        classTime.Add(changeClass.OldClass, changeClass.Time - lastTime);
                    }
                    else
                    {
                        classTime[changeClass.OldClass] += changeClass.Time - lastTime;
                    }

                    lastTime = changeClass.Time;

                    @event.DoEffect();
                }
            }

            classHistory.Add(new KeyValuePair <string, TimeSpan>(Player.Class, endTime - lastTime));

            if (!classTime.ContainsKey(Player.Class))
            {
                classTime.Add(Player.Class, endTime - lastTime);
            }
            else
            {
                classTime[Player.Class] += endTime - lastTime;
            }

            ClassTime = new ReadOnlyDictionary <string, TimeSpan>(classTime);

            ClassHistory = classHistory.AsReadOnly();

            MostUsedClass = classTime.OrderByDescending(x => x.Value).First().Key;

            IconSource = IconUtils.GetImageSource(MostUsedClass.ToLowerInvariant());
        }
        private void GameSelectBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            timelineControl.Reset();

            if (e.AddedItems[0] is KeyValuePair <string, Game> pair)
            {
                logAllEvents = new List <ILogEvent>(pair.Value.AllEvents);

                playerFilters.Clear();

                GameLengthText.Text = "Game Length: " + (pair.Value.End - pair.Value.Start).ToString("c", CultureInfo.InvariantCulture);
                WinnerTeam.Text     = "Winner: " + pair.Value.WinnerTeam.ToString();

                MainWindow.MapBackground.Source = IconUtils.GetImageSource(pair.Value.Stage.ToString());

                var blueTeam   = new List <PvPPlayer>();
                var yellowTeam = new List <PvPPlayer>();

                var lastClassChangeTime = new Dictionary <PvPPlayer, DateTime>();

                foreach (var playerDictPair in LogParser.PlayerDict)
                {
                    playerDictPair.Value.SetPropertysAt(pair.Value.Start);

                    if (playerDictPair.Value.Team == Enums.TeamID.Blue)
                    {
                        blueTeam.Add(playerDictPair.Value);
                    }
                    else if (playerDictPair.Value.Team == Enums.TeamID.Yellow)
                    {
                        yellowTeam.Add(playerDictPair.Value);
                    }

                    lastClassChangeTime.Add(playerDictPair.Value, pair.Value.Start);

                    playerFilters.Add(playerDictPair.Value, false);
                }

                BlueTeam.ItemsSource   = blueTeam;
                YellowTeam.ItemsSource = yellowTeam;

                BluePoints.Text   = pair.Value.BluePoint + " points";
                YellowPoints.Text = pair.Value.YellowPoint + " points";

                var blueStat   = new List <PvPPlayerStat>();
                var yellowStat = new List <PvPPlayerStat>();

                var blueClassTime   = new Dictionary <string, TimeSpan>();
                var yellowClassTime = new Dictionary <string, TimeSpan>();

                foreach (var player in blueTeam)
                {
                    var stat = new PvPPlayerStat(player, pair.Value.Start, pair.Value.End);
                    blueStat.Add(stat);

                    foreach (var timePair in stat.ClassTime)
                    {
                        if (!blueClassTime.ContainsKey(timePair.Key))
                        {
                            blueClassTime.Add(timePair.Key, timePair.Value);
                        }
                        else
                        {
                            blueClassTime[timePair.Key] += timePair.Value;
                        }
                    }
                }

                foreach (var player in yellowTeam)
                {
                    var stat = new PvPPlayerStat(player, pair.Value.Start, pair.Value.End);
                    yellowStat.Add(stat);

                    foreach (var timePair in stat.ClassTime)
                    {
                        if (!yellowClassTime.ContainsKey(timePair.Key))
                        {
                            yellowClassTime.Add(timePair.Key, timePair.Value);
                        }
                        else
                        {
                            yellowClassTime[timePair.Key] += timePair.Value;
                        }
                    }
                }

                BlueTeamClass.ItemsSource   = blueClassTime.OrderByDescending(x => x.Value);
                YellowTeamClass.ItemsSource = yellowClassTime.OrderByDescending(x => x.Value);

                BlueTeamStat.ItemsSource   = blueStat;
                YellowTeamStat.ItemsSource = yellowStat;

                BlueTeamStat.UpdateLayout();
                YellowTeamStat.UpdateLayout();

                aggregateApply             = true;
                BlueTeamCheckAll.IsChecked = true;
                foreach (var item in BlueTeamStat.Items)
                {
                    if (BlueTeamStat.ItemContainerGenerator.ContainerFromItem(item) is ListBoxItem element)
                    {
                        FindVisualChild <CheckBox>(element).IsChecked = true;
                    }
                }

                YellowTeamCheckAll.IsChecked = true;
                foreach (var item in YellowTeamStat.Items)
                {
                    if (YellowTeamStat.ItemContainerGenerator.ContainerFromItem(item) is ListBoxItem element)
                    {
                        FindVisualChild <CheckBox>(element).IsChecked = true;
                    }
                }

                aggregateApply = false;
                ApplyFilters();
                SetEventsToTimeline();
            }
        }