From 3858da89aff3ee910296a0bc34d70c46c9bb4640 Mon Sep 17 00:00:00 2001 From: sruon Date: Sat, 11 Apr 2026 21:02:26 -0600 Subject: [PATCH] Validate furniture placement Co-Authored-By: atom0s --- sql/item_furnishing.sql | 1011 ++++++++++--------- src/map/enums/furnishing_placement.h | 35 + src/map/items/item_furnishing.cpp | 42 +- src/map/items/item_furnishing.h | 18 +- src/map/packets/c2s/0x0fa_myroom_layout.cpp | 274 ++++- src/map/packets/c2s/0x0fb_myroom_bankin.cpp | 144 +-- src/map/utils/itemutils.cpp | 14 +- 7 files changed, 921 insertions(+), 617 deletions(-) create mode 100644 src/map/enums/furnishing_placement.h diff --git a/sql/item_furnishing.sql b/sql/item_furnishing.sql index a1f3711f25b..b083b108703 100644 --- a/sql/item_furnishing.sql +++ b/sql/item_furnishing.sql @@ -17,508 +17,529 @@ CREATE TABLE IF NOT EXISTS `item_furnishing` ( `moghancement` smallint(4) unsigned NOT NULL DEFAULT '0', `element` tinyint(3) unsigned NOT NULL DEFAULT '0', `aura` tinyint(3) unsigned NOT NULL DEFAULT '0', + `placement` tinyint(3) unsigned NOT NULL DEFAULT '0', + `size_x` tinyint(3) unsigned NOT NULL DEFAULT '1', + `size_y` tinyint(3) unsigned NOT NULL DEFAULT '1', + `height` smallint(4) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`itemid`) ) ENGINE=Aria TRANSACTIONAL=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AVG_ROW_LENGTH=25 PACK_KEYS=1 CHECKSUM=1; -- -- Contenu de la table `item_furnishing` + +-- Elements +SET @ELEM_FIRE = 1; +SET @ELEM_ICE = 2; +SET @ELEM_WIND = 3; +SET @ELEM_EARTH = 4; +SET @ELEM_LIGHTNING = 5; +SET @ELEM_WATER = 6; +SET @ELEM_LIGHT = 7; +SET @ELEM_DARK = 8; + +-- Furnishing placement +SET @FURN_PLACE_FLOOR = 0; -- Sits on the floor +SET @FURN_PLACE_SURFACE = 1; -- Sits on the floor, other items can go on top (tables, desks) +SET @FURN_PLACE_WALL = 2; -- Hung on a wall slot +SET @FURN_PLACE_ON_TABLE = 3; -- Goes on top of a Surface item (vases, statues) + -- -INSERT INTO `item_furnishing` VALUES (1,'pile_of_chocobo_bedding',1,520,8,2); -INSERT INTO `item_furnishing` VALUES (2,'simple_bed',1,520,6,3); -INSERT INTO `item_furnishing` VALUES (3,'oak_bed',1,520,3,5); -INSERT INTO `item_furnishing` VALUES (4,'mahogany_bed',1,520,7,6); -INSERT INTO `item_furnishing` VALUES (5,'bronze_bed',1,520,2,10); -INSERT INTO `item_furnishing` VALUES (6,'nobles_bed',1,520,5,12); -INSERT INTO `item_furnishing` VALUES (7,'gold_bed',1,520,1,18); -INSERT INTO `item_furnishing` VALUES (8,'royal_bed',2,520,8,24); -INSERT INTO `item_furnishing` VALUES (21,'desk',1,533,3,5); -INSERT INTO `item_furnishing` VALUES (22,'workbench',1,521,4,6); -INSERT INTO `item_furnishing` VALUES (23,'maple_table',1,521,4,8); -INSERT INTO `item_furnishing` VALUES (24,'oak_table',1,521,4,9); -INSERT INTO `item_furnishing` VALUES (26,'tarutaru_desk',2,521,4,4); -INSERT INTO `item_furnishing` VALUES (28,'drawing_desk',1,524,4,9); -INSERT INTO `item_furnishing` VALUES (29,'secretaire',1,533,4,2); -INSERT INTO `item_furnishing` VALUES (30,'bureau',2,515,4,3); -INSERT INTO `item_furnishing` VALUES (32,'dresser',15,518,7,4); -INSERT INTO `item_furnishing` VALUES (33,'millionaire_desk',1,532,8,2); -INSERT INTO `item_furnishing` VALUES (43,'wicker_box',4,514,3,2); -INSERT INTO `item_furnishing` VALUES (46,'armor_box',5,517,6,2); -INSERT INTO `item_furnishing` VALUES (49,'coffer',5,517,6,4); -INSERT INTO `item_furnishing` VALUES (51,'chest',3,517,6,4); -INSERT INTO `item_furnishing` VALUES (54,'chocobo_commode',6,0,6,0); -INSERT INTO `item_furnishing` VALUES (55,'cabinet',7,517,6,9); -INSERT INTO `item_furnishing` VALUES (56,'commode',6,517,6,9); -INSERT INTO `item_furnishing` VALUES (57,'cupboard',6,512,1,6); -INSERT INTO `item_furnishing` VALUES (59,'chiffonier',6,517,6,8); -INSERT INTO `item_furnishing` VALUES (61,'armoire',14,517,6,9); -INSERT INTO `item_furnishing` VALUES (76,'royal_bookshelf',10,514,3,4); -INSERT INTO `item_furnishing` VALUES (77,'bookshelf',20,512,1,8); -INSERT INTO `item_furnishing` VALUES (86,'san_dorian_holiday_tree',1,521,2,1); -INSERT INTO `item_furnishing` VALUES (87,'kadomatsu',1,521,4,1); -INSERT INTO `item_furnishing` VALUES (88,'timepiece',1,519,8,5); -INSERT INTO `item_furnishing` VALUES (89,'wastebasket',2,522,5,2); -INSERT INTO `item_furnishing` VALUES (90,'rusty_bucket',1,534,6,11); -INSERT INTO `item_furnishing` VALUES (91,'blue_pitcher',4,517,6,2); -INSERT INTO `item_furnishing` VALUES (92,'tarutaru_stool',1,522,5,2); -INSERT INTO `item_furnishing` VALUES (93,'water_cask',1,521,6,2); -INSERT INTO `item_furnishing` VALUES (95,'water_barrel',6,517,6,4); -INSERT INTO `item_furnishing` VALUES (96,'beverage_barrel',1,521,6,4); -INSERT INTO `item_furnishing` VALUES (97,'bookholder',1,522,7,1); -INSERT INTO `item_furnishing` VALUES (98,'scimitar_cactus',1,521,7,1); -INSERT INTO `item_furnishing` VALUES (99,'elshimo_palm',1,521,1,2); -INSERT INTO `item_furnishing` VALUES (100,'okadomatsu',2,521,4,2); -INSERT INTO `item_furnishing` VALUES (102,'flower_stand',1,516,5,2); -INSERT INTO `item_furnishing` VALUES (103,'goldfish_bowl',1,517,6,2); -INSERT INTO `item_furnishing` VALUES (104,'tarutaru_folding_screen',1,513,2,3); -INSERT INTO `item_furnishing` VALUES (105,'sky_pot',7,513,2,5); -INSERT INTO `item_furnishing` VALUES (106,'red_jar',7,512,1,5); -INSERT INTO `item_furnishing` VALUES (107,'water_jug',2,517,6,3); -INSERT INTO `item_furnishing` VALUES (109,'urn',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (110,'white_jar',6,518,7,5); -INSERT INTO `item_furnishing` VALUES (112,'yellow_jar',4,515,4,2); -INSERT INTO `item_furnishing` VALUES (113,'cleaning_tool_set',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (114,'my_first_magic_kit',1,516,5,2); -INSERT INTO `item_furnishing` VALUES (115,'bastokan_holiday_tree',1,521,2,1); -INSERT INTO `item_furnishing` VALUES (116,'windurstian_holiday_tree',1,521,2,1); -INSERT INTO `item_furnishing` VALUES (117,'wing_egg',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (118,'lamp_egg',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (119,'flower_egg',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (120,'freshwater_aquarium',1,521,6,5); -INSERT INTO `item_furnishing` VALUES (121,'saltwater_aquarium',1,517,6,5); -INSERT INTO `item_furnishing` VALUES (122,'amir_bed',1,520,1,6); -INSERT INTO `item_furnishing` VALUES (123,'athenienne',1,521,6,2); -INSERT INTO `item_furnishing` VALUES (124,'wardrobe',10,515,4,6); -INSERT INTO `item_furnishing` VALUES (125,'reliquary',8,512,1,2); -INSERT INTO `item_furnishing` VALUES (126,'falsiam_vase',6,516,5,4); -INSERT INTO `item_furnishing` VALUES (127,'coffee_table',1,533,4,7); -INSERT INTO `item_furnishing` VALUES (128,'console',6,516,5,6); -INSERT INTO `item_furnishing` VALUES (129,'imperial_standard',1,532,1,9); -INSERT INTO `item_furnishing` VALUES (130,'marble_bed',1,520,1,16); -INSERT INTO `item_furnishing` VALUES (131,'stationery_set',1,513,2,3); -INSERT INTO `item_furnishing` VALUES (132,'tableware_set',1,516,5,3); -INSERT INTO `item_furnishing` VALUES (133,'tea_set',1,517,6,3); -INSERT INTO `item_furnishing` VALUES (134,'copy_of_emeralda',1,530,5,9); -INSERT INTO `item_furnishing` VALUES (135,'magic_tome_set',1,513,2,2); -INSERT INTO `item_furnishing` VALUES (136,'set_of_kaiserin_cosmetics',1,513,2,1); -INSERT INTO `item_furnishing` VALUES (137,'cordon_bleu_cooking_set',1,531,3,9); -INSERT INTO `item_furnishing` VALUES (138,'jeunoan_tree',4,532,2,3); -INSERT INTO `item_furnishing` VALUES (139,'star_globe',1,533,8,9); -INSERT INTO `item_furnishing` VALUES (140,'dream_platter',2,522,5,3); -INSERT INTO `item_furnishing` VALUES (141,'dream_coffer',2,522,5,3); -INSERT INTO `item_furnishing` VALUES (142,'drogarogas_fang',1,529,8,9); -INSERT INTO `item_furnishing` VALUES (143,'ngoma',2,514,3,4); -INSERT INTO `item_furnishing` VALUES (144,'caisson',5,521,4,3); -INSERT INTO `item_furnishing` VALUES (145,'thurible',1,522,5,8); -INSERT INTO `item_furnishing` VALUES (146,'walahra_burner',3,522,8,4); -INSERT INTO `item_furnishing` VALUES (147,'imperial_tapestry',2,533,1,3); -INSERT INTO `item_furnishing` VALUES (148,'cartonnier',20,521,1,10); -INSERT INTO `item_furnishing` VALUES (149,'set_of_alchemists_tools',1,522,1,4); -INSERT INTO `item_furnishing` VALUES (150,'leather_pot',4,515,4,1); -INSERT INTO `item_furnishing` VALUES (151,'stack_of_fools_gold',1,526,7,9); -INSERT INTO `item_furnishing` VALUES (152,'flowerpot',1,521,7,1); -INSERT INTO `item_furnishing` VALUES (153,'mastersmith_anvil',1,525,1,9); -INSERT INTO `item_furnishing` VALUES (154,'miniature_airship',1,520,7,8); -INSERT INTO `item_furnishing` VALUES (155,'dream_stocking',2,522,5,3); -INSERT INTO `item_furnishing` VALUES (176,'snowman_knight',4,521,2,4); -INSERT INTO `item_furnishing` VALUES (177,'snowman_miner',4,521,2,4); -INSERT INTO `item_furnishing` VALUES (178,'snowman_mage',4,521,2,4); -INSERT INTO `item_furnishing` VALUES (179,'jeweled_egg',1,513,2,2); -INSERT INTO `item_furnishing` VALUES (180,'bonbori',2,521,2,2); -INSERT INTO `item_furnishing` VALUES (181,'san_dorian_flag',1,535,1,9); -INSERT INTO `item_furnishing` VALUES (182,'bastokan_flag',1,536,5,9); -INSERT INTO `item_furnishing` VALUES (183,'windurstian_flag',1,537,3,9); -INSERT INTO `item_furnishing` VALUES (184,'jeunoan_flag',1,539,7,9); -INSERT INTO `item_furnishing` VALUES (185,'rook_banner',1,532,1,7); -INSERT INTO `item_furnishing` VALUES (186,'shield_plaque',1,533,4,3); -INSERT INTO `item_furnishing` VALUES (187,'buckler_plaque',1,533,2,4); -INSERT INTO `item_furnishing` VALUES (188,'copy_of_acolytes_grief',1,522,8,4); -INSERT INTO `item_furnishing` VALUES (189,'copy_of_autumns_end_in_gustaberg',1,519,8,4); -INSERT INTO `item_furnishing` VALUES (190,'copy_of_lines_and_space',1,522,8,5); -INSERT INTO `item_furnishing` VALUES (191,'fishing_hole_map',1,523,6,9); -INSERT INTO `item_furnishing` VALUES (192,'copy_of_hoary_spire',1,538,4,3); -INSERT INTO `item_furnishing` VALUES (193,'adventuring_certificate',1,518,7,3); -INSERT INTO `item_furnishing` VALUES (194,'blacksmiths_plaque',1,525,2,3); -INSERT INTO `item_furnishing` VALUES (195,'stuffed_big_one',1,523,6,5); -INSERT INTO `item_furnishing` VALUES (196,'melodious_egg',1,522,5,4); -INSERT INTO `item_furnishing` VALUES (197,'clockwork_egg',1,522,2,4); -INSERT INTO `item_furnishing` VALUES (198,'gilt_tapestry',1,527,4,9); -INSERT INTO `item_furnishing` VALUES (199,'hatchling_egg',1,522,8,4); -INSERT INTO `item_furnishing` VALUES (200,'tsahyan_mask',1,522,5,3); -INSERT INTO `item_furnishing` VALUES (201,'totem_pole',1,512,1,8); -INSERT INTO `item_furnishing` VALUES (202,'golden_fleece',1,528,2,9); -INSERT INTO `item_furnishing` VALUES (203,'bomb_lantern',1,512,1,2); -INSERT INTO `item_furnishing` VALUES (204,'pumpkin_lantern',1,512,1,2); -INSERT INTO `item_furnishing` VALUES (205,'mandragora_lantern',1,512,1,2); -INSERT INTO `item_furnishing` VALUES (206,'copy_of_ancient_blood',1,522,8,3); -INSERT INTO `item_furnishing` VALUES (207,'fire_lamp',1,512,1,2); -INSERT INTO `item_furnishing` VALUES (208,'ice_lamp',1,513,2,2); -INSERT INTO `item_furnishing` VALUES (209,'wind_lamp',1,514,3,2); -INSERT INTO `item_furnishing` VALUES (210,'earth_lamp',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (211,'lightning_lamp',1,516,5,2); -INSERT INTO `item_furnishing` VALUES (212,'water_lamp',1,517,6,2); -INSERT INTO `item_furnishing` VALUES (213,'light_lamp',1,518,7,2); -INSERT INTO `item_furnishing` VALUES (214,'dark_lamp',1,519,8,2); -INSERT INTO `item_furnishing` VALUES (215,'set_of_festival_dolls',3,512,1,3); -INSERT INTO `item_furnishing` VALUES (216,'porcelain_flowerpot',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (217,'brass_flowerpot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (218,'earthen_flowerpot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (219,'ceramic_flowerpot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (220,'wooden_flowerpot',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (221,'arcane_flowerpot',1,515,4,4); -INSERT INTO `item_furnishing` VALUES (222,'fighting_fish_tank',1,517,6,2); -INSERT INTO `item_furnishing` VALUES (223,'river_aquarium',1,521,6,5); -INSERT INTO `item_furnishing` VALUES (224,'bay_aquarium',1,517,6,5); -INSERT INTO `item_furnishing` VALUES (225,'reef_aquarium',1,517,6,5); -INSERT INTO `item_furnishing` VALUES (246,'blackhorn',1,523,1,4); -INSERT INTO `item_furnishing` VALUES (247,'stripehorn',1,523,1,4); -INSERT INTO `item_furnishing` VALUES (248,'whitehorn',1,523,1,4); -INSERT INTO `item_furnishing` VALUES (256,'hume_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (257,'hume_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (258,'elvaan_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (259,'elvaan_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (260,'tarutaru_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (261,'tarutaru_?_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (262,'mithra_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (263,'galka_mannequin',28,518,7,6); -INSERT INTO `item_furnishing` VALUES (264,'stuffed_chocobo',4,538,1,4); -INSERT INTO `item_furnishing` VALUES (265,'adamantoise_statue',4,515,4,2); -INSERT INTO `item_furnishing` VALUES (266,'behemoth_statue',4,517,6,3); -INSERT INTO `item_furnishing` VALUES (267,'fafnir_statue',4,512,1,3); -INSERT INTO `item_furnishing` VALUES (268,'nomad_moogle_statue',4,518,7,3); -INSERT INTO `item_furnishing` VALUES (269,'shadow_lord_statue',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (270,'odin_statue',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (271,'alexander_statue',4,518,7,5); -INSERT INTO `item_furnishing` VALUES (272,'ark_angel_hm_statue',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (273,'ark_angel_ev_statue',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (274,'ark_angel_tt_statue',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (275,'ark_angel_mr_statue',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (276,'ark_angel_gk_statue',1,519,8,3); -INSERT INTO `item_furnishing` VALUES (277,'prishe_statue',1,538,1,3); -INSERT INTO `item_furnishing` VALUES (278,'cardian_statue',1,514,3,3); -INSERT INTO `item_furnishing` VALUES (279,'shadow_lord_statue_ii',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (280,'shadow_lord_statue_iii',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (281,'atomos_statue',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (282,'yovra_replica',4,523,3,3); -INSERT INTO `item_furnishing` VALUES (284,'goobbue_statue',4,515,4,3); -INSERT INTO `item_furnishing` VALUES (286,'nanaa_mihgo_statue',4,518,7,3); -INSERT INTO `item_furnishing` VALUES (287,'nanaa_mihgo_statue_ii',4,518,7,3); -INSERT INTO `item_furnishing` VALUES (294,'campfire',1,512,1,3); -INSERT INTO `item_furnishing` VALUES (295,'bonfire',1,2850,1,6); -INSERT INTO `item_furnishing` VALUES (303,'crystal_stakes_gold_cup',1,520,3,4); -INSERT INTO `item_furnishing` VALUES (304,'crystal_stakes_mythril_cup',1,520,3,3); -INSERT INTO `item_furnishing` VALUES (305,'crystal_stakes_bronze_cup',1,520,3,2); -INSERT INTO `item_furnishing` VALUES (307,'mythril_trophy',1,514,3,2); -INSERT INTO `item_furnishing` VALUES (308,'bronze_trophy',1,514,3,2); -INSERT INTO `item_furnishing` VALUES (309,'yellow_vcs_plaque',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (310,'black_vcs_plaque',1,519,8,1); -INSERT INTO `item_furnishing` VALUES (311,'red_vcs_plaque',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (312,'blue_vcs_plaque',1,513,2,1); -INSERT INTO `item_furnishing` VALUES (313,'green_vcs_plaque',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (314,'9-drawer_almirah',16,517,6,9); -INSERT INTO `item_furnishing` VALUES (315,'6-drawer_almirah',15,517,6,8); -INSERT INTO `item_furnishing` VALUES (316,'3-drawer_almirah',14,517,6,7); -INSERT INTO `item_furnishing` VALUES (317,'bronze_rose',1,516,5,10); -INSERT INTO `item_furnishing` VALUES (318,'crystal_rose',1,518,7,9); -INSERT INTO `item_furnishing` VALUES (319,'shell_lamp',1,519,8,9); -INSERT INTO `item_furnishing` VALUES (320,'harpsichord',4,538,7,3); -INSERT INTO `item_furnishing` VALUES (321,'mythril_bell',1,520,5,20); -INSERT INTO `item_furnishing` VALUES (322,'horn_trophy',2,532,2,4); -INSERT INTO `item_furnishing` VALUES (323,'sprig_of_red_bamboo_grass',2,538,8,3); -INSERT INTO `item_furnishing` VALUES (324,'sprig_of_blue_bamboo_grass',2,538,8,3); -INSERT INTO `item_furnishing` VALUES (325,'sprig_of_green_bamboo_grass',2,538,8,3); -INSERT INTO `item_furnishing` VALUES (326,'yellow_hobby_bo',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (327,'red_hobby_bo',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (328,'black_hobby_bo',1,519,8,1); -INSERT INTO `item_furnishing` VALUES (329,'blue_hobby_bo',1,513,2,1); -INSERT INTO `item_furnishing` VALUES (330,'green_hobby_bo',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (331,'winged_altar',2,533,7,2); -INSERT INTO `item_furnishing` VALUES (332,'winged_plaque',2,533,7,2); -INSERT INTO `item_furnishing` VALUES (333,'winged_balance',2,533,7,2); -INSERT INTO `item_furnishing` VALUES (334,'blacksmiths_signboard',1,525,1,10); -INSERT INTO `item_furnishing` VALUES (335,'goldsmiths_signboard',1,526,7,10); -INSERT INTO `item_furnishing` VALUES (336,'boneworkers_signboard',1,529,8,10); -INSERT INTO `item_furnishing` VALUES (337,'weavers_signboard',1,527,4,10); -INSERT INTO `item_furnishing` VALUES (338,'culinarians_signboard',1,531,3,10); -INSERT INTO `item_furnishing` VALUES (339,'tanners_signboard',1,528,2,10); -INSERT INTO `item_furnishing` VALUES (340,'fishermans_signboard',1,523,6,10); -INSERT INTO `item_furnishing` VALUES (341,'carpenters_signboard',1,524,4,10); -INSERT INTO `item_furnishing` VALUES (342,'alchemists_signboard',1,530,5,10); -INSERT INTO `item_furnishing` VALUES (343,'harp_stool',2,515,4,2); -INSERT INTO `item_furnishing` VALUES (345,'san_dorian_marriage_certificate',1,538,7,2); -INSERT INTO `item_furnishing` VALUES (346,'bastokan_marriage_certificate',1,538,7,2); -INSERT INTO `item_furnishing` VALUES (347,'windurstian_marriage_certificate',1,538,7,2); -INSERT INTO `item_furnishing` VALUES (348,'marble_plaque',1,539,7,9); -INSERT INTO `item_furnishing` VALUES (349,'royal_squires_bunk',3,520,4,4); -INSERT INTO `item_furnishing` VALUES (350,'republican_legionnaires_bedding',4,520,8,3); -INSERT INTO `item_furnishing` VALUES (351,'federal_mercenarys_hammock',2,520,3,6); -INSERT INTO `item_furnishing` VALUES (352,'half_partition',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (353,'spence',16,516,5,9); -INSERT INTO `item_furnishing` VALUES (354,'bookstack',16,532,4,8); -INSERT INTO `item_furnishing` VALUES (355,'bread_crock',9,519,8,6); -INSERT INTO `item_furnishing` VALUES (356,'set_of_guild_flyers',1,536,5,5); -INSERT INTO `item_furnishing` VALUES (357,'partition',1,521,2,4); -INSERT INTO `item_furnishing` VALUES (358,'credenza',7,515,4,7); -INSERT INTO `item_furnishing` VALUES (359,'bahut',8,521,4,10); -INSERT INTO `item_furnishing` VALUES (360,'matka',2,515,4,7); -INSERT INTO `item_furnishing` VALUES (361,'gallipot',8,515,4,2); -INSERT INTO `item_furnishing` VALUES (362,'fluoro-flora',1,522,7,5); -INSERT INTO `item_furnishing` VALUES (363,'amigo_cactus',2,533,1,4); -INSERT INTO `item_furnishing` VALUES (364,'amiga_cactus',2,532,6,4); -INSERT INTO `item_furnishing` VALUES (365,'poele_classique',3,512,1,4); -INSERT INTO `item_furnishing` VALUES (366,'kanonenofen',3,512,1,4); -INSERT INTO `item_furnishing` VALUES (367,'pot_topper',3,512,1,4); -INSERT INTO `item_furnishing` VALUES (368,'san_dorian_tea_set',1,538,1,6); -INSERT INTO `item_furnishing` VALUES (369,'bastokan_tea_set',1,538,6,6); -INSERT INTO `item_furnishing` VALUES (370,'windurstian_tea_set',1,538,3,6); -INSERT INTO `item_furnishing` VALUES (371,'butterfly_cage',3,514,3,4); -INSERT INTO `item_furnishing` VALUES (372,'cricket_cage',3,516,5,4); -INSERT INTO `item_furnishing` VALUES (373,'glowfly_cage',3,519,8,4); -INSERT INTO `item_furnishing` VALUES (374,'parclose',1,515,4,6); -INSERT INTO `item_furnishing` VALUES (375,'cs_gold_stand',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (376,'cs_mythril_stand',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (377,'cs_bronze_stand',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (378,'blue_9-drawer_almirah',16,513,2,9); -INSERT INTO `item_furnishing` VALUES (379,'blue_6-drawer_almirah',15,513,2,8); -INSERT INTO `item_furnishing` VALUES (380,'blue_3-drawer_almirah',14,513,2,7); -INSERT INTO `item_furnishing` VALUES (381,'green_9-drawer_almirah',16,514,3,9); -INSERT INTO `item_furnishing` VALUES (382,'green_6-drawer_almirah',15,514,3,8); -INSERT INTO `item_furnishing` VALUES (383,'green_3-drawer_almirah',14,514,3,7); -INSERT INTO `item_furnishing` VALUES (384,'yellow_9-drawer_almirah',16,515,4,9); -INSERT INTO `item_furnishing` VALUES (385,'yellow_6-drawer_almirah',15,515,4,8); -INSERT INTO `item_furnishing` VALUES (386,'yellow_3-drawer_almirah',14,515,4,7); -INSERT INTO `item_furnishing` VALUES (387,'white_9-drawer_almirah',16,518,7,9); -INSERT INTO `item_furnishing` VALUES (388,'white_6-drawer_almirah',15,518,7,8); -INSERT INTO `item_furnishing` VALUES (389,'white_3-drawer_almirah',14,518,7,7); -INSERT INTO `item_furnishing` VALUES (390,'carmine_desk',1,533,1,5); -INSERT INTO `item_furnishing` VALUES (391,'cerulean_desk',1,533,2,5); -INSERT INTO `item_furnishing` VALUES (392,'myrtle_desk',1,533,5,5); -INSERT INTO `item_furnishing` VALUES (393,'ecru_desk',1,533,7,5); -INSERT INTO `item_furnishing` VALUES (394,'blue_tarutaru_desk',2,513,2,4); -INSERT INTO `item_furnishing` VALUES (395,'green_tarutaru_desk',2,514,3,4); -INSERT INTO `item_furnishing` VALUES (396,'yellow_tarutaru_desk',2,515,4,4); -INSERT INTO `item_furnishing` VALUES (397,'white_tarutaru_desk',2,518,7,4); -INSERT INTO `item_furnishing` VALUES (398,'red_mahogany_bed',1,520,1,10); -INSERT INTO `item_furnishing` VALUES (399,'blue_mahogany_bed',1,520,6,10); -INSERT INTO `item_furnishing` VALUES (400,'green_mahogany_bed',1,520,3,10); -INSERT INTO `item_furnishing` VALUES (401,'yellow_mahogany_bed',1,520,4,10); -INSERT INTO `item_furnishing` VALUES (402,'blue_nobles_bed',1,520,6,12); -INSERT INTO `item_furnishing` VALUES (403,'green_nobles_bed',1,520,3,12); -INSERT INTO `item_furnishing` VALUES (404,'yellow_nobles_bed',1,520,4,12); -INSERT INTO `item_furnishing` VALUES (405,'white_nobles_bed',1,520,7,12); -INSERT INTO `item_furnishing` VALUES (406,'blue_tarutaru_standing_screen',1,513,2,3); -INSERT INTO `item_furnishing` VALUES (407,'green_tarutaru_standing_screen',1,514,3,3); -INSERT INTO `item_furnishing` VALUES (408,'yellow_tarutaru_standing_screen',1,515,4,3); -INSERT INTO `item_furnishing` VALUES (409,'white_tarutaru_standing_screen',1,518,7,3); -INSERT INTO `item_furnishing` VALUES (410,'red_round_table',5,512,1,3); -INSERT INTO `item_furnishing` VALUES (411,'blue_round_table',5,513,2,3); -INSERT INTO `item_furnishing` VALUES (412,'green_round_table',5,514,3,3); -INSERT INTO `item_furnishing` VALUES (413,'yellow_round_table',5,515,4,3); -INSERT INTO `item_furnishing` VALUES (414,'white_round_table',5,518,7,3); -INSERT INTO `item_furnishing` VALUES (415,'aldebaran_horn',3,538,4,6); -INSERT INTO `item_furnishing` VALUES (416,'tomeshelf',10,519,8,1); -INSERT INTO `item_furnishing` VALUES (417,'storage_hutch',12,515,4,1); -INSERT INTO `item_furnishing` VALUES (418,'tidings_board',4,515,4,4); -INSERT INTO `item_furnishing` VALUES (419,'leisure_table',2,515,4,2); -INSERT INTO `item_furnishing` VALUES (420,'pot_of_meadsweet',1,514,3,4); -INSERT INTO `item_furnishing` VALUES (421,'vase_of_rulude_orchids',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (422,'elshimo_pachira',2,512,1,2); -INSERT INTO `item_furnishing` VALUES (423,'tavern_bench',4,515,4,6); -INSERT INTO `item_furnishing` VALUES (424,'feasting_table',7,515,4,1); -INSERT INTO `item_furnishing` VALUES (425,'girandola',3,512,1,6); -INSERT INTO `item_furnishing` VALUES (426,'orchestrion',2,516,5,6); -INSERT INTO `item_furnishing` VALUES (427,'rococo_table',10,517,6,3); -INSERT INTO `item_furnishing` VALUES (428,'semainier',35,516,8,3); -INSERT INTO `item_furnishing` VALUES (429,'red_storm_lantern',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (430,'blue_storm_lantern',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (431,'green_storm_lantern',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (432,'yellow_storm_lantern',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (433,'white_storm_lantern',1,518,7,1); -INSERT INTO `item_furnishing` VALUES (434,'isula_sideboard',10,520,5,6); -INSERT INTO `item_furnishing` VALUES (435,'jeunoan_dresser',55,520,5,20); -INSERT INTO `item_furnishing` VALUES (436,'jeunoan_armoire',30,520,5,10); -INSERT INTO `item_furnishing` VALUES (437,'floral_nightstand',1,521,7,1); -INSERT INTO `item_furnishing` VALUES (438,'orblight',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (439,'planus_table',5,521,7,3); -INSERT INTO `item_furnishing` VALUES (440,'squat_desk',4,514,3,2); -INSERT INTO `item_furnishing` VALUES (441,'taru_tot_toyset',2,514,3,3); -INSERT INTO `item_furnishing` VALUES (442,'gilded_chest',20,519,8,5); -INSERT INTO `item_furnishing` VALUES (443,'aureous_chest',8,519,8,2); -INSERT INTO `item_furnishing` VALUES (444,'luxurious_chest',8,519,8,2); -INSERT INTO `item_furnishing` VALUES (445,'vaisselier_royale',8,515,4,3); -INSERT INTO `item_furnishing` VALUES (446,'gilded_shelf',40,512,1,5); -INSERT INTO `item_furnishing` VALUES (447,'mensa_lunata',11,514,3,4); -INSERT INTO `item_furnishing` VALUES (448,'gueridon',5,514,3,3); -INSERT INTO `item_furnishing` VALUES (449,'personal_table',7,514,3,2); -INSERT INTO `item_furnishing` VALUES (450,'candelabrum',1,512,1,4); -INSERT INTO `item_furnishing` VALUES (451,'egg_stool',2,538,4,3); -INSERT INTO `item_furnishing` VALUES (452,'egg_table',3,538,3,6); -INSERT INTO `item_furnishing` VALUES (453,'egg_locker',4,538,2,6); -INSERT INTO `item_furnishing` VALUES (454,'egg_lantern',1,538,1,3); -INSERT INTO `item_furnishing` VALUES (455,'egg_buffet',10,538,5,8); -INSERT INTO `item_furnishing` VALUES (456,'pepo_lantern',10,519,8,6); -INSERT INTO `item_furnishing` VALUES (457,'cushaw_lantern',6,519,8,6); -INSERT INTO `item_furnishing` VALUES (458,'calabazilla_lantern',2,519,8,6); -INSERT INTO `item_furnishing` VALUES (459,'candle_holder',1,512,1,4); -INSERT INTO `item_furnishing` VALUES (460,'bakery_platter',1,532,5,3); -INSERT INTO `item_furnishing` VALUES (461,'buffalo_milk_case',4,533,7,1); -INSERT INTO `item_furnishing` VALUES (3584,'panetiere',65,519,8,6); -INSERT INTO `item_furnishing` VALUES (3585,'galley_kitchen',17,534,5,6); -INSERT INTO `item_furnishing` VALUES (3586,'pot_of_red_viola',4,521,1,3); -INSERT INTO `item_furnishing` VALUES (3587,'pot_of_blue_viola',4,521,2,3); -INSERT INTO `item_furnishing` VALUES (3588,'pot_of_yellow_viola',4,521,4,3); -INSERT INTO `item_furnishing` VALUES (3589,'pot_of_white_viola',4,521,7,3); -INSERT INTO `item_furnishing` VALUES (3590,'puce_chest',10,512,1,1); -INSERT INTO `item_furnishing` VALUES (3591,'chest_of_marbled_drawers',45,514,3,5); -INSERT INTO `item_furnishing` VALUES (3592,'jewelry_case',6,512,1,3); -INSERT INTO `item_furnishing` VALUES (3593,'keepsake_case',6,518,7,3); -INSERT INTO `item_furnishing` VALUES (3594,'gemstone_case',6,515,4,3); -INSERT INTO `item_furnishing` VALUES (3595,'gemscope',1,526,7,5); -INSERT INTO `item_furnishing` VALUES (3596,'ornament_case',1,518,7,4); -INSERT INTO `item_furnishing` VALUES (3598,'opus_shelf',14,512,1,4); -INSERT INTO `item_furnishing` VALUES (3600,'bongo_drum',1,2852,4,15); -INSERT INTO `item_furnishing` VALUES (3608,'fictile_pot',5,519,8,5); -INSERT INTO `item_furnishing` VALUES (3609,'stepping_stool',1,519,8,4); -INSERT INTO `item_furnishing` VALUES (3610,'red_mariners_bed',2,520,1,8); -INSERT INTO `item_furnishing` VALUES (3611,'blue_mariners_bed',2,520,2,8); -INSERT INTO `item_furnishing` VALUES (3612,'green_mariners_bed',2,520,3,8); -INSERT INTO `item_furnishing` VALUES (3613,'yellow_mariners_bed',2,520,4,8); -INSERT INTO `item_furnishing` VALUES (3614,'white_mariners_bed',2,520,7,8); -INSERT INTO `item_furnishing` VALUES (3619,'couronne_des_etoiles',4,520,2,4); -INSERT INTO `item_furnishing` VALUES (3620,'silberkranz',4,520,2,4); -INSERT INTO `item_furnishing` VALUES (3621,'leafberry_wreath',4,520,2,4); -INSERT INTO `item_furnishing` VALUES (3622,'jack-o-pricket',1,519,8,4); -INSERT INTO `item_furnishing` VALUES (3623,'djinn_pricket',1,519,8,4); -INSERT INTO `item_furnishing` VALUES (3624,'korrigan_pricket',1,519,8,4); -INSERT INTO `item_furnishing` VALUES (3625,'blacksmiths_stall',20,555,1,11); -INSERT INTO `item_furnishing` VALUES (3626,'goldsmiths_stall',20,556,7,11); -INSERT INTO `item_furnishing` VALUES (3627,'boneworkers_stall',20,559,8,11); -INSERT INTO `item_furnishing` VALUES (3628,'weavers_stall',20,557,4,11); -INSERT INTO `item_furnishing` VALUES (3629,'culinarians_stall',20,561,3,11); -INSERT INTO `item_furnishing` VALUES (3630,'tanners_stall',20,558,2,11); -INSERT INTO `item_furnishing` VALUES (3631,'fishermens_stall',20,553,6,11); -INSERT INTO `item_furnishing` VALUES (3632,'carpenters_stall',20,554,4,11); -INSERT INTO `item_furnishing` VALUES (3633,'alchemists_stall',20,560,5,11); -INSERT INTO `item_furnishing` VALUES (3634,'starlight_cake',1,514,3,4); -INSERT INTO `item_furnishing` VALUES (3635,'buche_des_etoiles',1,561,3,2); -INSERT INTO `item_furnishing` VALUES (3636,'serving_of_bavarois_potiron',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (3637,'banquet_set',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3638,'plate_of_mock_hare',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (3639,'purifying_ewer',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3640,'rolanberry_delightaru',1,513,2,1); -INSERT INTO `item_furnishing` VALUES (3641,'kabuto-kazari',2,520,8,4); -INSERT INTO `item_furnishing` VALUES (3642,'katana-kazari',1,522,5,4); -INSERT INTO `item_furnishing` VALUES (3643,'carillon_vermeil',1,535,3,3); -INSERT INTO `item_furnishing` VALUES (3644,'aeolsglocke',1,536,3,3); -INSERT INTO `item_furnishing` VALUES (3645,'leafbell',1,537,3,3); -INSERT INTO `item_furnishing` VALUES (3646,'mandragora_pricket',1,518,7,4); -INSERT INTO `item_furnishing` VALUES (3647,'spook-a-swirl',1,534,8,4); -INSERT INTO `item_furnishing` VALUES (3648,'chocolate_grumpkin',1,534,8,4); -INSERT INTO `item_furnishing` VALUES (3649,'harvest_horror',1,534,8,4); -INSERT INTO `item_furnishing` VALUES (3650,'prinseggstarta',1,518,7,2); -INSERT INTO `item_furnishing` VALUES (3651,'harvest_pastry',1,2855,7,15); -INSERT INTO `item_furnishing` VALUES (3652,'memorial_cake',3,516,5,5); -INSERT INTO `item_furnishing` VALUES (3653,'banquet_table',5,512,1,3); -INSERT INTO `item_furnishing` VALUES (3654,'tender_bouquet',1,538,7,2); -INSERT INTO `item_furnishing` VALUES (3655,'treasury_table',10,512,1,2); -INSERT INTO `item_furnishing` VALUES (3656,'treasury_stand',10,512,1,2); -INSERT INTO `item_furnishing` VALUES (3657,'sundries_table',10,516,5,2); -INSERT INTO `item_furnishing` VALUES (3658,'sundries_stand',10,516,5,2); -INSERT INTO `item_furnishing` VALUES (3659,'supply_table',10,515,4,2); -INSERT INTO `item_furnishing` VALUES (3660,'supply_stand',10,515,4,2); -INSERT INTO `item_furnishing` VALUES (3661,'stone_hearth',4,525,1,5); -INSERT INTO `item_furnishing` VALUES (3662,'case_of_display_blades',2,512,1,4); -INSERT INTO `item_furnishing` VALUES (3663,'set_of_bonecrafting_tools',4,529,8,5); -INSERT INTO `item_furnishing` VALUES (3664,'shell_assortment',2,519,8,4); -INSERT INTO `item_furnishing` VALUES (3665,'spinning_wheel',4,527,4,5); -INSERT INTO `item_furnishing` VALUES (3666,'set_of_fine_raiments',2,515,4,4); -INSERT INTO `item_furnishing` VALUES (3667,'brass_crock',4,531,3,5); -INSERT INTO `item_furnishing` VALUES (3668,'hide_stretcher',4,528,2,5); -INSERT INTO `item_furnishing` VALUES (3669,'set_of_courier_bags',2,513,2,4); -INSERT INTO `item_furnishing` VALUES (3670,'net_and_lure',4,523,6,5); -INSERT INTO `item_furnishing` VALUES (3671,'set_of_stockfish',2,517,6,4); -INSERT INTO `item_furnishing` VALUES (3672,'carpenters_kit',4,524,4,5); -INSERT INTO `item_furnishing` VALUES (3673,'set_of_chocobo_carvings',2,515,4,4); -INSERT INTO `item_furnishing` VALUES (3674,'alembic',4,530,5,5); -INSERT INTO `item_furnishing` VALUES (3675,'flask_set',2,516,5,4); -INSERT INTO `item_furnishing` VALUES (3676,'celestial_globe',5,519,8,4); -INSERT INTO `item_furnishing` VALUES (3677,'spinet',1,518,7,1); -INSERT INTO `item_furnishing` VALUES (3678,'recital_bench',1,518,7,1); -INSERT INTO `item_furnishing` VALUES (3679,'beastman_gonfalon',5,519,8,9); -INSERT INTO `item_furnishing` VALUES (3680,'copy_of_judgment_day',7,516,5,7); -INSERT INTO `item_furnishing` VALUES (3681,'alzadaal_table',12,518,7,5); -INSERT INTO `item_furnishing` VALUES (3682,'sproutling_board',1,521,7,1); -INSERT INTO `item_furnishing` VALUES (3683,'forestdweller_board',1,521,4,1); -INSERT INTO `item_furnishing` VALUES (3684,'princess_board',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3685,'empress_board',1,516,5,1); -INSERT INTO `item_furnishing` VALUES (3686,'duelist_board',1,512,1,1); -INSERT INTO `item_furnishing` VALUES (3687,'crystal_board',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3688,'dancer_board',1,518,7,1); -INSERT INTO `item_furnishing` VALUES (3689,'wizardess_board',1,519,8,1); -INSERT INTO `item_furnishing` VALUES (3690,'fighter_board',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3691,'guardian_board',1,513,2,1); -INSERT INTO `item_furnishing` VALUES (3692,'stoic_board',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3693,'lamb_carving',1,515,4,3); -INSERT INTO `item_furnishing` VALUES (3694,'polished_lamb_carving',1,515,4,5); -INSERT INTO `item_furnishing` VALUES (3695,'cait_sith_carving',1,540,7,7); -INSERT INTO `item_furnishing` VALUES (3696,'kotatsu_table',1,512,1,3); -INSERT INTO `item_furnishing` VALUES (3697,'mandarin',1,2854,6,6); -INSERT INTO `item_furnishing` VALUES (3698,'cherry_tree',1,515,4,5); -INSERT INTO `item_furnishing` VALUES (3699,'bathtub',1,517,6,3); -INSERT INTO `item_furnishing` VALUES (3700,'shower_stand',1,517,6,3); -INSERT INTO `item_furnishing` VALUES (3701,'awning',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3702,'triangular_jalousie',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3703,'square_jalousie',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3704,'transom',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3705,'far_east_hearth',1,541,1,16); -INSERT INTO `item_furnishing` VALUES (3706,'vanaclock',1,542,7,16); -INSERT INTO `item_furnishing` VALUES (3707,'murrey_grisaille',1,562,7,18); -INSERT INTO `item_furnishing` VALUES (3708,'moss_green_grisaille',1,563,7,18); -INSERT INTO `item_furnishing` VALUES (3709,'valance',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3710,'windurstian_sill',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3711,'san_dorian_sill',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3712,'bastokan_sill',1,514,3,1); -INSERT INTO `item_furnishing` VALUES (3713,'pot_of_wards',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (3714,'pot_of_white_clematis',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (3715,'pot_of_pink_clematis',1,515,4,2); -INSERT INTO `item_furnishing` VALUES (3717,'birch_tree',1,2853,4,5); -INSERT INTO `item_furnishing` VALUES (3718,'handful_of_adoulinian_tomatoes',1,2849,6,6); -INSERT INTO `item_furnishing` VALUES (3719,'prishe_statue_ii',4,512,1,3); -INSERT INTO `item_furnishing` VALUES (3720,'arciela_statue',4,513,2,3); -INSERT INTO `item_furnishing` VALUES (3721,'iroha_statue',4,514,3,3); -INSERT INTO `item_furnishing` VALUES (3722,'lion_statue',4,515,4,3); -INSERT INTO `item_furnishing` VALUES (3723,'lilisette_statue',4,516,5,3); -INSERT INTO `item_furnishing` VALUES (3724,'uka_statue',4,518,7,3); -INSERT INTO `item_furnishing` VALUES (3725,'cornelia_statue',4,514,3,3); -INSERT INTO `item_furnishing` VALUES (3726,'aphmau_statue',4,517,6,3); -INSERT INTO `item_furnishing` VALUES (3727,'mumor_statue',4,518,7,3); -INSERT INTO `item_furnishing` VALUES (3728,'ullegore_statue',4,519,8,3); -INSERT INTO `item_furnishing` VALUES (3729,'light_chest',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3730,'bulky_coffer',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3731,'azure_chest',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3732,'crimson_chest',1,517,6,1); -INSERT INTO `item_furnishing` VALUES (3735,'aurum_coffer',5,540,7,7); -INSERT INTO `item_furnishing` VALUES (3736,'well',80,517,6,8); -INSERT INTO `item_furnishing` VALUES (3737,'doll_stand',2,2855,7,15); -INSERT INTO `item_furnishing` VALUES (3738,'eastern_umbrella',1,521,6,2); -- Moghancement: Gardening - From https://ffxiclopedia.fandom.com/wiki/Eastern_Umbrella (BG doesn't show Moghancement) -INSERT INTO `item_furnishing` VALUES (3739,'autumn_tree',1,515,4,5); -INSERT INTO `item_furnishing` VALUES (3740,'model_synergy_furnace',8,0,8,11); -- TODO: Moghancement: Synergy Skill Gains does not yet exist -INSERT INTO `item_furnishing` VALUES (3741,'model_synergy_furnace_ii',8,0,7,11); -- TODO: Moglification: Furnace Duration does not yet exist -INSERT INTO `item_furnishing` VALUES (3742,'painting_of_a_mercenary',1,0,4,1); -- TODO: Moghancement: Mandragora Mania does not yet exist -INSERT INTO `item_furnishing` VALUES (3743,'moogle_bed',1,520,7,8); -INSERT INTO `item_furnishing` VALUES (3744,'mandragora_pot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3745,'korrigan_pot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3746,'adenium_pot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3747,'citrullus_pot',1,515,4,1); -INSERT INTO `item_furnishing` VALUES (3748,'leafkin_bed',1,520,7,8); -INSERT INTO `item_furnishing` VALUES (3749,'chemistry_set',2,519,8,4); -INSERT INTO `item_furnishing` VALUES (3750,'qiqirn_sack',8,540,7,6); -INSERT INTO `item_furnishing` VALUES (3751,'besigiled_table',5,2852,8,3); -INSERT INTO `item_furnishing` VALUES (3752,'colibri_bed',1,520,7,8); -INSERT INTO `item_furnishing` VALUES (3753,'painting_of_blueblade_fell',1,533,7,3); -INSERT INTO `item_furnishing` VALUES (3754,'kagami_mochi',8,540,7,6); -INSERT INTO `item_furnishing` VALUES (3755,'prismatic_chest',1,0,8,1); -- TODO: Moglification: A.M.A.N. Trove does not yet exist -INSERT INTO `item_furnishing` VALUES (3756,'sachertorte',1,518,7,1); +INSERT INTO `item_furnishing` VALUES (1,'pile_of_chocobo_bedding',1,520,@ELEM_DARK,2,@FURN_PLACE_FLOOR,5,5,160); +INSERT INTO `item_furnishing` VALUES (2,'simple_bed',1,520,@ELEM_WATER,3,@FURN_PLACE_FLOOR,4,6,70); +INSERT INTO `item_furnishing` VALUES (3,'oak_bed',1,520,@ELEM_WIND,5,@FURN_PLACE_FLOOR,4,6,110); +INSERT INTO `item_furnishing` VALUES (4,'mahogany_bed',1,520,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (5,'bronze_bed',1,520,@ELEM_ICE,10,@FURN_PLACE_FLOOR,4,6,170); +INSERT INTO `item_furnishing` VALUES (6,'nobles_bed',1,520,@ELEM_LIGHTNING,12,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (7,'gold_bed',1,520,@ELEM_FIRE,18,@FURN_PLACE_FLOOR,4,6,120); +INSERT INTO `item_furnishing` VALUES (8,'royal_bed',2,520,@ELEM_DARK,24,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (21,'desk',1,533,@ELEM_WIND,5,@FURN_PLACE_SURFACE,3,3,50); +INSERT INTO `item_furnishing` VALUES (22,'workbench',1,521,@ELEM_EARTH,6,@FURN_PLACE_SURFACE,7,3,50); +INSERT INTO `item_furnishing` VALUES (23,'maple_table',1,521,@ELEM_EARTH,8,@FURN_PLACE_SURFACE,3,5,100); +INSERT INTO `item_furnishing` VALUES (24,'oak_table',1,521,@ELEM_EARTH,9,@FURN_PLACE_SURFACE,3,4,100); +INSERT INTO `item_furnishing` VALUES (26,'tarutaru_desk',2,521,@ELEM_EARTH,4,@FURN_PLACE_FLOOR,4,2,90); +INSERT INTO `item_furnishing` VALUES (28,'drawing_desk',1,524,@ELEM_EARTH,9,@FURN_PLACE_FLOOR,2,3,210); +INSERT INTO `item_furnishing` VALUES (29,'secretaire',1,533,@ELEM_EARTH,2,@FURN_PLACE_SURFACE,4,3,110); +INSERT INTO `item_furnishing` VALUES (30,'bureau',2,515,@ELEM_EARTH,3,@FURN_PLACE_FLOOR,3,2,180); +INSERT INTO `item_furnishing` VALUES (32,'dresser',15,518,@ELEM_LIGHT,4,@FURN_PLACE_FLOOR,2,1,200); +INSERT INTO `item_furnishing` VALUES (33,'millionaire_desk',1,532,@ELEM_DARK,2,@FURN_PLACE_SURFACE,5,2,120); +INSERT INTO `item_furnishing` VALUES (43,'wicker_box',4,514,@ELEM_WIND,2,@FURN_PLACE_SURFACE,2,2,80); +INSERT INTO `item_furnishing` VALUES (46,'armor_box',5,517,@ELEM_WATER,2,@FURN_PLACE_FLOOR,2,2,100); +INSERT INTO `item_furnishing` VALUES (49,'coffer',5,517,@ELEM_WATER,4,@FURN_PLACE_SURFACE,4,2,90); +INSERT INTO `item_furnishing` VALUES (51,'chest',3,517,@ELEM_WATER,4,@FURN_PLACE_SURFACE,3,1,100); +INSERT INTO `item_furnishing` VALUES (54,'chocobo_commode',6,0,@ELEM_WATER,0,@FURN_PLACE_SURFACE,3,2,150); +INSERT INTO `item_furnishing` VALUES (55,'cabinet',7,517,@ELEM_WATER,9,@FURN_PLACE_SURFACE,3,2,180); +INSERT INTO `item_furnishing` VALUES (56,'commode',6,517,@ELEM_WATER,9,@FURN_PLACE_SURFACE,3,2,150); +INSERT INTO `item_furnishing` VALUES (57,'cupboard',6,512,@ELEM_FIRE,6,@FURN_PLACE_FLOOR,3,2,250); +INSERT INTO `item_furnishing` VALUES (59,'chiffonier',6,517,@ELEM_WATER,8,@FURN_PLACE_SURFACE,2,2,150); +INSERT INTO `item_furnishing` VALUES (61,'armoire',14,517,@ELEM_WATER,9,@FURN_PLACE_SURFACE,3,2,250); +INSERT INTO `item_furnishing` VALUES (76,'royal_bookshelf',10,514,@ELEM_WIND,4,@FURN_PLACE_SURFACE,3,2,210); +INSERT INTO `item_furnishing` VALUES (77,'bookshelf',20,512,@ELEM_FIRE,8,@FURN_PLACE_SURFACE,5,2,180); +INSERT INTO `item_furnishing` VALUES (86,'san_dorian_holiday_tree',1,521,@ELEM_ICE,1,@FURN_PLACE_FLOOR,3,3,310); +INSERT INTO `item_furnishing` VALUES (87,'kadomatsu',1,521,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,3,2,200); +INSERT INTO `item_furnishing` VALUES (88,'timepiece',1,519,@ELEM_DARK,5,@FURN_PLACE_ON_TABLE,1,1,110); +INSERT INTO `item_furnishing` VALUES (89,'wastebasket',2,522,@ELEM_LIGHTNING,2,@FURN_PLACE_FLOOR,2,2,80); +INSERT INTO `item_furnishing` VALUES (90,'rusty_bucket',1,534,@ELEM_WATER,11,@FURN_PLACE_FLOOR,1,1,60); +INSERT INTO `item_furnishing` VALUES (91,'blue_pitcher',4,517,@ELEM_WATER,2,@FURN_PLACE_ON_TABLE,1,1,50); +INSERT INTO `item_furnishing` VALUES (92,'tarutaru_stool',1,522,@ELEM_LIGHTNING,2,@FURN_PLACE_FLOOR,2,2,30); +INSERT INTO `item_furnishing` VALUES (93,'water_cask',1,521,@ELEM_WATER,2,@FURN_PLACE_FLOOR,1,1,70); +INSERT INTO `item_furnishing` VALUES (95,'water_barrel',6,517,@ELEM_WATER,4,@FURN_PLACE_FLOOR,2,2,120); +INSERT INTO `item_furnishing` VALUES (96,'beverage_barrel',1,521,@ELEM_WATER,4,@FURN_PLACE_FLOOR,2,3,150); +INSERT INTO `item_furnishing` VALUES (97,'bookholder',1,522,@ELEM_LIGHT,1,@FURN_PLACE_FLOOR,1,1,90); +INSERT INTO `item_furnishing` VALUES (98,'scimitar_cactus',1,521,@ELEM_LIGHT,1,@FURN_PLACE_ON_TABLE,3,3,190); +INSERT INTO `item_furnishing` VALUES (99,'elshimo_palm',1,521,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,3,3,300); +INSERT INTO `item_furnishing` VALUES (100,'okadomatsu',2,521,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,5,3,400); +INSERT INTO `item_furnishing` VALUES (102,'flower_stand',1,516,@ELEM_LIGHTNING,2,@FURN_PLACE_SURFACE,1,1,130); +INSERT INTO `item_furnishing` VALUES (103,'goldfish_bowl',1,517,@ELEM_WATER,2,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (104,'tarutaru_folding_screen',1,513,@ELEM_ICE,3,@FURN_PLACE_FLOOR,7,1,270); +INSERT INTO `item_furnishing` VALUES (105,'sky_pot',7,513,@ELEM_ICE,5,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (106,'red_jar',7,512,@ELEM_FIRE,5,@FURN_PLACE_ON_TABLE,2,2,80); +INSERT INTO `item_furnishing` VALUES (107,'water_jug',2,517,@ELEM_WATER,3,@FURN_PLACE_ON_TABLE,2,2,130); +INSERT INTO `item_furnishing` VALUES (109,'urn',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (110,'white_jar',6,518,@ELEM_LIGHT,5,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (112,'yellow_jar',4,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,1,1,50); +INSERT INTO `item_furnishing` VALUES (113,'cleaning_tool_set',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,2,1,160); +INSERT INTO `item_furnishing` VALUES (114,'my_first_magic_kit',1,516,@ELEM_LIGHTNING,2,@FURN_PLACE_FLOOR,2,2,200); +INSERT INTO `item_furnishing` VALUES (115,'bastokan_holiday_tree',1,521,@ELEM_ICE,1,@FURN_PLACE_FLOOR,3,3,210); +INSERT INTO `item_furnishing` VALUES (116,'windurstian_holiday_tree',1,521,@ELEM_ICE,1,@FURN_PLACE_FLOOR,3,3,150); +INSERT INTO `item_furnishing` VALUES (117,'wing_egg',1,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,1,1,85); +INSERT INTO `item_furnishing` VALUES (118,'lamp_egg',1,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,1,1,75); +INSERT INTO `item_furnishing` VALUES (119,'flower_egg',1,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,1,1,75); +INSERT INTO `item_furnishing` VALUES (120,'freshwater_aquarium',1,521,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,3,1,120); +INSERT INTO `item_furnishing` VALUES (121,'saltwater_aquarium',1,517,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,3,1,120); +INSERT INTO `item_furnishing` VALUES (122,'amir_bed',1,520,@ELEM_FIRE,6,@FURN_PLACE_FLOOR,4,6,120); +INSERT INTO `item_furnishing` VALUES (123,'athenienne',1,521,@ELEM_WATER,2,@FURN_PLACE_SURFACE,1,1,90); +INSERT INTO `item_furnishing` VALUES (124,'wardrobe',10,515,@ELEM_EARTH,6,@FURN_PLACE_SURFACE,2,2,240); +INSERT INTO `item_furnishing` VALUES (125,'reliquary',8,512,@ELEM_FIRE,2,@FURN_PLACE_FLOOR,2,2,60); +INSERT INTO `item_furnishing` VALUES (126,'falsiam_vase',6,516,@ELEM_LIGHTNING,4,@FURN_PLACE_FLOOR,2,2,140); +INSERT INTO `item_furnishing` VALUES (127,'coffee_table',1,533,@ELEM_EARTH,7,@FURN_PLACE_SURFACE,5,3,90); +INSERT INTO `item_furnishing` VALUES (128,'console',6,516,@ELEM_LIGHTNING,6,@FURN_PLACE_SURFACE,3,2,120); +INSERT INTO `item_furnishing` VALUES (129,'imperial_standard',1,532,@ELEM_FIRE,9,@FURN_PLACE_WALL,1,1,60); +INSERT INTO `item_furnishing` VALUES (130,'marble_bed',1,520,@ELEM_FIRE,16,@FURN_PLACE_FLOOR,4,6,120); +INSERT INTO `item_furnishing` VALUES (131,'stationery_set',1,513,@ELEM_ICE,3,@FURN_PLACE_ON_TABLE,3,2,40); +INSERT INTO `item_furnishing` VALUES (132,'tableware_set',1,516,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,3,2,60); +INSERT INTO `item_furnishing` VALUES (133,'tea_set',1,517,@ELEM_WATER,3,@FURN_PLACE_ON_TABLE,3,2,50); +INSERT INTO `item_furnishing` VALUES (134,'copy_of_emeralda',1,530,@ELEM_LIGHTNING,9,@FURN_PLACE_ON_TABLE,3,3,280); +INSERT INTO `item_furnishing` VALUES (135,'magic_tome_set',1,513,@ELEM_ICE,2,@FURN_PLACE_ON_TABLE,2,2,30); +INSERT INTO `item_furnishing` VALUES (136,'set_of_kaiserin_cosmetics',1,513,@ELEM_ICE,1,@FURN_PLACE_ON_TABLE,2,1,40); +INSERT INTO `item_furnishing` VALUES (137,'cordon_bleu_cooking_set',1,531,@ELEM_WIND,9,@FURN_PLACE_ON_TABLE,3,2,40); +INSERT INTO `item_furnishing` VALUES (138,'jeunoan_tree',4,532,@ELEM_ICE,3,@FURN_PLACE_FLOOR,3,3,350); +INSERT INTO `item_furnishing` VALUES (139,'star_globe',1,533,@ELEM_DARK,9,@FURN_PLACE_ON_TABLE,3,3,180); +INSERT INTO `item_furnishing` VALUES (140,'dream_platter',2,522,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,2,2,34); +INSERT INTO `item_furnishing` VALUES (141,'dream_coffer',2,522,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (142,'drogarogas_fang',1,529,@ELEM_DARK,9,@FURN_PLACE_ON_TABLE,2,2,40); +INSERT INTO `item_furnishing` VALUES (143,'ngoma',2,514,@ELEM_WIND,4,@FURN_PLACE_FLOOR,2,2,60); +INSERT INTO `item_furnishing` VALUES (144,'caisson',5,521,@ELEM_EARTH,3,@FURN_PLACE_SURFACE,5,2,50); +INSERT INTO `item_furnishing` VALUES (145,'thurible',1,522,@ELEM_LIGHTNING,8,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (146,'walahra_burner',3,522,@ELEM_DARK,4,@FURN_PLACE_FLOOR,2,2,60); +INSERT INTO `item_furnishing` VALUES (147,'imperial_tapestry',2,533,@ELEM_FIRE,3,@FURN_PLACE_WALL,1,1,60); +INSERT INTO `item_furnishing` VALUES (148,'cartonnier',20,521,@ELEM_FIRE,10,@FURN_PLACE_SURFACE,6,2,240); +INSERT INTO `item_furnishing` VALUES (149,'set_of_alchemists_tools',1,522,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (150,'leather_pot',4,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,60); +INSERT INTO `item_furnishing` VALUES (151,'stack_of_fools_gold',1,526,@ELEM_LIGHT,9,@FURN_PLACE_ON_TABLE,3,1,50); +INSERT INTO `item_furnishing` VALUES (152,'flowerpot',1,521,@ELEM_LIGHT,1,@FURN_PLACE_ON_TABLE,4,2,100); +INSERT INTO `item_furnishing` VALUES (153,'mastersmith_anvil',1,525,@ELEM_FIRE,9,@FURN_PLACE_ON_TABLE,3,3,30); +INSERT INTO `item_furnishing` VALUES (154,'miniature_airship',1,520,@ELEM_LIGHT,8,@FURN_PLACE_ON_TABLE,3,2,100); +INSERT INTO `item_furnishing` VALUES (155,'dream_stocking',2,522,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,1,1,55); +INSERT INTO `item_furnishing` VALUES (176,'snowman_knight',4,521,@ELEM_ICE,4,@FURN_PLACE_FLOOR,2,2,200); +INSERT INTO `item_furnishing` VALUES (177,'snowman_miner',4,521,@ELEM_ICE,4,@FURN_PLACE_FLOOR,2,2,180); +INSERT INTO `item_furnishing` VALUES (178,'snowman_mage',4,521,@ELEM_ICE,4,@FURN_PLACE_FLOOR,2,2,120); +INSERT INTO `item_furnishing` VALUES (179,'jeweled_egg',1,513,@ELEM_ICE,2,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (180,'bonbori',2,521,@ELEM_ICE,2,@FURN_PLACE_ON_TABLE,2,2,110); +INSERT INTO `item_furnishing` VALUES (181,'san_dorian_flag',1,535,@ELEM_FIRE,9,@FURN_PLACE_WALL,3,1,250); +INSERT INTO `item_furnishing` VALUES (182,'bastokan_flag',1,536,@ELEM_LIGHTNING,9,@FURN_PLACE_WALL,3,1,240); +INSERT INTO `item_furnishing` VALUES (183,'windurstian_flag',1,537,@ELEM_WIND,9,@FURN_PLACE_WALL,3,1,250); +INSERT INTO `item_furnishing` VALUES (184,'jeunoan_flag',1,539,@ELEM_LIGHT,9,@FURN_PLACE_WALL,3,1,240); +INSERT INTO `item_furnishing` VALUES (185,'rook_banner',1,532,@ELEM_FIRE,7,@FURN_PLACE_WALL,3,1,300); +INSERT INTO `item_furnishing` VALUES (186,'shield_plaque',1,533,@ELEM_EARTH,3,@FURN_PLACE_WALL,3,1,130); +INSERT INTO `item_furnishing` VALUES (187,'buckler_plaque',1,533,@ELEM_ICE,4,@FURN_PLACE_WALL,3,1,100); +INSERT INTO `item_furnishing` VALUES (188,'copy_of_acolytes_grief',1,522,@ELEM_DARK,4,@FURN_PLACE_WALL,1,1,50); +INSERT INTO `item_furnishing` VALUES (189,'copy_of_autumns_end_in_gustaberg',1,519,@ELEM_DARK,4,@FURN_PLACE_WALL,2,2,100); +INSERT INTO `item_furnishing` VALUES (190,'copy_of_lines_and_space',1,522,@ELEM_DARK,5,@FURN_PLACE_WALL,3,3,140); +INSERT INTO `item_furnishing` VALUES (191,'fishing_hole_map',1,523,@ELEM_WATER,9,@FURN_PLACE_WALL,2,1,80); +INSERT INTO `item_furnishing` VALUES (192,'copy_of_hoary_spire',1,538,@ELEM_EARTH,3,@FURN_PLACE_WALL,2,1,300); +INSERT INTO `item_furnishing` VALUES (193,'adventuring_certificate',1,518,@ELEM_LIGHT,3,@FURN_PLACE_WALL,2,1,120); +INSERT INTO `item_furnishing` VALUES (194,'blacksmiths_plaque',1,525,@ELEM_ICE,3,@FURN_PLACE_WALL,4,1,200); +INSERT INTO `item_furnishing` VALUES (195,'stuffed_big_one',1,523,@ELEM_WATER,5,@FURN_PLACE_WALL,4,1,120); +INSERT INTO `item_furnishing` VALUES (196,'melodious_egg',1,522,@ELEM_LIGHTNING,4,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (197,'clockwork_egg',1,522,@ELEM_ICE,4,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (198,'gilt_tapestry',1,527,@ELEM_EARTH,9,@FURN_PLACE_WALL,3,1,370); +INSERT INTO `item_furnishing` VALUES (199,'hatchling_egg',1,522,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (200,'tsahyan_mask',1,522,@ELEM_LIGHTNING,3,@FURN_PLACE_WALL,2,1,240); +INSERT INTO `item_furnishing` VALUES (201,'totem_pole',1,512,@ELEM_FIRE,8,@FURN_PLACE_FLOOR,3,2,380); +INSERT INTO `item_furnishing` VALUES (202,'golden_fleece',1,528,@ELEM_ICE,9,@FURN_PLACE_WALL,3,1,250); +INSERT INTO `item_furnishing` VALUES (203,'bomb_lantern',1,512,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (204,'pumpkin_lantern',1,512,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (205,'mandragora_lantern',1,512,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (206,'copy_of_ancient_blood',1,522,@ELEM_DARK,3,@FURN_PLACE_WALL,3,1,140); +INSERT INTO `item_furnishing` VALUES (207,'fire_lamp',1,512,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (208,'ice_lamp',1,513,@ELEM_ICE,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (209,'wind_lamp',1,514,@ELEM_WIND,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (210,'earth_lamp',1,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (211,'lightning_lamp',1,516,@ELEM_LIGHTNING,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (212,'water_lamp',1,517,@ELEM_WATER,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (213,'light_lamp',1,518,@ELEM_LIGHT,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (214,'dark_lamp',1,519,@ELEM_DARK,2,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (215,'set_of_festival_dolls',3,512,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,2,2,50); +INSERT INTO `item_furnishing` VALUES (216,'porcelain_flowerpot',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (217,'brass_flowerpot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (218,'earthen_flowerpot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (219,'ceramic_flowerpot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (220,'wooden_flowerpot',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (221,'arcane_flowerpot',1,515,@ELEM_EARTH,4,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (222,'fighting_fish_tank',1,517,@ELEM_WATER,2,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (223,'river_aquarium',1,521,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,3,1,60); +INSERT INTO `item_furnishing` VALUES (224,'bay_aquarium',1,517,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,3,1,60); +INSERT INTO `item_furnishing` VALUES (225,'reef_aquarium',1,517,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,3,1,60); +INSERT INTO `item_furnishing` VALUES (246,'blackhorn',1,523,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,1,100); +INSERT INTO `item_furnishing` VALUES (247,'stripehorn',1,523,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,1,75); +INSERT INTO `item_furnishing` VALUES (248,'whitehorn',1,523,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,1,75); +INSERT INTO `item_furnishing` VALUES (256,'hume_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (257,'hume_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (258,'elvaan_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (259,'elvaan_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (260,'tarutaru_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (261,'tarutaru_?_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (262,'mithra_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (263,'galka_mannequin',28,518,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (264,'stuffed_chocobo',4,538,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,2,1); +INSERT INTO `item_furnishing` VALUES (265,'adamantoise_statue',4,515,@ELEM_EARTH,2,@FURN_PLACE_ON_TABLE,2,1,1); +INSERT INTO `item_furnishing` VALUES (266,'behemoth_statue',4,517,@ELEM_WATER,3,@FURN_PLACE_ON_TABLE,2,1,1); +INSERT INTO `item_furnishing` VALUES (267,'fafnir_statue',4,512,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,2,1,1); +INSERT INTO `item_furnishing` VALUES (268,'nomad_moogle_statue',4,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (269,'shadow_lord_statue',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (270,'odin_statue',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (271,'alexander_statue',4,518,@ELEM_LIGHT,5,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (272,'ark_angel_hm_statue',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (273,'ark_angel_ev_statue',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (274,'ark_angel_tt_statue',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (275,'ark_angel_mr_statue',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (276,'ark_angel_gk_statue',1,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (277,'prishe_statue',1,538,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (278,'cardian_statue',1,514,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (279,'shadow_lord_statue_ii',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (280,'shadow_lord_statue_iii',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (281,'atomos_statue',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (282,'yovra_replica',4,523,@ELEM_WIND,3,@FURN_PLACE_FLOOR,5,5,260); +INSERT INTO `item_furnishing` VALUES (284,'goobbue_statue',4,515,@ELEM_EARTH,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (286,'nanaa_mihgo_statue',4,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (287,'nanaa_mihgo_statue_ii',4,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,1); +INSERT INTO `item_furnishing` VALUES (294,'campfire',1,512,@ELEM_FIRE,3,@FURN_PLACE_FLOOR,3,3,3); +INSERT INTO `item_furnishing` VALUES (295,'bonfire',1,2850,@ELEM_FIRE,6,@FURN_PLACE_FLOOR,3,3,3); +INSERT INTO `item_furnishing` VALUES (303,'crystal_stakes_gold_cup',1,520,@ELEM_WIND,4,@FURN_PLACE_ON_TABLE,1,1,120); +INSERT INTO `item_furnishing` VALUES (304,'crystal_stakes_mythril_cup',1,520,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,120); +INSERT INTO `item_furnishing` VALUES (305,'crystal_stakes_bronze_cup',1,520,@ELEM_WIND,2,@FURN_PLACE_ON_TABLE,1,1,120); +INSERT INTO `item_furnishing` VALUES (307,'mythril_trophy',1,514,@ELEM_WIND,2,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (308,'bronze_trophy',1,514,@ELEM_WIND,2,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (309,'yellow_vcs_plaque',1,515,@ELEM_EARTH,1,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (310,'black_vcs_plaque',1,519,@ELEM_DARK,1,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (311,'red_vcs_plaque',1,512,@ELEM_FIRE,1,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (312,'blue_vcs_plaque',1,513,@ELEM_ICE,1,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (313,'green_vcs_plaque',1,514,@ELEM_WIND,1,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (314,'9-drawer_almirah',16,517,@ELEM_WATER,9,@FURN_PLACE_SURFACE,6,2,120); +INSERT INTO `item_furnishing` VALUES (315,'6-drawer_almirah',15,517,@ELEM_WATER,8,@FURN_PLACE_SURFACE,6,2,80); +INSERT INTO `item_furnishing` VALUES (316,'3-drawer_almirah',14,517,@ELEM_WATER,7,@FURN_PLACE_SURFACE,6,2,40); +INSERT INTO `item_furnishing` VALUES (317,'bronze_rose',1,516,@ELEM_LIGHTNING,10,@FURN_PLACE_ON_TABLE,1,1,70); +INSERT INTO `item_furnishing` VALUES (318,'crystal_rose',1,518,@ELEM_LIGHT,9,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (319,'shell_lamp',1,519,@ELEM_DARK,9,@FURN_PLACE_FLOOR,3,2,140); +INSERT INTO `item_furnishing` VALUES (320,'harpsichord',4,538,@ELEM_LIGHT,3,@FURN_PLACE_FLOOR,4,2,320); +INSERT INTO `item_furnishing` VALUES (321,'mythril_bell',1,520,@ELEM_LIGHTNING,20,@FURN_PLACE_ON_TABLE,2,1,250); +INSERT INTO `item_furnishing` VALUES (322,'horn_trophy',2,532,@ELEM_ICE,4,@FURN_PLACE_WALL,3,1,140); +INSERT INTO `item_furnishing` VALUES (323,'sprig_of_red_bamboo_grass',2,538,@ELEM_DARK,3,@FURN_PLACE_FLOOR,3,2,320); +INSERT INTO `item_furnishing` VALUES (324,'sprig_of_blue_bamboo_grass',2,538,@ELEM_DARK,3,@FURN_PLACE_FLOOR,3,2,280); +INSERT INTO `item_furnishing` VALUES (325,'sprig_of_green_bamboo_grass',2,538,@ELEM_DARK,3,@FURN_PLACE_FLOOR,3,2,230); +INSERT INTO `item_furnishing` VALUES (326,'yellow_hobby_bo',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,2,1,110); +INSERT INTO `item_furnishing` VALUES (327,'red_hobby_bo',1,512,@ELEM_FIRE,1,@FURN_PLACE_FLOOR,2,1,110); +INSERT INTO `item_furnishing` VALUES (328,'black_hobby_bo',1,519,@ELEM_DARK,1,@FURN_PLACE_FLOOR,2,1,110); +INSERT INTO `item_furnishing` VALUES (329,'blue_hobby_bo',1,513,@ELEM_ICE,1,@FURN_PLACE_FLOOR,2,1,110); +INSERT INTO `item_furnishing` VALUES (330,'green_hobby_bo',1,514,@ELEM_WIND,1,@FURN_PLACE_FLOOR,2,1,110); +INSERT INTO `item_furnishing` VALUES (331,'winged_altar',2,533,@ELEM_LIGHT,2,@FURN_PLACE_FLOOR,3,2,330); +INSERT INTO `item_furnishing` VALUES (332,'winged_plaque',2,533,@ELEM_LIGHT,2,@FURN_PLACE_WALL,4,1,160); +INSERT INTO `item_furnishing` VALUES (333,'winged_balance',2,533,@ELEM_LIGHT,2,@FURN_PLACE_ON_TABLE,2,1,150); +INSERT INTO `item_furnishing` VALUES (334,'blacksmiths_signboard',1,525,@ELEM_FIRE,10,@FURN_PLACE_FLOOR,2,1,270); +INSERT INTO `item_furnishing` VALUES (335,'goldsmiths_signboard',1,526,@ELEM_LIGHT,10,@FURN_PLACE_FLOOR,2,1,270); +INSERT INTO `item_furnishing` VALUES (336,'boneworkers_signboard',1,529,@ELEM_DARK,10,@FURN_PLACE_FLOOR,2,1,270); +INSERT INTO `item_furnishing` VALUES (337,'weavers_signboard',1,527,@ELEM_EARTH,10,@FURN_PLACE_FLOOR,2,1,280); +INSERT INTO `item_furnishing` VALUES (338,'culinarians_signboard',1,531,@ELEM_WIND,10,@FURN_PLACE_FLOOR,2,1,280); +INSERT INTO `item_furnishing` VALUES (339,'tanners_signboard',1,528,@ELEM_ICE,10,@FURN_PLACE_FLOOR,2,1,280); +INSERT INTO `item_furnishing` VALUES (340,'fishermans_signboard',1,523,@ELEM_WATER,10,@FURN_PLACE_FLOOR,2,1,260); +INSERT INTO `item_furnishing` VALUES (341,'carpenters_signboard',1,524,@ELEM_EARTH,10,@FURN_PLACE_FLOOR,2,1,260); +INSERT INTO `item_furnishing` VALUES (342,'alchemists_signboard',1,530,@ELEM_LIGHTNING,10,@FURN_PLACE_FLOOR,2,1,260); +INSERT INTO `item_furnishing` VALUES (343,'harp_stool',2,515,@ELEM_EARTH,2,@FURN_PLACE_SURFACE,2,1,60); +INSERT INTO `item_furnishing` VALUES (345,'san_dorian_marriage_certificate',1,538,@ELEM_LIGHT,2,@FURN_PLACE_WALL,1,1,0); +INSERT INTO `item_furnishing` VALUES (346,'bastokan_marriage_certificate',1,538,@ELEM_LIGHT,2,@FURN_PLACE_WALL,1,1,0); +INSERT INTO `item_furnishing` VALUES (347,'windurstian_marriage_certificate',1,538,@ELEM_LIGHT,2,@FURN_PLACE_WALL,1,1,0); +INSERT INTO `item_furnishing` VALUES (348,'marble_plaque',1,539,@ELEM_LIGHT,9,@FURN_PLACE_WALL,1,1,80); +INSERT INTO `item_furnishing` VALUES (349,'royal_squires_bunk',3,520,@ELEM_EARTH,4,@FURN_PLACE_FLOOR,4,6,355); +INSERT INTO `item_furnishing` VALUES (350,'republican_legionnaires_bedding',4,520,@ELEM_DARK,3,@FURN_PLACE_FLOOR,4,6,348); +INSERT INTO `item_furnishing` VALUES (351,'federal_mercenarys_hammock',2,520,@ELEM_WIND,6,@FURN_PLACE_FLOOR,3,8,176); +INSERT INTO `item_furnishing` VALUES (352,'half_partition',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,3,1,330); +INSERT INTO `item_furnishing` VALUES (353,'spence',16,516,@ELEM_LIGHTNING,9,@FURN_PLACE_FLOOR,4,2,300); +INSERT INTO `item_furnishing` VALUES (354,'bookstack',16,532,@ELEM_EARTH,8,@FURN_PLACE_FLOOR,5,2,274); +INSERT INTO `item_furnishing` VALUES (355,'bread_crock',9,519,@ELEM_DARK,6,@FURN_PLACE_ON_TABLE,2,2,150); +INSERT INTO `item_furnishing` VALUES (356,'set_of_guild_flyers',1,536,@ELEM_LIGHTNING,5,@FURN_PLACE_WALL,1,1,0); +INSERT INTO `item_furnishing` VALUES (357,'partition',1,521,@ELEM_ICE,4,@FURN_PLACE_FLOOR,6,1,322); +INSERT INTO `item_furnishing` VALUES (358,'credenza',7,515,@ELEM_EARTH,7,@FURN_PLACE_FLOOR,3,1,235); +INSERT INTO `item_furnishing` VALUES (359,'bahut',8,521,@ELEM_EARTH,10,@FURN_PLACE_SURFACE,4,1,140); +INSERT INTO `item_furnishing` VALUES (360,'matka',2,515,@ELEM_EARTH,7,@FURN_PLACE_SURFACE,1,1,60); +INSERT INTO `item_furnishing` VALUES (361,'gallipot',8,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,2,2,92); +INSERT INTO `item_furnishing` VALUES (362,'fluoro-flora',1,522,@ELEM_LIGHT,5,@FURN_PLACE_ON_TABLE,1,1,180); +INSERT INTO `item_furnishing` VALUES (363,'amigo_cactus',2,533,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,2,222); +INSERT INTO `item_furnishing` VALUES (364,'amiga_cactus',2,532,@ELEM_WATER,4,@FURN_PLACE_ON_TABLE,1,1,164); +INSERT INTO `item_furnishing` VALUES (365,'poele_classique',3,512,@ELEM_FIRE,4,@FURN_PLACE_FLOOR,2,2,300); +INSERT INTO `item_furnishing` VALUES (366,'kanonenofen',3,512,@ELEM_FIRE,4,@FURN_PLACE_FLOOR,2,2,273); +INSERT INTO `item_furnishing` VALUES (367,'pot_topper',3,512,@ELEM_FIRE,4,@FURN_PLACE_FLOOR,2,2,120); +INSERT INTO `item_furnishing` VALUES (368,'san_dorian_tea_set',1,538,@ELEM_FIRE,6,@FURN_PLACE_ON_TABLE,2,1,42); +INSERT INTO `item_furnishing` VALUES (369,'bastokan_tea_set',1,538,@ELEM_WATER,6,@FURN_PLACE_ON_TABLE,2,1,47); +INSERT INTO `item_furnishing` VALUES (370,'windurstian_tea_set',1,538,@ELEM_WIND,6,@FURN_PLACE_ON_TABLE,2,1,30); +INSERT INTO `item_furnishing` VALUES (371,'butterfly_cage',3,514,@ELEM_WIND,4,@FURN_PLACE_ON_TABLE,2,1,110); +INSERT INTO `item_furnishing` VALUES (372,'cricket_cage',3,516,@ELEM_LIGHTNING,4,@FURN_PLACE_ON_TABLE,2,1,110); +INSERT INTO `item_furnishing` VALUES (373,'glowfly_cage',3,519,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,2,1,110); +INSERT INTO `item_furnishing` VALUES (374,'parclose',1,515,@ELEM_EARTH,6,@FURN_PLACE_FLOOR,6,1,330); +INSERT INTO `item_furnishing` VALUES (375,'cs_gold_stand',1,515,@ELEM_EARTH,1,@FURN_PLACE_SURFACE,1,1,100); +INSERT INTO `item_furnishing` VALUES (376,'cs_mythril_stand',1,515,@ELEM_EARTH,1,@FURN_PLACE_SURFACE,1,1,100); +INSERT INTO `item_furnishing` VALUES (377,'cs_bronze_stand',1,515,@ELEM_EARTH,1,@FURN_PLACE_SURFACE,1,1,100); +INSERT INTO `item_furnishing` VALUES (378,'blue_9-drawer_almirah',16,513,@ELEM_ICE,9,@FURN_PLACE_SURFACE,6,2,120); +INSERT INTO `item_furnishing` VALUES (379,'blue_6-drawer_almirah',15,513,@ELEM_ICE,8,@FURN_PLACE_SURFACE,6,2,80); +INSERT INTO `item_furnishing` VALUES (380,'blue_3-drawer_almirah',14,513,@ELEM_ICE,7,@FURN_PLACE_SURFACE,6,2,40); +INSERT INTO `item_furnishing` VALUES (381,'green_9-drawer_almirah',16,514,@ELEM_WIND,9,@FURN_PLACE_SURFACE,6,2,120); +INSERT INTO `item_furnishing` VALUES (382,'green_6-drawer_almirah',15,514,@ELEM_WIND,8,@FURN_PLACE_SURFACE,6,2,80); +INSERT INTO `item_furnishing` VALUES (383,'green_3-drawer_almirah',14,514,@ELEM_WIND,7,@FURN_PLACE_SURFACE,6,2,40); +INSERT INTO `item_furnishing` VALUES (384,'yellow_9-drawer_almirah',16,515,@ELEM_EARTH,9,@FURN_PLACE_SURFACE,6,2,120); +INSERT INTO `item_furnishing` VALUES (385,'yellow_6-drawer_almirah',15,515,@ELEM_EARTH,8,@FURN_PLACE_SURFACE,6,2,80); +INSERT INTO `item_furnishing` VALUES (386,'yellow_3-drawer_almirah',14,515,@ELEM_EARTH,7,@FURN_PLACE_SURFACE,6,2,40); +INSERT INTO `item_furnishing` VALUES (387,'white_9-drawer_almirah',16,518,@ELEM_LIGHT,9,@FURN_PLACE_SURFACE,6,2,120); +INSERT INTO `item_furnishing` VALUES (388,'white_6-drawer_almirah',15,518,@ELEM_LIGHT,8,@FURN_PLACE_SURFACE,6,2,80); +INSERT INTO `item_furnishing` VALUES (389,'white_3-drawer_almirah',14,518,@ELEM_LIGHT,7,@FURN_PLACE_SURFACE,6,2,40); +INSERT INTO `item_furnishing` VALUES (390,'carmine_desk',1,533,@ELEM_FIRE,5,@FURN_PLACE_SURFACE,3,3,50); +INSERT INTO `item_furnishing` VALUES (391,'cerulean_desk',1,533,@ELEM_ICE,5,@FURN_PLACE_SURFACE,3,3,50); +INSERT INTO `item_furnishing` VALUES (392,'myrtle_desk',1,533,@ELEM_LIGHTNING,5,@FURN_PLACE_SURFACE,3,3,50); +INSERT INTO `item_furnishing` VALUES (393,'ecru_desk',1,533,@ELEM_LIGHT,5,@FURN_PLACE_SURFACE,3,3,50); +INSERT INTO `item_furnishing` VALUES (394,'blue_tarutaru_desk',2,513,@ELEM_ICE,4,@FURN_PLACE_FLOOR,4,2,90); +INSERT INTO `item_furnishing` VALUES (395,'green_tarutaru_desk',2,514,@ELEM_WIND,4,@FURN_PLACE_FLOOR,4,2,90); +INSERT INTO `item_furnishing` VALUES (396,'yellow_tarutaru_desk',2,515,@ELEM_EARTH,4,@FURN_PLACE_FLOOR,4,2,90); +INSERT INTO `item_furnishing` VALUES (397,'white_tarutaru_desk',2,518,@ELEM_LIGHT,4,@FURN_PLACE_FLOOR,4,2,90); +INSERT INTO `item_furnishing` VALUES (398,'red_mahogany_bed',1,520,@ELEM_FIRE,10,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (399,'blue_mahogany_bed',1,520,@ELEM_WATER,10,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (400,'green_mahogany_bed',1,520,@ELEM_WIND,10,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (401,'yellow_mahogany_bed',1,520,@ELEM_EARTH,10,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (402,'blue_nobles_bed',1,520,@ELEM_WATER,12,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (403,'green_nobles_bed',1,520,@ELEM_WIND,12,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (404,'yellow_nobles_bed',1,520,@ELEM_EARTH,12,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (405,'white_nobles_bed',1,520,@ELEM_LIGHT,12,@FURN_PLACE_FLOOR,4,6,300); +INSERT INTO `item_furnishing` VALUES (406,'blue_tarutaru_standing_screen',1,513,@ELEM_ICE,3,@FURN_PLACE_FLOOR,7,1,270); +INSERT INTO `item_furnishing` VALUES (407,'green_tarutaru_standing_screen',1,514,@ELEM_WIND,3,@FURN_PLACE_FLOOR,7,1,270); +INSERT INTO `item_furnishing` VALUES (408,'yellow_tarutaru_standing_screen',1,515,@ELEM_EARTH,3,@FURN_PLACE_FLOOR,7,1,270); +INSERT INTO `item_furnishing` VALUES (409,'white_tarutaru_standing_screen',1,518,@ELEM_LIGHT,3,@FURN_PLACE_FLOOR,7,1,270); +INSERT INTO `item_furnishing` VALUES (410,'red_round_table',5,512,@ELEM_FIRE,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (411,'blue_round_table',5,513,@ELEM_ICE,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (412,'green_round_table',5,514,@ELEM_WIND,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (413,'yellow_round_table',5,515,@ELEM_EARTH,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (414,'white_round_table',5,518,@ELEM_LIGHT,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (415,'aldebaran_horn',3,538,@ELEM_EARTH,6,@FURN_PLACE_ON_TABLE,1,2,120); +INSERT INTO `item_furnishing` VALUES (416,'tomeshelf',10,519,@ELEM_DARK,1,@FURN_PLACE_FLOOR,3,1,380); +INSERT INTO `item_furnishing` VALUES (417,'storage_hutch',12,515,@ELEM_EARTH,1,@FURN_PLACE_SURFACE,4,2,100); +INSERT INTO `item_furnishing` VALUES (418,'tidings_board',4,515,@ELEM_EARTH,4,@FURN_PLACE_FLOOR,6,2,240); +INSERT INTO `item_furnishing` VALUES (419,'leisure_table',2,515,@ELEM_EARTH,2,@FURN_PLACE_SURFACE,2,2,80); +INSERT INTO `item_furnishing` VALUES (420,'pot_of_meadsweet',1,514,@ELEM_WIND,4,@FURN_PLACE_ON_TABLE,2,2,100); +INSERT INTO `item_furnishing` VALUES (421,'vase_of_rulude_orchids',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,1,1,100); +INSERT INTO `item_furnishing` VALUES (422,'elshimo_pachira',2,512,@ELEM_FIRE,2,@FURN_PLACE_ON_TABLE,2,2,200); +INSERT INTO `item_furnishing` VALUES (423,'tavern_bench',4,515,@ELEM_EARTH,6,@FURN_PLACE_SURFACE,6,1,40); +INSERT INTO `item_furnishing` VALUES (424,'feasting_table',7,515,@ELEM_EARTH,1,@FURN_PLACE_SURFACE,6,4,90); +INSERT INTO `item_furnishing` VALUES (425,'girandola',3,512,@ELEM_FIRE,6,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (426,'orchestrion',2,516,@ELEM_LIGHTNING,6,@FURN_PLACE_FLOOR,2,1,240); +INSERT INTO `item_furnishing` VALUES (427,'rococo_table',10,517,@ELEM_WATER,3,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (428,'semainier',35,516,@ELEM_DARK,3,@FURN_PLACE_FLOOR,5,1,311); +INSERT INTO `item_furnishing` VALUES (429,'red_storm_lantern',1,512,@ELEM_FIRE,1,@FURN_PLACE_ON_TABLE,1,1,73); +INSERT INTO `item_furnishing` VALUES (430,'blue_storm_lantern',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,1,1,73); +INSERT INTO `item_furnishing` VALUES (431,'green_storm_lantern',1,514,@ELEM_WIND,1,@FURN_PLACE_ON_TABLE,1,1,73); +INSERT INTO `item_furnishing` VALUES (432,'yellow_storm_lantern',1,515,@ELEM_EARTH,1,@FURN_PLACE_ON_TABLE,1,1,73); +INSERT INTO `item_furnishing` VALUES (433,'white_storm_lantern',1,518,@ELEM_LIGHT,1,@FURN_PLACE_ON_TABLE,1,1,73); +INSERT INTO `item_furnishing` VALUES (434,'isula_sideboard',10,520,@ELEM_LIGHTNING,6,@FURN_PLACE_SURFACE,4,1,120); +INSERT INTO `item_furnishing` VALUES (435,'jeunoan_dresser',55,520,@ELEM_LIGHTNING,20,@FURN_PLACE_FLOOR,6,2,280); +INSERT INTO `item_furnishing` VALUES (436,'jeunoan_armoire',30,520,@ELEM_LIGHTNING,10,@FURN_PLACE_FLOOR,3,1,300); +INSERT INTO `item_furnishing` VALUES (437,'floral_nightstand',1,521,@ELEM_LIGHT,1,@FURN_PLACE_SURFACE,1,1,100); +INSERT INTO `item_furnishing` VALUES (438,'orblight',1,512,@ELEM_FIRE,1,@FURN_PLACE_FLOOR,1,1,320); +INSERT INTO `item_furnishing` VALUES (439,'planus_table',5,521,@ELEM_LIGHT,3,@FURN_PLACE_SURFACE,3,3,90); +INSERT INTO `item_furnishing` VALUES (440,'squat_desk',4,514,@ELEM_WIND,2,@FURN_PLACE_SURFACE,4,4,40); +INSERT INTO `item_furnishing` VALUES (441,'taru_tot_toyset',2,514,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,3,2,52); +INSERT INTO `item_furnishing` VALUES (442,'gilded_chest',20,519,@ELEM_DARK,5,@FURN_PLACE_SURFACE,5,2,110); +INSERT INTO `item_furnishing` VALUES (443,'aureous_chest',8,519,@ELEM_DARK,2,@FURN_PLACE_SURFACE,2,1,110); +INSERT INTO `item_furnishing` VALUES (444,'luxurious_chest',8,519,@ELEM_DARK,2,@FURN_PLACE_SURFACE,3,2,245); +INSERT INTO `item_furnishing` VALUES (445,'vaisselier_royale',8,515,@ELEM_EARTH,3,@FURN_PLACE_FLOOR,3,1,250); +INSERT INTO `item_furnishing` VALUES (446,'gilded_shelf',40,512,@ELEM_FIRE,5,@FURN_PLACE_SURFACE,3,1,240); +INSERT INTO `item_furnishing` VALUES (447,'mensa_lunata',11,514,@ELEM_WIND,4,@FURN_PLACE_SURFACE,6,3,100); +INSERT INTO `item_furnishing` VALUES (448,'gueridon',5,514,@ELEM_WIND,3,@FURN_PLACE_SURFACE,2,2,100); +INSERT INTO `item_furnishing` VALUES (449,'personal_table',7,514,@ELEM_WIND,2,@FURN_PLACE_SURFACE,3,2,90); +INSERT INTO `item_furnishing` VALUES (450,'candelabrum',1,512,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,2,200); +INSERT INTO `item_furnishing` VALUES (451,'egg_stool',2,538,@ELEM_EARTH,3,@FURN_PLACE_SURFACE,1,1,20); +INSERT INTO `item_furnishing` VALUES (452,'egg_table',3,538,@ELEM_WIND,6,@FURN_PLACE_SURFACE,3,3,70); +INSERT INTO `item_furnishing` VALUES (453,'egg_locker',4,538,@ELEM_ICE,6,@FURN_PLACE_ON_TABLE,3,3,150); +INSERT INTO `item_furnishing` VALUES (454,'egg_lantern',1,538,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,1,1,55); +INSERT INTO `item_furnishing` VALUES (455,'egg_buffet',10,538,@ELEM_LIGHTNING,8,@FURN_PLACE_FLOOR,3,3,250); +INSERT INTO `item_furnishing` VALUES (456,'pepo_lantern',10,519,@ELEM_DARK,6,@FURN_PLACE_FLOOR,5,5,300); +INSERT INTO `item_furnishing` VALUES (457,'cushaw_lantern',6,519,@ELEM_DARK,6,@FURN_PLACE_ON_TABLE,3,3,200); +INSERT INTO `item_furnishing` VALUES (458,'calabazilla_lantern',2,519,@ELEM_DARK,6,@FURN_PLACE_ON_TABLE,1,1,100); +INSERT INTO `item_furnishing` VALUES (459,'candle_holder',1,512,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,1,1,72); +INSERT INTO `item_furnishing` VALUES (460,'bakery_platter',1,532,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,2,1,26); +INSERT INTO `item_furnishing` VALUES (461,'buffalo_milk_case',4,533,@ELEM_LIGHT,1,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (3584,'panetiere',65,519,@ELEM_DARK,6,@FURN_PLACE_WALL,1,1,10); +INSERT INTO `item_furnishing` VALUES (3585,'galley_kitchen',17,534,@ELEM_LIGHTNING,6,@FURN_PLACE_FLOOR,6,2,260); +INSERT INTO `item_furnishing` VALUES (3586,'pot_of_red_viola',4,521,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (3587,'pot_of_blue_viola',4,521,@ELEM_ICE,3,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (3588,'pot_of_yellow_viola',4,521,@ELEM_EARTH,3,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (3589,'pot_of_white_viola',4,521,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (3590,'puce_chest',10,512,@ELEM_FIRE,1,@FURN_PLACE_ON_TABLE,2,2,70); +INSERT INTO `item_furnishing` VALUES (3591,'chest_of_marbled_drawers',45,514,@ELEM_WIND,5,@FURN_PLACE_SURFACE,4,2,200); +INSERT INTO `item_furnishing` VALUES (3592,'jewelry_case',6,512,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (3593,'keepsake_case',6,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (3594,'gemstone_case',6,515,@ELEM_EARTH,3,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (3595,'gemscope',1,526,@ELEM_LIGHT,5,@FURN_PLACE_ON_TABLE,2,1,60); +INSERT INTO `item_furnishing` VALUES (3596,'ornament_case',1,518,@ELEM_LIGHT,4,@FURN_PLACE_ON_TABLE,2,1,70); +INSERT INTO `item_furnishing` VALUES (3598,'opus_shelf',14,512,@ELEM_FIRE,4,@FURN_PLACE_FLOOR,3,1,180); +INSERT INTO `item_furnishing` VALUES (3600,'bongo_drum',1,2852,@ELEM_EARTH,15,@FURN_PLACE_ON_TABLE,2,2,110); +INSERT INTO `item_furnishing` VALUES (3608,'fictile_pot',5,519,@ELEM_DARK,5,@FURN_PLACE_ON_TABLE,1,1,46); +INSERT INTO `item_furnishing` VALUES (3609,'stepping_stool',1,519,@ELEM_DARK,4,@FURN_PLACE_SURFACE,1,1,40); +INSERT INTO `item_furnishing` VALUES (3610,'red_mariners_bed',2,520,@ELEM_FIRE,8,@FURN_PLACE_FLOOR,3,5,170); +INSERT INTO `item_furnishing` VALUES (3611,'blue_mariners_bed',2,520,@ELEM_ICE,8,@FURN_PLACE_FLOOR,3,5,170); +INSERT INTO `item_furnishing` VALUES (3612,'green_mariners_bed',2,520,@ELEM_WIND,8,@FURN_PLACE_FLOOR,3,5,170); +INSERT INTO `item_furnishing` VALUES (3613,'yellow_mariners_bed',2,520,@ELEM_EARTH,8,@FURN_PLACE_FLOOR,3,5,170); +INSERT INTO `item_furnishing` VALUES (3614,'white_mariners_bed',2,520,@ELEM_LIGHT,8,@FURN_PLACE_FLOOR,3,5,170); +INSERT INTO `item_furnishing` VALUES (3619,'couronne_des_etoiles',4,520,@ELEM_ICE,4,@FURN_PLACE_FLOOR,2,1,240); +INSERT INTO `item_furnishing` VALUES (3620,'silberkranz',4,520,@ELEM_ICE,4,@FURN_PLACE_FLOOR,1,1,240); +INSERT INTO `item_furnishing` VALUES (3621,'leafberry_wreath',4,520,@ELEM_ICE,4,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (3622,'jack-o-pricket',1,519,@ELEM_DARK,4,@FURN_PLACE_FLOOR,1,1,180); +INSERT INTO `item_furnishing` VALUES (3623,'djinn_pricket',1,519,@ELEM_DARK,4,@FURN_PLACE_FLOOR,1,1,150); +INSERT INTO `item_furnishing` VALUES (3624,'korrigan_pricket',1,519,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (3625,'blacksmiths_stall',20,555,@ELEM_FIRE,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3626,'goldsmiths_stall',20,556,@ELEM_LIGHT,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3627,'boneworkers_stall',20,559,@ELEM_DARK,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3628,'weavers_stall',20,557,@ELEM_EARTH,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3629,'culinarians_stall',20,561,@ELEM_WIND,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3630,'tanners_stall',20,558,@ELEM_ICE,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3631,'fishermens_stall',20,553,@ELEM_WATER,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3632,'carpenters_stall',20,554,@ELEM_EARTH,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3633,'alchemists_stall',20,560,@ELEM_LIGHTNING,11,@FURN_PLACE_SURFACE,6,2,90); +INSERT INTO `item_furnishing` VALUES (3634,'starlight_cake',1,514,@ELEM_WIND,4,@FURN_PLACE_ON_TABLE,2,2,40); +INSERT INTO `item_furnishing` VALUES (3635,'buche_des_etoiles',1,561,@ELEM_WIND,2,@FURN_PLACE_ON_TABLE,1,1,40); +INSERT INTO `item_furnishing` VALUES (3636,'serving_of_bavarois_potiron',1,512,@ELEM_FIRE,1,@FURN_PLACE_ON_TABLE,1,1,20); +INSERT INTO `item_furnishing` VALUES (3637,'banquet_set',1,515,@ELEM_EARTH,1,@FURN_PLACE_ON_TABLE,2,1,20); +INSERT INTO `item_furnishing` VALUES (3638,'plate_of_mock_hare',1,512,@ELEM_FIRE,1,@FURN_PLACE_ON_TABLE,2,1,20); +INSERT INTO `item_furnishing` VALUES (3639,'purifying_ewer',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3640,'rolanberry_delightaru',1,513,@ELEM_ICE,1,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3641,'kabuto-kazari',2,520,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,2,1,80); +INSERT INTO `item_furnishing` VALUES (3642,'katana-kazari',1,522,@ELEM_LIGHTNING,4,@FURN_PLACE_ON_TABLE,2,1,90); +INSERT INTO `item_furnishing` VALUES (3643,'carillon_vermeil',1,535,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,100); +INSERT INTO `item_furnishing` VALUES (3644,'aeolsglocke',1,536,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (3645,'leafbell',1,537,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (3646,'mandragora_pricket',1,518,@ELEM_LIGHT,4,@FURN_PLACE_ON_TABLE,1,1,60); +INSERT INTO `item_furnishing` VALUES (3647,'spook-a-swirl',1,534,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (3648,'chocolate_grumpkin',1,534,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,1,1,70); +INSERT INTO `item_furnishing` VALUES (3649,'harvest_horror',1,534,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,1,1,80); +INSERT INTO `item_furnishing` VALUES (3650,'prinseggstarta',1,518,@ELEM_LIGHT,2,@FURN_PLACE_ON_TABLE,1,1,50); +INSERT INTO `item_furnishing` VALUES (3651,'harvest_pastry',1,2855,@ELEM_LIGHT,15,@FURN_PLACE_ON_TABLE,2,2,10); +INSERT INTO `item_furnishing` VALUES (3652,'memorial_cake',3,516,@ELEM_LIGHTNING,5,@FURN_PLACE_ON_TABLE,3,3,200); +INSERT INTO `item_furnishing` VALUES (3653,'banquet_table',5,512,@ELEM_FIRE,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (3654,'tender_bouquet',1,538,@ELEM_LIGHT,2,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (3655,'treasury_table',10,512,@ELEM_FIRE,2,@FURN_PLACE_SURFACE,4,2,90); +INSERT INTO `item_furnishing` VALUES (3656,'treasury_stand',10,512,@ELEM_FIRE,2,@FURN_PLACE_SURFACE,2,2,90); +INSERT INTO `item_furnishing` VALUES (3657,'sundries_table',10,516,@ELEM_LIGHTNING,2,@FURN_PLACE_SURFACE,4,2,90); +INSERT INTO `item_furnishing` VALUES (3658,'sundries_stand',10,516,@ELEM_LIGHTNING,2,@FURN_PLACE_SURFACE,2,2,90); +INSERT INTO `item_furnishing` VALUES (3659,'supply_table',10,515,@ELEM_EARTH,2,@FURN_PLACE_SURFACE,4,2,90); +INSERT INTO `item_furnishing` VALUES (3660,'supply_stand',10,515,@ELEM_EARTH,2,@FURN_PLACE_SURFACE,2,2,90); +INSERT INTO `item_furnishing` VALUES (3661,'stone_hearth',4,525,@ELEM_FIRE,5,@FURN_PLACE_ON_TABLE,2,1,60); +INSERT INTO `item_furnishing` VALUES (3662,'case_of_display_blades',2,512,@ELEM_FIRE,4,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (3663,'set_of_bonecrafting_tools',4,529,@ELEM_DARK,5,@FURN_PLACE_ON_TABLE,2,2,20); +INSERT INTO `item_furnishing` VALUES (3664,'shell_assortment',2,519,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3665,'spinning_wheel',4,527,@ELEM_EARTH,5,@FURN_PLACE_ON_TABLE,2,1,130); +INSERT INTO `item_furnishing` VALUES (3666,'set_of_fine_raiments',2,515,@ELEM_EARTH,4,@FURN_PLACE_ON_TABLE,2,1,30); +INSERT INTO `item_furnishing` VALUES (3667,'brass_crock',4,531,@ELEM_WIND,5,@FURN_PLACE_ON_TABLE,2,2,90); +INSERT INTO `item_furnishing` VALUES (3668,'hide_stretcher',4,528,@ELEM_ICE,5,@FURN_PLACE_ON_TABLE,2,1,100); +INSERT INTO `item_furnishing` VALUES (3669,'set_of_courier_bags',2,513,@ELEM_ICE,4,@FURN_PLACE_ON_TABLE,2,1,30); +INSERT INTO `item_furnishing` VALUES (3670,'net_and_lure',4,523,@ELEM_WATER,5,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3671,'set_of_stockfish',2,517,@ELEM_WATER,4,@FURN_PLACE_ON_TABLE,2,2,90); +INSERT INTO `item_furnishing` VALUES (3672,'carpenters_kit',4,524,@ELEM_EARTH,5,@FURN_PLACE_ON_TABLE,2,2,80); +INSERT INTO `item_furnishing` VALUES (3673,'set_of_chocobo_carvings',2,515,@ELEM_EARTH,4,@FURN_PLACE_ON_TABLE,1,1,90); +INSERT INTO `item_furnishing` VALUES (3674,'alembic',4,530,@ELEM_LIGHTNING,5,@FURN_PLACE_ON_TABLE,2,1,80); +INSERT INTO `item_furnishing` VALUES (3675,'flask_set',2,516,@ELEM_LIGHTNING,4,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (3676,'celestial_globe',5,519,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,3,3,220); +INSERT INTO `item_furnishing` VALUES (3677,'spinet',1,518,@ELEM_LIGHT,1,@FURN_PLACE_FLOOR,4,2,320); +INSERT INTO `item_furnishing` VALUES (3678,'recital_bench',1,518,@ELEM_LIGHT,1,@FURN_PLACE_FLOOR,2,1,60); +INSERT INTO `item_furnishing` VALUES (3679,'beastman_gonfalon',5,519,@ELEM_DARK,9,@FURN_PLACE_FLOOR,5,2,410); +INSERT INTO `item_furnishing` VALUES (3680,'copy_of_judgment_day',7,516,@ELEM_LIGHTNING,7,@FURN_PLACE_FLOOR,7,2,320); +INSERT INTO `item_furnishing` VALUES (3681,'alzadaal_table',12,518,@ELEM_LIGHT,5,@FURN_PLACE_SURFACE,6,6,90); +INSERT INTO `item_furnishing` VALUES (3682,'sproutling_board',1,521,@ELEM_LIGHT,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3683,'forestdweller_board',1,521,@ELEM_EARTH,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3684,'princess_board',1,515,@ELEM_EARTH,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3685,'empress_board',1,516,@ELEM_LIGHTNING,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3686,'duelist_board',1,512,@ELEM_FIRE,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3687,'crystal_board',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3688,'dancer_board',1,518,@ELEM_LIGHT,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3689,'wizardess_board',1,519,@ELEM_DARK,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3690,'fighter_board',1,517,@ELEM_WATER,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3691,'guardian_board',1,513,@ELEM_ICE,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3692,'stoic_board',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3693,'lamb_carving',1,515,@ELEM_EARTH,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3694,'polished_lamb_carving',1,515,@ELEM_EARTH,5,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3695,'cait_sith_carving',1,540,@ELEM_LIGHT,7,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3696,'kotatsu_table',1,512,@ELEM_FIRE,3,@FURN_PLACE_SURFACE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3697,'mandarin',1,2854,@ELEM_WATER,6,@FURN_PLACE_ON_TABLE,1,1,11); +INSERT INTO `item_furnishing` VALUES (3698,'cherry_tree',1,515,@ELEM_EARTH,5,@FURN_PLACE_FLOOR,1,1,530); +INSERT INTO `item_furnishing` VALUES (3699,'bathtub',1,517,@ELEM_WATER,3,@FURN_PLACE_FLOOR,2,4,80); +INSERT INTO `item_furnishing` VALUES (3700,'shower_stand',1,517,@ELEM_WATER,3,@FURN_PLACE_FLOOR,1,1,320); +INSERT INTO `item_furnishing` VALUES (3701,'awning',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,180); +INSERT INTO `item_furnishing` VALUES (3702,'triangular_jalousie',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,160); +INSERT INTO `item_furnishing` VALUES (3703,'square_jalousie',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,120); +INSERT INTO `item_furnishing` VALUES (3704,'transom',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,190); +INSERT INTO `item_furnishing` VALUES (3705,'far_east_hearth',1,541,@ELEM_FIRE,16,@FURN_PLACE_SURFACE,5,5,40); +INSERT INTO `item_furnishing` VALUES (3706,'vanaclock',1,542,@ELEM_LIGHT,16,@FURN_PLACE_WALL,1,1,240); +INSERT INTO `item_furnishing` VALUES (3707,'murrey_grisaille',1,562,@ELEM_LIGHT,18,@FURN_PLACE_WALL,1,1,240); +INSERT INTO `item_furnishing` VALUES (3708,'moss_green_grisaille',1,563,@ELEM_LIGHT,18,@FURN_PLACE_WALL,1,1,240); +INSERT INTO `item_furnishing` VALUES (3709,'valance',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,180); +INSERT INTO `item_furnishing` VALUES (3710,'windurstian_sill',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,160); +INSERT INTO `item_furnishing` VALUES (3711,'san_dorian_sill',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,120); +INSERT INTO `item_furnishing` VALUES (3712,'bastokan_sill',1,514,@ELEM_WIND,1,@FURN_PLACE_WALL,1,1,190); +INSERT INTO `item_furnishing` VALUES (3713,'pot_of_wards',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,8,2,240); +INSERT INTO `item_furnishing` VALUES (3714,'pot_of_white_clematis',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,8,2,150); +INSERT INTO `item_furnishing` VALUES (3715,'pot_of_pink_clematis',1,515,@ELEM_EARTH,2,@FURN_PLACE_FLOOR,8,2,150); +INSERT INTO `item_furnishing` VALUES (3717,'birch_tree',1,2853,@ELEM_EARTH,5,@FURN_PLACE_FLOOR,2,2,900); +INSERT INTO `item_furnishing` VALUES (3718,'handful_of_adoulinian_tomatoes',1,2849,@ELEM_WATER,6,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3719,'prishe_statue_ii',4,512,@ELEM_FIRE,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3720,'arciela_statue',4,513,@ELEM_ICE,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3721,'iroha_statue',4,514,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3722,'lion_statue',4,515,@ELEM_EARTH,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3723,'lilisette_statue',4,516,@ELEM_LIGHTNING,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3724,'uka_statue',4,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3725,'cornelia_statue',4,514,@ELEM_WIND,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3726,'aphmau_statue',4,517,@ELEM_WATER,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3727,'mumor_statue',4,518,@ELEM_LIGHT,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3728,'ullegore_statue',4,519,@ELEM_DARK,3,@FURN_PLACE_ON_TABLE,1,1,10); +INSERT INTO `item_furnishing` VALUES (3729,'light_chest',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3730,'bulky_coffer',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3731,'azure_chest',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3732,'crimson_chest',1,517,@ELEM_WATER,1,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3735,'aurum_coffer',5,540,@ELEM_LIGHT,7,@FURN_PLACE_ON_TABLE,3,2,120); +INSERT INTO `item_furnishing` VALUES (3736,'well',80,517,@ELEM_WATER,8,@FURN_PLACE_FLOOR,4,4,150); +INSERT INTO `item_furnishing` VALUES (3737,'doll_stand',2,2855,@ELEM_LIGHT,15,@FURN_PLACE_FLOOR,1,1,150); +INSERT INTO `item_furnishing` VALUES (3738,'eastern_umbrella',1,521,@ELEM_WATER,2,@FURN_PLACE_FLOOR,2,2,150); -- Moghancement: Gardening - From https://ffxiclopedia.fandom.com/wiki/Eastern_Umbrella (BG doesn't show Moghancement) +INSERT INTO `item_furnishing` VALUES (3739,'autumn_tree',1,515,@ELEM_EARTH,5,@FURN_PLACE_FLOOR,2,2,900); +INSERT INTO `item_furnishing` VALUES (3740,'model_synergy_furnace',8,0,@ELEM_DARK,11,@FURN_PLACE_ON_TABLE,3,3,200); -- TODO: Moghancement: Synergy Skill Gains does not yet exist +INSERT INTO `item_furnishing` VALUES (3741,'model_synergy_furnace_ii',8,0,@ELEM_LIGHT,11,@FURN_PLACE_ON_TABLE,3,3,300); -- TODO: Moglification: Furnace Duration does not yet exist +INSERT INTO `item_furnishing` VALUES (3742,'painting_of_a_mercenary',1,0,@ELEM_EARTH,1,@FURN_PLACE_WALL,3,1,180); -- TODO: Moghancement: Mandragora Mania does not yet exist +INSERT INTO `item_furnishing` VALUES (3743,'moogle_bed',1,520,@ELEM_LIGHT,8,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (3744,'mandragora_pot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (3745,'korrigan_pot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (3746,'adenium_pot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (3747,'citrullus_pot',1,515,@ELEM_EARTH,1,@FURN_PLACE_FLOOR,1,1,0); +INSERT INTO `item_furnishing` VALUES (3748,'leafkin_bed',1,520,@ELEM_LIGHT,8,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (3749,'chemistry_set',2,519,@ELEM_DARK,4,@FURN_PLACE_ON_TABLE,2,1,50); +INSERT INTO `item_furnishing` VALUES (3750,'qiqirn_sack',8,540,@ELEM_LIGHT,6,@FURN_PLACE_ON_TABLE,2,2,60); +INSERT INTO `item_furnishing` VALUES (3751,'besigiled_table',5,2852,@ELEM_DARK,3,@FURN_PLACE_SURFACE,3,3,80); +INSERT INTO `item_furnishing` VALUES (3752,'colibri_bed',1,520,@ELEM_LIGHT,8,@FURN_PLACE_FLOOR,3,6,130); +INSERT INTO `item_furnishing` VALUES (3753,'painting_of_blueblade_fell',1,533,@ELEM_LIGHT,3,@FURN_PLACE_WALL,3,1,180); +INSERT INTO `item_furnishing` VALUES (3754,'kagami_mochi',8,540,@ELEM_LIGHT,6,@FURN_PLACE_FLOOR,4,4,10); +INSERT INTO `item_furnishing` VALUES (3755,'prismatic_chest',1,0,@ELEM_DARK,1,@FURN_PLACE_ON_TABLE,2,2,60); -- TODO: Moglification: A.M.A.N. Trove does not yet exist +INSERT INTO `item_furnishing` VALUES (3756,'sachertorte',1,518,@ELEM_LIGHT,1,@FURN_PLACE_ON_TABLE,1,1,20); /* `itemid` smallint(5) unsigned NOT NULL, diff --git a/src/map/enums/furnishing_placement.h b/src/map/enums/furnishing_placement.h new file mode 100644 index 00000000000..20efc867f77 --- /dev/null +++ b/src/map/enums/furnishing_placement.h @@ -0,0 +1,35 @@ +/* +=========================================================================== + + Copyright (c) 2026 LandSandBoat Dev Teams + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see http://www.gnu.org/licenses/ + +=========================================================================== +*/ + +#pragma once + +#include "common/cbasetypes.h" + +// Furnishing placement kind. +// How a piece of furniture is placed in the mog house. +// Exactly one per item; these are not flags. +enum class FurnishingPlacement : uint8 +{ + Floor = 0, // Sits on the floor + Surface = 1, // Sits on the floor and other items can be placed on top (tables, desks) + Wall = 2, // Hung on a wall slot + OnTable = 3, // Placed on top of a Surface item (vases, statues, flowerpots) +}; diff --git a/src/map/items/item_furnishing.cpp b/src/map/items/item_furnishing.cpp index de5c264f212..cdd3d8a9713 100644 --- a/src/map/items/item_furnishing.cpp +++ b/src/map/items/item_furnishing.cpp @@ -26,13 +26,15 @@ CItemFurnishing::CItemFurnishing(uint16 id) : CItem(id) +, m_storage(0) +, m_moghancement(0) +, m_element(0) +, m_aura(0) +, size_{ 1, 1 } +, height_(0) +, placement_(FurnishingPlacement::Floor) { setType(ITEM_FURNISHING); - - m_storage = 0; - m_moghancement = 0; - m_element = 0; - m_aura = 0; } CItemFurnishing::~CItemFurnishing() = default; @@ -87,6 +89,36 @@ uint8 CItemFurnishing::getAura() const return m_aura; } +void CItemFurnishing::setSize(uint8 size_x, uint8 size_y) +{ + size_ = { size_x, size_y }; +} + +auto CItemFurnishing::size() const -> std::pair +{ + return size_; +} + +void CItemFurnishing::setHeight(uint16 height) +{ + height_ = height; +} + +auto CItemFurnishing::height() const -> uint16 +{ + return height_; +} + +void CItemFurnishing::setPlacement(FurnishingPlacement placement) +{ + placement_ = placement; +} + +auto CItemFurnishing::placement() const -> FurnishingPlacement +{ + return placement_; +} + void CItemFurnishing::setCol(uint8 col) { this->exdata().X = col; diff --git a/src/map/items/item_furnishing.h b/src/map/items/item_furnishing.h index 03dc8fe8793..3bd1fc19200 100644 --- a/src/map/items/item_furnishing.h +++ b/src/map/items/item_furnishing.h @@ -25,6 +25,7 @@ #include "common/cbasetypes.h" #include "item.h" +#include "map/enums/furnishing_placement.h" // List of Moghancements @@ -110,6 +111,9 @@ class CItemFurnishing : public CItem uint16 getMoghancement() const; uint8 getElement() const; uint8 getAura() const; + auto size() const -> std::pair; + auto height() const -> uint16; + auto placement() const -> FurnishingPlacement; bool isInstalled(); uint8 getCol(); @@ -123,6 +127,9 @@ class CItemFurnishing : public CItem void setMoghancement(uint16 moghancement); void setElement(uint8 element); void setAura(uint8 aura); + void setSize(uint8 size_x, uint8 size_y); + void setHeight(uint16 height); + void setPlacement(FurnishingPlacement placement); void setCol(uint8 col); void setRow(uint8 row); @@ -144,10 +151,13 @@ class CItemFurnishing : public CItem bool isGardeningPot() const; private: - uint8 m_storage; - uint16 m_moghancement; - uint8 m_element; - uint8 m_aura; + uint8 m_storage; + uint16 m_moghancement; + uint8 m_element; + uint8 m_aura; + std::pair size_{ 1, 1 }; + uint16 height_{}; + FurnishingPlacement placement_{ FurnishingPlacement::Floor }; }; #endif diff --git a/src/map/packets/c2s/0x0fa_myroom_layout.cpp b/src/map/packets/c2s/0x0fa_myroom_layout.cpp index 49ebb9d6c77..9e6e0cb7a44 100644 --- a/src/map/packets/c2s/0x0fa_myroom_layout.cpp +++ b/src/map/packets/c2s/0x0fa_myroom_layout.cpp @@ -24,80 +24,266 @@ #include "entities/charentity.h" #include "items/item_furnishing.h" #include "lua/luautils.h" +#include "map/enums/furnishing_placement.h" #include "packets/s2c/0x01c_item_max.h" #include "packets/s2c/0x01d_item_same.h" #include "packets/s2c/0x020_item_attr.h" #include "packets/s2c/0x0fa_myroom_operation.h" -#include "utils/charutils.h" + +namespace +{ +// MH1F: 20x24 grid with a 8x18 unusable rectangle (x 6..13, z 0..17) +// MH2F: 20x26 grid, no exclusions. +auto isValidFloorCell(const uint8 cx, const uint8 cz, const bool is2F) -> bool +{ + if (is2F) + { + return cx <= 19 && cz <= 25; + } + + if (cz > 23) + { + return false; + } + + if (cx <= 5 || (cx >= 14 && cx <= 19)) + { + return true; + } + + return cx >= 6 && cx <= 13 && cz >= 18; +} + +// 1F has 5 wall slots (0..4); 2F has 92 (0..91). +auto isValidWallSlot(const uint8 slot, const bool is2F) -> bool +{ + return slot <= (is2F ? 91 : 4); +} + +// 90/270 degree rotations swap the item's width and depth. +auto rotatedSize(const CItemFurnishing* PItem, const uint8 v) -> std::pair +{ + const auto [sx, sy] = PItem->size(); + return v == 1 || v == 3 ? std::pair{ sy, sx } : std::pair{ sx, sy }; +} + +// Given packet anchor point for furniture and server-side dimensions, ensure the whole footprint fits in legitimate cells. +auto footprintInGrid(const uint8 ax, const uint8 az, const uint8 sx, const uint8 sz, const bool is2F) -> bool +{ + for (uint8 cx = ax; cx < ax + sx; ++cx) + { + for (uint8 cz = az; cz < az + sz; ++cz) + { + if (!isValidFloorCell(cx, cz, is2F)) + { + return false; + } + } + } + + return true; +} + +// Does 'other' occupy a floor cell that overlaps the rectangle at (x, z, width, depth)? +auto collidesOnFloor(CItemFurnishing* other, const uint8 x, const uint8 z, const uint8 width, const uint8 depth, const bool is2F) -> bool +{ + if (other->getOn2ndFloor() != is2F) + { + return false; + } + + const auto op = other->placement(); + if (op == FurnishingPlacement::Wall) + { + return false; + } + + // Stacked OnTable items live above the floor and don't conflict. + if (op == FurnishingPlacement::OnTable && other->getLevel() != 0) + { + return false; + } + + const auto [otherWidth, otherDepth] = rotatedSize(other, other->getRotation()); + const uint8 otherX = other->getCol(); + const uint8 otherZ = other->getRow(); + return x < otherX + otherWidth && otherX < x + width && + z < otherZ + otherDepth && otherZ < z + depth; +} + +// Walks every installed furnishing in both mog safes (skipping the +// self entry) and returns true if pred matches one. +auto anyInstalledFurnishing(CCharEntity* PChar, const uint8 selfCat, const uint8 selfSlot, auto&& pred) -> bool +{ + for (const auto cat : { LOC_MOGSAFE, LOC_MOGSAFE2 }) + { + const auto* container = PChar->getStorage(cat); + for (int slot = 1; slot <= container->GetSize(); ++slot) + { + if (cat == selfCat && slot == selfSlot) + { + continue; + } + + if (auto* PFurn = dynamic_cast(container->GetItem(slot)); PFurn && PFurn->isInstalled() && pred(PFurn)) + { + return true; + } + } + } + + return false; +} +} // namespace auto GP_CLI_COMMAND_MYROOM_LAYOUT::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { - // There's a handful more checks that could be moved up here, but the handler needs a proper refactor first. return PacketValidator() - .range("MyroomFloorFlg", MyroomFloorFlg, 0, 1) // Flag indicating if 2nd floor - .range("v", v, 0x0, 0x03) // Rotation of the item (0-3) - .range("y", y, 0x0, 0x15); // Y grid position + .range("MyroomFloorFlg", this->MyroomFloorFlg, 0, 1) // Flag indicating if 2nd floor + .range("v", this->v, 0, 3) // Rotation of the item (0-3) + .range("y", this->y, 0, 25); // Stacking elevation (parent height / 10) } void GP_CLI_COMMAND_MYROOM_LAYOUT::process(MapSession* PSession, CCharEntity* PChar) const { - if (MyroomItemNo == 0) + if (this->MyroomItemNo == 0) { // No item sent means the client has finished placing furniture PChar->UpdateMoghancement(); return; } - // TODO: Should we be responding with inventory update/finish if we reject the client's request? - - if (MyroomCategory != LOC_MOGSAFE && MyroomCategory != LOC_MOGSAFE2) + if (this->MyroomCategory != LOC_MOGSAFE && this->MyroomCategory != LOC_MOGSAFE2) { RATE_LIMIT(30s, ShowErrorFmt("Invalid container requested: {}", PChar->getName())); return; } - auto* PContainer = PChar->getStorage(MyroomCategory); - if (PContainer == nullptr) + auto* PContainer = PChar->getStorage(this->MyroomCategory); + + // Reject out of bounds item index + if (this->MyroomItemIndex > PContainer->GetSize()) { - RATE_LIMIT(30s, ShowErrorFmt("Invalid storage requested: {}", PChar->getName())); + RATE_LIMIT(30s, ShowErrorFmt("Invalid slot requested: {}", PChar->getName())); return; } - if (MyroomItemIndex > PContainer->GetSize()) // TODO: Is this off-by-one? + // Reject MH2F placements without MH2F unlocked + const bool is2F = this->MyroomFloorFlg != 0; + if (is2F && !(PChar->profile.mhflag & 0x20)) { - RATE_LIMIT(30s, ShowErrorFmt("Invalid slot requested: {}", PChar->getName())); + ShowErrorFmt("MH2F placement without 2F unlocked: {}", PChar->getName()); return; } - // NOTE: Items hanging on walls count as their own z/x entries, rather than y changes. - // : The multiple options on MH2F mean the x limit is higher. - - // NOTE: These are all unsigned, so <0 is handled - bool lowerArea0 = z <= 23 && x <= 5; - bool lowerArea1 = z >= 18 && z <= 23 && x >= 6 && x <= 13; - bool lowerArea2 = z <= 23 && x >= 14 && x <= 19; - bool upperArea0 = z <= 25 && x <= 91; - - if (MyroomFloorFlg && !upperArea0) + // Reject missing or wrong type items + CItem* PSlotItem = PContainer->GetItem(this->MyroomItemIndex); + if (!PSlotItem || !PSlotItem->isType(ITEM_FURNISHING)) { - RATE_LIMIT(30s, ShowErrorFmt("Invalid z/x requested: {}", PChar->getName())); return; } - else if (!MyroomFloorFlg && !lowerArea0 && !lowerArea1 && !lowerArea2) + + auto* PItem = static_cast(PSlotItem); + + // Reject item ID not matching packet value. + if (PItem->getID() != this->MyroomItemNo) { - RATE_LIMIT(30s, ShowErrorFmt("Invalid z/x requested: {}", PChar->getName())); + ShowErrorFmt("Layout item id mismatch: {}", PChar->getName()); return; } - // Get item - auto* PItem = dynamic_cast(PContainer->GetItem(MyroomItemIndex)); - if (PItem == nullptr) + const auto placement = PItem->placement(); + const auto [itemWidth, itemDepth] = rotatedSize(PItem, this->v); + + switch (placement) { - return; + case FurnishingPlacement::Floor: + case FurnishingPlacement::Surface: + case FurnishingPlacement::OnTable: + { + // Every cell of the footprint must land on a valid floor tile. + if (!footprintInGrid(this->x, this->z, itemWidth, itemDepth, is2F)) + { + ShowErrorFmt("Invalid placement footprint: {}", PChar->getName()); + return; + } + + // Items on the floor (y=0) must not overlap other floor furniture. + // Stacked items (y>0) skip this because the client sends them before + // the parent when repositioning, so the parent isn't at its new spot yet. + if (this->y == 0 && anyInstalledFurnishing(PChar, this->MyroomCategory, this->MyroomItemIndex, [&](CItemFurnishing* other) + { + return collidesOnFloor(other, this->x, this->z, itemWidth, itemDepth, is2F); + })) + { + ShowErrorFmt("Placement collides with installed furniture: {}", PChar->getName()); + return; + } + + // Fresh OnTable placement (not a move): verify a Surface parent exists + // at (x, z) with matching height. Moves skip this because the client + // sends the child packet before the parent's. + if (placement == FurnishingPlacement::OnTable && this->y > 0 && !PItem->isInstalled()) + { + const bool hasParent = anyInstalledFurnishing(PChar, this->MyroomCategory, this->MyroomItemIndex, [&](CItemFurnishing* other) + { + if (other->placement() != FurnishingPlacement::Surface || other->getOn2ndFloor() != is2F) + { + return false; + } + + if (other->height() / 10 != this->y) + { + return false; + } + + const auto [pw, pd] = rotatedSize(other, other->getRotation()); + const uint8 px = other->getCol(); + const uint8 pz = other->getRow(); + return this->x >= px && this->x < px + pw && + this->z >= pz && this->z < pz + pd; + }); + if (!hasParent) + { + ShowErrorFmt("OnTable placement with no matching Surface parent: {}", PChar->getName()); + return; + } + } + + break; + } + case FurnishingPlacement::Wall: + { + if (this->y != 0 || this->z != 0) + { + ShowErrorFmt("Wall placement with non-zero y/z: {}", PChar->getName()); + return; + } + + if (!isValidWallSlot(this->x, is2F)) + { + ShowErrorFmt("Invalid wall slot requested: {}", PChar->getName()); + return; + } + + const bool occupied = anyInstalledFurnishing(PChar, this->MyroomCategory, this->MyroomItemIndex, [&](CItemFurnishing* other) + { + return other->placement() == FurnishingPlacement::Wall && + other->getOn2ndFloor() == is2F && + other->getCol() == this->x; + }); + if (occupied) + { + ShowErrorFmt("Wall slot already occupied: {}", PChar->getName()); + return; + } + + break; + } } // Try to catch packet abuse, leading to gardening pots being placed on 2nd floor. - if (MyroomFloorFlg && PItem->isGardeningPot()) + if (this->MyroomFloorFlg && PItem->isGardeningPot()) { RATE_LIMIT( 30s, @@ -110,17 +296,15 @@ void GP_CLI_COMMAND_MYROOM_LAYOUT::process(MapSession* PSession, CCharEntity* PC } // Continue with regular usage - if (PItem->getID() == MyroomItemNo && PItem->isType(ITEM_FURNISHING)) + if (PItem->getID() == this->MyroomItemNo && PItem->isType(ITEM_FURNISHING)) { - auto tempV = v; - bool wasInstalled = PItem->isInstalled(); PItem->setInstalled(true); - PItem->setOn2ndFloor(MyroomFloorFlg); - PItem->setCol(x); - PItem->setRow(z); - PItem->setLevel(y); - PItem->setRotation(tempV); + PItem->setOn2ndFloor(this->MyroomFloorFlg); + PItem->setCol(this->x); + PItem->setRow(this->z); + PItem->setLevel(this->y); + PItem->setRotation(this->v); constexpr auto maxContainerSize = MAX_CONTAINER_SIZE * 2; @@ -132,7 +316,7 @@ void GP_CLI_COMMAND_MYROOM_LAYOUT::process(MapSession* PSession, CCharEntity* PC CItemContainer* PContainer = PChar->getStorage(safeMyroomCategory); for (int slotIndex = 1; slotIndex <= PContainer->GetSize(); ++slotIndex) { - if (MyroomItemIndex == slotIndex && MyroomCategory == safeMyroomCategory) + if (this->MyroomItemIndex == slotIndex && this->MyroomCategory == safeMyroomCategory) { continue; } @@ -164,15 +348,15 @@ void GP_CLI_COMMAND_MYROOM_LAYOUT::process(MapSession* PSession, CCharEntity* PC PItem->setSubType(ITEM_LOCKED); - PChar->pushPacket(PItem, static_cast(MyroomCategory), MyroomItemIndex); + PChar->pushPacket(PItem, static_cast(this->MyroomCategory), this->MyroomItemIndex); const auto rset = db::preparedStmt("UPDATE char_inventory " "SET " "extra = ? " "WHERE location = ? AND slot = ? AND charid = ? LIMIT 1", PItem->m_extra, - MyroomCategory, - MyroomItemIndex, + this->MyroomCategory, + this->MyroomItemIndex, PChar->id); if (rset && rset->rowsAffected() && !wasInstalled) @@ -190,7 +374,7 @@ void GP_CLI_COMMAND_MYROOM_LAYOUT::process(MapSession* PSession, CCharEntity* PC PChar->loc.zone->SpawnConditionalNPCs(PChar); } - PChar->pushPacket(PItem, static_cast(MyroomCategory), MyroomItemIndex); + PChar->pushPacket(PItem, static_cast(this->MyroomCategory), this->MyroomItemIndex); PChar->pushPacket(PChar); } } diff --git a/src/map/packets/c2s/0x0fb_myroom_bankin.cpp b/src/map/packets/c2s/0x0fb_myroom_bankin.cpp index 3bc1e0131b1..d5308fb7aea 100644 --- a/src/map/packets/c2s/0x0fb_myroom_bankin.cpp +++ b/src/map/packets/c2s/0x0fb_myroom_bankin.cpp @@ -43,90 +43,108 @@ const std::set validContainers = { LOC_MOGSAFE, LOC_MOGSAFE2 }; auto GP_CLI_COMMAND_MYROOM_BANKIN::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { return PacketValidator() - .mustNotEqual(MyroomItemNo, 0, "MyroomItemNo must not equal 0") - .oneOf("MyroomCategory", MyroomCategory, validContainers); + .mustNotEqual(this->MyroomItemNo, 0, "MyroomItemNo must not equal 0") + .oneOf("MyroomCategory", this->MyroomCategory, validContainers); } void GP_CLI_COMMAND_MYROOM_BANKIN::process(MapSession* PSession, CCharEntity* PChar) const { - CItemContainer* PItemContainer = PChar->getStorage(MyroomCategory); - CItemFurnishing* PItem = static_cast(PItemContainer->GetItem(MyroomItemIndex)); + const CItemContainer* PItemContainer = PChar->getStorage(this->MyroomCategory); + if (this->MyroomItemIndex > PItemContainer->GetSize()) + { + ShowErrorFmt("Invalid slot requested: {}", PChar->getName()); + return; + } - if (PItem != nullptr && PItem->getID() == MyroomItemNo && PItem->isType(ITEM_FURNISHING)) + CItem* PItem = PItemContainer->GetItem(this->MyroomItemIndex); + if (PItem == nullptr || !PItem->isType(ITEM_FURNISHING)) { - PItemContainer = PChar->getStorage(LOC_STORAGE); + return; + } - uint8 RemovedSize = PItemContainer->GetSize() - std::min(PItemContainer->GetSize(), PItemContainer->GetBuff() - PItem->getStorage()); + auto* PFurnishing = static_cast(PItem); - if (PItemContainer->GetFreeSlotsCount() >= RemovedSize) - { - PItem->setInstalled(false); - PItem->setCol(0); - PItem->setRow(0); - PItem->setLevel(0); - PItem->setRotation(0); + if (PFurnishing->getID() != this->MyroomItemNo) + { + ShowErrorFmt("Bankin item id mismatch: {}", PChar->getName()); + return; + } - PItem->setSubType(ITEM_UNLOCKED); + if (!PFurnishing->isInstalled()) + { + ShowErrorFmt("Bankin requested for an uninstalled item: {}", PChar->getName()); + return; + } - // If this furniture is a mannequin, clear its appearance and unlock all items that were on it! - if (PItem->isMannequin()) - { - PChar->pushPacket(static_cast(MyroomCategory), MyroomItemIndex, 0, 0, 0, 0, 0, 0, 0, 0); - auto& mannequin = PItem->exdata(); - uint8_t* slots[] = { &mannequin.EquipMain, &mannequin.EquipSub, &mannequin.EquipRanged, &mannequin.EquipHead, &mannequin.EquipBody, &mannequin.EquipHands, &mannequin.EquipLegs, &mannequin.EquipFeet }; - for (auto* slot : slots) - { - if (*slot > 0) - { - auto* PEquippedItem = PChar->getStorage(LOC_STORAGE)->GetItem(*slot); - if (PEquippedItem != nullptr) - { - PChar->pushPacket(PEquippedItem, ItemLockFlg::Normal); - } - - *slot = 0; - } - } - } + PItemContainer = PChar->getStorage(LOC_STORAGE); + const uint8 RemovedSize = PItemContainer->GetSize() - std::min(PItemContainer->GetSize(), PItemContainer->GetBuff() - PFurnishing->getStorage()); + if (PItemContainer->GetFreeSlotsCount() < RemovedSize) + { + ShowError("GP_CLI_COMMAND_MYROOM_BANKIN: furnishing can't be removed"); + return; + } - const auto rset = db::preparedStmt("UPDATE char_inventory " - "SET " - "extra = ? " - "WHERE location = ? AND slot = ? AND charid = ? LIMIT 1", - PItem->m_extra, - MyroomCategory, - MyroomItemIndex, - PChar->id); + PFurnishing->setInstalled(false); + PFurnishing->setCol(0); + PFurnishing->setRow(0); + PFurnishing->setLevel(0); + PFurnishing->setRotation(0); - if (rset && rset->rowsAffected()) - { - uint8 NewSize = PItemContainer->GetSize() - RemovedSize; - for (uint8 SlotID = PItemContainer->GetSize(); SlotID > NewSize; --SlotID) - { - if (PItemContainer->GetItem(SlotID) != nullptr) - { - charutils::MoveItem(PChar, LOC_STORAGE, SlotID, ERROR_SLOTID); - } - } + PFurnishing->setSubType(ITEM_UNLOCKED); - // Storage mods only apply on the 1st floor - if (!PItem->getOn2ndFloor()) + // If this furniture is a mannequin, clear its appearance and unlock all items that were on it! + if (PFurnishing->isMannequin()) + { + PChar->pushPacket(static_cast(this->MyroomCategory), this->MyroomItemIndex, 0, 0, 0, 0, 0, 0, 0, 0); + auto& mannequin = PFurnishing->exdata(); + uint8_t* slots[] = { &mannequin.EquipMain, &mannequin.EquipSub, &mannequin.EquipRanged, &mannequin.EquipHead, &mannequin.EquipBody, &mannequin.EquipHands, &mannequin.EquipLegs, &mannequin.EquipFeet }; + for (auto* slot : slots) + { + if (*slot > 0) + { + auto* PEquippedItem = PChar->getStorage(LOC_STORAGE)->GetItem(*slot); + if (PEquippedItem != nullptr) { - PChar->getStorage(LOC_STORAGE)->AddBuff(-(int8)PItem->getStorage()); + PChar->pushPacket(PEquippedItem, ItemLockFlg::Normal); } - PChar->pushPacket(PChar); + *slot = 0; + } + } + } - luautils::OnFurnitureRemoved(PChar, PItem); + const auto rset = db::preparedStmt("UPDATE char_inventory " + "SET " + "extra = ? " + "WHERE location = ? AND slot = ? AND charid = ? LIMIT 1", + PFurnishing->m_extra, + this->MyroomCategory, + this->MyroomItemIndex, + PChar->id); - PChar->loc.zone->SpawnConditionalNPCs(PChar); + if (rset && rset->rowsAffected()) + { + const uint8 NewSize = PItemContainer->GetSize() - RemovedSize; + for (uint8 SlotID = PItemContainer->GetSize(); SlotID > NewSize; --SlotID) + { + if (PItemContainer->GetItem(SlotID) != nullptr) + { + charutils::MoveItem(PChar, LOC_STORAGE, SlotID, ERROR_SLOTID); } - PChar->pushPacket(PItem, static_cast(MyroomCategory), PItem->getSlotID()); - PChar->pushPacket(PChar); } - else + + // Storage mods only apply on the 1st floor + if (!PFurnishing->getOn2ndFloor()) { - ShowError("GP_CLI_COMMAND_MYROOM_BANKIN: furnishing can't be removed"); + PChar->getStorage(LOC_STORAGE)->AddBuff(-(int8)PFurnishing->getStorage()); } + + PChar->pushPacket(PChar); + + luautils::OnFurnitureRemoved(PChar, PFurnishing); + + PChar->loc.zone->SpawnConditionalNPCs(PChar); } + PChar->pushPacket(PFurnishing, static_cast(this->MyroomCategory), PFurnishing->getSlotID()); + PChar->pushPacket(PChar); } diff --git a/src/map/utils/itemutils.cpp b/src/map/utils/itemutils.cpp index cdc55df0027..7a900eca0e6 100644 --- a/src/map/utils/itemutils.cpp +++ b/src/map/utils/itemutils.cpp @@ -300,7 +300,7 @@ void LoadItemList() "w.skill,w.subskill,w.ilvl_skill,w.ilvl_parry," "w.ilvl_macc,w.delay,w.dmg,w.dmgType," "w.hit,w.unlock_points," - "f.storage,f.moghancement,f.element,f.aura," + "f.storage,f.moghancement,f.element,f.aura,f.placement AS furn_placement,f.size_x,f.size_y,f.height AS furn_height," "p.slot AS pup_slot,p.element AS pup_element " "FROM item_basic AS b " "LEFT JOIN item_usable AS u USING (itemId) " @@ -416,10 +416,14 @@ void LoadItemList() if (PItem->isType(ITEM_FURNISHING)) { - static_cast(PItem)->setStorage(rset->get("storage")); - static_cast(PItem)->setMoghancement(rset->get("moghancement")); - static_cast(PItem)->setElement(rset->get("element")); - static_cast(PItem)->setAura(rset->get("aura")); + auto* PFurnishing = static_cast(PItem); + PFurnishing->setStorage(rset->get("storage")); + PFurnishing->setMoghancement(rset->get("moghancement")); + PFurnishing->setElement(rset->get("element")); + PFurnishing->setAura(rset->get("aura")); + PFurnishing->setSize(rset->get("size_x"), rset->get("size_y")); + PFurnishing->setHeight(rset->get("furn_height")); + PFurnishing->setPlacement(rset->get("furn_placement")); } g_pItemList[PItem->getID()] = PItem;