From 4915b62d7b1be92af76ade9a176d936ab099f3c7 Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 16 Nov 2018 17:07:22 +0100 Subject: [PATCH] Do not use the current zone for landdetail lookup but the provided territoryId --- .../Scripts/common/CmnDefHousingSignboard.cpp | 2 +- .../Network/Handlers/ClientTriggerHandler.cpp | 9 +++++-- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 26 +++++++++++-------- src/servers/sapphire_zone/Zone/HousingMgr.h | 5 ++-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp index fd4fb907..5e5e13d9 100644 --- a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp +++ b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp @@ -35,7 +35,7 @@ public: auto pTerritory = player.getCurrentZone(); auto pHousing = std::dynamic_pointer_cast< HousingZone >( pTerritory ); - auto pHouMgr = pFw->get< Core::HousingMgr >(); + auto pHouMgr = pFw->get< Core::HousingMgr >(); LandPurchaseResult res = pHouMgr->purchseLand( player, activeLand.plot, static_cast< uint8_t >( result.param2 ) ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 96bacd66..74a1cbc6 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -328,16 +328,20 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR { auto ward = static_cast< uint8_t >( ( param12 & 0xFF00 ) >> 8 ); auto plot = static_cast< uint8_t >( param12 & 0xFF ); + auto territoryId = static_cast< uint16_t >( param11 & 0xFFFF ); + auto pHousingMgr = g_fw.get< HousingMgr >(); - pHousingMgr->sendLandSignFree( player, ward, plot ); + pHousingMgr->sendLandSignFree( player, ward, plot, territoryId ); break; } case ClientTriggerType::RequestLandSignOwned: { auto ward = static_cast< uint8_t >( ( param12 & 0xFF00 ) >> 8 ); auto plot = static_cast< uint8_t >( param12 & 0xFF ); + auto territoryId = static_cast< uint16_t >( param11 & 0xFFFF ); + auto pHousingMgr = g_fw.get< HousingMgr >(); - pHousingMgr->sendLandSignOwned( player, ward, plot ); + pHousingMgr->sendLandSignOwned( player, ward, plot, territoryId ); break; } case ClientTriggerType::RequestLandRelinquish: @@ -345,6 +349,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR auto ward = static_cast< uint8_t >( ( param12 & 0xFF00 ) >> 8 ); auto plot = static_cast< uint8_t >( param12 & 0xFF ); auto pHousingMgr = g_fw.get< HousingMgr >(); + pLog->debug( "Request to relinquish plot " + std::to_string( plot ) ); // TODO: do stuff! break; diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index fd2222da..f698c8b3 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -48,6 +48,11 @@ uint16_t Core::HousingMgr::getNexLandId() return ++m_lastLandId; } +uint32_t Core::HousingMgr::toLandSetId( uint16_t territoryTypeId, uint8_t wardId ) const +{ + return ( static_cast< uint32_t >( territoryTypeId ) << 16 ) | wardId; +} + void Core::HousingMgr::insertHousingZone( Core::Data::HousingZonePtr hZone ) { uint16_t id = getNexLandId(); @@ -95,18 +100,17 @@ Core::LandPtr Core::HousingMgr::getLandByOwnerId( uint32_t id ) return nullptr; } -void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t ward, uint8_t plot ) +void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ) { - player.setActiveLand( plot, ward ); + player.setActiveLand( plotId, wardId ); - auto zone = player.getCurrentZone(); - - auto hZone = std::dynamic_pointer_cast< HousingZone >( zone ); + auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plot ); + auto land = hZone->getLand( plotId ); if( !land ) { land = getLandByOwnerId( player.getId() ); @@ -128,17 +132,17 @@ void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t ward, player.queuePacket( landInfoSignPacket ); } -void Core::HousingMgr::sendLandSignFree( Entity::Player& player, uint8_t ward, uint8_t plot ) +void Core::HousingMgr::sendLandSignFree( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ) { - player.setActiveLand( plot, ward ); + player.setActiveLand( plotId, wardId ); - auto zone = player.getCurrentZone(); - auto hZone = std::dynamic_pointer_cast< HousingZone >( zone ); + auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plot ); + auto land = hZone->getLand( plotId ); auto plotPricePacket = makeZonePacket< Server::FFXIVIpcLandPriceUpdate >( player.getId() ); plotPricePacket->data().price = land->getCurrentPrice(); plotPricePacket->data().timeLeft = land->getDevaluationTime(); diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.h b/src/servers/sapphire_zone/Zone/HousingMgr.h index 03b12bac..39537767 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.h +++ b/src/servers/sapphire_zone/Zone/HousingMgr.h @@ -22,14 +22,15 @@ namespace Core bool init(); + uint32_t toLandSetId( uint16_t territoryTypeId, uint8_t wardId ) const; uint16_t getNexLandId(); void insertHousingZone( Core::Data::HousingZonePtr hZone ); Core::Data::HousingZonePtr getHousingZone( uint16_t id ); Core::Data::HousingZonePtr getHousingZoneByLandSetId( uint32_t id ); Core::LandPtr getLandByOwnerId( uint32_t id ); - void sendLandSignOwned( Entity::Player& player, uint8_t ward, uint8_t plot ); - void sendLandSignFree( Entity::Player& player, uint8_t ward, uint8_t plot ); + void sendLandSignOwned( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ); + void sendLandSignFree( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ); LandPurchaseResult purchseLand( Entity::Player& player, uint8_t plot, uint8_t state ); private: