From a66b9372009bbdd588da92b8bb65e98d470c6ddf Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 25 Dec 2018 21:05:13 +1100 Subject: [PATCH] create all estate inventories on launch --- src/common/Common.h | 8 +- src/world/Manager/HousingMgr.cpp | 85 ++++++++++++++----- src/world/Manager/HousingMgr.h | 7 +- .../Network/Handlers/ClientTriggerHandler.cpp | 4 +- 4 files changed, 76 insertions(+), 28 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index b44c67c3..caed668e 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -225,13 +225,15 @@ namespace Sapphire::Common // housing interior containers HousingInteriorAppearance = 25002, - // 50 in each container max, 300 slots max + // 50 in each container max, 400 slots max HousingInteriorPlacedItems1 = 25003, HousingInteriorPlacedItems2 = 25004, HousingInteriorPlacedItems3 = 25005, HousingInteriorPlacedItems4 = 25006, HousingInteriorPlacedItems5 = 25007, HousingInteriorPlacedItems6 = 25008, + HousingInteriorPlacedItems7 = 25009, + HousingInteriorPlacedItems8 = 25010, // 50 max per container, 400 slots max // slot limit increased 'temporarily' for relocation for all estates @@ -247,9 +249,9 @@ namespace Sapphire::Common // housing exterior containers - HousingOutdoorPlacedItems = 25001, + HousingExteriorPlacedItems = 25001, HousingExteriorAppearance = 25000, - HousingOutdoorStoreroom = 27000, + HousingExteriorStoreroom = 27000, }; diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 5ea6d1e1..44dfc5c3 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -35,7 +35,18 @@ using namespace Sapphire::Network::Packets::Server; extern Sapphire::Framework g_fw; -Sapphire::World::Manager::HousingMgr::HousingMgr() = default; +Sapphire::World::Manager::HousingMgr::HousingMgr() +{ + m_containerMap[ 0 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 1 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 2 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 3 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 4 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 5 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 6 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); + m_containerMap[ 7 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); +} + Sapphire::World::Manager::HousingMgr::~HousingMgr() = default; bool Sapphire::World::Manager::HousingMgr::init() @@ -117,19 +128,11 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() ContainerIdToContainerMap& estateInv = m_estateInventories[ ident ]; - // check if containerId exists + // check if containerId exists, it always should - if it doesn't, something went wrong auto container = estateInv.find( containerId ); - if( container == estateInv.end() ) - { - // create container - // todo: how to handle this max slot stuff? override it on land init? - auto ic = make_ItemContainer( containerId, 400, "houseiteminventory", true ); - ic->setItem( slot, item ); + assert( container != estateInv.end() ); - estateInv[ containerId ] = ic; - } - else - container->second->setItem( slot, item ); + container->second->setItem( slot, item ); itemCount++; } @@ -153,7 +156,7 @@ void Sapphire::World::Manager::HousingMgr::initLandCache() // land stuff entry.m_landSetId = res->getUInt64( "LandSetId" ); - entry.m_landId = res->getUInt64( "LandId" ); + entry.m_landId = res->getUInt( "LandId" ); entry.m_type = static_cast< Common::LandType >( res->getUInt( "Type" ) ); entry.m_size = res->getUInt8( "Size" ); @@ -180,25 +183,63 @@ void Sapphire::World::Manager::HousingMgr::initLandCache() switch( entry.m_size ) { case HouseSize::Cottage: - maxExternalItems = 20; - maxInternalItems = 200; + entry.m_maxPlacedExternalItems = 20; + entry.m_maxPlacedInternalItems = 200; break; case HouseSize::House: - maxExternalItems = 30; - maxInternalItems = 300; + entry.m_maxPlacedExternalItems = 30; + entry.m_maxPlacedInternalItems = 300; break; case HouseSize::Mansion: - maxExternalItems = 40; - maxInternalItems = 400; + entry.m_maxPlacedExternalItems = 40; + entry.m_maxPlacedInternalItems = 400; break; default: // this should never ever happen, if it does the db is fucked log->error( "HousingMgr: Plot " + std::to_string( entry.m_landId ) + " in landset " + std::to_string( entry.m_landSetId ) + " has an invalid land size, defaulting to cottage." ); - maxExternalItems = 20; - maxInternalItems = 200; + entry.m_maxPlacedExternalItems = 20; + entry.m_maxPlacedInternalItems = 200; break; } + + // setup containers + // todo: this is pretty garbage + Common::LandIdent ident; + ident.territoryTypeId = entry.m_landSetId >> 16; + ident.wardNum = entry.m_landSetId & 0xFFFF; + ident.landId = entry.m_landId; + ident.worldId = 67; + + auto& containers = getEstateInventory( ident ); + + auto makeContainer = [ &containers ]( Common::InventoryType type, uint16_t size ) + { + containers[ type ] = make_ItemContainer( type, size, "houseiteminventory", true ); + }; + + uint16_t count = 0; + for( int i = 0; i < 8; ++i ) + { + if( count >= entry.m_maxPlacedInternalItems ) + break; + + auto& pair = m_containerMap[ i ]; + + makeContainer( pair.first, 50 ); + makeContainer( pair.second, 50 ); + + count += 50; + } + + // exterior + makeContainer( InventoryType::HousingExteriorPlacedItems, entry.m_maxPlacedExternalItems ); + makeContainer( InventoryType::HousingExteriorStoreroom, entry.m_maxPlacedExternalItems ); + + // fixed containers + makeContainer( InventoryType::HousingInteriorAppearance, 10 ); + makeContainer( InventoryType::HousingExteriorAppearance, 8 ); + } } @@ -855,7 +896,7 @@ uint32_t Sapphire::World::Manager::HousingMgr::getItemAdditionalData( uint32_t c bool Sapphire::World::Manager::HousingMgr::isPlacedItemsInventory( Sapphire::Common::InventoryType type ) { - return type == InventoryType::HousingOutdoorPlacedItems || + return type == InventoryType::HousingExteriorPlacedItems || type == InventoryType::HousingInteriorPlacedItems1 || type == InventoryType::HousingInteriorPlacedItems2 || type == InventoryType::HousingInteriorPlacedItems3 || diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index 08deb2ac..8413f8e2 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -26,7 +26,7 @@ namespace Sapphire::World::Manager { // land table uint64_t m_landSetId; - uint64_t m_landId; + uint16_t m_landId; Common::LandType m_type; uint8_t m_size; @@ -46,6 +46,9 @@ namespace Sapphire::World::Manager uint64_t m_buildTime; uint64_t m_endorsements; + + uint16_t m_maxPlacedExternalItems; + uint16_t m_maxPlacedInternalItems; }; /*! @@ -190,6 +193,8 @@ namespace Sapphire::World::Manager LandSetLandCacheMap m_landCache; LandIdentToInventoryContainerMap m_estateInventories; + std::array< std::pair< Common::InventoryType, Common::InventoryType >, 8 > m_containerMap; + }; } diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp index e61e168d..157739eb 100644 --- a/src/world/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp @@ -430,9 +430,9 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX if( !housingMgr ) break; - uint16_t inventoryType = Common::InventoryType::HousingOutdoorPlacedItems; + uint16_t inventoryType = Common::InventoryType::HousingExteriorPlacedItems; if( param2 == 1 ) - inventoryType = Common::InventoryType::HousingOutdoorStoreroom; + inventoryType = Common::InventoryType::HousingExteriorStoreroom; housingMgr->sendEstateInventory( player, inventoryType, plot );