Ejemplo n.º 1
0
        public static void TakeMailItemRequest(IRealmClient client, RealmPacketIn packet)
        {
            int num1 = packet.ReadInt32();

            if (!client.ActiveCharacter.MailMessages.ContainsKey((long)num1))
            {
                client.ActiveCharacter.YouAreFuckingCheater("Try to take not existing mail message.", 50);
                Asda2MailHandler.SendMailItemTakedResponse(client, Asda2MailItemTakedStatus.WrongInfo,
                                                           (Asda2Item)null);
            }
            else
            {
                Asda2MailMessage mailMessage = client.ActiveCharacter.MailMessages[(long)num1];
                if (mailMessage == null)
                {
                    Asda2MailHandler.SendMailItemTakedResponse(client, Asda2MailItemTakedStatus.WrongInfo,
                                                               (Asda2Item)null);
                }
                else
                {
                    Asda2Item itemToCopyStats = mailMessage.Item;
                    Asda2Item asda2Item       = (Asda2Item)null;
                    if (itemToCopyStats != null)
                    {
                        int num2 = (int)client.ActiveCharacter.Asda2Inventory.TryAdd(itemToCopyStats.ItemId,
                                                                                     itemToCopyStats.Amount, true, ref asda2Item, new Asda2InventoryType?(), itemToCopyStats);
                        Log.Create(Log.Types.ItemOperations, LogSourceType.Character, client.ActiveCharacter.EntryId)
                        .AddAttribute("source", 0.0, "taked_from_mail")
                        .AddAttribute("message_id", (double)mailMessage.Guid, "").AddItemAttributes(asda2Item, "")
                        .Write();
                        mailMessage.ItemGuid = 0L;
                        mailMessage.Item     = (Asda2Item)null;
                        itemToCopyStats.Destroy();
                    }

                    client.ActiveCharacter.AddMoney(mailMessage.Gold);
                    mailMessage.Gold = 0U;
                    mailMessage.UpdateLater();
                    Asda2MailHandler.SendMailItemTakedResponse(client, Asda2MailItemTakedStatus.Ok, asda2Item);
                    client.ActiveCharacter.SendMoneyUpdate();
                }
            }
        }
