mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-03 09:17:47 +00:00
load housing invs correctly
This commit is contained in:
parent
8b70f79108
commit
e52127fd91
6 changed files with 93 additions and 105 deletions
|
@ -25,6 +25,8 @@
|
|||
#include "ServerMgr.h"
|
||||
#include "Territory/House.h"
|
||||
#include "InventoryMgr.h"
|
||||
#include "Inventory/Item.h"
|
||||
#include "Inventory/ItemContainer.h"
|
||||
|
||||
using namespace Sapphire::Common;
|
||||
using namespace Sapphire::Network;
|
||||
|
@ -48,7 +50,7 @@ bool Sapphire::World::Manager::HousingMgr::init()
|
|||
|
||||
loadLandCache();
|
||||
|
||||
log->info( "HousingMgr: Checking land counts" );
|
||||
log->debug( "HousingMgr: Checking land counts" );
|
||||
|
||||
uint32_t houseCount = 0;
|
||||
for( auto& landSet : m_landCache )
|
||||
|
@ -80,6 +82,48 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories()
|
|||
|
||||
log->info( "HousingMgr: Loading inventories for estates" );
|
||||
|
||||
auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||
|
||||
auto stmt = pDb->getPreparedStatement( Db::LAND_INV_SEL_ALL );
|
||||
auto res = pDb->query( stmt );
|
||||
|
||||
uint32_t itemCount = 0;
|
||||
while( res->next() )
|
||||
{
|
||||
//uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t model2, bool isHq
|
||||
uint64_t ident = res->getUInt64( "LandIdent" );
|
||||
uint16_t containerId = res->getUInt16( "ContainerId" );
|
||||
uint64_t itemId = res->getUInt64( "ItemId" );
|
||||
uint16_t slot = res->getUInt16( "SlotId" );
|
||||
uint32_t catalogId = res->getUInt( "catalogId" );
|
||||
uint8_t stain = res->getUInt8( "stain" );
|
||||
uint64_t characterId = res->getUInt64( "CharacterId" );
|
||||
|
||||
auto item = make_Item( itemId, catalogId, 0, 0, 0 );
|
||||
item->setStain( stain );
|
||||
// todo: need to set the owner character id on the item
|
||||
|
||||
ContainerIdToContainerMap estateInv = m_estateInventories[ ident ];
|
||||
|
||||
// check if containerId exists
|
||||
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 );
|
||||
|
||||
estateInv[ containerId ] = ic;
|
||||
}
|
||||
else
|
||||
container->second->setItem( slot, item );
|
||||
|
||||
itemCount++;
|
||||
}
|
||||
|
||||
log->debug( "HousingMgr: Loaded " + std::to_string( itemCount ) + " inventory items" );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -580,7 +624,7 @@ void Sapphire::World::Manager::HousingMgr::sendEstateInventory( Entity::Player&
|
|||
if( targetLand->getOwnerId() != player.getId() )
|
||||
return;
|
||||
|
||||
auto container = targetLand->getItemContainer( inventoryType );
|
||||
auto container = getEstateInventory( targetLand->getLandIdent() )[ inventoryType ];
|
||||
if( !container )
|
||||
return;
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ Sapphire::House::House( uint32_t houseId, uint32_t landSetId, Common::LandIdent
|
|||
// auto models = reinterpret_cast< uint32_t* >( &housePartModels[ 0 ] );
|
||||
// for( auto i = 0; i < 8; i++ )
|
||||
// {
|
||||
// m_houseParts[ i ] = { models[ i ], housePartColours[ i ] };
|
||||
// m_houseModelsCache[ i ] = { models[ i ], housePartColours[ i ] };
|
||||
// }
|
||||
//
|
||||
// auto houseInteriorModels = res->getBlobVector( "HouseInteriorModels" );
|
||||
|
@ -59,7 +59,7 @@ Sapphire::House::House( uint32_t houseId, uint32_t landSetId, Common::LandIdent
|
|||
// auto interiorModels = reinterpret_cast< uint32_t* >( &houseInteriorModels[ 0 ] );
|
||||
// for( auto i = 0; i < 10; i++ )
|
||||
// {
|
||||
// m_houseInteriorParts[ i ] = interiorModels[ i ];
|
||||
// m_houseInteriorModels[ i ] = interiorModels[ i ];
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ void Sapphire::House::updateHouseDb()
|
|||
|
||||
for( auto i = 0; i < 8; i++ )
|
||||
{
|
||||
auto& part = m_houseParts[ i ];
|
||||
auto& part = m_houseModelsCache[ i ];
|
||||
models.push_back( part.first );
|
||||
colours.push_back( part.second );
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ void Sapphire::House::updateHouseDb()
|
|||
|
||||
for( auto i = 0; i < 10; i++ )
|
||||
{
|
||||
models.push_back( m_houseInteriorParts[ i ] );
|
||||
models.push_back( m_houseInteriorModels[ i ] );
|
||||
}
|
||||
|
||||
std::vector< uint8_t > tmp2Models( models.size() * 4 );
|
||||
|
@ -132,37 +132,37 @@ uint32_t Sapphire::House::getHouseId() const
|
|||
|
||||
uint8_t Sapphire::House::getHousePartColor( Common::HousePartSlot slot ) const
|
||||
{
|
||||
return m_houseParts[ slot ].second;
|
||||
return m_houseModelsCache[ slot ].second;
|
||||
}
|
||||
|
||||
uint32_t Sapphire::House::getHouseInteriorPart( Common::HousingInteriorSlot slot ) const
|
||||
{
|
||||
return m_houseInteriorParts[ slot ];
|
||||
return m_houseInteriorModels[ slot ];
|
||||
}
|
||||
|
||||
void Sapphire::House::setHousePart( Common::HousePartSlot slot, uint32_t id )
|
||||
{
|
||||
m_houseParts[ slot ].first = id;
|
||||
m_houseModelsCache[ slot ].first = id;
|
||||
}
|
||||
|
||||
void Sapphire::House::setHousePartColor( Common::HousePartSlot slot, uint32_t id )
|
||||
{
|
||||
m_houseParts[ slot ].second = id;
|
||||
m_houseModelsCache[ slot ].second = id;
|
||||
}
|
||||
|
||||
void Sapphire::House::setHouseInteriorPart( Common::HousingInteriorSlot slot, uint32_t id )
|
||||
{
|
||||
m_houseInteriorParts[ slot ] = id;
|
||||
m_houseInteriorModels[ slot ] = id;
|
||||
}
|
||||
|
||||
uint32_t Sapphire::House::getHousePart( Common::HousePartSlot slot ) const
|
||||
{
|
||||
return m_houseParts[ slot ].first;
|
||||
return m_houseModelsCache[ slot ].first;
|
||||
}
|
||||
|
||||
Sapphire::House::HousePartsArray const& Sapphire::House::getHouseParts() const
|
||||
Sapphire::House::HouseModelsArray const& Sapphire::House::getHouseModels() const
|
||||
{
|
||||
return m_houseParts;
|
||||
return m_houseModelsCache;
|
||||
}
|
||||
|
||||
const std::string& Sapphire::House::getHouseName() const
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace Sapphire
|
|||
virtual ~House();
|
||||
|
||||
using HousePart = std::pair< uint32_t, uint8_t >;
|
||||
using HousePartsArray = std::array< HousePart, 8 >;
|
||||
using HouseModelsArray = std::array< HousePart, 8 >;
|
||||
|
||||
//gerneral
|
||||
uint32_t getLandSetId() const;
|
||||
|
@ -38,7 +38,7 @@ namespace Sapphire
|
|||
uint8_t getHousePartColor( Common::HousePartSlot slot ) const;
|
||||
uint32_t getHouseInteriorPart( Common::HousingInteriorSlot slot ) const;
|
||||
|
||||
HousePartsArray const& getHouseParts() const;
|
||||
HouseModelsArray const& getHouseModels() const;
|
||||
|
||||
void updateHouseDb();
|
||||
|
||||
|
@ -49,8 +49,8 @@ namespace Sapphire
|
|||
|
||||
uint64_t m_buildTime;
|
||||
|
||||
HousePartsArray m_houseParts;
|
||||
uint32_t m_houseInteriorParts[10];
|
||||
HouseModelsArray m_houseModelsCache;
|
||||
uint32_t m_houseInteriorModels[10];
|
||||
|
||||
std::string m_estateComment;
|
||||
std::string m_estateName;
|
||||
|
|
|
@ -83,9 +83,9 @@ bool Sapphire::HousingZone::init()
|
|||
// setup house
|
||||
if( entry.m_houseId )
|
||||
{
|
||||
//uint32_t houseId, uint32_t landSetId, Common::LandIdent ident, const std::string& estateName,
|
||||
// const std::string& estateMessage
|
||||
auto house = make_House( entry.m_houseId, m_landSetId, land->getLandIdent(), entry.m_estateName, entry.m_estateComment );
|
||||
|
||||
land->setHouse( house );
|
||||
}
|
||||
|
||||
land->init( entry.m_type, entry.m_size, entry.m_status, entry.m_currentPrice, entry.m_ownerId, entry.m_houseId );
|
||||
|
@ -115,20 +115,20 @@ void Sapphire::HousingZone::onPlayerZoneIn( Entity::Player& player )
|
|||
|
||||
for( yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ )
|
||||
{
|
||||
auto housingObjectInitializPacket = makeZonePacket< FFXIVIpcHousingObjectInitialize >( player.getId() );
|
||||
memset( &housingObjectInitializPacket->data().landIdent, 0xFF, sizeof( Common::LandIdent ) );
|
||||
housingObjectInitializPacket->data().u1 = 0xFF;
|
||||
housingObjectInitializPacket->data().packetNum = yardPacketNum;
|
||||
housingObjectInitializPacket->data().packetTotal = yardPacketTotal;
|
||||
auto housingObjectInit = makeZonePacket< FFXIVIpcHousingObjectInitialize >( player.getId() );
|
||||
memset( &housingObjectInit->data().landIdent, 0xFF, sizeof( Common::LandIdent ) );
|
||||
housingObjectInit->data().u1 = 0xFF;
|
||||
housingObjectInit->data().packetNum = yardPacketNum;
|
||||
housingObjectInit->data().packetTotal = yardPacketTotal;
|
||||
|
||||
//TODO: Add Objects here
|
||||
|
||||
player.queuePacket( housingObjectInitializPacket );
|
||||
player.queuePacket( housingObjectInit );
|
||||
}
|
||||
|
||||
auto landSetMap = makeZonePacket< FFXIVIpcLandSetMap >( player.getId() );
|
||||
landSetMap->data().subdivision = isPlayerSubInstance( player ) == false ? 2 : 1;
|
||||
uint8_t startIndex = isPlayerSubInstance( player ) == false ? 0 : 30;
|
||||
landSetMap->data().subdivision = !isPlayerSubInstance( player ) ? 2 : 1;
|
||||
uint8_t startIndex = !isPlayerSubInstance( player ) ? 0 : 30;
|
||||
for( uint8_t i = startIndex, count = 0; i < ( startIndex + 30 ); i++, count++ )
|
||||
{
|
||||
landSetMap->data().landInfo[ count ].status = 1;
|
||||
|
@ -147,9 +147,9 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
|
|||
landsetInitializePacket->data().landIdent.territoryTypeId = m_territoryTypeId;
|
||||
//TODO: get current WorldId
|
||||
landsetInitializePacket->data().landIdent.worldId = 67;
|
||||
landsetInitializePacket->data().subInstance = isPlayerSubInstance( player ) == false ? 1 : 2;
|
||||
landsetInitializePacket->data().subInstance = !isPlayerSubInstance( player ) ? 1 : 2;
|
||||
|
||||
uint8_t startIndex = isPlayerSubInstance( player ) == false ? 0 : 30;
|
||||
uint8_t startIndex = !isPlayerSubInstance( player ) ? 0 : 30;
|
||||
|
||||
for( uint8_t i = startIndex, count = 0; i < ( startIndex + 30 ); ++i, ++count )
|
||||
{
|
||||
|
@ -169,7 +169,7 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
|
|||
{
|
||||
landData.flags = 1;
|
||||
|
||||
auto& parts = house->getHouseParts();
|
||||
auto& parts = house->getHouseModels();
|
||||
|
||||
for( auto i = 0; i != parts.size(); i++ )
|
||||
{
|
||||
|
@ -206,7 +206,7 @@ void Sapphire::HousingZone::sendLandUpdate( uint8_t landId )
|
|||
{
|
||||
landData.flags = 1;
|
||||
|
||||
auto& parts = house->getHouseParts();
|
||||
auto& parts = house->getHouseModels();
|
||||
|
||||
for( auto i = 0; i != parts.size(); i++ )
|
||||
{
|
||||
|
|
|
@ -90,66 +90,23 @@ void Sapphire::Land::init( Common::LandType type, uint8_t size, uint8_t state, u
|
|||
}
|
||||
|
||||
// init item containers
|
||||
auto setupContainer = [ this ]( InventoryType type, uint16_t maxSize )
|
||||
{
|
||||
m_landInventoryMap[ type ] = make_ItemContainer( type, maxSize, "houseiteminventory", true, true );
|
||||
};
|
||||
|
||||
setupContainer( InventoryType::HousingOutdoorAppearance, 8 );
|
||||
setupContainer( InventoryType::HousingOutdoorPlacedItems, m_maxPlacedExternalItems );
|
||||
setupContainer( InventoryType::HousingOutdoorStoreroom, m_maxPlacedExternalItems );
|
||||
|
||||
setupContainer( InventoryType::HousingInteriorAppearance, 9 );
|
||||
|
||||
// nb: so we're going to store these internally in one container because SE is fucked in the head
|
||||
// but when an inventory is requested, we will split them into groups of 50
|
||||
setupContainer( InventoryType::HousingInteriorPlacedItems1, m_maxPlacedInternalItems );
|
||||
setupContainer( InventoryType::HousingInteriorStoreroom1, m_maxPlacedInternalItems );
|
||||
|
||||
loadItemContainerContents();
|
||||
}
|
||||
|
||||
void Sapphire::Land::loadItemContainerContents()
|
||||
{
|
||||
if( !m_pHouse )
|
||||
return;
|
||||
|
||||
auto ident = *reinterpret_cast< uint64_t* >( &m_landIdent );
|
||||
g_fw.get< Sapphire::Logger >()->debug( "Loading housing inventory for ident: " + std::to_string( ident ) );
|
||||
|
||||
auto pDB = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
|
||||
|
||||
auto stmt = pDB->getPreparedStatement( Db::LAND_INV_SEL_HOUSE );
|
||||
stmt->setUInt64( 1, ident );
|
||||
|
||||
auto res = pDB->query( stmt );
|
||||
|
||||
std::unordered_map< uint16_t, std::vector< std::pair< uint16_t, uint32_t > > > items;
|
||||
|
||||
while( res->next() )
|
||||
{
|
||||
auto containerId = res->getUInt( "ContainerId" );
|
||||
auto itemId = res->getUInt64( "ItemId" );
|
||||
auto slotId = res->getUInt( "SlotId" );
|
||||
|
||||
items[ containerId ].push_back( std::make_pair( slotId, itemId ) );
|
||||
}
|
||||
|
||||
// fuck the query off
|
||||
res.reset();
|
||||
|
||||
for( auto it = items.begin(); it != items.end(); it++ )
|
||||
{
|
||||
auto container = m_landInventoryMap[ it->first ];
|
||||
|
||||
// todo: delet this
|
||||
for( auto fuck = it->second.begin(); fuck != it->second.end(); fuck++ )
|
||||
{
|
||||
auto item = Sapphire::Items::Util::loadItem( fuck->second );
|
||||
if( item )
|
||||
container->setItem( fuck->first, item );
|
||||
}
|
||||
}
|
||||
// auto setupContainer = [ this ]( InventoryType type, uint16_t maxSize )
|
||||
// {
|
||||
// m_landInventoryMap[ type ] = make_ItemContainer( type, maxSize, "houseiteminventory", true, true );
|
||||
// };
|
||||
//
|
||||
// setupContainer( InventoryType::HousingOutdoorAppearance, 8 );
|
||||
// setupContainer( InventoryType::HousingOutdoorPlacedItems, m_maxPlacedExternalItems );
|
||||
// setupContainer( InventoryType::HousingOutdoorStoreroom, m_maxPlacedExternalItems );
|
||||
//
|
||||
// setupContainer( InventoryType::HousingInteriorAppearance, 9 );
|
||||
//
|
||||
// // nb: so we're going to store these internally in one container because SE is fucked in the head
|
||||
// // but when an inventory is requested, we will split them into groups of 50
|
||||
// setupContainer( InventoryType::HousingInteriorPlacedItems1, m_maxPlacedInternalItems );
|
||||
// setupContainer( InventoryType::HousingInteriorStoreroom1, m_maxPlacedInternalItems );
|
||||
//
|
||||
// loadItemContainerContents();
|
||||
}
|
||||
|
||||
uint32_t Sapphire::Land::convertItemIdToHousingItemId( uint32_t itemId )
|
||||
|
@ -374,13 +331,4 @@ bool Sapphire::Land::setPreset( uint32_t itemId )
|
|||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Sapphire::ItemContainerPtr Sapphire::Land::getItemContainer( uint16_t inventoryType ) const
|
||||
{
|
||||
auto container = m_landInventoryMap.find( inventoryType );
|
||||
if( container == m_landInventoryMap.end() )
|
||||
return nullptr;
|
||||
|
||||
return container->second;
|
||||
}
|
|
@ -61,9 +61,6 @@ namespace Sapphire
|
|||
void setLandTag( uint8_t slot, uint8_t tag );
|
||||
uint8_t getLandTag( uint8_t slot );
|
||||
|
||||
ItemContainerPtr getItemContainer( uint16_t inventoryType ) const;
|
||||
void loadItemContainerContents();
|
||||
|
||||
private:
|
||||
uint32_t convertItemIdToHousingItemId( uint32_t itemId );
|
||||
uint32_t getNextHouseId();
|
||||
|
@ -87,7 +84,6 @@ namespace Sapphire
|
|||
Sapphire::HousePtr m_pHouse;
|
||||
|
||||
//item storage
|
||||
LandInventoryMap m_landInventoryMap;
|
||||
uint16_t m_maxPlacedExternalItems;
|
||||
uint16_t m_maxPlacedInternalItems;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue