From 05b7ca341ee0dce4b21005e5f3db3ad4c3849a8e Mon Sep 17 00:00:00 2001 From: collett Date: Sat, 6 Feb 2021 03:00:16 +0900 Subject: [PATCH] allow removing items out as well --- .../Network/PacketDef/Zone/ClientZoneDef.h | 4 +++- src/world/Manager/HousingMgr.cpp | 23 ++++++++++++++++--- src/world/Manager/HousingMgr.h | 2 +- src/world/Network/Handlers/PacketHandlers.cpp | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 44f6cb09..678a20f2 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -430,7 +430,9 @@ struct FFXIVIpcHousingEditExterior : FFXIVIpcBasePacket< HousingEditExterior > { uint16_t landId; - uint8_t unknown[8]; + uint8_t unknown[6]; + uint8_t removeFlag; + uint8_t unknown2; uint16_t container[9]; uint16_t slot[9]; uint16_t padding; diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 53165a4d..de302205 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1632,7 +1632,7 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); } -void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList ) +void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) { auto terri = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); if( !terri ) @@ -1654,18 +1654,35 @@ void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Playe auto container = containerList.at( i ); auto slot = slotList.at( i ); if( container == 0x270F || slot == 0xFF ) + { + if( i >= 5 ) + { + auto removed = ( ( removeFlag >> ( i - 5 ) ) & 1 ) > 0; + if( removed ) + { + auto oldItem = exteriorAppearenceContainer->getItem( i ); + if( oldItem ) + { + exteriorAppearenceContainer->removeItem( i ); + invMgr.removeItemFromHousingContainer( land->getLandIdent(), exteriorAppearenceContainer->getId(), i ); + player.addItem( oldItem, false, false, false ); + } + } + } continue; + } auto item = getHousingItemFromPlayer( player, static_cast< Sapphire::Common::InventoryType >( container ), slot ); if( item ) { auto oldItem = exteriorAppearenceContainer->getItem( i ); + exteriorAppearenceContainer->setItem( i, item ); if( oldItem ) { - player.addItem( oldItem, false, false, false ); + player.insertInventoryItem( static_cast< Sapphire::Common::InventoryType >( container ), slot, oldItem ); } - exteriorAppearenceContainer->setItem( i, item ); } } + invMgr.sendInventoryContainer( player, exteriorAppearenceContainer ); invMgr.saveHousingContainer( land->getLandIdent(), exteriorAppearenceContainer ); updateHouseModels( land->getHouse() ); std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() )->sendLandUpdate( plot ); diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index 35578842..e5b608af 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -181,7 +181,7 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); - void editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList ); + void editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ); private: diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 7f00dbc3..da34f720 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -743,7 +743,7 @@ void Sapphire::Network::GameConnection::housingEditExterior( const Packets::FFXI slotList.push_back( container != 0x270F ? static_cast< uint8_t >( packet.data().slot[i] ) : 0xFF ); } - housingMgr.editExterior( player, packet.data().landId, containerList, slotList ); + housingMgr.editExterior( player, packet.data().landId, containerList, slotList, packet.data().removeFlag ); } void Sapphire::Network::GameConnection::marketBoardSearch( const Packets::FFXIVARR_PACKET_RAW& inPacket,