diff --git a/src/common/Common.h b/src/common/Common.h index 6ac99a0c..1c695917 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -864,7 +864,7 @@ namespace Sapphire::Common { IsEstateOwned = 1, IsPublicEstate = 2, - HasEstateMessage = 4, + HasEstateGreeting = 4, EstateFlagUnknown = 8, IsFreeCompanyEstate = 16, }; diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.cpp b/src/servers/sapphire_zone/Manager/HousingMgr.cpp index e58922b2..60f04b8a 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Manager/HousingMgr.cpp @@ -244,6 +244,9 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla wardInfoPacket->data().landIdent.wardNum = wardId; wardInfoPacket->data().landIdent.territoryTypeId = territoryTypeId; + // todo: properly get worldId + wardInfoPacket->data().landIdent.worldId = 67; + for( int i = 0; i < 60; i++ ) { auto land = hZone->getLand( i ); @@ -258,20 +261,26 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla if( land->getState() == Common::HouseState::forSale ) continue; + if( auto house = land->getHouse() ) + { + if( !house->getHouseGreeting().empty() ) + entry.infoFlags |= WardlandFlags::HasEstateGreeting; + } + switch( land->getLandType() ) { case LandType::FreeCompany: - entry.infoFlags = Common::WardlandFlags::IsEstateOwned | Common::WardlandFlags::IsFreeCompanyEstate; + entry.infoFlags |= Common::WardlandFlags::IsEstateOwned | Common::WardlandFlags::IsFreeCompanyEstate; // todo: send FC name break; case LandType::Private: - entry.infoFlags = Common::WardlandFlags::IsEstateOwned; + entry.infoFlags |= Common::WardlandFlags::IsEstateOwned; auto owner = land->getPlayerOwner(); - std::string playerName = g_fw.get< Sapphire::ServerMgr >()->getPlayerNameFromDb( owner ); + auto playerName = g_fw.get< Sapphire::ServerMgr >()->getPlayerNameFromDb( owner ); memcpy( &entry.estateOwnerName, playerName.c_str(), playerName.size() ); break; @@ -284,6 +293,32 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla player.queuePacket( wardInfoPacket ); } +void Sapphire::World::Manager::HousingMgr::sendEstateGreeting( Entity::Player& player, const Common::LandIdent ident ) +{ + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto hZone = getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + return; + + auto land = hZone->getLand( ident.landId ); + if( !land ) + return; + + auto house = land->getHouse(); + if( !house ) + return; + + auto greetingPacket = makeZonePacket< FFXIVIpcHousingEstateGreeting >( player.getId() ); + + greetingPacket->data().landIdent = ident; + + auto greeting = house->getHouseGreeting(); + memcpy( &greetingPacket->data().message, greeting.c_str(), greeting.size() ); + + player.queuePacket( greetingPacket ); +} + void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetItem ) { auto hZone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentZone() ); diff --git a/src/servers/sapphire_zone/Manager/HousingMgr.h b/src/servers/sapphire_zone/Manager/HousingMgr.h index 73e67125..f0e3c170 100644 --- a/src/servers/sapphire_zone/Manager/HousingMgr.h +++ b/src/servers/sapphire_zone/Manager/HousingMgr.h @@ -43,6 +43,8 @@ namespace Sapphire::World::Manager void requestEstateEditGuestAccess( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ); + 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 277ac909..482e10c6 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -427,6 +427,28 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX break; } + 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; + + housingMgr->sendEstateGreeting( player, ident ); + + break; + } default: {