コード例 #1
0
        public void Parse(GameClient session, ClientPacket packet)
        {
            if (PlusEnvironment.GetSettingsManager().TryGetValue("catalog.enabled") != "1")
            {
                session.SendNotification("The hotel managers have disabled the catalogue");
                return;
            }

            var pageId    = packet.PopInt();
            var itemId    = packet.PopInt();
            var extraData = packet.PopString();
            var amount    = packet.PopInt();

            CatalogPage page;

            if (!PlusEnvironment.GetGame().GetCatalog().TryGetPage(pageId, out page))
            {
                return;
            }

            if (!page.Enabled || !page.Visible || page.MinimumRank > session.GetHabbo().Rank || page.MinimumRank > session.GetHabbo().VipRank&& session.GetHabbo().Rank == 1)
            {
                return;
            }

            if (!page.Items.TryGetValue(itemId, out var item))
            {
                if (page.ItemOffers.ContainsKey(itemId))
                {
                    item = page.ItemOffers[itemId];
                    if (item == null)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
            }

            if (amount < 1 || amount > 100 || !item.HaveOffer)
            {
                amount = 1;
            }

            var amountPurchase = item.Amount > 1 ? item.Amount : amount;

            var totalCreditsCost = amount > 1 ? item.CostCredits * amount - (int)Math.Floor((double)amount / 6) * item.CostCredits : item.CostCredits;
            var totalPixelCost   = amount > 1 ? item.CostPixels * amount - (int)Math.Floor((double)amount / 6) * item.CostPixels : item.CostPixels;
            var totalDiamondCost = amount > 1 ? item.CostDiamonds * amount - (int)Math.Floor((double)amount / 6) * item.CostDiamonds : item.CostDiamonds;

            if (session.GetHabbo().Credits < totalCreditsCost || session.GetHabbo().Duckets < totalPixelCost || session.GetHabbo().Diamonds < totalDiamondCost)
            {
                return;
            }

            var limitedEditionSells = 0;
            var limitedEditionStack = 0;

            switch (item.Data.InteractionType)
            {
            case InteractionType.None:
                extraData = "";
                break;

            case InteractionType.GuildItem:
            case InteractionType.GuildGate:
                break;

                #region Pet handling

            case InteractionType.Pet:
                try
                {
                    var bits    = extraData.Split('\n');
                    var petName = bits[0];
                    var race    = bits[1];
                    var color   = bits[2];

                    int.Parse(race);     // to trigger any possible errors

                    if (!PetUtility.CheckPetName(petName))
                    {
                        return;
                    }

                    if (race.Length > 2)
                    {
                        return;
                    }

                    if (color.Length != 6)
                    {
                        return;
                    }

                    PlusEnvironment.GetGame().GetAchievementManager().ProgressAchievement(session, "ACH_PetLover", 1);
                }
                catch (Exception e)
                {
                    ExceptionLogger.LogException(e);
                    return;
                }

                break;

                #endregion

            case InteractionType.Floor:
            case InteractionType.Wallpaper:
            case InteractionType.Landscape:

                double number = 0;

                try
                {
                    if (string.IsNullOrEmpty(extraData))
                    {
                        number = 0;
                    }
                    else
                    {
                        number = double.Parse(extraData, PlusEnvironment.CultureInfo);
                    }
                }
                catch (Exception e)
                {
                    ExceptionLogger.LogException(e);
                }

                extraData = number.ToString().Replace(',', '.');
                break;     // maintain extra data // todo: validate

            case InteractionType.Postit:
                extraData = "FFFF33";
                break;

            case InteractionType.Moodlight:
                extraData = "1,1,1,#000000,255";
                break;

            case InteractionType.Trophy:
                extraData = session.GetHabbo().Username + Convert.ToChar(9) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + Convert.ToChar(9) +
                            extraData;
                break;

            case InteractionType.Mannequin:
                extraData = "m" + Convert.ToChar(5) + ".ch-210-1321.lg-285-92" + Convert.ToChar(5) + "Default Mannequin";
                break;

            case InteractionType.BadgeDisplay:
                if (!session.GetHabbo().GetBadgeComponent().HasBadge(extraData))
                {
                    session.SendPacket(new BroadcastMessageAlertComposer("Oops, it appears that you do not own this badge."));
                    return;
                }

                extraData = extraData + Convert.ToChar(9) + session.GetHabbo().Username + Convert.ToChar(9) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" +
                            DateTime.Now.Year;
                break;

            case InteractionType.Badge:
            {
                if (session.GetHabbo().GetBadgeComponent().HasBadge(item.Data.ItemName))
                {
                    session.SendPacket(new PurchaseErrorComposer(1));
                    return;
                }

                break;
            }

            default:
                extraData = "";
                break;
            }

            if (item.IsLimited)
            {
                if (item.LimitedEditionStack <= item.LimitedEditionSells)
                {
                    session.SendNotification("This item has sold out!\n\n" + "Please note, you have not recieved another item (You have also not been charged for it!)");
                    session.SendPacket(new CatalogUpdatedComposer());
                    session.SendPacket(new PurchaseOkComposer());
                    return;
                }

                item.LimitedEditionSells++;
                using (var dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                {
                    dbClient.SetQuery("UPDATE `catalog_items` SET `limited_sells` = @limitSells WHERE `id` = @itemId LIMIT 1");
                    dbClient.AddParameter("limitSells", item.LimitedEditionSells);
                    dbClient.AddParameter("itemId", item.Id);
                    dbClient.RunQuery();

                    limitedEditionSells = item.LimitedEditionSells;
                    limitedEditionStack = item.LimitedEditionStack;
                }
            }

            if (item.CostCredits > 0)
            {
                session.GetHabbo().Credits -= totalCreditsCost;
                session.SendPacket(new CreditBalanceComposer(session.GetHabbo().Credits));
            }

            if (item.CostPixels > 0)
            {
                session.GetHabbo().Duckets -= totalPixelCost;
                session.SendPacket(new HabboActivityPointNotificationComposer(session.GetHabbo().Duckets, session.GetHabbo().Duckets)); //Love you, Tom.
            }

            if (item.CostDiamonds > 0)
            {
                session.GetHabbo().Diamonds -= totalDiamondCost;
                session.SendPacket(new HabboActivityPointNotificationComposer(session.GetHabbo().Diamonds, 0, 5));
            }

            Item newItem = null;
            switch (item.Data.Type.ToString().ToLower())
            {
            default:
                var generatedGenericItems = new List <Item>();

                switch (item.Data.InteractionType)
                {
                default:
                    if (amountPurchase > 1)
                    {
                        var items = ItemFactory.CreateMultipleItems(item.Data, session.GetHabbo(), extraData, amountPurchase);

                        if (items != null)
                        {
                            generatedGenericItems.AddRange(items);
                        }
                    }
                    else
                    {
                        newItem = ItemFactory.CreateSingleItemNullable(item.Data, session.GetHabbo(), extraData, 0, limitedEditionSells, limitedEditionStack);

                        if (newItem != null)
                        {
                            generatedGenericItems.Add(newItem);
                        }
                    }
                    break;

                case InteractionType.GuildGate:
                case InteractionType.GuildItem:
                case InteractionType.GuildForum:
                    if (amountPurchase > 1)
                    {
                        var items = ItemFactory.CreateMultipleItems(item.Data, session.GetHabbo(), extraData, amountPurchase, Convert.ToInt32(extraData));

                        if (items != null)
                        {
                            generatedGenericItems.AddRange(items);
                        }
                    }
                    else
                    {
                        newItem = ItemFactory.CreateSingleItemNullable(item.Data, session.GetHabbo(), extraData, Convert.ToInt32(extraData));

                        if (newItem != null)
                        {
                            generatedGenericItems.Add(newItem);
                        }
                    }
                    break;

                case InteractionType.Arrow:
                case InteractionType.Teleport:
                    for (var i = 0; i < amountPurchase; i++)
                    {
                        var teleItems = ItemFactory.CreateTeleporterItems(item.Data, session.GetHabbo());

                        if (teleItems != null)
                        {
                            generatedGenericItems.AddRange(teleItems);
                        }
                    }

                    break;

                case InteractionType.Moodlight:
                {
                    if (amountPurchase > 1)
                    {
                        var items = ItemFactory.CreateMultipleItems(item.Data, session.GetHabbo(), extraData, amountPurchase);

                        if (items != null)
                        {
                            generatedGenericItems.AddRange(items);
                            foreach (var I in items)
                            {
                                ItemFactory.CreateMoodlightData(I);
                            }
                        }
                    }
                    else
                    {
                        newItem = ItemFactory.CreateSingleItemNullable(item.Data, session.GetHabbo(), extraData);

                        if (newItem != null)
                        {
                            generatedGenericItems.Add(newItem);
                            ItemFactory.CreateMoodlightData(newItem);
                        }
                    }
                }

                break;

                case InteractionType.Toner:
                {
                    if (amountPurchase > 1)
                    {
                        var items = ItemFactory.CreateMultipleItems(item.Data, session.GetHabbo(), extraData, amountPurchase);

                        if (items != null)
                        {
                            generatedGenericItems.AddRange(items);
                            foreach (var I in items)
                            {
                                ItemFactory.CreateTonerData(I);
                            }
                        }
                    }
                    else
                    {
                        newItem = ItemFactory.CreateSingleItemNullable(item.Data, session.GetHabbo(), extraData);

                        if (newItem != null)
                        {
                            generatedGenericItems.Add(newItem);
                            ItemFactory.CreateTonerData(newItem);
                        }
                    }
                }

                break;

                case InteractionType.Deal:
                {
                    CatalogDeal deal = null;
                    if (PlusEnvironment.GetGame().GetCatalog().TryGetDeal(item.Data.BehaviourData, out deal))
                    {
                        foreach (var catalogItem in deal.ItemDataList.ToList())
                        {
                            var items = ItemFactory.CreateMultipleItems(catalogItem.Data, session.GetHabbo(), "", amountPurchase);

                            if (items != null)
                            {
                                generatedGenericItems.AddRange(items);
                            }
                        }
                    }

                    break;
                }

                case InteractionType.Roomdeal:
                {
                    CatalogDeal deal;
                    if (PlusEnvironment.GetGame().GetCatalog().TryGetDeal(item.Data.BehaviourData, out deal))
                    {
                        var room = PlusEnvironment.GetGame().GetRoomManager().LoadRoom(deal.RoomId);

                        if (room == null)
                        {
                            session.SendNotification("There was an error loading this Room Bundle, if this happens again please contact hotel management!");
                            return;
                        }

                        var newRoom = PlusEnvironment.GetGame().GetRoomManager().CreateRoom(session, room.Name, room.Description, room.ModelName, room.Category, 10,
                                                                                            room.TradeSettings, room.Wallpaper, room.Floor, room.Landscape, room.WallThickness, room.FloorThickness);
                        if (newRoom == null)
                        {
                            return;
                        }

                        var myRoom = PlusEnvironment.GetGame().GetRoomManager().LoadRoom(newRoom.Id);
                        if (myRoom != null)
                        {
                            var  items    = ItemLoader.GetItemsForRoom(deal.RoomId, room);
                            Item teleLink = null;

                            foreach (var furni in items)
                            {
                                if (furni.Data.InteractionType == InteractionType.Teleport)
                                {
                                    if (teleLink == null)
                                    {
                                        var teleItems = ItemFactory.CreateTeleporterItems(furni.Data, session.GetHabbo());

                                        if (teleItems != null && teleItems.ToList().Count > 1)
                                        {
                                            myRoom.GetRoomItemHandler().SetFloorItem(session, teleItems[0], furni.GetX, furni.GetY, furni.Rotation, true, true, true, false,
                                                                                     furni.GetZ);
                                            teleLink = teleItems[1];
                                        }
                                    }
                                    else
                                    {
                                        myRoom.GetRoomItemHandler().SetFloorItem(session, teleLink, furni.GetX, furni.GetY, furni.Rotation, true, true, true, false,
                                                                                 furni.GetZ);
                                        teleLink = null;
                                    }
                                }
                                else
                                {
                                    newItem = ItemFactory.CreateSingleItemNullable(furni.Data, session.GetHabbo(), furni.ExtraData, furni.GroupId);

                                    if (newItem != null)
                                    {
                                        if (newItem.IsWallItem)
                                        {
                                            newItem.WallCoord = furni.WallCoord;
                                            myRoom.GetRoomItemHandler().SetWallItem(session, newItem);
                                        }
                                        else
                                        {
                                            myRoom.GetRoomItemHandler().SetFloorItem(session, newItem, furni.GetX, furni.GetY, furni.Rotation, true, true, true, false,
                                                                                     furni.GetZ);
                                        }
                                    }
                                }
                            }

                            session.GetHabbo().PrepareRoom(myRoom.Id, "");
                        }
                    }

                    break;
                }
                }

                foreach (var purchasedItem in generatedGenericItems)
                {
                    if (session.GetHabbo().GetInventoryComponent().TryAddItem(purchasedItem))
                    {
                        //Session.SendMessage(new FurniListAddComposer(PurchasedItem));
                        session.SendPacket(new FurniListNotificationComposer(purchasedItem.Id, 1));
                    }
                }

                break;

            case "e":
                AvatarEffect effect = null;

                if (session.GetHabbo().Effects().HasEffect(item.Data.SpriteId))
                {
                    effect = session.GetHabbo().Effects().GetEffectNullable(item.Data.SpriteId);

                    if (effect != null)
                    {
                        effect.AddToQuantity();
                    }
                }
                else
                {
                    effect = AvatarEffectFactory.CreateNullable(session.GetHabbo(), item.Data.SpriteId, 3600);
                }

                if (effect != null)     // && Session.GetHabbo().Effects().TryAdd(Effect))
                {
                    session.SendPacket(new AvatarEffectAddedComposer(item.Data.SpriteId, 3600));
                }
                break;

            case "r":
                var bot = BotUtility.CreateBot(item.Data, session.GetHabbo().Id);
                if (bot != null)
                {
                    session.GetHabbo().GetInventoryComponent().TryAddBot(bot);
                    session.SendPacket(new BotInventoryComposer(session.GetHabbo().GetInventoryComponent().GetBots()));
                    session.SendPacket(new FurniListNotificationComposer(bot.Id, 5));
                }
                else
                {
                    session.SendNotification("Oops! There was an error whilst purchasing this bot. It seems that there is no bot data for the bot!");
                }
                break;

            case "b":
            {
                session.GetHabbo().GetBadgeComponent().GiveBadge(item.Data.ItemName, true, session);
                session.SendPacket(new FurniListNotificationComposer(0, 4));
                break;
            }

            case "p":
            {
                var petData = extraData.Split('\n');

                var generatedPet = PetUtility.CreatePet(session.GetHabbo().Id, petData[0], item.Data.BehaviourData, petData[1], petData[2]);
                if (generatedPet != null)
                {
                    session.GetHabbo().GetInventoryComponent().TryAddPet(generatedPet);

                    session.SendPacket(new FurniListNotificationComposer(generatedPet.PetId, 3));
                    session.SendPacket(new PetInventoryComposer(session.GetHabbo().GetInventoryComponent().GetPets()));

                    ItemData petFood = null;
                    if (PlusEnvironment.GetGame().GetItemManager().GetItem(320, out petFood))
                    {
                        var food = ItemFactory.CreateSingleItemNullable(petFood, session.GetHabbo(), "");
                        if (food != null)
                        {
                            session.GetHabbo().GetInventoryComponent().TryAddItem(food);
                            session.SendPacket(new FurniListNotificationComposer(food.Id, 1));
                        }
                    }
                }
                break;
            }
            }

            BadgeDefinition badge;

            if (!string.IsNullOrEmpty(item.Badge) &&
                PlusEnvironment.GetGame().GetBadgeManager().TryGetBadge(item.Badge, out badge) &&
                (string.IsNullOrEmpty(badge.RequiredRight) || session.GetHabbo().GetPermissions().HasRight(badge.RequiredRight)))
            {
                session.GetHabbo().GetBadgeComponent().GiveBadge(badge.Code, true, session);
            }

            session.SendPacket(new PurchaseOkComposer(item, item.Data));
            session.SendPacket(new FurniListUpdateComposer());
        }
コード例 #2
0
        public CatalogPageComposer(CatalogPage Page, string CataMode)
            : base(ServerPacketHeader.CatalogPageMessageComposer)
        {
            WriteInteger(Page.Id);
            WriteString(CataMode);
            WriteString(Page.Template);

            WriteInteger(Page.PageStrings1.Count);
            foreach (string s in Page.PageStrings1)
            {
                WriteString(s);
            }

            WriteInteger(Page.PageStrings2.Count);
            foreach (string s in Page.PageStrings2)
            {
                WriteString(s);
            }

            if (!Page.Template.Equals("frontpage") && !Page.Template.Equals("club_buy"))
            {
                WriteInteger(Page.Items.Count);
                foreach (CatalogItem Item in Page.Items.Values)
                {
                    WriteInteger(Item.Id);
                    WriteString(Item.Name);
                    WriteBoolean(false);//IsRentable
                    WriteInteger(Item.CostCredits);

                    if (Item.CostDiamonds > 0)
                    {
                        WriteInteger(Item.CostDiamonds);
                        WriteInteger(5); // Diamonds
                    }
                    else
                    {
                        WriteInteger(Item.CostPixels);
                        WriteInteger(0); // Type of PixelCost
                    }

                    WriteBoolean(ItemUtility.CanGiftItem(Item));

                    if (Item.Data.InteractionType == InteractionType.DEAL || Item.Data.InteractionType == InteractionType.ROOMDEAL)
                    {
                        CatalogDeal deal = null;
                        if (!PlusEnvironment.GetGame().GetCatalog().TryGetDeal(Item.Data.BehaviourData, out deal))
                        {
                            WriteInteger(0);//Count
                        }
                        else
                        {
                            WriteInteger(deal.ItemDataList.Count);

                            foreach (CatalogItem dealItem in deal.ItemDataList.ToList())
                            {
                                WriteString(dealItem.Data.Type.ToString());
                                WriteInteger(dealItem.Data.SpriteId);
                                WriteString("");
                                WriteInteger(dealItem.Amount);
                                WriteBoolean(false);
                            }
                        }
                    }
                    else
                    {
                        WriteInteger(string.IsNullOrEmpty(Item.Badge) ? 1 : 2);//Count 1 item if there is no badge, otherwise count as 2.

                        if (!string.IsNullOrEmpty(Item.Badge))
                        {
                            WriteString("b");
                            WriteString(Item.Badge);
                        }

                        WriteString(Item.Data.Type.ToString());
                        if (Item.Data.Type.ToString().ToLower() == "b")
                        {
                            //This is just a badge, append the name.
                            WriteString(Item.Data.ItemName);
                        }
                        else
                        {
                            WriteInteger(Item.Data.SpriteId);
                            if (Item.Data.InteractionType == InteractionType.WALLPAPER || Item.Data.InteractionType == InteractionType.FLOOR || Item.Data.InteractionType == InteractionType.LANDSCAPE)
                            {
                                WriteString(Item.Name.Split('_')[2]);
                            }
                            else if (Item.Data.InteractionType == InteractionType.BOT)//Bots
                            {
                                CatalogBot CatalogBot = null;
                                if (!PlusEnvironment.GetGame().GetCatalog().TryGetBot(Item.ItemId, out CatalogBot))
                                {
                                    WriteString("hd-180-7.ea-1406-62.ch-210-1321.hr-831-49.ca-1813-62.sh-295-1321.lg-285-92");
                                }
                                else
                                {
                                    WriteString(CatalogBot.Figure);
                                }
                            }
                            else if (Item.ExtraData != null)
                            {
                                WriteString(Item.ExtraData != null ? Item.ExtraData : string.Empty);
                            }
                            WriteInteger(Item.Amount);
                            WriteBoolean(Item.IsLimited); // IsLimited
                            if (Item.IsLimited)
                            {
                                WriteInteger(Item.LimitedEditionStack);
                                WriteInteger(Item.LimitedEditionStack - Item.LimitedEditionSells);
                            }
                        }
                    }
                    WriteInteger(0); //club_level
                    WriteBoolean(ItemUtility.CanSelectAmount(Item));

                    WriteBoolean(false); // TODO: Figure out
                    WriteString("");     //previewImage -> e.g; catalogue/pet_lion.png
                }
            }
            else
            {
                WriteInteger(0);
            }
            WriteInteger(-1);
            WriteBoolean(false);

            WriteInteger(PlusEnvironment.GetGame().GetCatalog().GetPromotions().ToList().Count);//Count
            foreach (CatalogPromotion Promotion in PlusEnvironment.GetGame().GetCatalog().GetPromotions().ToList())
            {
                WriteInteger(Promotion.Id);
                WriteString(Promotion.Title);
                WriteString(Promotion.Image);
                WriteInteger(Promotion.Unknown);
                WriteString(Promotion.PageLink);
                WriteInteger(Promotion.ParentId);
            }
        }
コード例 #3
0
        public void Parse(GameClient Session, ClientPacket Packet)
        {
            if (PlusEnvironment.GetSettingsManager().TryGetValue("catalog.enabled") != "1")
            {
                Session.SendNotification("The hotel managers have disabled the catalogue");
                return;
            }

            int    PageId    = Packet.PopInt();
            int    ItemId    = Packet.PopInt();
            string ExtraData = Packet.PopString();
            int    Amount    = Packet.PopInt();


            CatalogPage Page = null;

            if (!PlusEnvironment.GetGame().GetCatalog().TryGetPage(PageId, out Page))
            {
                return;
            }

            if (!Page.Enabled || !Page.Visible || Page.MinimumRank > Session.GetHabbo().Rank || (Page.MinimumVIP > Session.GetHabbo().VIPRank&& Session.GetHabbo().Rank == 1))
            {
                return;
            }

            CatalogItem Item = null;

            if (!Page.Items.TryGetValue(ItemId, out Item))
            {
                if (Page.ItemOffers.ContainsKey(ItemId))
                {
                    Item = (CatalogItem)Page.ItemOffers[ItemId];
                    if (Item == null)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
            }

            if (Amount < 1 || Amount > 100 || !Item.HaveOffer)
            {
                Amount = 1;
            }

            int AmountPurchase = Item.Amount > 1 ? Item.Amount : Amount;

            int TotalCreditsCost = Amount > 1 ? ((Item.CostCredits * Amount) - ((int)Math.Floor((double)Amount / 6) * Item.CostCredits)) : Item.CostCredits;
            int TotalPixelCost   = Amount > 1 ? ((Item.CostPixels * Amount) - ((int)Math.Floor((double)Amount / 6) * Item.CostPixels)) : Item.CostPixels;
            int TotalDiamondCost = Amount > 1 ? ((Item.CostDiamonds * Amount) - ((int)Math.Floor((double)Amount / 6) * Item.CostDiamonds)) : Item.CostDiamonds;

            if (Session.GetHabbo().Credits < TotalCreditsCost || Session.GetHabbo().Duckets < TotalPixelCost || Session.GetHabbo().Diamonds < TotalDiamondCost)
            {
                return;
            }

            int LimitedEditionSells = 0;
            int LimitedEditionStack = 0;

            #region Create the extradata
            switch (Item.Data.InteractionType)
            {
            case InteractionType.NONE:
                ExtraData = "";
                break;

            case InteractionType.GUILD_ITEM:
            case InteractionType.GUILD_GATE:
                break;

                #region Pet handling

            case InteractionType.PET:
                try
                {
                    string[] Bits    = ExtraData.Split('\n');
                    string   PetName = Bits[0];
                    string   Race    = Bits[1];
                    string   Color   = Bits[2];

                    int.Parse(Race);     // to trigger any possible errors

                    if (!PetUtility.CheckPetName(PetName))
                    {
                        return;
                    }

                    if (Race.Length > 2)
                    {
                        return;
                    }

                    if (Color.Length != 6)
                    {
                        return;
                    }

                    PlusEnvironment.GetGame().GetAchievementManager().ProgressAchievement(Session, "ACH_PetLover", 1);
                }
                catch (Exception e)
                {
                    ExceptionLogger.LogException(e);
                    return;
                }

                break;

                #endregion

            case InteractionType.FLOOR:
            case InteractionType.WALLPAPER:
            case InteractionType.LANDSCAPE:

                Double Number = 0;

                try
                {
                    if (string.IsNullOrEmpty(ExtraData))
                    {
                        Number = 0;
                    }
                    else
                    {
                        Number = Double.Parse(ExtraData, PlusEnvironment.CultureInfo);
                    }
                }
                catch (Exception e)
                {
                    ExceptionLogger.LogException(e);
                }

                ExtraData = Number.ToString().Replace(',', '.');
                break;     // maintain extra data // todo: validate

            case InteractionType.POSTIT:
                ExtraData = "FFFF33";
                break;

            case InteractionType.MOODLIGHT:
                ExtraData = "1,1,1,#000000,255";
                break;

            case InteractionType.TROPHY:
                ExtraData = Session.GetHabbo().Username + Convert.ToChar(9) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + Convert.ToChar(9) + ExtraData;
                break;

            case InteractionType.MANNEQUIN:
                ExtraData = "m" + Convert.ToChar(5) + ".ch-210-1321.lg-285-92" + Convert.ToChar(5) + "Default Mannequin";
                break;

            case InteractionType.BADGE_DISPLAY:
                if (!Session.GetHabbo().GetBadgeComponent().HasBadge(ExtraData))
                {
                    Session.SendPacket(new BroadcastMessageAlertComposer("Oops, it appears that you do not own this badge."));
                    return;
                }

                ExtraData = ExtraData + Convert.ToChar(9) + Session.GetHabbo().Username + Convert.ToChar(9) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year;
                break;

            case InteractionType.BADGE:
            {
                if (Session.GetHabbo().GetBadgeComponent().HasBadge(Item.Data.ItemName))
                {
                    Session.SendPacket(new PurchaseErrorComposer(1));
                    return;
                }
                break;
            }

            default:
                ExtraData = "";
                break;
            }
            #endregion


            if (Item.IsLimited)
            {
                if (Item.LimitedEditionStack <= Item.LimitedEditionSells)
                {
                    Session.SendNotification("This item has sold out!\n\n" + "Please note, you have not recieved another item (You have also not been charged for it!)");
                    Session.SendPacket(new CatalogUpdatedComposer());
                    Session.SendPacket(new PurchaseOKComposer());
                    return;
                }

                Item.LimitedEditionSells++;
                using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                {
                    dbClient.SetQuery("UPDATE `catalog_items` SET `limited_sells` = @limitSells WHERE `id` = @itemId LIMIT 1");
                    dbClient.AddParameter("limitSells", Item.LimitedEditionSells);
                    dbClient.AddParameter("itemId", Item.Id);
                    dbClient.RunQuery();

                    LimitedEditionSells = Item.LimitedEditionSells;
                    LimitedEditionStack = Item.LimitedEditionStack;
                }
            }

            if (Item.CostCredits > 0)
            {
                Session.GetHabbo().Credits -= TotalCreditsCost;
                Session.SendPacket(new CreditBalanceComposer(Session.GetHabbo().Credits));
            }

            if (Item.CostPixels > 0)
            {
                Session.GetHabbo().Duckets -= TotalPixelCost;
                Session.SendPacket(new HabboActivityPointNotificationComposer(Session.GetHabbo().Duckets, Session.GetHabbo().Duckets));//Love you, Tom.
            }

            if (Item.CostDiamonds > 0)
            {
                Session.GetHabbo().Diamonds -= TotalDiamondCost;
                Session.SendPacket(new HabboActivityPointNotificationComposer(Session.GetHabbo().Diamonds, 0, 5));
            }

            Item NewItem = null;
            switch (Item.Data.Type.ToString().ToLower())
            {
            default:
                List <Item> GeneratedGenericItems = new List <Item>();

                switch (Item.Data.InteractionType)
                {
                default:
                    if (AmountPurchase > 1)
                    {
                        List <Item> Items = ItemFactory.CreateMultipleItems(Item.Data, Session.GetHabbo(), ExtraData, AmountPurchase);

                        if (Items != null)
                        {
                            GeneratedGenericItems.AddRange(Items);
                        }
                    }
                    else
                    {
                        NewItem = ItemFactory.CreateSingleItemNullable(Item.Data, Session.GetHabbo(), ExtraData, ExtraData, 0, LimitedEditionSells, LimitedEditionStack);

                        if (NewItem != null)
                        {
                            GeneratedGenericItems.Add(NewItem);
                        }
                    }
                    break;

                case InteractionType.GUILD_GATE:
                case InteractionType.GUILD_ITEM:
                case InteractionType.GUILD_FORUM:
                    if (AmountPurchase > 1)
                    {
                        List <Item> Items = ItemFactory.CreateMultipleItems(Item.Data, Session.GetHabbo(), ExtraData, AmountPurchase, Convert.ToInt32(ExtraData));

                        if (Items != null)
                        {
                            GeneratedGenericItems.AddRange(Items);
                        }
                    }
                    else
                    {
                        NewItem = ItemFactory.CreateSingleItemNullable(Item.Data, Session.GetHabbo(), ExtraData, ExtraData, Convert.ToInt32(ExtraData));

                        if (NewItem != null)
                        {
                            GeneratedGenericItems.Add(NewItem);
                        }
                    }
                    break;

                case InteractionType.ARROW:
                case InteractionType.TELEPORT:
                    for (int i = 0; i < AmountPurchase; i++)
                    {
                        List <Item> TeleItems = ItemFactory.CreateTeleporterItems(Item.Data, Session.GetHabbo());

                        if (TeleItems != null)
                        {
                            GeneratedGenericItems.AddRange(TeleItems);
                        }
                    }
                    break;

                case InteractionType.MOODLIGHT:
                {
                    if (AmountPurchase > 1)
                    {
                        List <Item> Items = ItemFactory.CreateMultipleItems(Item.Data, Session.GetHabbo(), ExtraData, AmountPurchase);

                        if (Items != null)
                        {
                            GeneratedGenericItems.AddRange(Items);
                            foreach (Item I in Items)
                            {
                                ItemFactory.CreateMoodlightData(I);
                            }
                        }
                    }
                    else
                    {
                        NewItem = ItemFactory.CreateSingleItemNullable(Item.Data, Session.GetHabbo(), ExtraData, ExtraData);

                        if (NewItem != null)
                        {
                            GeneratedGenericItems.Add(NewItem);
                            ItemFactory.CreateMoodlightData(NewItem);
                        }
                    }
                }
                break;

                case InteractionType.TONER:
                {
                    if (AmountPurchase > 1)
                    {
                        List <Item> Items = ItemFactory.CreateMultipleItems(Item.Data, Session.GetHabbo(), ExtraData, AmountPurchase);

                        if (Items != null)
                        {
                            GeneratedGenericItems.AddRange(Items);
                            foreach (Item I in Items)
                            {
                                ItemFactory.CreateTonerData(I);
                            }
                        }
                    }
                    else
                    {
                        NewItem = ItemFactory.CreateSingleItemNullable(Item.Data, Session.GetHabbo(), ExtraData, ExtraData);

                        if (NewItem != null)
                        {
                            GeneratedGenericItems.Add(NewItem);
                            ItemFactory.CreateTonerData(NewItem);
                        }
                    }
                }
                break;

                case InteractionType.DEAL:
                {
                    CatalogDeal deal = null;
                    if (PlusEnvironment.GetGame().GetCatalog().TryGetDeal(Item.Data.BehaviourData, out deal))
                    {
                        foreach (CatalogItem CatalogItem in deal.ItemDataList.ToList())
                        {
                            List <Item> Items = ItemFactory.CreateMultipleItems(CatalogItem.Data, Session.GetHabbo(), "", AmountPurchase);

                            if (Items != null)
                            {
                                GeneratedGenericItems.AddRange(Items);
                            }
                        }
                    }
                    break;
                }

                case InteractionType.ROOMDEAL:
                {
                    CatalogDeal deal = null;
                    if (PlusEnvironment.GetGame().GetCatalog().TryGetDeal(Item.Data.BehaviourData, out deal))
                    {
                        Room room = PlusEnvironment.GetGame().GetRoomManager().LoadRoom(deal.RoomId);
                        if (room == null)
                        {
                            Session.SendNotification("There was an error loading this Room Bundle, if this happens again please contact hotel management!");
                        }

                        RoomData newRoom = PlusEnvironment.GetGame().GetRoomManager().CreateRoom(Session, room.Name, room.Description, room.ModelName, room.Category, 10, room.TradeSettings, room.Wallpaper, room.Floor, room.Landscape, room.WallThickness, room.FloorThickness);
                        if (newRoom == null)
                        {
                            return;
                        }

                        Room myRoom = PlusEnvironment.GetGame().GetRoomManager().LoadRoom(newRoom.Id);
                        if (myRoom != null)
                        {
                            List <Item> Items    = ItemLoader.GetItemsForRoom(deal.RoomId, room);
                            Item        teleLink = null;

                            foreach (var furni in Items)
                            {
                                if (furni.Data.InteractionType == InteractionType.TELEPORT)
                                {
                                    if (teleLink == null)
                                    {
                                        List <Item> TeleItems = ItemFactory.CreateTeleporterItems(furni.Data, Session.GetHabbo());

                                        if (TeleItems != null && TeleItems.ToList().Count > 1)
                                        {
                                            myRoom.GetRoomItemHandler().SetFloorItem(Session, TeleItems[0], furni.GetX, furni.GetY, furni.Rotation, true, true, true, false, furni.GetZ);
                                            teleLink = TeleItems[1];
                                        }
                                    }
                                    else
                                    {
                                        myRoom.GetRoomItemHandler().SetFloorItem(Session, teleLink, furni.GetX, furni.GetY, furni.Rotation, true, true, true, false, furni.GetZ);
                                        teleLink = null;
                                    }
                                }
                                else
                                {
                                    NewItem = ItemFactory.CreateSingleItemNullable(furni.Data, Session.GetHabbo(), furni.ExtraData, "", furni.GroupId);

                                    if (NewItem != null)
                                    {
                                        if (NewItem.IsWallItem)
                                        {
                                            NewItem.wallCoord = furni.wallCoord;
                                            myRoom.GetRoomItemHandler().SetWallItem(Session, NewItem);
                                        }
                                        else
                                        {
                                            myRoom.GetRoomItemHandler().SetFloorItem(Session, NewItem, furni.GetX, furni.GetY, furni.Rotation, true, true, true, false, furni.GetZ);
                                        }
                                    }
                                }
                            }
                            Session.GetHabbo().PrepareRoom(myRoom.Id, "");
                        }
                    }
                    break;
                }
                }

                foreach (Item PurchasedItem in GeneratedGenericItems)
                {
                    if (Session.GetHabbo().GetInventoryComponent().TryAddItem(PurchasedItem))
                    {
                        //Session.SendMessage(new FurniListAddComposer(PurchasedItem));
                        Session.SendPacket(new FurniListNotificationComposer(PurchasedItem.Id, 1));
                    }
                }
                break;

            case "e":
                AvatarEffect Effect = null;

                if (Session.GetHabbo().Effects().HasEffect(Item.Data.SpriteId))
                {
                    Effect = Session.GetHabbo().Effects().GetEffectNullable(Item.Data.SpriteId);

                    if (Effect != null)
                    {
                        Effect.AddToQuantity();
                    }
                }
                else
                {
                    Effect = AvatarEffectFactory.CreateNullable(Session.GetHabbo(), Item.Data.SpriteId, 3600);
                }

                if (Effect != null)    // && Session.GetHabbo().Effects().TryAdd(Effect))
                {
                    Session.SendPacket(new AvatarEffectAddedComposer(Item.Data.SpriteId, 3600));
                }
                break;

            case "r":
                Bot Bot = BotUtility.CreateBot(Item.Data, Session.GetHabbo().Id);
                if (Bot != null)
                {
                    Session.GetHabbo().GetInventoryComponent().TryAddBot(Bot);
                    Session.SendPacket(new BotInventoryComposer(Session.GetHabbo().GetInventoryComponent().GetBots()));
                    Session.SendPacket(new FurniListNotificationComposer(Bot.Id, 5));
                }
                else
                {
                    Session.SendNotification("Oops! There was an error whilst purchasing this bot. It seems that there is no bot data for the bot!");
                }
                break;

            case "b":
            {
                Session.GetHabbo().GetBadgeComponent().GiveBadge(Item.Data.ItemName, true, Session);
                Session.SendPacket(new FurniListNotificationComposer(0, 4));
                break;
            }

            case "p":
            {
                string[] PetData = ExtraData.Split('\n');

                Pet GeneratedPet = PetUtility.CreatePet(Session.GetHabbo().Id, PetData[0], Item.Data.BehaviourData, PetData[1], PetData[2]);
                if (GeneratedPet != null)
                {
                    Session.GetHabbo().GetInventoryComponent().TryAddPet(GeneratedPet);

                    Session.SendPacket(new FurniListNotificationComposer(GeneratedPet.PetId, 3));
                    Session.SendPacket(new PetInventoryComposer(Session.GetHabbo().GetInventoryComponent().GetPets()));

                    ItemData PetFood = null;
                    if (PlusEnvironment.GetGame().GetItemManager().GetItem(320, out PetFood))
                    {
                        Item Food = ItemFactory.CreateSingleItemNullable(PetFood, Session.GetHabbo(), "", "");
                        if (Food != null)
                        {
                            Session.GetHabbo().GetInventoryComponent().TryAddItem(Food);
                            Session.SendPacket(new FurniListNotificationComposer(Food.Id, 1));
                        }
                    }
                }
                break;
            }
            }

            BadgeDefinition Badge;

            if (!string.IsNullOrEmpty(Item.Badge) &&
                PlusEnvironment.GetGame().GetBadgeManager().TryGetBadge(Item.Badge, out Badge) &&
                (string.IsNullOrEmpty(Badge.RequiredRight) || Session.GetHabbo().GetPermissions().HasRight(Badge.RequiredRight)))
            {
                Session.GetHabbo().GetBadgeComponent().GiveBadge(Badge.Code, true, Session);
            }

            Session.SendPacket(new PurchaseOKComposer(Item, Item.Data));
            Session.SendPacket(new FurniListUpdateComposer());
        }