mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 06:47:45 +00:00
it works (again!)
This commit is contained in:
parent
ceebb27c1c
commit
4d9802bdbb
13 changed files with 81 additions and 84 deletions
|
@ -589,7 +589,7 @@ Sapphire::ItemPtr Sapphire::Entity::Player::createItem( uint32_t catalogId, uint
|
||||||
|
|
||||||
uint8_t flags = 0;
|
uint8_t flags = 0;
|
||||||
|
|
||||||
ItemPtr pItem = make_Item( Items::Util::getNextUId(), catalogId, m_pFw );
|
ItemPtr pItem = make_Item( itemMgr->getNextUId(), catalogId, m_pFw );
|
||||||
|
|
||||||
pItem->setStackSize( quantity );
|
pItem->setStackSize( quantity );
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "HousingItem.h"
|
#include "HousingItem.h"
|
||||||
|
|
||||||
Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId ) :
|
Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw ) :
|
||||||
Sapphire::Item( uId, catalogId, false )
|
Sapphire::Item( uId, catalogId, pFw, false )
|
||||||
{
|
{
|
||||||
m_stackSize = 1;
|
m_stackSize = 1;
|
||||||
m_spiritBond = 1;
|
m_spiritBond = 1;
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace Sapphire::Inventory
|
||||||
class HousingItem : public Item
|
class HousingItem : public Item
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HousingItem( uint64_t uId, uint32_t catalogId );
|
HousingItem( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw );
|
||||||
virtual ~HousingItem() = default;
|
virtual ~HousingItem() = default;
|
||||||
|
|
||||||
void setRot( uint16_t rot );
|
void setRot( uint16_t rot );
|
||||||
|
|
|
@ -43,7 +43,7 @@ void Sapphire::ItemContainer::removeItem( uint16_t slotId )
|
||||||
|
|
||||||
if( it != m_itemMap.end() )
|
if( it != m_itemMap.end() )
|
||||||
{
|
{
|
||||||
if( m_removeItemOnContainerRemove )
|
if( m_isPersistentStorage )
|
||||||
pDb->execute( "DELETE FROM charaglobalitem WHERE itemId = " + std::to_string( it->second->getUId() ) );
|
pDb->execute( "DELETE FROM charaglobalitem WHERE itemId = " + std::to_string( it->second->getUId() ) );
|
||||||
|
|
||||||
m_itemMap.erase( it );
|
m_itemMap.erase( it );
|
||||||
|
@ -115,7 +115,7 @@ bool Sapphire::ItemContainer::isMultiStorage() const
|
||||||
|
|
||||||
bool Sapphire::ItemContainer::isPersistentStorage() const
|
bool Sapphire::ItemContainer::isPersistentStorage() const
|
||||||
{
|
{
|
||||||
return m_removeItemOnContainerRemove;
|
return m_isPersistentStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -75,9 +75,7 @@ Sapphire::World::Manager::HousingMgr::~HousingMgr() = default;
|
||||||
|
|
||||||
bool Sapphire::World::Manager::HousingMgr::init()
|
bool Sapphire::World::Manager::HousingMgr::init()
|
||||||
{
|
{
|
||||||
auto log = g_fw.get< Sapphire::Logger >();
|
Logger::info( "HousingMgr: Caching housing land init data" );
|
||||||
|
|
||||||
log->info( "HousingMgr: Caching housing land init data" );
|
|
||||||
//LAND_SEL_ALL
|
//LAND_SEL_ALL
|
||||||
|
|
||||||
// 18 wards per territory, 4 territories
|
// 18 wards per territory, 4 territories
|
||||||
|
@ -85,7 +83,7 @@ bool Sapphire::World::Manager::HousingMgr::init()
|
||||||
|
|
||||||
initLandCache();
|
initLandCache();
|
||||||
|
|
||||||
log->debug( "HousingMgr: Checking land counts" );
|
Logger::debug( "HousingMgr: Checking land counts" );
|
||||||
|
|
||||||
uint32_t houseCount = 0;
|
uint32_t houseCount = 0;
|
||||||
for( auto& landSet : m_landCache )
|
for( auto& landSet : m_landCache )
|
||||||
|
@ -96,12 +94,12 @@ bool Sapphire::World::Manager::HousingMgr::init()
|
||||||
|
|
||||||
if( landSet.second.size() != 60 )
|
if( landSet.second.size() != 60 )
|
||||||
{
|
{
|
||||||
log->fatal( "LandSet " + std::to_string( landSet.first ) + " is missing land entries. Only have " + std::to_string( count ) + " land entries." );
|
Logger::fatal( "LandSet " + std::to_string( landSet.first ) + " is missing land entries. Only have " + std::to_string( count ) + " land entries." );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log->info( "HousingMgr: Cached " + std::to_string( houseCount ) + " houses" );
|
Logger::info( "HousingMgr: Cached " + std::to_string( houseCount ) + " houses" );
|
||||||
|
|
||||||
/////
|
/////
|
||||||
|
|
||||||
|
@ -113,11 +111,9 @@ bool Sapphire::World::Manager::HousingMgr::init()
|
||||||
|
|
||||||
bool Sapphire::World::Manager::HousingMgr::loadEstateInventories()
|
bool Sapphire::World::Manager::HousingMgr::loadEstateInventories()
|
||||||
{
|
{
|
||||||
auto log = g_fw.get< Sapphire::Logger >();
|
Logger::info( "HousingMgr: Loading inventories for estates" );
|
||||||
|
|
||||||
log->info( "HousingMgr: Loading inventories for estates" );
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_SEL_ALL );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_SEL_ALL );
|
||||||
auto res = pDb->query( stmt );
|
auto res = pDb->query( stmt );
|
||||||
|
@ -134,7 +130,7 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories()
|
||||||
auto stain = res->getUInt8( "stain" );
|
auto stain = res->getUInt8( "stain" );
|
||||||
auto characterId = res->getUInt64( "CharacterId" );
|
auto characterId = res->getUInt64( "CharacterId" );
|
||||||
|
|
||||||
auto item = Inventory::make_HousingItem( itemId, catalogId );
|
auto item = Inventory::make_HousingItem( itemId, catalogId, framework() );
|
||||||
item->setStain( stain );
|
item->setStain( stain );
|
||||||
item->setStackSize( 1 );
|
item->setStackSize( 1 );
|
||||||
// todo: need to set the owner character id on the item
|
// todo: need to set the owner character id on the item
|
||||||
|
@ -162,15 +158,14 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories()
|
||||||
itemCount++;
|
itemCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
log->debug( "HousingMgr: Loaded " + std::to_string( itemCount ) + " inventory items" );
|
Logger::debug( "HousingMgr: Loaded " + std::to_string( itemCount ) + " inventory items" );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::World::Manager::HousingMgr::initLandCache()
|
void Sapphire::World::Manager::HousingMgr::initLandCache()
|
||||||
{
|
{
|
||||||
auto log = g_fw.get< Sapphire::Logger >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_SEL_ALL );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_SEL_ALL );
|
||||||
auto res = pDb->query( stmt );
|
auto res = pDb->query( stmt );
|
||||||
|
@ -221,8 +216,8 @@ void Sapphire::World::Manager::HousingMgr::initLandCache()
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// this should never ever happen, if it does the db is fucked
|
// 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 ) +
|
Logger::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." );
|
" has an invalid land size, defaulting to cottage." );
|
||||||
entry.m_maxPlacedExternalItems = 20;
|
entry.m_maxPlacedExternalItems = 20;
|
||||||
entry.m_maxPlacedInternalItems = 200;
|
entry.m_maxPlacedInternalItems = 200;
|
||||||
break;
|
break;
|
||||||
|
@ -238,9 +233,9 @@ void Sapphire::World::Manager::HousingMgr::initLandCache()
|
||||||
|
|
||||||
auto& containers = getEstateInventory( ident );
|
auto& containers = getEstateInventory( ident );
|
||||||
|
|
||||||
auto makeContainer = [ &containers ]( Common::InventoryType type, uint16_t size )
|
auto makeContainer = [ &containers, this ]( Common::InventoryType type, uint16_t size )
|
||||||
{
|
{
|
||||||
containers[ type ] = make_ItemContainer( type, size, "houseiteminventory", false, false );
|
containers[ type ] = make_ItemContainer( type, size, "houseiteminventory", false, framework(), false );
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t count = 0;
|
uint16_t count = 0;
|
||||||
|
@ -270,7 +265,7 @@ void Sapphire::World::Manager::HousingMgr::initLandCache()
|
||||||
|
|
||||||
uint64_t Sapphire::World::Manager::HousingMgr::getNextHouseId()
|
uint64_t Sapphire::World::Manager::HousingMgr::getNextHouseId()
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
auto pQR = pDb->query( "SELECT MAX( HouseId ) FROM house" );
|
auto pQR = pDb->query( "SELECT MAX( HouseId ) FROM house" );
|
||||||
|
|
||||||
if( !pQR->next() )
|
if( !pQR->next() )
|
||||||
|
@ -555,15 +550,15 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play
|
||||||
auto itemMax = land->getInventoryItemMax();
|
auto itemMax = land->getInventoryItemMax();
|
||||||
|
|
||||||
// type, maxSize, tableName, isMultiStorage
|
// type, maxSize, tableName, isMultiStorage
|
||||||
auto intContainer = make_ItemContainer( InventoryType::HousingInteriorAppearance, itemMax.second, "houseiteminventory", true );
|
auto intContainer = make_ItemContainer( InventoryType::HousingInteriorAppearance, itemMax.second, "houseiteminventory", true, framework() );
|
||||||
auto extContainer = make_ItemContainer( InventoryType::HousingExteriorAppearance, itemMax.first, "houseiteminventory", true );
|
auto extContainer = make_ItemContainer( InventoryType::HousingExteriorAppearance, itemMax.first, "houseiteminventory", true, framework() );
|
||||||
|
|
||||||
// add containers to inv collection
|
// add containers to inv collection
|
||||||
auto& houseInventory = getEstateInventory( house->getLandIdent() );
|
auto& houseInventory = getEstateInventory( house->getLandIdent() );
|
||||||
houseInventory[ InventoryType::HousingInteriorAppearance ] = intContainer;
|
houseInventory[ InventoryType::HousingInteriorAppearance ] = intContainer;
|
||||||
houseInventory[ InventoryType::HousingExteriorAppearance ] = extContainer;
|
houseInventory[ InventoryType::HousingExteriorAppearance ] = extContainer;
|
||||||
|
|
||||||
auto exdData = g_fw.get< Sapphire::Data::ExdDataGenerated >();
|
auto exdData = framework()->get< Sapphire::Data::ExdDataGenerated >();
|
||||||
auto preset = exdData->get< Sapphire::Data::HousingPreset >( getItemAdditionalData( presetCatalogId ) );
|
auto preset = exdData->get< Sapphire::Data::HousingPreset >( getItemAdditionalData( presetCatalogId ) );
|
||||||
if( !preset )
|
if( !preset )
|
||||||
return false;
|
return false;
|
||||||
|
@ -604,7 +599,7 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
// create and link items
|
// create and link items
|
||||||
for( auto& destContainer : invMap )
|
for( auto& destContainer : invMap )
|
||||||
|
@ -633,7 +628,7 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play
|
||||||
|
|
||||||
void Sapphire::World::Manager::HousingMgr::createHouse( Sapphire::HousePtr house ) const
|
void Sapphire::World::Manager::HousingMgr::createHouse( Sapphire::HousePtr house ) const
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::HOUSING_HOUSE_INS );
|
auto stmt = pDb->getPreparedStatement( Db::HOUSING_HOUSE_INS );
|
||||||
// LandSetId, HouseId, HouseName
|
// LandSetId, HouseId, HouseName
|
||||||
|
@ -665,7 +660,7 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl
|
||||||
// create house
|
// create house
|
||||||
auto ident = pLand->getLandIdent();
|
auto ident = pLand->getLandIdent();
|
||||||
auto house = make_House( getNextHouseId(), pLand->getLandSetId(), ident,
|
auto house = make_House( getNextHouseId(), pLand->getLandSetId(), ident,
|
||||||
"Estate #" + std::to_string( ident.landId + 1 ), "" );
|
"Estate #" + std::to_string( ident.landId + 1 ), "", framework() );
|
||||||
|
|
||||||
pLand->setHouse( house );
|
pLand->setHouse( house );
|
||||||
|
|
||||||
|
@ -854,7 +849,7 @@ void Sapphire::World::Manager::HousingMgr::sendEstateInventory( Entity::Player&
|
||||||
if( needle == containers.end() )
|
if( needle == containers.end() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< Manager::InventoryMgr >();
|
auto invMgr = framework()->get< Manager::InventoryMgr >();
|
||||||
invMgr->sendInventoryContainer( player, needle->second );
|
invMgr->sendInventoryContainer( player, needle->second );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,7 +904,7 @@ void Sapphire::World::Manager::HousingMgr::updateHouseModels( Sapphire::HousePtr
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_fw.get< Logger >()->error( "Plot " + std::to_string( house->getLandIdent().landId ) + " has an invalid inventory configuration for outdoor appearance." );
|
framework()->get< Logger >()->error( "Plot " + std::to_string( house->getLandIdent().landId ) + " has an invalid inventory configuration for outdoor appearance." );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto intContainer = containers.find( static_cast< uint16_t >( InventoryType::HousingInteriorAppearance ) );
|
auto intContainer = containers.find( static_cast< uint16_t >( InventoryType::HousingInteriorAppearance ) );
|
||||||
|
@ -923,13 +918,13 @@ void Sapphire::World::Manager::HousingMgr::updateHouseModels( Sapphire::HousePtr
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_fw.get< Logger >()->error( "Plot " + std::to_string( house->getLandIdent().landId ) + " has an invalid inventory configuration for indoor appearance." );
|
framework()->get< Logger >()->error( "Plot " + std::to_string( house->getLandIdent().landId ) + " has an invalid inventory configuration for indoor appearance." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Sapphire::World::Manager::HousingMgr::getItemAdditionalData( uint32_t catalogId )
|
uint32_t Sapphire::World::Manager::HousingMgr::getItemAdditionalData( uint32_t catalogId )
|
||||||
{
|
{
|
||||||
auto pExdData = g_fw.get< Data::ExdDataGenerated >();
|
auto pExdData = framework()->get< Data::ExdDataGenerated >();
|
||||||
auto info = pExdData->get< Sapphire::Data::Item >( catalogId );
|
auto info = pExdData->get< Sapphire::Data::Item >( catalogId );
|
||||||
return info->additionalData;
|
return info->additionalData;
|
||||||
}
|
}
|
||||||
|
@ -1001,7 +996,7 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceHousingItem( Sapphire::Entity
|
||||||
{
|
{
|
||||||
auto tmpItem = player.dropInventoryItem( static_cast< Common::InventoryType >( containerId ), slotId );
|
auto tmpItem = player.dropInventoryItem( static_cast< Common::InventoryType >( containerId ), slotId );
|
||||||
|
|
||||||
item = Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() );
|
item = Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId(), framework() );
|
||||||
|
|
||||||
// set params
|
// set params
|
||||||
item->setPos( {
|
item->setPos( {
|
||||||
|
@ -1037,7 +1032,7 @@ bool Sapphire::World::Manager::HousingMgr::placeExternalItem( Entity::Player& pl
|
||||||
Inventory::HousingItemPtr item,
|
Inventory::HousingItemPtr item,
|
||||||
Common::LandIdent ident )
|
Common::LandIdent ident )
|
||||||
{
|
{
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
auto& container = getEstateInventory( ident )[ InventoryType::HousingExteriorPlacedItems ];
|
auto& container = getEstateInventory( ident )[ InventoryType::HousingExteriorPlacedItems ];
|
||||||
|
|
||||||
|
@ -1070,7 +1065,7 @@ bool Sapphire::World::Manager::HousingMgr::placeExternalItem( Entity::Player& pl
|
||||||
bool Sapphire::World::Manager::HousingMgr::placeInteriorItem( Entity::Player& player,
|
bool Sapphire::World::Manager::HousingMgr::placeInteriorItem( Entity::Player& player,
|
||||||
Inventory::HousingItemPtr item )
|
Inventory::HousingItemPtr item )
|
||||||
{
|
{
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() );
|
auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() );
|
||||||
assert( zone );
|
assert( zone );
|
||||||
|
@ -1144,7 +1139,7 @@ void Sapphire::World::Manager::HousingMgr::sendInternalEstateInventoryBatch( Sap
|
||||||
else
|
else
|
||||||
containerIds = m_internalPlacedItemContainers;
|
containerIds = m_internalPlacedItemContainers;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< Manager::InventoryMgr >();
|
auto invMgr = framework()->get< Manager::InventoryMgr >();
|
||||||
auto& containers = getEstateInventory( zone->getLandIdent() );
|
auto& containers = getEstateInventory( zone->getLandIdent() );
|
||||||
|
|
||||||
for( auto containerId : containerIds )
|
for( auto containerId : containerIds )
|
||||||
|
@ -1221,7 +1216,7 @@ bool Sapphire::World::Manager::HousingMgr::moveInternalItem( Entity::Player& pla
|
||||||
item->setRot( Util::floatToUInt16Rot( rot ) );
|
item->setRot( Util::floatToUInt16Rot( rot ) );
|
||||||
|
|
||||||
// save
|
// save
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
invMgr->updateHousingItemPosition( item );
|
invMgr->updateHousingItemPosition( item );
|
||||||
|
|
||||||
terri.updateHousingObjectPosition( player, slot, item->getPos(), item->getRot() );
|
terri.updateHousingObjectPosition( player, slot, item->getPos(), item->getRot() );
|
||||||
|
@ -1264,7 +1259,7 @@ bool Sapphire::World::Manager::HousingMgr::moveExternalItem( Entity::Player& pla
|
||||||
|
|
||||||
item->setRot( Util::floatToUInt16Rot( rot ) );
|
item->setRot( Util::floatToUInt16Rot( rot ) );
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
invMgr->updateHousingItemPosition( item );
|
invMgr->updateHousingItemPosition( item );
|
||||||
|
|
||||||
terri.updateYardObjectPos( player, slot, ident.landId, *item );
|
terri.updateYardObjectPos( player, slot, ident.landId, *item );
|
||||||
|
@ -1353,7 +1348,7 @@ bool Sapphire::World::Manager::HousingMgr::removeInternalItem( Entity::Player& p
|
||||||
if( !player.getFreeInventoryContainerSlot( containerPair ) )
|
if( !player.getFreeInventoryContainerSlot( containerPair ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
// remove it from housing inventory
|
// remove it from housing inventory
|
||||||
container->removeItem( slotId );
|
container->removeItem( slotId );
|
||||||
|
@ -1375,7 +1370,7 @@ bool Sapphire::World::Manager::HousingMgr::removeInternalItem( Entity::Player& p
|
||||||
if( !freeContainer )
|
if( !freeContainer )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
container->removeItem( slotId );
|
container->removeItem( slotId );
|
||||||
invMgr->sendInventoryContainer( player, container );
|
invMgr->sendInventoryContainer( player, container );
|
||||||
|
@ -1410,7 +1405,7 @@ bool Sapphire::World::Manager::HousingMgr::removeExternalItem( Entity::Player& p
|
||||||
if( !item )
|
if( !item )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
if( sendToStoreroom )
|
if( sendToStoreroom )
|
||||||
{
|
{
|
||||||
|
@ -1495,7 +1490,7 @@ void Sapphire::World::Manager::HousingMgr::reqEstateExteriorRemodel( Sapphire::E
|
||||||
if( needle == inv.end() )
|
if( needle == inv.end() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
invMgr->sendInventoryContainer( player, needle->second );
|
invMgr->sendInventoryContainer( player, needle->second );
|
||||||
|
|
||||||
|
@ -1526,7 +1521,7 @@ void Sapphire::World::Manager::HousingMgr::reqEstateInteriorRemodel( Sapphire::E
|
||||||
if( needle == inv.end() )
|
if( needle == inv.end() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto invMgr = g_fw.get< InventoryMgr >();
|
auto invMgr = framework()->get< InventoryMgr >();
|
||||||
|
|
||||||
invMgr->sendInventoryContainer( player, needle->second );
|
invMgr->sendInventoryContainer( player, needle->second );
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "Inventory/ItemContainer.h"
|
#include "Inventory/ItemContainer.h"
|
||||||
#include "Inventory/HousingItem.h"
|
#include "Inventory/HousingItem.h"
|
||||||
#include "Inventory/ItemUtil.h"
|
#include "Manager/ItemMgr.h"
|
||||||
#include <Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <Network/GamePacketNew.h>
|
#include <Network/GamePacketNew.h>
|
||||||
|
|
||||||
|
@ -13,10 +13,12 @@
|
||||||
|
|
||||||
#include "Framework.h"
|
#include "Framework.h"
|
||||||
|
|
||||||
extern Sapphire::Framework g_fw;
|
|
||||||
|
|
||||||
using namespace Sapphire::Network::Packets;
|
using namespace Sapphire::Network::Packets;
|
||||||
|
|
||||||
|
Sapphire::World::Manager::InventoryMgr::InventoryMgr( Sapphire::FrameworkPtr pFw ) :
|
||||||
|
BaseManager( pFw )
|
||||||
|
{ }
|
||||||
|
|
||||||
void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::Entity::Player& player,
|
void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::Entity::Player& player,
|
||||||
Sapphire::ItemContainerPtr container )
|
Sapphire::ItemContainerPtr container )
|
||||||
{
|
{
|
||||||
|
@ -69,14 +71,15 @@ void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::E
|
||||||
Sapphire::ItemPtr Sapphire::World::Manager::InventoryMgr::createItem( Entity::Player& player,
|
Sapphire::ItemPtr Sapphire::World::Manager::InventoryMgr::createItem( Entity::Player& player,
|
||||||
uint32_t catalogId, uint32_t quantity )
|
uint32_t catalogId, uint32_t quantity )
|
||||||
{
|
{
|
||||||
auto pExdData = g_fw.get< Data::ExdDataGenerated >();
|
auto pExdData = framework()->get< Data::ExdDataGenerated >();
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
auto itemMgr = framework()->get< Manager::ItemMgr >();
|
||||||
auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId );
|
auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId );
|
||||||
|
|
||||||
if( !itemInfo )
|
if( !itemInfo )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto item = make_Item( Items::Util::getNextUId(), catalogId );
|
auto item = make_Item( itemMgr->getNextUId(), catalogId, framework() );
|
||||||
|
|
||||||
item->setStackSize( std::max< uint32_t >( 1, quantity ) );
|
item->setStackSize( std::max< uint32_t >( 1, quantity ) );
|
||||||
|
|
||||||
|
@ -100,7 +103,7 @@ void Sapphire::World::Manager::InventoryMgr::removeItemFromHousingContainer( Sap
|
||||||
uint16_t containerId,
|
uint16_t containerId,
|
||||||
uint16_t slotId )
|
uint16_t slotId )
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL );
|
||||||
|
|
||||||
|
@ -117,7 +120,7 @@ void Sapphire::World::Manager::InventoryMgr::saveHousingContainerItem( uint64_t
|
||||||
uint16_t containerId, uint16_t slotId,
|
uint16_t containerId, uint16_t slotId,
|
||||||
uint64_t itemId )
|
uint64_t itemId )
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP );
|
||||||
// LandIdent, ContainerId, SlotId, ItemId, ItemId
|
// LandIdent, ContainerId, SlotId, ItemId, ItemId
|
||||||
|
@ -136,7 +139,7 @@ void Sapphire::World::Manager::InventoryMgr::saveHousingContainerItem( uint64_t
|
||||||
|
|
||||||
void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire::Inventory::HousingItemPtr item )
|
void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire::Inventory::HousingItemPtr item )
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP_ITEMPOS );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP_ITEMPOS );
|
||||||
// ItemId, PosX, PosY, PosZ, Rotation, PosX, PosY, PosZ, Rotation
|
// ItemId, PosX, PosY, PosZ, Rotation, PosX, PosY, PosZ, Rotation
|
||||||
|
@ -161,7 +164,7 @@ void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire
|
||||||
|
|
||||||
void Sapphire::World::Manager::InventoryMgr::removeHousingItemPosition( Sapphire::Inventory::HousingItem& item )
|
void Sapphire::World::Manager::InventoryMgr::removeHousingItemPosition( Sapphire::Inventory::HousingItem& item )
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
|
|
||||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL_ITEMPOS );
|
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL_ITEMPOS );
|
||||||
|
|
||||||
|
@ -172,7 +175,7 @@ void Sapphire::World::Manager::InventoryMgr::removeHousingItemPosition( Sapphire
|
||||||
|
|
||||||
void Sapphire::World::Manager::InventoryMgr::saveItem( Sapphire::Entity::Player& player, Sapphire::ItemPtr item )
|
void Sapphire::World::Manager::InventoryMgr::saveItem( Sapphire::Entity::Player& player, Sapphire::ItemPtr item )
|
||||||
{
|
{
|
||||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||||
auto stmt = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_INS );
|
auto stmt = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_INS );
|
||||||
|
|
||||||
stmt->setUInt( 1, player.getId() );
|
stmt->setUInt( 1, player.getId() );
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
#define SAPPHIRE_INVENTORYMGR_H
|
#define SAPPHIRE_INVENTORYMGR_H
|
||||||
|
|
||||||
#include "ForwardsZone.h"
|
#include "ForwardsZone.h"
|
||||||
|
#include "BaseManager.h"
|
||||||
|
|
||||||
namespace Sapphire::World::Manager
|
namespace Sapphire::World::Manager
|
||||||
{
|
{
|
||||||
|
|
||||||
class InventoryMgr
|
class InventoryMgr : public Sapphire::World::Manager::BaseManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
explicit InventoryMgr( Sapphire::FrameworkPtr pFw );
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Sends an item container to a player
|
* @brief Sends an item container to a player
|
||||||
*
|
*
|
||||||
|
|
|
@ -137,8 +137,6 @@ Sapphire::ItemPtr Sapphire::World::Manager::ItemMgr::loadItem( uint64_t uId )
|
||||||
|
|
||||||
ItemPtr pItem = make_Item( uId,
|
ItemPtr pItem = make_Item( uId,
|
||||||
itemRes->getUInt( 1 ),
|
itemRes->getUInt( 1 ),
|
||||||
itemInfo->modelMain,
|
|
||||||
itemInfo->modelSub,
|
|
||||||
framework(),
|
framework(),
|
||||||
isHq );
|
isHq );
|
||||||
|
|
||||||
|
|
|
@ -79,11 +79,11 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw,
|
||||||
const auto param4 = packet.data().param4;
|
const auto param4 = packet.data().param4;
|
||||||
const auto param5 = packet.data().param5;
|
const auto param5 = packet.data().param5;
|
||||||
|
|
||||||
pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " +
|
Logger::debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " +
|
||||||
Util::intToHexString( static_cast< uint32_t >( commandId & 0xFFFF ), 4 ) +
|
Util::intToHexString( static_cast< uint32_t >( commandId & 0xFFFF ), 4 ) +
|
||||||
"\nparam1: " + Util::intToHexString( static_cast< uint64_t >( param1 & 0xFFFFFFFFFFFFFFF ), 16 ) +
|
"\nparam1: " + Util::intToHexString( static_cast< uint64_t >( param1 & 0xFFFFFFFFFFFFFFF ), 16 ) +
|
||||||
"\nparam2: " + Util::intToHexString( static_cast< uint32_t >( param2 & 0xFFFFFFFF ), 8 ) +
|
"\nparam2: " + Util::intToHexString( static_cast< uint32_t >( param2 & 0xFFFFFFFF ), 8 ) +
|
||||||
"\nparam3: " + Util::intToHexString( static_cast< uint64_t >( param3 & 0xFFFFFFFFFFFFFFF ), 16 )
|
"\nparam3: " + Util::intToHexString( static_cast< uint64_t >( param3 & 0xFFFFFFFFFFFFFFF ), 16 )
|
||||||
);
|
);
|
||||||
|
|
||||||
//g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString());
|
//g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString());
|
||||||
|
@ -437,10 +437,6 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw,
|
||||||
}
|
}
|
||||||
case ClientTriggerType::RequestEstateInventory:
|
case ClientTriggerType::RequestEstateInventory:
|
||||||
{
|
{
|
||||||
// only sent if param1 is 1, because the client sends this with 0 when you open the ui for whatever reason
|
|
||||||
if( param1 != 1 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto housingMgr = pFw->get< HousingMgr >();
|
auto housingMgr = pFw->get< HousingMgr >();
|
||||||
if( !housingMgr )
|
if( !housingMgr )
|
||||||
break;
|
break;
|
||||||
|
@ -457,7 +453,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw,
|
||||||
}
|
}
|
||||||
case ClientTriggerType::RequestHousingItemRemove:
|
case ClientTriggerType::RequestHousingItemRemove:
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< HousingMgr >();
|
auto housingMgr = m_pFw->get< HousingMgr >();
|
||||||
|
|
||||||
auto slot = param4 & 0xFF;
|
auto slot = param4 & 0xFF;
|
||||||
auto sendToStoreroom = ( param4 >> 16 ) != 0;
|
auto sendToStoreroom = ( param4 >> 16 ) != 0;
|
||||||
|
@ -469,7 +465,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw,
|
||||||
}
|
}
|
||||||
case ClientTriggerType::RequestEstateExteriorRemodel:
|
case ClientTriggerType::RequestEstateExteriorRemodel:
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< HousingMgr >();
|
auto housingMgr = m_pFw->get< HousingMgr >();
|
||||||
|
|
||||||
housingMgr->reqEstateExteriorRemodel( player, param11 );
|
housingMgr->reqEstateExteriorRemodel( player, param11 );
|
||||||
|
|
||||||
|
@ -477,7 +473,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw,
|
||||||
}
|
}
|
||||||
case ClientTriggerType::RequestEstateInteriorRemodel:
|
case ClientTriggerType::RequestEstateInteriorRemodel:
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< HousingMgr >();
|
auto housingMgr = m_pFw->get< HousingMgr >();
|
||||||
|
|
||||||
housingMgr->reqEstateInteriorRemodel( player );
|
housingMgr->reqEstateInteriorRemodel( player );
|
||||||
|
|
||||||
|
|
|
@ -723,10 +723,11 @@ void Sapphire::Network::GameConnection::housingUpdateGreetingHandler( FrameworkP
|
||||||
pHousingMgr->updateEstateGreeting( player, packet.data().ident, std::string( packet.data().greeting ) );
|
pHousingMgr->updateEstateGreeting( player, packet.data().ident, std::string( packet.data().greeting ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::reqPlaceHousingItem( const Packets::FFXIVARR_PACKET_RAW& inPacket,
|
void Sapphire::Network::GameConnection::reqPlaceHousingItem( FrameworkPtr pFw,
|
||||||
|
const Packets::FFXIVARR_PACKET_RAW& inPacket,
|
||||||
Entity::Player& player )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< HousingMgr >();
|
auto housingMgr = pFw->get< HousingMgr >();
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcReqPlaceHousingItem >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcReqPlaceHousingItem >( inPacket );
|
||||||
const auto& data = packet.data();
|
const auto& data = packet.data();
|
||||||
|
|
||||||
|
@ -734,10 +735,11 @@ void Sapphire::Network::GameConnection::reqPlaceHousingItem( const Packets::FFXI
|
||||||
data.position, data.rotation );
|
data.position, data.rotation );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::reqMoveHousingItem( const Packets::FFXIVARR_PACKET_RAW& inPacket,
|
void Sapphire::Network::GameConnection::reqMoveHousingItem( FrameworkPtr pFw,
|
||||||
|
const Packets::FFXIVARR_PACKET_RAW& inPacket,
|
||||||
Entity::Player& player )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< HousingMgr >();
|
auto housingMgr = pFw->get< HousingMgr >();
|
||||||
|
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingUpdateObjectPosition >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingUpdateObjectPosition >( inPacket );
|
||||||
const auto& data = packet.data();
|
const auto& data = packet.data();
|
||||||
|
|
|
@ -150,7 +150,7 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] )
|
||||||
framework()->set< Manager::TerritoryMgr >( pTeriMgr );
|
framework()->set< Manager::TerritoryMgr >( pTeriMgr );
|
||||||
if( !pHousingMgr->init() )
|
if( !pHousingMgr->init() )
|
||||||
{
|
{
|
||||||
pLog->fatal( "Failed to setup housing!" );
|
Logger::fatal( "Failed to setup housing!" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] )
|
||||||
auto pDebugCom = std::make_shared< DebugCommandMgr >( framework() );
|
auto pDebugCom = std::make_shared< DebugCommandMgr >( framework() );
|
||||||
auto pPlayerMgr = std::make_shared< Manager::PlayerMgr >( framework() );
|
auto pPlayerMgr = std::make_shared< Manager::PlayerMgr >( framework() );
|
||||||
auto pShopMgr = std::make_shared< Manager::ShopMgr >( framework() );
|
auto pShopMgr = std::make_shared< Manager::ShopMgr >( framework() );
|
||||||
auto pInventoryMgr = std::make_shared< Manager::InventoryMgr >();
|
auto pInventoryMgr = std::make_shared< Manager::InventoryMgr >( framework() );
|
||||||
auto pEventMgr = std::make_shared< Manager::EventMgr >( framework() );
|
auto pEventMgr = std::make_shared< Manager::EventMgr >( framework() );
|
||||||
auto pItemMgr = std::make_shared< Manager::ItemMgr >( framework() );
|
auto pItemMgr = std::make_shared< Manager::ItemMgr >( framework() );
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ const Common::LandIdent Sapphire::World::Territory::Housing::HousingInteriorTerr
|
||||||
|
|
||||||
void Sapphire::World::Territory::Housing::HousingInteriorTerritory::updateHousingObjects()
|
void Sapphire::World::Territory::Housing::HousingInteriorTerritory::updateHousingObjects()
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< Manager::HousingMgr >();
|
auto housingMgr = m_pFw->get< Manager::HousingMgr >();
|
||||||
|
|
||||||
auto containerIds = {
|
auto containerIds = {
|
||||||
InventoryType::HousingInteriorPlacedItems1,
|
InventoryType::HousingInteriorPlacedItems1,
|
||||||
|
@ -163,7 +163,7 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::spawnHousing
|
||||||
uint16_t containerType,
|
uint16_t containerType,
|
||||||
Inventory::HousingItemPtr item )
|
Inventory::HousingItemPtr item )
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< Manager::HousingMgr >();
|
auto housingMgr = m_pFw->get< Manager::HousingMgr >();
|
||||||
|
|
||||||
auto offset = ( containerIdx * 50 ) + slot;
|
auto offset = ( containerIdx * 50 ) + slot;
|
||||||
auto obj = housingMgr->getYardObjectForItem( item );
|
auto obj = housingMgr->getYardObjectForItem( item );
|
||||||
|
|
|
@ -114,14 +114,14 @@ bool Sapphire::HousingZone::init()
|
||||||
arr.fill( obj );
|
arr.fill( obj );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto housingMgr = g_fw.get< World::Manager::HousingMgr >();
|
auto housingMgr = m_pFw->get< World::Manager::HousingMgr >();
|
||||||
auto landCache = housingMgr->getLandCacheMap();
|
auto landCache = housingMgr->getLandCacheMap();
|
||||||
|
|
||||||
// make sure the landset exists
|
// make sure the landset exists
|
||||||
auto landSetCache = landCache.find( m_landSetId );
|
auto landSetCache = landCache.find( m_landSetId );
|
||||||
if( landSetCache == landCache.end() )
|
if( landSetCache == landCache.end() )
|
||||||
{
|
{
|
||||||
g_fw.get< Sapphire::Logger >()->fatal( "LandSet " + std::to_string( m_landSetId ) + " is missing from the land cache." );
|
Logger::fatal( "LandSet " + std::to_string( m_landSetId ) + " is missing from the land cache." );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ bool Sapphire::HousingZone::init()
|
||||||
if( entry.m_houseId )
|
if( entry.m_houseId )
|
||||||
{
|
{
|
||||||
auto house = make_House( entry.m_houseId, m_landSetId, land->getLandIdent(), entry.m_estateName,
|
auto house = make_House( entry.m_houseId, m_landSetId, land->getLandIdent(), entry.m_estateName,
|
||||||
entry.m_estateComment );
|
entry.m_estateComment, m_pFw );
|
||||||
|
|
||||||
housingMgr->updateHouseModels( house );
|
housingMgr->updateHouseModels( house );
|
||||||
land->setHouse( house );
|
land->setHouse( house );
|
||||||
|
@ -328,7 +328,7 @@ Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEO
|
||||||
|
|
||||||
void Sapphire::HousingZone::updateYardObjects( Sapphire::Common::LandIdent ident )
|
void Sapphire::HousingZone::updateYardObjects( Sapphire::Common::LandIdent ident )
|
||||||
{
|
{
|
||||||
auto housingMgr = g_fw.get< World::Manager::HousingMgr >();
|
auto housingMgr = m_pFw->get< World::Manager::HousingMgr >();
|
||||||
auto& landStorage = housingMgr->getEstateInventory( ident );
|
auto& landStorage = housingMgr->getEstateInventory( ident );
|
||||||
|
|
||||||
auto yardContainer = landStorage[ InventoryType::HousingExteriorPlacedItems ];
|
auto yardContainer = landStorage[ InventoryType::HousingExteriorPlacedItems ];
|
||||||
|
|
Loading…
Add table
Reference in a new issue