From 99d52f18f1c9f7103b30c341e95edf1faf40247f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 26 Dec 2018 00:43:27 +1100 Subject: [PATCH] yard object spawning (mostly) working --- src/world/Inventory/HousingItem.cpp | 4 +- src/world/Inventory/HousingItem.h | 7 +-- src/world/Inventory/Item.h | 2 +- src/world/Manager/HousingMgr.cpp | 2 +- src/world/Territory/HousingZone.cpp | 84 ++++++++++++++++++++++++++++- src/world/Territory/HousingZone.h | 14 +++++ 6 files changed, 104 insertions(+), 9 deletions(-) diff --git a/src/world/Inventory/HousingItem.cpp b/src/world/Inventory/HousingItem.cpp index 139e5e94..3ab655e2 100644 --- a/src/world/Inventory/HousingItem.cpp +++ b/src/world/Inventory/HousingItem.cpp @@ -4,12 +4,12 @@ Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId Sapphire::Item( uId, catalogId, false ) { } -float Sapphire::Inventory::HousingItem::getRot() const +uint16_t Sapphire::Inventory::HousingItem::getRot() const { return m_rotation; } -void Sapphire::Inventory::HousingItem::setRot( float rot ) +void Sapphire::Inventory::HousingItem::setRot( uint16_t rot ) { m_rotation = rot; } diff --git a/src/world/Inventory/HousingItem.h b/src/world/Inventory/HousingItem.h index 83fa20e3..d1536834 100644 --- a/src/world/Inventory/HousingItem.h +++ b/src/world/Inventory/HousingItem.h @@ -9,16 +9,17 @@ namespace Sapphire::Inventory { public: HousingItem( uint64_t uId, uint32_t catalogId ); + virtual ~HousingItem() = default; - void setRot( float rot ); - float getRot() const; + void setRot( uint16_t rot ); + uint16_t getRot() const; void setPos( Common::FFXIVARR_POSITION3 pos ); Common::FFXIVARR_POSITION3 getPos() const; private: Common::FFXIVARR_POSITION3 m_position; - float m_rotation; + uint16_t m_rotation; }; } diff --git a/src/world/Inventory/Item.h b/src/world/Inventory/Item.h index a5980ba5..f2b17ad1 100644 --- a/src/world/Inventory/Item.h +++ b/src/world/Inventory/Item.h @@ -12,7 +12,7 @@ namespace Sapphire public: Item( uint64_t uId, uint32_t catalogId, bool isHq = false ); - ~Item() = default; + virtual ~Item() = default; uint32_t getId() const; diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 2ad42b83..1d49544e 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -124,7 +124,7 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() res->getFloat( "PosZ" ) } ); - item->setRot( res->getFloat( "Rotation" ) ); + item->setRot( res->getUInt( "Rotation" ) ); } ContainerIdToContainerMap& estateInv = m_estateInventories[ ident ]; diff --git a/src/world/Territory/HousingZone.cpp b/src/world/Territory/HousingZone.cpp index f480282e..bcfc6dc1 100644 --- a/src/world/Territory/HousingZone.cpp +++ b/src/world/Territory/HousingZone.cpp @@ -12,6 +12,8 @@ #include "Actor/EventObject.h" #include "Land.h" #include "House.h" +#include "Inventory/HousingItem.h" +#include "Inventory/ItemContainer.h" #include "Forwards.h" #include "HousingZone.h" @@ -51,7 +53,7 @@ bool Sapphire::HousingZone::init() } - int housingIndex; + uint32_t housingIndex = 0; if( m_territoryTypeId == 339 ) housingIndex = 0; else if( m_territoryTypeId == 340 ) @@ -64,6 +66,44 @@ bool Sapphire::HousingZone::init() auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto info = pExdData->get< Sapphire::Data::HousingLandSet >( housingIndex ); + // build yard objects array indices + int16_t cursor = -1; + uint16_t index = 0; + for( const auto size : info->plotSize ) + { + uint16_t itemMax = 0; + switch( size ) + { + case 0: + itemMax = 20; + break; + + case 1: + itemMax = 30; + break; + + case 2: + itemMax = 40; + break; + } + + int16_t start = cursor + 1; + int16_t end = cursor + itemMax; + + m_yardObjectArrayBounds[ index++ ] = std::make_pair( start, end ); + + // reset cursor for subdivision + if( index == 30 ) + { + cursor = -1; + + continue; + } + + cursor += itemMax; + } + + auto housingMgr = g_fw.get< World::Manager::HousingMgr >(); auto landCache = housingMgr->getLandCacheMap(); @@ -83,7 +123,8 @@ bool Sapphire::HousingZone::init() // setup house if( entry.m_houseId ) { - auto house = make_House( entry.m_houseId, m_landSetId, land->getLandIdent(), entry.m_estateName, entry.m_estateComment ); + auto house = make_House( entry.m_houseId, m_landSetId, land->getLandIdent(), entry.m_estateName, + entry.m_estateComment ); housingMgr->updateHouseModels( house ); land->setHouse( house ); @@ -95,6 +136,32 @@ bool Sapphire::HousingZone::init() if( entry.m_houseId > 0 ) registerEstateEntranceEObj( entry.m_landId ); + + // add items to yard object array + auto& inventory = housingMgr->getEstateInventory( land->getLandIdent() ); + auto& externalContainer = inventory[ InventoryType::HousingExteriorPlacedItems ]; + + auto arrayBounds = m_yardObjectArrayBounds[ entry.m_landId ]; + uint8_t yardMapIndex = entry.m_landId <= 29 ? 0 : 1; + + for( auto& item : externalContainer->getItemMap() ) + { + Common::YardObject obj{}; + + auto housingItem = std::dynamic_pointer_cast< Inventory::HousingItem >( item.second ); + assert( housingItem ); + + auto pos = housingItem->getPos(); + + obj.itemId = housingItem->getAdditionalData(); + obj.itemRotation = housingItem->getRot(); + + obj.pos_x = Util::floatToUInt16( pos.x ); + obj.pos_y = Util::floatToUInt16( pos.y ); + obj.pos_z = Util::floatToUInt16( pos.z ); + + m_yardObjects[ yardMapIndex ][ item.first + arrayBounds.first ] = obj; + } } return true; @@ -273,4 +340,17 @@ Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEO registerEObj( eObj ); return eObj; +} + +void Sapphire::HousingZone::updateYardObjects( Sapphire::Common::LandIdent ident ) +{ + auto housingMgr = g_fw.get< World::Manager::HousingMgr >(); + auto& landStorage = housingMgr->getEstateInventory( ident ); + + auto yardContainer = landStorage[ InventoryType::HousingExteriorPlacedItems ]; + + for( const auto& item : yardContainer->getItemMap() ) + { + + } } \ No newline at end of file diff --git a/src/world/Territory/HousingZone.h b/src/world/Territory/HousingZone.h index 84464182..e5d913f0 100644 --- a/src/world/Territory/HousingZone.h +++ b/src/world/Territory/HousingZone.h @@ -52,13 +52,26 @@ namespace Sapphire Entity::EventObjectPtr registerEstateEntranceEObj( uint8_t landId ); + void updateYardObjects( Common::LandIdent ident ); + private: using LandPtrMap = std::unordered_map< uint8_t, Sapphire::LandPtr >; using YardObjectArray = std::array< Common::YardObject, 800 >; using YardObjectMap = std::map< uint8_t, YardObjectArray >; + /*! + * @brief Maps the start and end index of the yard object array for a specific plot + * + * pair.first = start index + * pair.second = end index + */ using YardObjectArrayBoundsPair = std::pair< uint16_t, uint16_t >; + /*! + * @brief Maps each plot to a YardObjectArrayBoundsPair to the start/end index of the yard object array. + */ + using YardObjectArrayBoundsArray = std::array< YardObjectArrayBoundsPair, 60 >; + const uint32_t m_landSetMax = 18; LandPtrMap m_landPtrMap; uint8_t m_wardNum; @@ -66,6 +79,7 @@ namespace Sapphire uint32_t m_territoryTypeId; YardObjectMap m_yardObjects; + YardObjectArrayBoundsArray m_yardObjectArrayBounds; }; }