private async Task SetBasePlayer(IBasePlayerStat playerStat, ArenaPlayer player, MatchEvents matchEvents = null) { player.Weapons = playerStat.WeaponStats.Where(w => w.Weapon != null && (w.TotalDamageDealt > 0 || w.TotalShotsFired > 0)).OrderByDescending(w => w.TotalKills).Select(Mapper.Map <WeaponStat>).ToList(); var minKills = player.Weapons.Min(w => w.TotalKills); var maxKills = player.Weapons.Max(w => w.TotalKills) - minKills; var minHeadShots = player.Weapons.Min(w => w.TotalHeadshots); var maxHeadShots = player.Weapons.Max(w => w.TotalHeadshots) - minHeadShots; var minTotalDamage = player.Weapons.Min(w => w.TotalDamageDealt); var maxTotalDamage = player.Weapons.Max(w => w.TotalDamageDealt) - minTotalDamage; var minShotsFired = player.Weapons.Min(w => w.TotalShotsFired); var maxShotsFired = player.Weapons.Max(w => w.TotalShotsFired) - minShotsFired; var minShotsLanded = player.Weapons.Min(w => w.TotalShotsLanded); var maxShotsLanded = player.Weapons.Max(w => w.TotalShotsLanded) - minShotsLanded; var minAccuraccy = player.Weapons.Min(w => w.Accuracy); var maxAccuraccy = player.Weapons.Max(w => w.Accuracy) - minAccuraccy; foreach (var weaponStat in player.Weapons) { weaponStat.KillPercent = weaponStat.TotalKills.Percent(minKills, maxKills); weaponStat.HeadShotPercent = weaponStat.TotalHeadshots.Percent(minHeadShots, maxHeadShots); weaponStat.TotalDamagePercent = weaponStat.TotalDamageDealt.Percent(minTotalDamage, maxTotalDamage); weaponStat.ShotsFiredPercent = weaponStat.TotalShotsFired.Percent(minShotsFired, maxShotsFired); weaponStat.ShotsLandedPercent = weaponStat.TotalShotsLanded.Percent(minShotsLanded, maxShotsLanded); weaponStat.AccuracyPercent = weaponStat.Accuracy.Percent(minAccuraccy, maxAccuraccy); } player.Medals = playerStat.MedalAwards.GroupBy(m => m.Medal.Classification).Select(m => new MedalClassification { Classification = m.Key, MedalAwards = Mapper.Map <List <MedalAward> >(m) }).ToList(); List <GameEvent> killers = new List <GameEvent>(); if (matchEvents != null) { killers = matchEvents.GameEvents.Where(e => e.VictimAgent == Enumeration.Agent.Player && e.Victim.Gamertag == player.GamerTag && e.KillerAgent == Enumeration.Agent.AI && !e.IsWeapon && e.EventName == Enumeration.EventType.Death).ToList(); } foreach (var baseGroup in playerStat.EnemyKills.GroupBy(k => k.Enemy.BaseId)) { var enemyKill = baseGroup.First(); Enemy enemy = new Enemy { Name = enemyKill.Enemy.EnemyObject.Name, Kills = baseGroup.Sum(k => k.TotalKills), Description = enemyKill.Enemy.EnemyObject.Description, ImageUrl = enemyKill.Enemy.EnemyObject.SmallIconImageUrl, Deaths = killers.Count(k => k.KillerWeaponStockId == enemyKill.Enemy.BaseId), IsPlayer = false }; enemy.Spread = enemy.Kills - enemy.Deaths; player.Enemies.Add(enemy); } foreach (var baseGroup in playerStat.DestroyedEnemyVehicles.GroupBy(k => k.Enemy.BaseId)) { var enemyKill = baseGroup.First(); Enemy enemy = new Enemy { Name = enemyKill.Enemy.Vehicle.Name, Kills = baseGroup.Sum(k => k.TotalKills), Description = enemyKill.Enemy.Vehicle.Description, ImageUrl = enemyKill.Enemy.Vehicle.SmallIconImageUrl, Deaths = killers.Count(k => k.KillerWeaponStockId == enemyKill.Enemy.BaseId), IsPlayer = false }; enemy.Spread = enemy.Kills - enemy.Deaths; player.Enemies.Add(enemy); } var ids = playerStat.EnemyKills.Select(k => k.Enemy.BaseId) .Union(playerStat.DestroyedEnemyVehicles.Select(v => v.Enemy.BaseId)) .ToList(); killers.RemoveAll(k => ids.Contains(k.KillerWeaponStockId)); foreach (var killer in killers.GroupBy(k => k.KillerWeaponStockId)) { var enemyKill = await _metadataRepository.GetEnemyOrVehicl(killer.Key); if (enemyKill != null) { Enemy enemy = new Enemy { Name = enemyKill.Name, Kills = 0, Description = enemyKill.Description, ImageUrl = enemyKill.SmallIconImageUrl, Deaths = killer.Count(), IsPlayer = false }; enemy.Spread = enemy.Kills - enemy.Deaths; player.Enemies.Add(enemy); } } }
private async Task SetBasePlayer(IBasePlayerStat playerStat, ArenaPlayer player, MatchEvents matchEvents = null) { player.Weapons = playerStat.WeaponStats.Where(w => w.Weapon != null && (w.TotalDamageDealt > 0 || w.TotalShotsFired > 0)).OrderByDescending(w => w.TotalKills).Select(Mapper.Map <WeaponStat>).ToList(); if (player.Weapons.Any()) { var minKills = player.Weapons.Min(w => w.TotalKills); var maxKills = player.Weapons.Max(w => w.TotalKills) - minKills; var minHeadShots = player.Weapons.Min(w => w.TotalHeadshots); var maxHeadShots = player.Weapons.Max(w => w.TotalHeadshots) - minHeadShots; var minTotalDamage = player.Weapons.Min(w => w.TotalDamageDealt); var maxTotalDamage = player.Weapons.Max(w => w.TotalDamageDealt) - minTotalDamage; var minShotsFired = player.Weapons.Min(w => w.TotalShotsFired); var maxShotsFired = player.Weapons.Max(w => w.TotalShotsFired) - minShotsFired; var minShotsLanded = player.Weapons.Min(w => w.TotalShotsLanded); var maxShotsLanded = player.Weapons.Max(w => w.TotalShotsLanded) - minShotsLanded; var minAccuraccy = player.Weapons.Min(w => w.Accuracy); var maxAccuraccy = player.Weapons.Max(w => w.Accuracy) - minAccuraccy; foreach (var weaponStat in player.Weapons) { weaponStat.KillPercent = weaponStat.TotalKills.Percent(minKills, maxKills); weaponStat.HeadShotPercent = weaponStat.TotalHeadshots.Percent(minHeadShots, maxHeadShots); weaponStat.TotalDamagePercent = weaponStat.TotalDamageDealt.Percent(minTotalDamage, maxTotalDamage); weaponStat.ShotsFiredPercent = weaponStat.TotalShotsFired.Percent(minShotsFired, maxShotsFired); weaponStat.ShotsLandedPercent = weaponStat.TotalShotsLanded.Percent(minShotsLanded, maxShotsLanded); weaponStat.AccuracyPercent = weaponStat.Accuracy.Percent(minAccuraccy, maxAccuraccy); } } player.Medals = playerStat.MedalAwards?.Where(m => m.Medal != null).GroupBy(m => m.Medal.Classification).Select(m => new MedalClassification { Classification = m.Key, MedalAwards = Mapper.Map <List <MedalAward> >(m) }).ToList(); player.TotalPerfectKills = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.PerfectKill))?.Count ?? 0; player.RoundWinningKills = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.RoundWinningKill))?.Count ?? 0; player.FlagCaptures = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.FlagCapture))?.Count ?? 0; player.FlagPulls = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.FlagGrabs))?.Count ?? 0; player.FlagCarrierKills = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.FlagCarrierKills))?.Count ?? 0; player.StrongholdsCaptured = playerStat.FlexibleStats.MedalStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.StrongholdCaptured))?.Count ?? 0; player.StrongholdsSecured = playerStat.FlexibleStats.MedalStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.StrongholdSecured))?.Count ?? 0; player.StrongholdsDefended = playerStat.FlexibleStats.MedalStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.StrongholdDefense))?.Count ?? 0; player.Score = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.Score))?.Count ?? 0; player.Kills = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.Kills))?.Count ?? 0; player.RoundsSurvived = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.RoundsSurvived))?.Count ?? 0; player.RoundsComplete = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.RoundsComplete))?.Count ?? 0; player.BossTakedowns = playerStat.FlexibleStats.MedalStatCounts.Where(i => i.Id == Guid.Parse(Constants.MythicTakedown) || i.Id == Guid.Parse(Constants.LegendaryTakedown) || i.Id == Guid.Parse(Constants.BossTakedown)).Sum(i => i.Count); player.NpcKills = playerStat.EnemyKills.Sum(e => e.TotalKills); player.BasesCaptured = playerStat.FlexibleStats.ImpulseStatCounts.FirstOrDefault(i => i.Id == Guid.Parse(Constants.BasesCaptured))?.Count ?? 0; List <GameEvent> killers = new List <GameEvent>(); if (matchEvents != null) { killers = matchEvents.GameEvents.Where(e => e.VictimAgent == Enumeration.Agent.Player && e.Victim.Gamertag == player.GamerTag && e.KillerAgent == Enumeration.Agent.AI && (e.IsWeapon == null || e.IsWeapon == false) && e.EventName == Enumeration.EventType.Death).ToList(); } foreach (var baseGroup in playerStat.EnemyKills.GroupBy(k => k.Enemy.BaseId)) { var enemyKill = baseGroup.First(); Enemy enemy = new Enemy { Id = enemyKill.Enemy.BaseId, Name = enemyKill.Enemy.EnemyObject.Name, Kills = baseGroup.Sum(k => k.TotalKills), Description = enemyKill.Enemy.EnemyObject.Description, ImageUrl = enemyKill.Enemy.EnemyObject.SmallIconImageUrl, Deaths = killers.Count(k => k.KillerWeaponStockId == enemyKill.Enemy.BaseId), IsPlayer = false }; enemy.Spread = enemy.Kills - enemy.Deaths; player.Enemies.Add(enemy); } //foreach (var baseGroup in playerStat.DestroyedEnemyVehicles.GroupBy(k=>k.Enemy.BaseId)) //{ // var enemyKill = baseGroup.First(); // Enemy enemy = new Enemy // { // Id = enemyKill.Enemy.BaseId, // Name = enemyKill.Enemy.Vehicle.Name, // Kills = baseGroup.Sum(k => k.TotalKills), // Description = enemyKill.Enemy.Vehicle.Description, // ImageUrl = enemyKill.Enemy.Vehicle.SmallIconImageUrl, // Deaths = killers.Count(k => k.KillerWeaponStockId == enemyKill.Enemy.BaseId), // IsPlayer = false // }; // enemy.Spread = enemy.Kills - enemy.Deaths; // player.Enemies.Add(enemy); //} var ids = playerStat.EnemyKills.Select(k => k.Enemy.BaseId) .Union(playerStat.DestroyedEnemyVehicles.Select(v => v.Enemy.BaseId)) .ToList(); killers.RemoveAll(k => ids.Contains(k.KillerWeaponStockId.Value)); foreach (var killer in killers.Where(k => k.KillerWeaponStockId.HasValue).GroupBy(k => k.KillerWeaponStockId)) { var enemyKill = await _metadataRepository.GetEnemyOrVehicle(killer.Key.Value); if (enemyKill != null) { Enemy enemy = new Enemy { Id = enemyKill.Id, Name = enemyKill.Name, Kills = 0, Description = enemyKill.Description, ImageUrl = enemyKill.SmallIconImageUrl, Deaths = killer.Count(), IsPlayer = false }; enemy.Spread = enemy.Kills - enemy.Deaths; player.Enemies.Add(enemy); } } if (matchEvents != null) { foreach (var enemy in player.Enemies) { var weaponKills = matchEvents.GameEvents.Where(e => e.EventName == Enumeration.EventType.Death && (e.VictimStockId == enemy.Id && e.Killer != null && e.Killer.Gamertag == player.GamerTag) || e.Victim != null && e.Victim.Gamertag == player.GamerTag && e.KillerWeaponStockId == enemy.Id) .Select(e => new { Killer = e.Killer?.Gamertag, //Victim = e.VictimStockId, WeaponId = e.WeaponKillId(), Type = e.SpartanKillType() }).ToList(); var groups = weaponKills.Where(g => g.WeaponId != 0).GroupBy(g => new { g.WeaponId, g.Type }); foreach (var g in groups) { var weapon = await _metadataRepository.GetWeaponOrEnemyOrVehicle(g.Key.WeaponId); if (weapon != null) { var weaponKill = Mapper.Map <WeaponKill>(weapon); weaponKill.Kills = g.Count(g2 => g2.Killer == player.GamerTag); weaponKill.Deaths = g.Count(g2 => g2.Killer != player.GamerTag); if (!string.IsNullOrEmpty(g.Key.Type)) { weaponKill.Name = g.Key.Type; } enemy.WeaponKills.Add(weaponKill); } } enemy.WeaponKills = enemy.WeaponKills.OrderByDescending(e => e.Kills).ThenBy(e => e.Deaths).ToList(); //var weaponKills = matchEvents.GameEvents.Where(e => e.Killer != null && e.Victim != null && // e.KillerWeaponStockId.HasValue && e.EventName == Enumeration.EventType.Death && // ((e.Killer.Gamertag == tag && e.Victim.Gamertag == player.GamerTag) || // (e.Killer.Gamertag == player.GamerTag && e.Victim.Gamertag == tag))).Select(e => new // { // Killer = e.Killer.Gamertag, // Victim = e.Victim.Gamertag, // WeaponId = e.KillerWeaponStockId.Value // }).ToList(); } } }