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()); }
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); } }
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()); }