From 60f5fd580ec3d6486f8450a7418076d21093d7de Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 5 Dec 2018 16:55:14 +1100 Subject: [PATCH 1/8] cleanup housing ClientTrigger handling --- src/common/Common.h | 8 +-- .../sapphire_zone/Manager/HousingMgr.cpp | 68 +++++++++---------- .../sapphire_zone/Manager/HousingMgr.h | 14 ++-- .../Network/Handlers/ClientTriggerHandler.cpp | 58 ++++------------ 4 files changed, 60 insertions(+), 88 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 14de2012..b4aa0760 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -803,10 +803,10 @@ namespace Sapphire::Common struct LandIdent { - int16_t landId; //00 - int16_t wardNum; //02 - int16_t territoryTypeId; //04 - int16_t worldId; //06 + uint16_t landId; //00 + uint16_t wardNum; //02 + uint16_t territoryTypeId; //04 + uint16_t worldId; //06 }; struct LandFlagSet diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.cpp b/src/servers/sapphire_zone/Manager/HousingMgr.cpp index 60f04b8a..1f7b7f39 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Manager/HousingMgr.cpp @@ -73,17 +73,17 @@ Sapphire::LandPtr Sapphire::World::Manager::HousingMgr::getLandByOwnerId( uint32 return hZone->getLand( res->getUInt( 2 ) ); } -void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ) +void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident ) { - player.setActiveLand( plotId, wardId ); + player.setActiveLand( ident.landId, ident.wardNum ); - auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plotId ); + auto land = hZone->getLand( ident.landId ); if( !land ) { land = getLandByOwnerId( player.getId() ); @@ -96,10 +96,7 @@ void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& pl //memcpy( &landInfoSignPacket->data().estateName, land->getLandName().c_str(), land->getLandName().size() ); landInfoSignPacket->data().houseSize = land->getSize(); landInfoSignPacket->data().houseType = static_cast< uint8_t >( land->getLandType() ); - landInfoSignPacket->data().landIdent.landId = land->getLandId(); - landInfoSignPacket->data().landIdent.wardNum = land->getWardNum(); - landInfoSignPacket->data().landIdent.worldId = 67; - landInfoSignPacket->data().landIdent.territoryTypeId = land->getTerritoryTypeId(); + landInfoSignPacket->data().landIdent = ident; landInfoSignPacket->data().houseIconAdd = land->getSharing(); landInfoSignPacket->data().ownerId = player.getContentId(); // should be real owner contentId, not player.contentId() @@ -114,17 +111,17 @@ void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& pl player.queuePacket( landInfoSignPacket ); } -void Sapphire::World::Manager::HousingMgr::sendLandSignFree( Entity::Player& player, uint8_t wardId, uint8_t plotId, uint16_t territoryTypeId ) +void Sapphire::World::Manager::HousingMgr::sendLandSignFree( Entity::Player& player, const Common::LandIdent ident ) { - player.setActiveLand( plotId, wardId ); + player.setActiveLand( ident.landId, ident.wardNum ); - auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plotId ); + auto land = hZone->getLand( ident.landId ); auto plotPricePacket = makeZonePacket< Server::FFXIVIpcLandPriceUpdate >( player.getId() ); plotPricePacket->data().price = land->getCurrentPrice(); plotPricePacket->data().timeLeft = land->getDevaluationTime(); @@ -362,15 +359,15 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl eobj->setHousingLink( plotNum << 8 ); } -void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plotId ); + auto land = hZone->getLand( ident.landId ); auto house = land->getHouse(); if( !house ) @@ -378,24 +375,21 @@ void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& auto landRenamePacket = makeZonePacket< Server::FFXIVIpcLandRename >( player.getId() ); - landRenamePacket->data().landIdent.landId = land->getLandId(); - landRenamePacket->data().landIdent.wardNum = land->getWardNum(); - landRenamePacket->data().landIdent.worldId = 67; - landRenamePacket->data().landIdent.territoryTypeId = land->getTerritoryTypeId(); + landRenamePacket->data().landIdent = ident; memcpy( &landRenamePacket->data().houseName, house->getHouseName().c_str(), 20 ); player.queuePacket( landRenamePacket ); } -void Sapphire::World::Manager::HousingMgr::requestEstateEditGreeting( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +void Sapphire::World::Manager::HousingMgr::requestEstateEditGreeting( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plotId ); + auto land = hZone->getLand( ident.landId ); if( !land ) return; @@ -405,16 +399,13 @@ void Sapphire::World::Manager::HousingMgr::requestEstateEditGreeting( Entity::Pl auto estateGreetingPacket = makeZonePacket< Server::FFXIVIpcHousingEstateGreeting >( player.getId() ); - estateGreetingPacket->data().landIdent.landId = land->getLandId(); - estateGreetingPacket->data().landIdent.wardNum = land->getWardNum(); - estateGreetingPacket->data().landIdent.worldId = 67; - estateGreetingPacket->data().landIdent.territoryTypeId = land->getTerritoryTypeId(); + estateGreetingPacket->data().landIdent = ident; memcpy( &estateGreetingPacket->data().message, house->getHouseGreeting().c_str(), sizeof( estateGreetingPacket->data().message ) ); player.queuePacket( estateGreetingPacket ); } -void Sapphire::World::Manager::HousingMgr::updateEstateGreeting( Entity::Player& player, const Common::LandIdent& ident, const std::string& greeting ) +void Sapphire::World::Manager::HousingMgr::updateEstateGreeting( Entity::Player& player, const Common::LandIdent ident, const std::string& greeting ) { auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto zone = getHousingZoneByLandSetId( landSetId ); @@ -440,15 +431,15 @@ void Sapphire::World::Manager::HousingMgr::updateEstateGreeting( Entity::Player& player.sendLogMessage( 3381 ); } -void Sapphire::World::Manager::HousingMgr::requestEstateEditGuestAccess( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +void Sapphire::World::Manager::HousingMgr::requestEstateEditGuestAccess( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( plotId ); + auto land = hZone->getLand( ident.landId ); if( !land ) return; @@ -457,11 +448,18 @@ void Sapphire::World::Manager::HousingMgr::requestEstateEditGuestAccess( Entity: return; auto packet = makeZonePacket< FFXIVIpcHousingShowEstateGuestAccess >( player.getId() ); - - packet->data().ident.landId = plotId; - packet->data().ident.territoryTypeId = territoryTypeId; - packet->data().ident.wardNum = wardId; - packet->data().ident.worldId = worldId; + packet->data().ident = ident; player.queuePacket( packet ); } + +Sapphire::Common::LandIdent Sapphire::World::Manager::HousingMgr::clientTriggerParamsToLandIdent( uint32_t param11, uint32_t param12 ) const +{ + Common::LandIdent ident; + ident.worldId = param11 >> 16; + ident.territoryTypeId = param11 & 0xFFFF; + ident.wardNum = param12 >> 16; + ident.landId = param12 & 0xFFFF; + + return ident; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.h b/src/servers/sapphire_zone/Manager/HousingMgr.h index f0e3c170..9745b2f1 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.h +++ b/src/servers/sapphire_zone/Manager/HousingMgr.h @@ -26,22 +26,24 @@ namespace Sapphire::World::Manager Sapphire::Data::HousingZonePtr getHousingZoneByLandSetId( uint32_t id ); Sapphire::LandPtr getLandByOwnerId( uint32_t id ); - 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 ); + void sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident ); + void sendLandSignFree( Entity::Player& player, const Common::LandIdent ident ); LandPurchaseResult purchaseLand( Entity::Player& player, uint8_t plot, uint8_t state ); + Common::LandIdent clientTriggerParamsToLandIdent( uint32_t param11, uint32_t param12 ) const; + void sendWardLandInfo( Entity::Player& player, uint8_t wardId, uint16_t territoryTypeId ); bool relinquishLand( Entity::Player& player, uint8_t plot ); void buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetItem ); - void requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ); + void requestEstateRename( Entity::Player& player, const Common::LandIdent ident ); - void requestEstateEditGreeting( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ); - void updateEstateGreeting( Entity::Player& player, const Common::LandIdent& ident, const std::string& greeting ); + void requestEstateEditGreeting( Entity::Player& player, const Common::LandIdent ident ); + void updateEstateGreeting( Entity::Player& player, const Common::LandIdent ident, const std::string& greeting ); - void requestEstateEditGuestAccess( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ); + void requestEstateEditGuestAccess( Entity::Player& player, const Common::LandIdent ident ); void sendEstateGreeting( Entity::Player& player, const Common::LandIdent ident ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 482e10c6..1e309533 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -325,22 +325,20 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX } case ClientTriggerType::RequestLandSignFree: { - 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, territoryId ); + + auto ident = pHousingMgr->clientTriggerParamsToLandIdent( param11, param12 ); + pHousingMgr->sendLandSignFree( player, ident ); + 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, territoryId ); + + auto ident = pHousingMgr->clientTriggerParamsToLandIdent( param11, param12 ); + pHousingMgr->sendLandSignOwned( player, ident ); + break; } case ClientTriggerType::RequestWardLandInfo: @@ -363,49 +361,34 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX } case ClientTriggerType::RequestEstateRename: { - uint16_t territoryTypeId = param11 & 0xFFFF; - uint16_t worldId = param11 >> 16; - - uint8_t ward = ( param12 >> 16 ) & 0xFF; - uint8_t plot = ( param12 & 0xFF ); - auto pHousingMgr = g_fw.get< HousingMgr >(); if( !pHousingMgr ) break; - pHousingMgr->requestEstateRename( player, territoryTypeId, worldId, ward, plot ); + auto ident = pHousingMgr->clientTriggerParamsToLandIdent( param11, param12 ); + pHousingMgr->requestEstateRename( player, ident ); break; } case ClientTriggerType::RequestEstateEditGreeting: { - uint16_t territoryTypeId = param11 & 0xFFFF; - uint16_t worldId = param11 >> 16; - - uint8_t ward = ( param12 >> 16 ) & 0xFF; - uint8_t plot = ( param12 & 0xFF ); - auto pHousingMgr = g_fw.get< HousingMgr >(); if( !pHousingMgr ) break; - pHousingMgr->requestEstateEditGreeting( player, territoryTypeId, worldId, ward, plot ); + auto ident = pHousingMgr->clientTriggerParamsToLandIdent( param11, param12 ); + pHousingMgr->requestEstateEditGreeting( player, ident ); break; } case ClientTriggerType::RequestEstateEditGuestAccessSettings: { - uint16_t territoryTypeId = param11 & 0xFFFF; - uint16_t worldId = param11 >> 16; - - uint8_t ward = ( param12 >> 16 ) & 0xFF; - uint8_t plot = ( param12 & 0xFF ); - auto pHousingMgr = g_fw.get< HousingMgr >(); if( !pHousingMgr ) break; - pHousingMgr->requestEstateEditGuestAccess( player, territoryTypeId, worldId, ward, plot ); + auto ident = pHousingMgr->clientTriggerParamsToLandIdent( param11, param12 ); + pHousingMgr->requestEstateEditGuestAccess( player, ident ); break; } @@ -429,22 +412,11 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX } case ClientTriggerType::RequestEstateGreeting: { - uint16_t territoryTypeId = param11 & 0xFFFF; - uint16_t worldId = param11 >> 16; - - uint8_t ward = ( param12 >> 16 ) & 0xFF; - uint8_t plot = ( param12 & 0xFF ); - auto housingMgr = g_fw.get< HousingMgr >(); if( !housingMgr ) break; - Common::LandIdent ident; - ident.territoryTypeId = territoryTypeId; - ident.worldId = worldId; - ident.wardNum = ward; - ident.landId = plot; - + auto ident = housingMgr->clientTriggerParamsToLandIdent( param11, param12 ); housingMgr->sendEstateGreeting( player, ident ); break; From b49b5ab15ae299f588c0469064188c00a54186fa Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 5 Dec 2018 19:58:43 +1100 Subject: [PATCH 2/8] handle internal/external housing storeroom inventory requests --- src/common/Network/CommonActorControl.h | 3 +- .../sapphire_zone/Manager/HousingMgr.cpp | 42 +++++++++++++++++++ .../sapphire_zone/Manager/HousingMgr.h | 10 +++++ .../Network/Handlers/ClientTriggerHandler.cpp | 29 +++++++++++++ .../Housing/HousingInteriorTerritory.cpp | 7 +++- .../Housing/HousingInteriorTerritory.h | 2 + src/servers/sapphire_zone/Territory/Land.cpp | 9 ++++ src/servers/sapphire_zone/Territory/Land.h | 4 +- 8 files changed, 103 insertions(+), 3 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index e15c95c3..f90c9a70 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -311,12 +311,13 @@ enum ActorControlType : uint16_t RequestLandSignOwned = 0x452, RequestWardLandInfo = 0x453, RequestLandRelinquish = 0x454, + RequestExternalHousingInventory = 0x0458, RequestEstateRename = 0x45A, RequestEstateEditGreeting = 0x45B, RequestEstateGreeting = 0x45C, // sends FFXIVIpcHousingEstateGreeting in return RequestEstateEditGuestAccessSettings = 0x45D, RequestEstateTagSettings = 0x45F, - + RequestInternalHousingInventory = 0x0461, RequestHousingItemUI = 0x463, RequestSharedEstateSettings = 0x46F, UpdateEstateLightingLevel = 0x471, diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.cpp b/src/servers/sapphire_zone/Manager/HousingMgr.cpp index 1f7b7f39..1f5f6bab 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Manager/HousingMgr.cpp @@ -17,6 +17,7 @@ #include "TerritoryMgr.h" #include "Territory/Zone.h" #include "Territory/HousingZone.h" +#include "Territory/Housing/HousingInteriorTerritory.h" #include "HousingMgr.h" #include "Territory/Land.h" #include "Framework.h" @@ -462,4 +463,45 @@ Sapphire::Common::LandIdent Sapphire::World::Manager::HousingMgr::clientTriggerP ident.landId = param12 & 0xFFFF; return ident; +} + +void Sapphire::World::Manager::HousingMgr::sendHousingInventory( Entity::Player& player, uint16_t inventoryType, uint8_t plotNum ) +{ + Sapphire::LandPtr targetLand; + + // plotNum will be 255 in the event that it's an internal zone + // and we have to switch up our way of getting the LandPtr + if( plotNum == 255 ) + { + auto internalZone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentZone() ); + if( !internalZone ) + return; + + auto ident = internalZone->getIdent(); + + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto exteriorZone = getHousingZoneByLandSetId( landSetId ); + + if( !exteriorZone ) + return; + + targetLand = exteriorZone->getLand( ident.landId ); + } + else + { + auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentZone() ); + if( !zone ) + return; + + targetLand = zone->getLand( plotNum ); + } + + if( !targetLand ) + return; + + // todo: add proper permissions checks + if( targetLand->getPlayerOwner() != player.getId() ) + return; + + player.sendDebug( "got inventory for plot: " + targetLand->getHouse()->getHouseName() ); } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.h b/src/servers/sapphire_zone/Manager/HousingMgr.h index 9745b2f1..e0f5c232 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.h +++ b/src/servers/sapphire_zone/Manager/HousingMgr.h @@ -30,6 +30,9 @@ namespace Sapphire::World::Manager void sendLandSignFree( Entity::Player& player, const Common::LandIdent ident ); LandPurchaseResult purchaseLand( Entity::Player& player, uint8_t plot, uint8_t state ); + /*! + * @brief Converts param1 of a client trigger into a Common::LandIndent + */ Common::LandIdent clientTriggerParamsToLandIdent( uint32_t param11, uint32_t param12 ) const; void sendWardLandInfo( Entity::Player& player, uint8_t wardId, uint16_t territoryTypeId ); @@ -47,6 +50,13 @@ namespace Sapphire::World::Manager void sendEstateGreeting( Entity::Player& player, const Common::LandIdent ident ); + /*! + * @brief Sends the house inventory for the specified type to a player. + * + * This enforces permissions on the inventory too so random players can't request a houses items + */ + void sendHousingInventory( Entity::Player& player, uint16_t inventoryType, uint8_t plotNum ); + }; } diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 1e309533..13c3f640 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -421,6 +421,35 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } + case ClientTriggerType::RequestExternalHousingInventory: + { + if( param2 != 1 ) + return; + + uint8_t plot = ( param12 & 0xFF ); + + auto housingMgr = g_fw.get< HousingMgr >(); + if( !housingMgr ) + break; + + housingMgr->sendHousingInventory( player, Common::InventoryType::HousingOutdoorItemStoreroom, plot ); + + break; + } + case ClientTriggerType::RequestInternalHousingInventory: + { + // 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 = g_fw.get< HousingMgr >(); + if( !housingMgr ) + break; + + housingMgr->sendHousingInventory( player, Common::InventoryType::HousingIndoorItemStoreroom, 255 ); + + break; + } default: { diff --git a/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.cpp b/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.cpp index 373d725a..da5c399d 100644 --- a/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.cpp +++ b/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.cpp @@ -68,7 +68,7 @@ void Housing::HousingInteriorTerritory::onPlayerZoneIn( Entity::Player& player ) for( auto i = 0; i < 10; i++ ) { - indoorInitPacket->data().indoorItems[ i ] = pHouse->getHouseInteriorPart( (Common::HousingInteriorSlot)i ); + indoorInitPacket->data().indoorItems[ i ] = pHouse->getHouseInteriorPart( static_cast< Common::HousingInteriorSlot >( i ) ); } @@ -102,4 +102,9 @@ void Housing::HousingInteriorTerritory::onUpdate( uint32_t currTime ) uint32_t Housing::HousingInteriorTerritory::getLastActivityTime() const { return m_lastActivityTime; +} + +const Common::LandIdent Housing::HousingInteriorTerritory::getIdent() const +{ + return m_landIdent; } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.h b/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.h index e5be57a9..f8287df8 100644 --- a/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.h +++ b/src/servers/sapphire_zone/Territory/Housing/HousingInteriorTerritory.h @@ -20,6 +20,8 @@ namespace Sapphire::World::Territory::Housing uint32_t getLastActivityTime() const; + const Common::LandIdent getIdent() const; + private: Common::LandIdent m_landIdent; uint32_t m_lastActivityTime; diff --git a/src/servers/sapphire_zone/Territory/Land.cpp b/src/servers/sapphire_zone/Territory/Land.cpp index 4ef3bae8..31071b76 100644 --- a/src/servers/sapphire_zone/Territory/Land.cpp +++ b/src/servers/sapphire_zone/Territory/Land.cpp @@ -355,3 +355,12 @@ bool Sapphire::Land::setPreset( uint32_t itemId ) return true; } + +Sapphire::ItemContainerPtr Sapphire::Land::getInventory( uint16_t inventoryType ) const +{ + auto container = m_landInventoryMap.find( inventoryType ); + if( container == m_landInventoryMap.end() ) + return nullptr; + + return container->second; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Territory/Land.h b/src/servers/sapphire_zone/Territory/Land.h index 1b4b2fa1..b509ea07 100644 --- a/src/servers/sapphire_zone/Territory/Land.h +++ b/src/servers/sapphire_zone/Territory/Land.h @@ -18,7 +18,7 @@ namespace Sapphire Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId, uint32_t landSetId, Sapphire::Data::HousingLandSetPtr info ); virtual ~Land(); - using LandInventoryMap = std::unordered_map< uint32_t, ItemContainerPtr >; + using LandInventoryMap = std::unordered_map< uint16_t, ItemContainerPtr >; //Primary state void setSize( uint8_t size ); @@ -61,6 +61,8 @@ namespace Sapphire void setLandTag( uint8_t slot, uint8_t tag ); uint8_t getLandTag( uint8_t slot ); + ItemContainerPtr getInventory( uint16_t inventoryType ) const; + private: uint32_t convertItemIdToHousingItemId( uint32_t itemId ); void init(); From 60e372b2321f7ba3b47b41a07aec35e822cd153f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 5 Dec 2018 21:29:33 +1100 Subject: [PATCH 3/8] adjust size type in itemcontainer to accommodate larger inventories --- .../sapphire_zone/Inventory/ItemContainer.cpp | 18 +++++++++--------- .../sapphire_zone/Inventory/ItemContainer.h | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/servers/sapphire_zone/Inventory/ItemContainer.cpp b/src/servers/sapphire_zone/Inventory/ItemContainer.cpp index 775b122e..e5ad2d1a 100644 --- a/src/servers/sapphire_zone/Inventory/ItemContainer.cpp +++ b/src/servers/sapphire_zone/Inventory/ItemContainer.cpp @@ -11,7 +11,7 @@ extern Sapphire::Framework g_fw; -Sapphire::ItemContainer::ItemContainer( uint16_t storageId, uint8_t maxSize, const std::string& tableName, +Sapphire::ItemContainer::ItemContainer( uint16_t storageId, uint16_t maxSize, const std::string& tableName, bool isMultiStorage, bool isPersistentStorage ) : m_id( storageId ), m_size( maxSize ), @@ -32,12 +32,12 @@ uint16_t Sapphire::ItemContainer::getId() const return m_id; } -uint8_t Sapphire::ItemContainer::getEntryCount() const +uint16_t Sapphire::ItemContainer::getEntryCount() const { - return static_cast< uint8_t >( m_itemMap.size() ); + return static_cast< uint16_t >( m_itemMap.size() ); } -void Sapphire::ItemContainer::removeItem( uint8_t slotId ) +void Sapphire::ItemContainer::removeItem( uint16_t slotId ) { auto pLog = g_fw.get< Logger >(); auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); @@ -68,9 +68,9 @@ const Sapphire::ItemMap& Sapphire::ItemContainer::getItemMap() const return m_itemMap; } -int8_t Sapphire::ItemContainer::getFreeSlot() +int16_t Sapphire::ItemContainer::getFreeSlot() { - for( uint8_t slotId = 0; slotId < m_size; slotId++ ) + for( uint16_t slotId = 0; slotId < m_size; slotId++ ) { ItemMap::iterator it = m_itemMap.find( slotId ); if( it == m_itemMap.end() || @@ -80,7 +80,7 @@ int8_t Sapphire::ItemContainer::getFreeSlot() return -1; } -Sapphire::ItemPtr Sapphire::ItemContainer::getItem( uint8_t slotId ) +Sapphire::ItemPtr Sapphire::ItemContainer::getItem( uint16_t slotId ) { if( ( slotId > m_size ) ) @@ -93,7 +93,7 @@ Sapphire::ItemPtr Sapphire::ItemContainer::getItem( uint8_t slotId ) return m_itemMap[ slotId ]; } -void Sapphire::ItemContainer::setItem( uint8_t slotId, ItemPtr pItem ) +void Sapphire::ItemContainer::setItem( uint16_t slotId, ItemPtr pItem ) { if( slotId > m_size ) return; @@ -101,7 +101,7 @@ void Sapphire::ItemContainer::setItem( uint8_t slotId, ItemPtr pItem ) m_itemMap[ slotId ] = pItem; } -uint8_t Sapphire::ItemContainer::getMaxSize() const +uint16_t Sapphire::ItemContainer::getMaxSize() const { return m_size; } diff --git a/src/servers/sapphire_zone/Inventory/ItemContainer.h b/src/servers/sapphire_zone/Inventory/ItemContainer.h index 39d21510..295fa51a 100644 --- a/src/servers/sapphire_zone/Inventory/ItemContainer.h +++ b/src/servers/sapphire_zone/Inventory/ItemContainer.h @@ -8,34 +8,34 @@ namespace Sapphire { - using ItemMap = std::map< uint8_t, ItemPtr >; + using ItemMap = std::map< uint16_t, ItemPtr >; class ItemContainer { public: - ItemContainer( uint16_t storageId, uint8_t maxSize, const std::string& tableName, bool isMultiStorage, + ItemContainer( uint16_t storageId, uint16_t maxSize, const std::string& tableName, bool isMultiStorage, bool isPersistentStorage = true ); ~ItemContainer(); uint16_t getId() const; - uint8_t getEntryCount() const; + uint16_t getEntryCount() const; - void removeItem( uint8_t slotId ); + void removeItem( uint16_t slotId ); ItemMap& getItemMap(); const ItemMap& getItemMap() const; - ItemPtr getItem( uint8_t slotId ); + ItemPtr getItem( uint16_t slotId ); - void setItem( uint8_t slotId, ItemPtr item ); + void setItem( uint16_t slotId, ItemPtr item ); - int8_t getFreeSlot(); + int16_t getFreeSlot(); - uint8_t getMaxSize() const; + uint16_t getMaxSize() const; std::string getTableName() const; @@ -45,7 +45,7 @@ namespace Sapphire private: uint16_t m_id; - uint8_t m_size; + uint16_t m_size; std::string m_tableName; bool m_bMultiStorage; bool m_isPersistentStorage; From 703049e14f4a424b19e483b004f52ef1fe2eda8d Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 7 Dec 2018 20:11:59 +1100 Subject: [PATCH 4/8] refactor getInventory -> getItemContainer --- src/servers/sapphire_zone/Territory/Land.cpp | 2 +- src/servers/sapphire_zone/Territory/Land.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Territory/Land.cpp b/src/servers/sapphire_zone/Territory/Land.cpp index 31071b76..84bd215f 100644 --- a/src/servers/sapphire_zone/Territory/Land.cpp +++ b/src/servers/sapphire_zone/Territory/Land.cpp @@ -356,7 +356,7 @@ bool Sapphire::Land::setPreset( uint32_t itemId ) return true; } -Sapphire::ItemContainerPtr Sapphire::Land::getInventory( uint16_t inventoryType ) const +Sapphire::ItemContainerPtr Sapphire::Land::getItemContainer( uint16_t inventoryType ) const { auto container = m_landInventoryMap.find( inventoryType ); if( container == m_landInventoryMap.end() ) diff --git a/src/servers/sapphire_zone/Territory/Land.h b/src/servers/sapphire_zone/Territory/Land.h index b509ea07..7d3ee6a1 100644 --- a/src/servers/sapphire_zone/Territory/Land.h +++ b/src/servers/sapphire_zone/Territory/Land.h @@ -61,7 +61,7 @@ namespace Sapphire void setLandTag( uint8_t slot, uint8_t tag ); uint8_t getLandTag( uint8_t slot ); - ItemContainerPtr getInventory( uint16_t inventoryType ) const; + ItemContainerPtr getItemContainer( uint16_t inventoryType ) const; private: uint32_t convertItemIdToHousingItemId( uint32_t itemId ); From 795c8280d5ed1d611be9fb7c26e95166d06db536 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 7 Dec 2018 20:12:20 +1100 Subject: [PATCH 5/8] fix db schema so characters get created correctly --- sql/schema/schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/schema/schema.sql b/sql/schema/schema.sql index ce590bd4..c9e1e547 100644 --- a/sql/schema/schema.sql +++ b/sql/schema/schema.sql @@ -212,7 +212,7 @@ CREATE TABLE `charaitemgearset` ( `CharacterId` int(20) NOT NULL, `storageId` int(10) NOT NULL, `type` int(5) DEFAULT '0', - `idx` int(5) NOT NULL, + `idx` int(5) DEFAULT '0', `container_0` int(20) DEFAULT '0', `container_1` int(20) DEFAULT '0', `container_2` int(20) DEFAULT '0', @@ -235,7 +235,7 @@ CREATE TABLE `charaiteminventory` ( `CharacterId` int(20) NOT NULL, `storageId` int(10) NOT NULL, `type` int(5) DEFAULT '0', - `idx` int(5) NOT NULL, + `idx` int(5) DEFAULT '0', `container_0` int(20) DEFAULT '0', `container_1` int(20) DEFAULT '0', `container_2` int(20) DEFAULT '0', From 86fb678b0c5f8abb11527d52e3558e37e5d9cfbc Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 7 Dec 2018 20:36:52 +1100 Subject: [PATCH 6/8] Fix issue where housing eobj wouldn't spawn on land build - #448 --- .../sapphire_zone/Manager/HousingMgr.cpp | 3 +-- .../sapphire_zone/Territory/HousingZone.cpp | 17 +++++++++++++++-- .../sapphire_zone/Territory/HousingZone.h | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.cpp b/src/servers/sapphire_zone/Manager/HousingMgr.cpp index 1f5f6bab..46d8c053 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Manager/HousingMgr.cpp @@ -356,8 +356,7 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl player.setLandFlags( LandFlagsSlot::Private, EstateBuilt, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); player.sendLandFlagsSlot( LandFlagsSlot::Private ); - auto eobj = hZone->registerEObj( "entrance", 2002737, 0, 4, pLand->getMapMarkerPosition(), 1.f, 0.f ); - eobj->setHousingLink( plotNum << 8 ); + hZone->registerHouseEntranceEObj( plotNum ); } void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& player, const Common::LandIdent ident ) diff --git a/src/servers/sapphire_zone/Territory/HousingZone.cpp b/src/servers/sapphire_zone/Territory/HousingZone.cpp index b5304093..5f47d22f 100644 --- a/src/servers/sapphire_zone/Territory/HousingZone.cpp +++ b/src/servers/sapphire_zone/Territory/HousingZone.cpp @@ -69,8 +69,7 @@ bool Sapphire::HousingZone::init() if( auto house = pLand->getHouse() ) { - auto eobj = registerEObj( "entrance", 2002737, 0, 4, pLand->getMapMarkerPosition(), 1.f, 0.f ); - eobj->setHousingLink( landId << 8 ); + registerHouseEntranceEObj( landId << 8 ); } } @@ -230,4 +229,18 @@ Sapphire::LandPtr Sapphire::HousingZone::getLand( uint8_t id ) return nullptr; return it->second; +} + +Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerHouseEntranceEObj( uint8_t plotId ) +{ + auto land = getLand( plotId ); + assert( land ); + + auto eObj = Entity::make_EventObject( getNextEObjId(), 2002737, 0, 4, land->getMapMarkerPosition(), 0.f, "entrance" ); + eObj->setHousingLink( plotId << 8 ); + eObj->setScale( 1.f ); + + registerEObj( eObj ); + + return eObj; } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Territory/HousingZone.h b/src/servers/sapphire_zone/Territory/HousingZone.h index 985bbbba..3868f31a 100644 --- a/src/servers/sapphire_zone/Territory/HousingZone.h +++ b/src/servers/sapphire_zone/Territory/HousingZone.h @@ -50,6 +50,8 @@ namespace Sapphire uint32_t getLandSetId() const; Sapphire::LandPtr getLand( uint8_t id ); + Entity::EventObjectPtr registerHouseEntranceEObj( uint8_t plotId ); + private: using LandPtrMap = std::unordered_map< uint8_t, Sapphire::LandPtr >; const uint32_t m_landSetMax = 18; From 3f372d3aa1880db41f65200d7781557ee93624a6 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 7 Dec 2018 23:34:45 +1100 Subject: [PATCH 7/8] LandIdent now uses signed ints, rename housing clienttriggers, fix formatting --- src/common/Common.h | 8 ++++---- src/common/Network/CommonActorControl.h | 4 ++-- src/servers/sapphire_zone/Inventory/ItemContainer.cpp | 2 +- .../Network/Handlers/ClientTriggerHandler.cpp | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index b4aa0760..14de2012 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -803,10 +803,10 @@ namespace Sapphire::Common struct LandIdent { - uint16_t landId; //00 - uint16_t wardNum; //02 - uint16_t territoryTypeId; //04 - uint16_t worldId; //06 + int16_t landId; //00 + int16_t wardNum; //02 + int16_t territoryTypeId; //04 + int16_t worldId; //06 }; struct LandFlagSet diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index f90c9a70..b5586709 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -311,13 +311,13 @@ enum ActorControlType : uint16_t RequestLandSignOwned = 0x452, RequestWardLandInfo = 0x453, RequestLandRelinquish = 0x454, - RequestExternalHousingInventory = 0x0458, + RequestHousingLandInventory = 0x0458, RequestEstateRename = 0x45A, RequestEstateEditGreeting = 0x45B, RequestEstateGreeting = 0x45C, // sends FFXIVIpcHousingEstateGreeting in return RequestEstateEditGuestAccessSettings = 0x45D, RequestEstateTagSettings = 0x45F, - RequestInternalHousingInventory = 0x0461, + RequestHousingEstateInventory = 0x0461, RequestHousingItemUI = 0x463, RequestSharedEstateSettings = 0x46F, UpdateEstateLightingLevel = 0x471, diff --git a/src/servers/sapphire_zone/Inventory/ItemContainer.cpp b/src/servers/sapphire_zone/Inventory/ItemContainer.cpp index e5ad2d1a..3328a4f9 100644 --- a/src/servers/sapphire_zone/Inventory/ItemContainer.cpp +++ b/src/servers/sapphire_zone/Inventory/ItemContainer.cpp @@ -12,7 +12,7 @@ extern Sapphire::Framework g_fw; Sapphire::ItemContainer::ItemContainer( uint16_t storageId, uint16_t maxSize, const std::string& tableName, - bool isMultiStorage, bool isPersistentStorage ) : + bool isMultiStorage, bool isPersistentStorage ) : m_id( storageId ), m_size( maxSize ), m_tableName( tableName ), diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 13c3f640..fcc6eb00 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -421,7 +421,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } - case ClientTriggerType::RequestExternalHousingInventory: + case ClientTriggerType::RequestHousingLandInventory: { if( param2 != 1 ) return; @@ -436,7 +436,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } - case ClientTriggerType::RequestInternalHousingInventory: + case ClientTriggerType::RequestHousingEstateInventory: { // only sent if param1 is 1, because the client sends this with 0 when you open the ui for whatever reason if( param1 != 1 ) From 9e412306b6e6cc68cba7d44521d2c5f607bcb3a2 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 7 Dec 2018 23:38:45 +1100 Subject: [PATCH 8/8] new and improved:tm: naming convention has been rejected --- src/common/Network/CommonActorControl.h | 4 ++-- .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index b5586709..1f55a52b 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -311,13 +311,13 @@ enum ActorControlType : uint16_t RequestLandSignOwned = 0x452, RequestWardLandInfo = 0x453, RequestLandRelinquish = 0x454, - RequestHousingLandInventory = 0x0458, + RequestLandInventory = 0x0458, RequestEstateRename = 0x45A, RequestEstateEditGreeting = 0x45B, RequestEstateGreeting = 0x45C, // sends FFXIVIpcHousingEstateGreeting in return RequestEstateEditGuestAccessSettings = 0x45D, RequestEstateTagSettings = 0x45F, - RequestHousingEstateInventory = 0x0461, + RequestEstateInventory = 0x0461, RequestHousingItemUI = 0x463, RequestSharedEstateSettings = 0x46F, UpdateEstateLightingLevel = 0x471, diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index fcc6eb00..b2236677 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -421,7 +421,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } - case ClientTriggerType::RequestHousingLandInventory: + case ClientTriggerType::RequestLandInventory: { if( param2 != 1 ) return; @@ -436,7 +436,7 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } - case ClientTriggerType::RequestHousingEstateInventory: + 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 )