From 332456ffd0af65a493c7d9ab65b77d33e6adacca Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 20 Dec 2018 20:41:16 +1100 Subject: [PATCH] handle inventory packet sequencing properly for items & containers --- bin/sql/schema/schema.sql | 7 ++++--- src/world/Actor/Player.h | 4 ++++ src/world/Actor/PlayerInventory.cpp | 12 +++++++----- src/world/Manager/HousingMgr.cpp | 8 ++++++++ src/world/Manager/InventoryMgr.cpp | 4 ++-- src/world/Manager/InventoryMgr.h | 3 +-- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/bin/sql/schema/schema.sql b/bin/sql/schema/schema.sql index b87b2a9b..185d0225 100644 --- a/bin/sql/schema/schema.sql +++ b/bin/sql/schema/schema.sql @@ -530,9 +530,10 @@ CREATE TABLE `landset` ( ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `houseiteminventory` ( - `landIdent` BIGINT(20) UNSIGNED NOT NULL, - `containerId` INT(10) UNSIGNED NOT NULL, - `itemId` INT(20) NOT NULL, + `LandIdent` BIGINT(20) UNSIGNED NOT NULL, + `ContainerId` INT(10) UNSIGNED NOT NULL, + `ItemId` INT(20) NOT NULL, + `SlotId` INT(10) UNSIGNED NOT NULL, INDEX `landIdent` (`landIdent`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 8532e21a..34ea3204 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -910,6 +910,8 @@ namespace Sapphire::Entity bool isObtainable( uint32_t catalogId, uint8_t quantity ); + uint32_t getNextInventorySequence(); + void send(); uint8_t getFreeSlotsInBags(); @@ -939,6 +941,8 @@ namespace Sapphire::Entity bool m_onEnterEventDone; + uint32_t m_inventorySequence; + private: using InventoryMap = std::map< uint16_t, Sapphire::ItemContainerPtr >; diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 365bd622..67545381 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -357,14 +357,11 @@ void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t void Sapphire::Entity::Player::sendInventory() { - InventoryMap::iterator it; - auto pInvMgr = g_fw.get< World::Manager::InventoryMgr >(); - uint32_t count = 0; - for( it = m_storageMap.begin(); it != m_storageMap.end(); ++it, ++count ) + for( auto it = m_storageMap.begin(); it != m_storageMap.end(); ++it ) { - pInvMgr->sendInventoryContainer( *this, it->second, count ); + pInvMgr->sendInventoryContainer( *this, it->second ); } } @@ -867,3 +864,8 @@ bool Sapphire::Entity::Player::collectHandInItems( std::vector< uint32_t > itemI return true; } + +uint32_t Sapphire::Entity::Player::getNextInventorySequence() +{ + return m_inventorySequence++; +} diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 2a999e95..80fcbf8c 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -24,6 +24,7 @@ #include "Framework.h" #include "ServerMgr.h" #include "Territory/House.h" +#include "InventoryMgr.h" using namespace Sapphire::Common; using namespace Sapphire::Network; @@ -508,5 +509,12 @@ void Sapphire::World::Manager::HousingMgr::sendHousingInventory( Entity::Player& if( targetLand->getOwnerId() != player.getId() ) return; + auto container = targetLand->getItemContainer( inventoryType ); + if( !container ) + return; + player.sendDebug( "got inventory for plot: " + targetLand->getHouse()->getHouseName() ); + + auto invMgr = g_fw.get< Manager::InventoryMgr >(); + invMgr->sendInventoryContainer( player, container ); } \ No newline at end of file diff --git a/src/world/Manager/InventoryMgr.cpp b/src/world/Manager/InventoryMgr.cpp index 8ce40ffe..6529d617 100644 --- a/src/world/Manager/InventoryMgr.cpp +++ b/src/world/Manager/InventoryMgr.cpp @@ -10,9 +10,9 @@ using namespace Sapphire::Network::Packets; void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::Entity::Player& player, - Sapphire::ItemContainerPtr container, - uint32_t sequence ) + Sapphire::ItemContainerPtr container ) { + auto sequence = player.getNextInventorySequence(); auto pMap = container->getItemMap(); for( auto itM = pMap.begin(); itM != pMap.end(); ++itM ) diff --git a/src/world/Manager/InventoryMgr.h b/src/world/Manager/InventoryMgr.h index 55869850..26fae576 100644 --- a/src/world/Manager/InventoryMgr.h +++ b/src/world/Manager/InventoryMgr.h @@ -9,8 +9,7 @@ namespace Sapphire::World::Manager class InventoryMgr { public: - void sendInventoryContainer( Sapphire::Entity::Player& player, Sapphire::ItemContainerPtr container, - uint32_t sequence = 0 ); + void sendInventoryContainer( Sapphire::Entity::Player& player, Sapphire::ItemContainerPtr container ); }; }