From 878c422c0f87d07477e1272a37f4ec593fd8a1a1 Mon Sep 17 00:00:00 2001 From: Emagi Date: Tue, 8 Jul 2025 10:32:56 -0400 Subject: [PATCH] Support house containers being placed inside house. Need to have an appearance set with equip_type as model type/id --- source/WorldServer/Commands/Commands.cpp | 2 +- source/WorldServer/Items/Items.cpp | 18 ++++++++++++++++-- source/WorldServer/Items/ItemsDB.cpp | 4 ++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/source/WorldServer/Commands/Commands.cpp b/source/WorldServer/Commands/Commands.cpp index fdeb528..3cb9d9c 100644 --- a/source/WorldServer/Commands/Commands.cpp +++ b/source/WorldServer/Commands/Commands.cpp @@ -4034,7 +4034,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie Item* item = client->GetPlayer()->item_list.GetItemFromUniqueID(uniqueid); //Item* item = player->GetEquipmentList()->GetItem(slot); - if (item && item->IsHouseItem()) + if (item && (item->IsHouseItem() || item->IsHouseContainer())) { if (!client->HasOwnerOrEditAccess()) { diff --git a/source/WorldServer/Items/Items.cpp b/source/WorldServer/Items/Items.cpp index 37f3d33..19b187b 100644 --- a/source/WorldServer/Items/Items.cpp +++ b/source/WorldServer/Items/Items.cpp @@ -238,7 +238,7 @@ vector* MasterItemList::GetItems(string name, int64 itype, int64 ltype, i break; } case ITEM_BROKER_TYPE_HOUSEITEM:{ - if(item->IsHouseItem()) + if(item->IsHouseItem() || item->IsHouseContainer()) should_add = true; break; } @@ -1072,6 +1072,11 @@ void Item::SetItem(Item* old_item){ break; } case ITEM_TYPE_HOUSE_CONTAINER:{ + houseitem_info = new HouseItem_Info; + if(old_item->houseitem_info) { + memcpy(houseitem_info, old_item->houseitem_info, sizeof(HouseItem_Info)); + } + // House Containers housecontainer_info = new HouseContainer_Info; if (old_item->housecontainer_info) { @@ -1577,6 +1582,10 @@ void Item::SetItemType(int8 in_type){ memset(houseitem_info, 0, sizeof(HouseItem_Info)); } else if(IsHouseContainer() && !housecontainer_info){ + if(!houseitem_info) { + houseitem_info = new HouseItem_Info; + memset(houseitem_info, 0, sizeof(HouseItem_Info)); + } housecontainer_info = new HouseContainer_Info; housecontainer_info->allowed_types = 0; housecontainer_info->broker_commission = 0; @@ -2493,6 +2502,11 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16 } case ITEM_TYPE_HOUSE_CONTAINER:{ + if(houseitem_info && client->GetVersion() >= 374){ + packet->setDataByName("status_rent_reduction", houseitem_info->status_rent_reduction); + packet->setDataByName("coin_rent_reduction", houseitem_info->coin_rent_reduction); + packet->setDataByName("house_only", houseitem_info->house_only); + } //House Containers if(housecontainer_info && client->GetVersion() >= 374){ packet->setDataByName("allowed_types", housecontainer_info->allowed_types); @@ -3736,7 +3750,7 @@ void PlayerItemList::AddItemToPacket(PacketStruct* packet, Player* player, Item* //TODO: Add check to allow scribe menu_data += ITEM_MENU_TYPE_SCRIBE; } - if (item->generic_info.item_type == 10){ + if (item->generic_info.item_type == ITEM_TYPE_HOUSE || item->generic_info.item_type == ITEM_TYPE_HOUSE_CONTAINER){ menu_data += ITEM_MENU_TYPE_TEST1; menu_data += ITEM_MENU_TYPE_HOUSE; } diff --git a/source/WorldServer/Items/ItemsDB.cpp b/source/WorldServer/Items/ItemsDB.cpp index 4030412..8fdf45b 100644 --- a/source/WorldServer/Items/ItemsDB.cpp +++ b/source/WorldServer/Items/ItemsDB.cpp @@ -473,7 +473,7 @@ int32 WorldDatabase::LoadHouseItem(int32 item_id) { LogWrite(ITEM__DEBUG, 5, "Items", "\tItem HouseItem for item_id %u", id); LogWrite(ITEM__DEBUG, 5, "Items", "\ttype: %i, %i, %u, %.2f, %u", ITEM_TYPE_HOUSE, atoul(row[1]), atoi(row[2]), atof(row[3]), atoul(row[4])); - item->SetItemType(ITEM_TYPE_HOUSE); + item->SetItemType(ITEM_TYPE_HOUSE); // container will be overwritten by LoadHouseContainers which is ran after item->houseitem_info->status_rent_reduction = atoi(row[2]); item->houseitem_info->coin_rent_reduction = atof(row[3]); item->houseitem_info->house_only = atoi(row[4]); @@ -1069,7 +1069,7 @@ void WorldDatabase::LoadItemList(int32 item_id) LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Skill Items", LoadSkillItems(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Adornment Items", LoadAdornments(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Recipe Book Items", LoadRecipeBookItems(item_id)); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Containers", LoadHouseContainers(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Containers", LoadHouseContainers(item_id)); // must be called after LoadHouseItem LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Appearances..."); LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Appearances", LoadItemAppearances(item_id));