Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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();
                }
            }
        }