From a271ee6d46dc877327da344fe3ccdeab5f797ccf Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 21:59:28 +1100 Subject: [PATCH] estate greetings can be updated/set --- src/common/Network/PacketDef/Ipcs.h | 2 +- .../Network/PacketDef/Zone/ClientZoneDef.h | 12 ++++++--- src/servers/sapphire_zone/Actor/Player.cpp | 6 +++++ src/servers/sapphire_zone/Actor/Player.h | 2 ++ .../sapphire_zone/Network/GameConnection.cpp | 5 +++- .../sapphire_zone/Network/GameConnection.h | 4 ++- .../Network/Handlers/PacketHandlers.cpp | 19 ++++++++++++-- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 25 +++++++++++++++++++ src/servers/sapphire_zone/Zone/HousingMgr.h | 2 ++ 9 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 518d1c91..e7862e6d 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -304,7 +304,7 @@ namespace Core::Network::Packets LinkshellEventHandler1 = 0x1151, // updated 4.1 ?? LandRenameHandler = 0x0171, // updated 4.4 - LandChangeEstateMessageHandler = 0x0172, // updated 4.4 + HousingUpdateHouseGreeting = 0x0172, // updated 4.4 SetSharedEstateSettings = 0x0177, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 3e2ac51b..69ba674c 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -199,14 +199,18 @@ struct FFXIVIpcInventoryModifyHandler : struct FFXIVIpcRenameLandHandler : FFXIVIpcBasePacket< LandRenameHandler > { - /* 0000 */ uint16_t landId; - /* 0002 */ uint16_t wardNum; - /* 0004 */ uint16_t zoneId; - /* 0006 */ uint16_t worldId; + /* 0000 */ Common::LandIdent ident; /* 0008 */ char houseName[20]; /* 0028 */ uint32_t padding; }; +struct FFXIVIpcHousingUpdateHouseGreeting : + FFXIVIpcBasePacket< HousingUpdateHouseGreeting > +{ + /* 0000 */ Common::LandIdent ident; + /* 0008 */ char greeting[200]; +}; + struct FFXIVIpcBuildPresetHandler : FFXIVIpcBasePacket< BuildPresetHandler > { diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 95b5d1af..29c8ad61 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1290,6 +1290,12 @@ void Core::Entity::Player::sendDebug( const std::string& message ) //Grey Text queuePacket( std::make_shared< ChatPacket >( *getAsPlayer(), ChatType::ServerDebug, message ) ); } +void Core::Entity::Player::sendLogMessage( uint32_t messageId, uint32_t param2, uint32_t param3, + uint32_t param4, uint32_t param5, uint32_t param6 ) +{ + queuePacket( makeActorControl144( getId(), ActorControlType::LogMsg, messageId, param2, param3, param4, param5, param6 ) ); +} + void Core::Entity::Player::updateHowtosSeen( uint32_t howToId ) { uint8_t index = howToId / 8; diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 3ca345d2..dfc57e7b 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -757,6 +757,8 @@ namespace Core::Entity void sendDebug( const std::string& message ); + void sendLogMessage( uint32_t messageId, uint32_t param2 = 0, uint32_t param3 = 0, uint32_t param4 = 0, uint32_t param5 = 0, uint32_t param6 = 0 ); + bool isDirectorInitialized() const; void setDirectorInitialized( bool isInitialized ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index bfeda82f..71028d7a 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -85,6 +85,9 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::BuildPresetHandler, "BuildPresetHandler", &GameConnection::buildPresetHandler ); setZoneHandler( ClientZoneIpcType::LandRenameHandler, "LandRenameHandler", &GameConnection::landRenameHandler ); + setZoneHandler( ClientZoneIpcType::HousingUpdateHouseGreeting, "HousingUpdateHouseGreeting", + &GameConnection::housingUpdateGreetingHandler ); + setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); setZoneHandler( ClientZoneIpcType::WithinRangeEventHandler, "EventHandlerWithinRange", @@ -225,7 +228,7 @@ void Core::Network::GameConnection::handleZonePacket( Core::Network::Packets::FF else { pLog->debug( sessionStr + " Undefined Zone IPC : Unknown ( " + - Util::intToHexString( static_cast< uint32_t >( opcode ), 4 ) + " )" ); + Util::intToHexString( static_cast< uint32_t >( opcode ), 4 ) + " )" ); pLog->debug( "Dump:\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &pPacket.data[ 0 ] ), pPacket.segHdr.size ) ); } diff --git a/src/servers/sapphire_zone/Network/GameConnection.h b/src/servers/sapphire_zone/Network/GameConnection.h index c6ab31ae..9ab043f2 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.h +++ b/src/servers/sapphire_zone/Network/GameConnection.h @@ -152,7 +152,7 @@ namespace Core::Network DECLARE_HANDLER( cfRegisterRoulette ); DECLARE_HANDLER( cfDutyAccepted ); - + DECLARE_HANDLER( actionHandler ); DECLARE_HANDLER( gm1Handler ); @@ -165,6 +165,8 @@ namespace Core::Network DECLARE_HANDLER( landRenameHandler ); + DECLARE_HANDLER( housingUpdateGreetingHandler ); + DECLARE_HANDLER( buildPresetHandler ); DECLARE_HANDLER( tellHandler ); diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 16a7d5f0..e6cd8a16 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -658,10 +658,15 @@ void Core::Network::GameConnection::landRenameHandler( const Core::Network::Pack { const auto packet = ZoneChannelPacket< Client::FFXIVIpcRenameLandHandler >( inPacket ); - uint32_t landSetId = ( static_cast< uint32_t >( packet.data().zoneId ) << 16 ) | packet.data().wardNum; auto pHousingMgr = g_fw.get< HousingMgr >(); - auto pLand = pHousingMgr->getHousingZoneByLandSetId( landSetId )->getLand( packet.data().landId ); + auto landSetId = pHousingMgr->toLandSetId( packet.data().ident.territoryTypeId, packet.data().ident.wardNum ); + + auto pZone = pHousingMgr->getHousingZoneByLandSetId( landSetId ); + if( !pZone ) + return; + + auto pLand = pZone->getLand( packet.data().ident.landId ); if( !pLand ) return; @@ -689,3 +694,13 @@ void Core::Network::GameConnection::buildPresetHandler( const Core::Network::Pac auto pHousingMgr = g_fw.get< HousingMgr >(); pHousingMgr->buildPresetEstate( player, packet.data().plotNum, packet.data().itemId ); } + +void Core::Network::GameConnection::housingUpdateGreetingHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) +{ + const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingUpdateHouseGreeting >( inPacket ); + + auto pHousingMgr = g_fw.get< HousingMgr >(); + + pHousingMgr->updateEstateGreeting( player, packet.data().ident, std::string( packet.data().greeting ) ); +} diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index bc073f34..a6dd416e 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -374,3 +374,28 @@ void Core::HousingMgr::requestEstateEditGreeting( Entity::Player& player, uint16 player.queuePacket( estateGreetingPacket ); } + +void Core::HousingMgr::updateEstateGreeting( Entity::Player& player, const Common::LandIdent& ident, const std::string& greeting ) +{ + auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto zone = getHousingZoneByLandSetId( landSetId ); + + if( !zone ) + return; + + auto land = zone->getLand( ident.landId ); + if( !land ) + return; + + // todo: implement proper permissions checks + if( land->getPlayerOwner() != player.getId() ) + return; + + auto house = land->getHouse(); + if( !house ) + return; + + house->setHouseGreeting( greeting ); + + player.sendLogMessage( 3381 ); +} diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.h b/src/servers/sapphire_zone/Zone/HousingMgr.h index a60fc672..fa117cf4 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.h +++ b/src/servers/sapphire_zone/Zone/HousingMgr.h @@ -37,7 +37,9 @@ namespace Core 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 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 ); private: