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(); } }