Ejemplo n.º 2
0
        public void BuyItems(Character activeCharacter, List <Asda2ItemTradeRef> itemsToBuyRefs)
        {
            Owner.Map.AddMessage(() =>
            {
                List <Asda2ItemTradeRef> source = new List <Asda2ItemTradeRef>();
                foreach (Asda2ItemTradeRef itemsToBuyRef in itemsToBuyRefs)
                {
                    Asda2ItemTradeRef asda2ItemTradeRef = ItemsOnTrade[itemsToBuyRef.TradeSlot];
                    if (asda2ItemTradeRef == null || asda2ItemTradeRef.Amount == -1 || asda2ItemTradeRef.Amount != 0 &&
                        asda2ItemTradeRef.Amount < itemsToBuyRef.Amount)
                    {
                        Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                     PrivateShopBuyResult.RequestedNumberOfItemsIsNoLongerAvaliable, null);
                        return;
                    }

                    source.Add(new Asda2ItemTradeRef
                    {
                        Amount    = itemsToBuyRef.Amount,
                        Item      = asda2ItemTradeRef.Item,
                        Price     = asda2ItemTradeRef.Price,
                        TradeSlot = asda2ItemTradeRef.TradeSlot
                    });
                }

                ulong num1 = source.Aggregate(0UL,
                                              (current, asda2ItemTradeRef) =>
                                              current + (ulong)(asda2ItemTradeRef.Price * asda2ItemTradeRef.Amount));
                if (num1 > int.MaxValue)
                {
                    activeCharacter.YouAreFuckingCheater("Trying to buy items with wrong money amount.", 50);
                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                 PrivateShopBuyResult.NotEnoghtGold, null);
                }
                else if (activeCharacter.Money < num1)
                {
                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                 PrivateShopBuyResult.NotEnoghtGold, null);
                }
                else if (Owner.Money + num1 > int.MaxValue)
                {
                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                 PrivateShopBuyResult.Error, null);
                    SendMessage(Owner.Name + " has to much gold.", Owner, Locale.Start);
                }
                else if (source.Any(asda2ItemTradeRef =>
                {
                    if (asda2ItemTradeRef.Item == null || asda2ItemTradeRef.Item.IsDeleted)
                    {
                        return(true);
                    }
                    if (asda2ItemTradeRef.Item.Amount != 0)
                    {
                        return(asda2ItemTradeRef.Item.Amount < asda2ItemTradeRef.Amount);
                    }
                    return(false);
                }))
                {
                    Owner.YouAreFuckingCheater("Trying to cheat while trading items from private shop", 10);
                    Exit(Owner);
                }
                else if (activeCharacter.Asda2Inventory.FreeRegularSlotsCount <
                         source.Count(i =>
                                      i.Item.InventoryType == Asda2InventoryType.Regular) ||
                         activeCharacter.Asda2Inventory.FreeShopSlotsCount < source.Count(
                             i => i.Item.InventoryType == Asda2InventoryType.Shop))
                {
                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                 PrivateShopBuyResult.NoSlotAreAvailable, null);
                }
                else
                {
                    activeCharacter.SubtractMoney((uint)num1);
                    Owner.AddMoney((uint)num1);
                    List <Asda2Item> buyedItems         = new List <Asda2Item>();
                    List <Asda2ItemTradeRef> itemsBuyed = new List <Asda2ItemTradeRef>();
                    foreach (Asda2ItemTradeRef asda2ItemTradeRef1 in source)
                    {
                        if (asda2ItemTradeRef1.Amount == 0)
                        {
                            asda2ItemTradeRef1.Amount = 1;
                        }
                        if (asda2ItemTradeRef1.Amount >= asda2ItemTradeRef1.Item.Amount)
                        {
                            LogHelperEntry lgDelete = Log
                                                      .Create(Log.Types.ItemOperations, LogSourceType.Character, Owner.EntryId)
                                                      .AddAttribute("source", 0.0, "selled_from_private_shop")
                                                      .AddItemAttributes(asda2ItemTradeRef1.Item, "")
                                                      .AddAttribute("buyer_id", activeCharacter.EntryId, "")
                                                      .AddAttribute("amount", asda2ItemTradeRef1.Amount, "").Write();
                            Asda2Item itemToCopyStats = asda2ItemTradeRef1.Item;
                            Asda2Item asda2Item       = null;
                            int num2 = (int)activeCharacter.Asda2Inventory.TryAdd(itemToCopyStats.ItemId,
                                                                                  itemToCopyStats.Amount, true, ref asda2Item, new Asda2InventoryType?(),
                                                                                  itemToCopyStats);
                            Log.Create(Log.Types.ItemOperations, LogSourceType.Character, activeCharacter.EntryId)
                            .AddAttribute("source", 0.0, "buyed_from_private_shop").AddItemAttributes(asda2Item, "")
                            .AddAttribute("seller_id", Owner.EntryId, "").AddReference(lgDelete)
                            .AddAttribute("amount", asda2ItemTradeRef1.Amount, "").Write();
                            buyedItems.Add(asda2Item);
                            itemToCopyStats.Destroy();
                            ItemsOnTrade[asda2ItemTradeRef1.TradeSlot].Amount = -1;
                            ItemsOnTrade[asda2ItemTradeRef1.TradeSlot].Price  = 0;
                        }
                        else
                        {
                            LogHelperEntry lgDelete = Log
                                                      .Create(Log.Types.ItemOperations, LogSourceType.Character, Owner.EntryId)
                                                      .AddAttribute("source", 0.0, "selled_from_private_shop_split")
                                                      .AddItemAttributes(asda2ItemTradeRef1.Item, "")
                                                      .AddAttribute("buyer_id", activeCharacter.EntryId, "")
                                                      .AddAttribute("amount", asda2ItemTradeRef1.Amount, "").Write();
                            asda2ItemTradeRef1.Item.Amount -= asda2ItemTradeRef1.Amount;
                            Asda2Item asda2Item             = null;
                            int num2 = (int)activeCharacter.Asda2Inventory.TryAdd(
                                (int)asda2ItemTradeRef1.Item.Template.ItemId, asda2ItemTradeRef1.Amount, true,
                                ref asda2Item, new Asda2InventoryType?(), asda2ItemTradeRef1.Item);
                            Log.Create(Log.Types.ItemOperations, LogSourceType.Character, activeCharacter.EntryId)
                            .AddAttribute("source", 0.0, "buyed_from_private_shop_split")
                            .AddItemAttributes(asda2Item, "new_item")
                            .AddItemAttributes(asda2ItemTradeRef1.Item, "old_item")
                            .AddAttribute("amount", asda2ItemTradeRef1.Amount, "")
                            .AddAttribute("seller_id", Owner.EntryId, "").AddReference(lgDelete)
                            .Write();
                            asda2ItemTradeRef1.Item.Save();
                            buyedItems.Add(asda2Item);
                        }

                        Asda2ItemTradeRef asda2ItemTradeRef2 = ItemsOnTrade[asda2ItemTradeRef1.TradeSlot];
                        itemsBuyed.Add(asda2ItemTradeRef2);
                        if (asda2ItemTradeRef2 != null && asda2ItemTradeRef2.Amount > 0)
                        {
                            asda2ItemTradeRef2.Amount -= asda2ItemTradeRef1.Amount;
                            if (asda2ItemTradeRef2.Amount <= 0)
                            {
                                asda2ItemTradeRef2.Amount = -1;
                            }
                        }
                    }

                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopResponse(activeCharacter,
                                                                                 PrivateShopBuyResult.Ok, buyedItems);
                    Asda2PrivateShopHandler.SendItemBuyedFromPrivateShopToOwnerNotifyResponse(this, itemsBuyed,
                                                                                              activeCharacter);
                    Asda2PrivateShopHandler.SendPrivateShopChatNotificationAboutBuyResponse(this, itemsBuyed,
                                                                                            activeCharacter);
                    Owner.SendMoneyUpdate();
                    activeCharacter.SendMoneyUpdate();
                }
            });
        }
