Пример #1
0
        public async Task CharacterFirstCreateHandler(GameSession session, CharacterFirstCreateReqMessage message)
        {
            var plr  = session.Player;
            var cmng = plr.CharacterManager;

            if (cmng.Any() && plr.Account.Nickname != string.Empty)
            {
                return;
            }

            try
            {
                cmng.Remove(0);
                cmng.Remove(1);
                cmng.Remove(2);
            }
            catch
            {
            }

            if (string.IsNullOrWhiteSpace(plr.Account.Nickname))
            {
                if (!await AuthService.IsNickAvailableAsync(message.Nickname))
                {
                    await session.SendAsync(new ServerResultAckMessage(ServerResult.NicknameUnavailable));

                    return;
                }

                using (var db = AuthDatabase.Open())
                {
                    var result = (await DbUtil.FindAsync <AccountDto>(db, smtp => smtp
                                                                      .Where($"{nameof(AccountDto.Id):C} = @Id")
                                                                      .WithParameters(new { session.Player.Account.Id })
                                                                      )).FirstOrDefault();

                    if (result == null)
                    {
                        await session.SendAsync(new ServerResultAckMessage(ServerResult.CreateCharacterFailed));

                        return;
                    }

                    result.Nickname = message.Nickname;
                    await DbUtil.UpdateAsync(db, result);

                    plr.Account.Nickname = message.Nickname;
                }
            }

            var items = new List <RequitalGiveItemResultDto>();

            try
            {
                cmng.CreateFirst(0, (CharacterGender)message.Gender);
                cmng.Select(0, true);
                try
                {
                    var max = 6;
                    if (message.FirstItems.Length < max)
                    {
                        max = message.FirstItems.Length;
                    }

                    foreach (var itemNumber in message.FirstItems.Take(max))
                    {
                        if (itemNumber != 0)
                        {
                            items.Add(new RequitalGiveItemResultDto(itemNumber, 0));
                            var pi = plr.Inventory.CreateSilent(itemNumber, 0, 0, 1);
                            cmng.CurrentCharacter.Costumes.Equip(pi, (CostumeSlot)pi.ItemNumber.SubCategory, true);
                        }
                    }
                }
                catch (ArgumentException e)
                {
                    Logger.Debug(e, "FirstChar items couldnt be created");
                }
            }
            catch (CharacterException ex)
            {
                Logger.ForAccount(session)
                .Error(ex.Message);
                await session.SendAsync(new ServerResultAckMessage(ServerResult.CreateCharacterFailed));

                return;
            }

            await session.SendAsync(new RequitalGiveItemResultAckMessage(items.ToArray()));

            IEnumerable <StartItemDto> startItems;

            using (var db = GameDatabase.Open())
            {
                startItems = await DbUtil.FindAsync <StartItemDto>(db, statement => statement
                                                                   .Where(
                                                                       $"{nameof(StartItemDto.RequiredSecurityLevel):C} <= @{nameof(plr.Account.SecurityLevel)}")
                                                                   .WithParameters(new { plr.Account.SecurityLevel }));
            }

            foreach (var startItem in startItems)
            {
                var shop     = GameServer.Instance.ResourceCache.GetShop();
                var item     = shop.Items.Values.First(group => group.GetItemInfo(startItem.ShopItemInfoId) != null);
                var itemInfo = item.GetItemInfo(startItem.ShopItemInfoId);
                var effect   = itemInfo.EffectGroup.GetEffect(startItem.ShopEffectId);

                var price = itemInfo.PriceGroup.GetPrice(startItem.ShopPriceId);
                if (price == null)
                {
                    Logger.Warning("Cant find ShopPrice for Start item {startItemId} - Forgot to reload the cache?",
                                   startItem.Id);
                    continue;
                }

                var color = startItem.Color;
                if (color > item.ColorGroup)
                {
                    Logger.Warning("Start item {startItemId} has an invalid color {color}", startItem.Id, color);
                    color = 0;
                }

                var count = startItem.Count;
                if (count > 0 && item.ItemNumber.Category <= ItemCategory.Skill)
                {
                    Logger.Warning("Start item {startItemId} cant have stacks(quantity={count})", startItem.Id, count);
                    count = 0;
                }

                if (count < 0)
                {
                    count = 0;
                }
                var reteff = new List <EffectNumber> {
                    effect.Effect
                };
                plr.Inventory.CreateSilent(itemInfo, price, color, reteff.ToArray(), (uint)count);
            }

            plr.NeedsToSave = true;
            plr.Save();
            await AuthService.LoginAsync(session);
        }
        public async void CharacterFirstCreateHandler(GameSession session, CharacterFirstCreateReqMessage message)
        {
            var plr  = session.Player;
            var cmng = plr.CharacterManager;

            if (!await AuthService.IsNickAvailableAsync(message.Nickname))
            {
                await session.SendAsync(new ServerResultAckMessage(ServerResult.NicknameUnavailable));

                return;
            }

            using (var db = AuthDatabase.Open())
            {
                var result = (await db.FindAsync <AccountDto>(smtp => smtp
                                                              .Where($"{nameof(AccountDto.Id):C} = @Id")
                                                              .WithParameters(new { session.Player.Account.Id })
                                                              )).FirstOrDefault();

                if (result == null)
                {
                    await session.SendAsync(new ServerResultAckMessage(ServerResult.CreateCharacterFailed));

                    return;
                }

                result.Nickname = message.Nickname;
                await db.UpdateAsync(result);

                plr.Account.Nickname = message.Nickname;
            }

            try
            {
                cmng.Create(0, (CharacterGender)message.Gender, 0, 0, 0, 0);
                cmng.Select(0);
            }
            catch (CharacterException ex)
            {
                Logger.ForAccount(session)
                .Error(ex.Message);
                await session.SendAsync(new ServerResultAckMessage(ServerResult.CreateCharacterFailed));

                return;
            }

            await AuthService.LoginAsync(session);

            IEnumerable <StartItemDto> startItems;

            using (var db = GameDatabase.Open())
            {
                startItems = await db.FindAsync <StartItemDto>(statement => statement
                                                               .Where(
                                                                   $"{nameof(StartItemDto.RequiredSecurityLevel):C} <= @{nameof(plr.Account.SecurityLevel)}")
                                                               .WithParameters(new { plr.Account.SecurityLevel }));
            }

            foreach (var startItem in startItems)
            {
                var shop     = GameServer.Instance.ResourceCache.GetShop();
                var item     = shop.Items.Values.First(group => group.GetItemInfo(startItem.ShopItemInfoId) != null);
                var itemInfo = item.GetItemInfo(startItem.ShopItemInfoId);
                var effect   = itemInfo.EffectGroup.GetEffect(startItem.ShopEffectId);

                var price = itemInfo.PriceGroup.GetPrice(startItem.ShopPriceId);
                if (price == null)
                {
                    Logger.Warning("Cant find ShopPrice for Start item {startItemId} - Forgot to reload the cache?",
                                   startItem.Id);
                    continue;
                }

                var color = startItem.Color;
                if (color > item.ColorGroup)
                {
                    Logger.Warning("Start item {startItemId} has an invalid color {color}", startItem.Id, color);
                    color = 0;
                }

                var count = startItem.Count;
                if (count > 0 && item.ItemNumber.Category <= ItemCategory.Skill)
                {
                    Logger.Warning("Start item {startItemId} cant have stacks(quantity={count})", startItem.Id,
                                   count);
                    count = 0;
                }

                if (count < 0)
                {
                    count = 0;
                }
                var reteff = new List <uint>
                {
                    effect.Effect
                };
                plr.Inventory.Create(itemInfo, price, color, reteff.ToArray(), (uint)count);
            }

            try
            {
                foreach (var itemNumber in message.FirstItems)
                {
                    if (itemNumber != 0)
                    {
                        var pi = plr.Inventory.Create(itemNumber, ItemPriceType.PEN, ItemPeriodType.None, 0, 0, new uint[] { 0 }, 1);
                        cmng.CurrentCharacter.Costumes.Equip(pi, (CostumeSlot)pi.ItemNumber.SubCategory);
                    }
                }
            }
            catch (ArgumentException e)
            {
                Logger.Debug(e, "Problem creating new items");
            }
        }