private async Task Process(DeathPayload payload)
        {
            using (var factory = _dbContextHelper.GetFactory())
            {
                var dbContext = factory.GetDbContext();

                bool isValidAttackerId = (payload.AttackerCharacterId != null && payload.AttackerCharacterId.Length > 18);
                bool isValidVictimId   = (payload.CharacterId != null && payload.CharacterId.Length > 18);

                try
                {
                    var TaskList = new List <Task>();
                    Task <OutfitMember> attackerOutfitTask = null;
                    Task <OutfitMember> victimOutfitTask   = null;

                    if (isValidAttackerId == true)
                    {
                        attackerOutfitTask = _characterService.GetCharactersOutfitAsync(payload.AttackerCharacterId);
                        TaskList.Add(attackerOutfitTask);
                    }
                    if (isValidVictimId == true)
                    {
                        victimOutfitTask = _characterService.GetCharactersOutfitAsync(payload.CharacterId);
                        TaskList.Add(victimOutfitTask);
                    }

                    await Task.WhenAll(TaskList);

                    TaskList.Clear();

                    int attackerFactionId = await dbContext.Characters
                                            .Where(c => c.Id == payload.AttackerCharacterId)
                                            .Select(c => c.FactionId)
                                            .FirstOrDefaultAsync();

                    int victimFactionId = await dbContext.Characters
                                          .Where(c => c.Id == payload.CharacterId)
                                          .Select(c => c.FactionId)
                                          .FirstOrDefaultAsync();

                    DeathEventType deathEventType;

                    if (isValidAttackerId == true)
                    {
                        if (payload.AttackerCharacterId == payload.CharacterId)
                        {
                            deathEventType = DeathEventType.Suicide;
                        }
                        else if (attackerFactionId == victimFactionId)
                        {
                            deathEventType = DeathEventType.Teamkill;
                        }
                        else
                        {
                            deathEventType = DeathEventType.Kill;
                        }
                    }
                    else
                    {
                        deathEventType = DeathEventType.Suicide;
                    }

                    var dataModel = new Shared.Models.Death
                    {
                        AttackerCharacterId = payload.AttackerCharacterId,
                        AttackerFireModeId  = payload.AttackerFireModeId,
                        AttackerLoadoutId   = payload.AttackerLoadoutId,
                        AttackerVehicleId   = payload.AttackerVehicleId,
                        AttackerWeaponId    = payload.AttackerWeaponId,
                        AttackerOutfitId    = attackerOutfitTask?.Result?.OutfitId,
                        AttackerFactionId   = attackerFactionId,
                        CharacterId         = payload.CharacterId,
                        CharacterLoadoutId  = payload.CharacterLoadoutId,
                        CharacterOutfitId   = victimOutfitTask?.Result?.OutfitId,
                        CharacterFactionId  = victimFactionId,
                        IsHeadshot          = payload.IsHeadshot,
                        DeathEventType      = deathEventType,
                        Timestamp           = payload.Timestamp,
                        WorldId             = payload.WorldId,
                        ZoneId = payload.ZoneId.Value
                    };

                    dbContext.Deaths.Add(dataModel);
                    await dbContext.SaveChangesAsync();
                }
                catch (Exception)
                {
                    //Ignore
                }
            }
        }
Пример #2
0
        public void Kill(PowerContext context = null, bool lootAndExp = false)
        {
            var deathload = new DeathPayload(context, Powers.DamageType.Physical, this, lootAndExp);

            deathload.Apply();
        }