Ejemplo n.º 3
0
        private static void ProcessFunctionalItem(IRealmClient client, uint parametr, short slot)
        {
            Asda2Item item = client.ActiveCharacter.Asda2Inventory.GetShopShopItem(slot);

            if (item == null)
            {
                FunctionalItemsHandler.SendUpdateShopItemInfoResponse(client,
                                                                      UseFunctionalItemError.FunctionalItemDoesNotExist, (Asda2Item)null);
            }
            else
            {
                UseFunctionalItemError status = UseFunctionalItemError.Ok;
                if ((int)item.RequiredLevel > client.ActiveCharacter.Level)
                {
                    FunctionalItemsHandler.SendUpdateShopItemInfoResponse(client,
                                                                          UseFunctionalItemError.YorLevelIsNotHightEnoght, item);
                }
                else
                {
                    ServerApp <WCell.RealmServer.RealmServer> .IOQueue.AddMessage((Action)(() =>
                    {
                        try
                        {
                            switch (item.Category)
                            {
                            case Asda2ItemCategory.IncPAtk:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncMAtk:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncPDef:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncMdef:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncHp:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncMp:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncStr:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncSta:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncInt:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncSpi:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncDex:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncLuck:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncMoveSpeed:
                                if (client.ActiveCharacter.LastTransportUsedTime +
                                    TimeSpan.FromMilliseconds(30000.0) > DateTime.Now)
                                {
                                    status = UseFunctionalItemError.CoolingTimeRemain;
                                    break;
                                }

                                if (item.Record.IsSoulBound && item.Record.AuctionEndTime != DateTime.MinValue &&
                                    DateTime.Now > item.Record.AuctionEndTime)
                                {
                                    Asda2InventoryHandler.ItemRemovedFromInventoryResponse(client.ActiveCharacter,
                                                                                           item, DeleteOrSellItemStatus.Ok, 0);
                                    item.Destroy();
                                    client.ActiveCharacter.SendInfoMsg("Vehicle expired.");
                                    status = UseFunctionalItemError.TheDurationOfTheShopitemHaExprised;
                                    break;
                                }

                                if (item.Record.AuctionEndTime == DateTime.MinValue)
                                {
                                    item.Record.AuctionEndTime =
                                        DateTime.Now + TimeSpan.FromDays((double)item.AttackTime);
                                }
                                client.ActiveCharacter.LastTransportUsedTime = DateTime.Now;
                                item.IsSoulbound = true;
                                client.ActiveCharacter.TransportItemId = item.ItemId;
                                AchievementProgressRecord progressRecord1 =
                                    client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(85U);
                                switch (++progressRecord1.Counter)
                                {
                                case 1:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.DiscoverTitle(Asda2TitleId.Rapid219)));
                                    break;

                                case 1000:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.GetTitle(Asda2TitleId.Rapid219)));
                                    break;
                                }

                                progressRecord1.SaveAndFlush();
                                break;

                            case Asda2ItemCategory.IncExp:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncDropChance:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncDigChance:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncExpStackable:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.IncAtackSpeed:
                                client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, false);
                                FunctionalItemsHandler.SendShopItemUsedResponse(client, item.ItemId,
                                                                                (int)item.Template.AtackRange);
                                break;

                            case Asda2ItemCategory.ExpandWarehouse:
                                if (client.ActiveCharacter.Record.PremiumWarehouseBagsCount >= (byte)8)
                                {
                                    status = UseFunctionalItemError.WarehouseHasReachedMaxCapacity;
                                    break;
                                }

                                ++client.ActiveCharacter.Record.PremiumWarehouseBagsCount;
                                FunctionalItemsHandler.SendWarehouseSlotsExpandedResponse(client, false);
                                break;

                            case Asda2ItemCategory.ResetAllSkill:
                                FunctionalItemsHandler.ResetSkills(client.ActiveCharacter);
                                Asda2CharacterHandler.SendLearnedSkillsInfo(client.ActiveCharacter);
                                AchievementProgressRecord progressRecord2 =
                                    client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(84U);
                                switch (++progressRecord2.Counter)
                                {
                                case 3:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.DiscoverTitle(Asda2TitleId
                                                                                                                         .Perfectionist218)));
                                    break;

                                case 5:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.GetTitle(Asda2TitleId.Perfectionist218)));
                                    break;
                                }

                                progressRecord2.SaveAndFlush();
                                break;

                            case Asda2ItemCategory.ResetOneSkill:
                                Spell spell1 =
                                    client.ActiveCharacter.Spells.First <Spell>(
                                        (Func <Spell, bool>)(s => (long)s.RealId == (long)parametr));
                                if (spell1 != null)
                                {
                                    int num1 = 0 + spell1.Cost;
                                    for (int index = spell1.Level - 1; index > 0; --index)
                                    {
                                        Spell spell2 =
                                            SpellHandler.Get((uint)spell1.RealId + (uint)(index * 1000));
                                        if (spell2 != null)
                                        {
                                            num1 += spell2.Cost;
                                        }
                                    }

                                    uint num2 = (uint)(num1 / 2);
                                    client.ActiveCharacter.Spells.Remove(spell1);
                                    client.ActiveCharacter.AddMoney(num2);
                                    Asda2CharacterHandler.SendPreResurectResponse(client.ActiveCharacter);
                                    FunctionalItemsHandler.SendSkillResetedResponse(client, spell1.RealId,
                                                                                    (short)spell1.Level, num2);
                                    Asda2CharacterHandler.SendUpdateStatsOneResponse(client);
                                    Asda2CharacterHandler.SendUpdateStatsResponse(client);
                                    client.ActiveCharacter.SendMoneyUpdate();
                                    AchievementProgressRecord progressRecord3 =
                                        client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(84U);
                                    switch (++progressRecord3.Counter)
                                    {
                                    case 3:
                                        client.ActiveCharacter.Map.CallDelayed(500,
                                                                               (Action)(() =>
                                                                                        client.ActiveCharacter.DiscoverTitle(Asda2TitleId
                                                                                                                             .Perfectionist218)));
                                        break;

                                    case 5:
                                        client.ActiveCharacter.Map.CallDelayed(500,
                                                                               (Action)(() =>
                                                                                        client.ActiveCharacter.GetTitle(Asda2TitleId
                                                                                                                        .Perfectionist218)));
                                        break;
                                    }

                                    progressRecord3.SaveAndFlush();
                                    break;
                                }

                                status = UseFunctionalItemError.FailedToUse;
                                client.ActiveCharacter.SendInfoMsg("Skill is not learned. Restart client.");
                                break;

                            case Asda2ItemCategory.TeleportToCharacter:
                                if (parametr >= 10U || client.ActiveCharacter.TeleportPoints[parametr] == null)
                                {
                                    status = UseFunctionalItemError.FailedToUse;
                                    break;
                                }

                                Asda2TeleportingPointRecord teleportPoint =
                                    client.ActiveCharacter.TeleportPoints[parametr];
                                client.ActiveCharacter.TeleportTo(teleportPoint.MapId,
                                                                  new Vector3((float)teleportPoint.X, (float)teleportPoint.Y));
                                AchievementProgressRecord progressRecord4 =
                                    client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(89U);
                                switch (++progressRecord4.Counter)
                                {
                                case 50:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.DiscoverTitle(Asda2TitleId.Traveler223)));
                                    break;

                                case 100:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.GetTitle(Asda2TitleId.Traveler223)));
                                    break;
                                }

                                progressRecord4.SaveAndFlush();
                                break;

                            case Asda2ItemCategory.InstantRecover100PrcHP:
                                if (client.ActiveCharacter.Last100PrcRecoveryUsed + 30000U >
                                    (uint)Environment.TickCount)
                                {
                                    status = UseFunctionalItemError.CoolingTimeRemain;
                                    break;
                                }

                                client.ActiveCharacter.Last100PrcRecoveryUsed = (uint)Environment.TickCount;
                                client.ActiveCharacter.HealPercent(100, (Unit)null, (SpellEffect)null);
                                break;

                            case Asda2ItemCategory.InstantRecover100PrcHPandMP:
                                if (client.ActiveCharacter.Last100PrcRecoveryUsed + 30000U <
                                    (uint)Environment.TickCount)
                                {
                                    status = UseFunctionalItemError.CoolingTimeRemain;
                                }
                                client.ActiveCharacter.HealPercent(100, (Unit)null, (SpellEffect)null);
                                client.ActiveCharacter.Power = client.ActiveCharacter.MaxPower;
                                client.ActiveCharacter.Last100PrcRecoveryUsed = (uint)Environment.TickCount;
                                break;

                            case Asda2ItemCategory.RecoverHp10TimesByPrcOver30Sec:
                                PereodicAction pereodicAction = (PereodicAction)null;
                                if (client.ActiveCharacter.PereodicActions.ContainsKey(Asda2PereodicActionType
                                                                                       .HpRegenPrc))
                                {
                                    pereodicAction =
                                        client.ActiveCharacter.PereodicActions[Asda2PereodicActionType.HpRegenPrc];
                                }
                                if (pereodicAction != null && pereodicAction.CallsNum >= 10 &&
                                    pereodicAction.Value >= item.Template.ValueOnUse)
                                {
                                    status = UseFunctionalItemError.CoolingTimeRemain;
                                    break;
                                }

                                if (client.ActiveCharacter.PereodicActions.ContainsKey(Asda2PereodicActionType
                                                                                       .HpRegenPrc))
                                {
                                    client.ActiveCharacter.PereodicActions.Remove(
                                        Asda2PereodicActionType.HpRegenPrc);
                                }
                                client.ActiveCharacter.PereodicActions.Add(Asda2PereodicActionType.HpRegenPrc,
                                                                           new PereodicAction(client.ActiveCharacter, item.Template.ValueOnUse, 10, 3000,
                                                                                              Asda2PereodicActionType.HpRegenPrc));
                                break;

                            case Asda2ItemCategory.ShopBanner:
                                if (client.ActiveCharacter.Level < 10)
                                {
                                    status = UseFunctionalItemError.YorLevelIsNotHightEnoght;
                                    break;
                                }

                                FunctionalItemsHandler.SendPremiumLongBuffInfoResponse(client,
                                                                                       (byte)client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, true),
                                                                                       item.ItemId, (short)item.Template.PackageId);
                                break;

                            case Asda2ItemCategory.OpenWarehouse:
                                break;

                            case Asda2ItemCategory.PremiumPotions:
                                FunctionalItemsHandler.SendPremiumLongBuffInfoResponse(client,
                                                                                       (byte)client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, true),
                                                                                       item.ItemId, (short)item.Template.PackageId);
                                client.ActiveCharacter.Asda2WingsItemId = (short)item.ItemId;
                                AchievementProgressRecord progressRecord5 =
                                    client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(86U);
                                switch (++progressRecord5.Counter)
                                {
                                case 50:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.DiscoverTitle(Asda2TitleId.Winged220)));
                                    break;

                                case 100:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.GetTitle(Asda2TitleId.Winged220)));
                                    break;
                                }

                                progressRecord5.SaveAndFlush();
                                break;

                            case Asda2ItemCategory.ExpandInventory:
                                FunctionalItemsHandler.SendPremiumLongBuffInfoResponse(client,
                                                                                       (byte)client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, true),
                                                                                       item.ItemId, (short)item.Template.PackageId);
                                AchievementProgressRecord progressRecord6 =
                                    client.ActiveCharacter.Achievements.GetOrCreateProgressRecord(87U);
                                switch (++progressRecord6.Counter)
                                {
                                case 3:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.DiscoverTitle(Asda2TitleId.Packrat221)));
                                    break;

                                case 5:
                                    client.ActiveCharacter.Map.CallDelayed(500,
                                                                           (Action)(() =>
                                                                                    client.ActiveCharacter.GetTitle(Asda2TitleId.Packrat221)));
                                    break;
                                }

                                progressRecord6.SaveAndFlush();
                                break;

                            case Asda2ItemCategory.PetNotEatingByDays:
                                FunctionalItemsHandler.SendPremiumLongBuffInfoResponse(client,
                                                                                       (byte)client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, true),
                                                                                       item.ItemId, (short)item.Template.PackageId);
                                client.ActiveCharacter.Map.CallDelayed(500,
                                                                       (Action)(() => client.ActiveCharacter.GetTitle(Asda2TitleId.Treat366)));
                                break;

                            case Asda2ItemCategory.RemoveDeathPenaltiesByDays:
                                FunctionalItemsHandler.SendPremiumLongBuffInfoResponse(client,
                                                                                       (byte)client.ActiveCharacter.ApplyFunctionItemBuff(item.ItemId, true),
                                                                                       item.ItemId, (short)item.Template.PackageId);
                                break;

                            default:
                                status = UseFunctionalItemError.NotAunctionalItem;
                                break;
                            }
                        }
                        catch (AlreadyBuffedExcepton ex)
                        {
                            status = UseFunctionalItemError.AlreadyFeelingTheEffectOfSimilarSkillType;
                        }

                        if (status == UseFunctionalItemError.Ok && item.Category != Asda2ItemCategory.IncMoveSpeed)
                        {
                            item.ModAmount(-1);
                        }
                        FunctionalItemsHandler.SendUpdateShopItemInfoResponse(client, status, item);
                    }));
                }
            }
        }