From c12adb5c741ec8d3d3e950e42b566cf58b0f84c7 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 23:29:55 +1100 Subject: [PATCH] Fix land state being sent incorrectly and consistently name those IPCs --- src/common/Common.h | 2 +- src/common/Network/PacketDef/Ipcs.h | 4 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 6 +- src/servers/sapphire_zone/Actor/Player.cpp | 61 ++++++++++++------- src/servers/sapphire_zone/Actor/Player.h | 4 +- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 13 ++-- 6 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 17d7055c..b03618ef 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -758,7 +758,7 @@ namespace Core::Common SubTag2 }; - enum LandStateSlot + enum LandFlagsSlot { FreeCompany, Private, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index e7862e6d..a50a5c3e 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -193,8 +193,8 @@ namespace Core::Network::Packets HousingEstateGreeting = 0x0227, // updated 4.4 - LandStateSlot = 0x0228, // updated 4.4 - LandPermission = 0x0229, // updated 4.4 + HousingUpdateLandFlagsSlot = 0x0228, // updated 4.4 + HousingLandFlags = 0x0229, // updated 4.4 LandSetYardInitialize = 0x022C, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 1f603d61..b6cc582f 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1575,14 +1575,14 @@ struct FFXIVIpcPerformNote : FFXIVIpcBasePacket< PerformNote > uint8_t data[32]; }; -struct FFXIVIpcLandStateSlot : FFXIVIpcBasePacket< LandStateSlot > +struct FFXIVIpcHousingUpdateLandFlagsSlot : FFXIVIpcBasePacket< HousingUpdateLandFlagsSlot > { uint32_t type; uint32_t unknown; - Common::LandFlagSet permissionSet; + Common::LandFlagSet flagSet; }; -struct FFXIVIpcLandPermission : FFXIVIpcBasePacket< LandPermission > +struct FFXIVIpcHousingLandFlags : FFXIVIpcBasePacket< HousingLandFlags > { Common::LandFlagSet freeCompanyHouse; // 00 uint64_t unkown1; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 29c8ad61..79f24075 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -94,8 +94,8 @@ Core::Entity::Player::Player() : for ( uint8_t i = 0; i < 5; i++ ) { - memset( &m_landPermission[i], 0xFF, 8 ); - memset( &m_landPermission[i].landFlags, 0, 8 ); + memset( &m_landFlags[i], 0xFF, 8 ); + memset( &m_landFlags[i].landFlags, 0, 8 ); } m_objSpawnIndexAllocator.init( MAX_DISPLAYED_EOBJS ); @@ -1603,7 +1603,7 @@ void Core::Entity::Player::sendZonePackets() state |= ESTATE_HAS_AETHERYTE; } - setLandFlags( LandStateSlot::Private, state, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + setLandFlags( LandFlagsSlot::Private, state, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); } sendLandFlags(); @@ -1784,38 +1784,53 @@ bool Core::Entity::Player::isOnEnterEventDone() const return m_onEnterEventDone; } -void Core::Entity::Player::setLandFlags( uint8_t permissionSet, uint32_t landFlags, +void Core::Entity::Player::setLandFlags( uint8_t flagSlot, uint32_t landFlags, int16_t landId, int16_t wardNum, int16_t zoneId ) { - m_landPermission[ permissionSet ].landIdent.landId = landId; - m_landPermission[ permissionSet ].landIdent.wardNum = wardNum; - m_landPermission[ permissionSet ].landIdent.territoryTypeId = zoneId; - m_landPermission[ permissionSet ].landIdent.worldId = 67; - m_landPermission[ permissionSet ].landFlags = landFlags; - m_landPermission[ permissionSet ].unkown1 = 0; + m_landFlags[ flagSlot ].landIdent.landId = landId; + m_landFlags[ flagSlot ].landIdent.wardNum = wardNum; + m_landFlags[ flagSlot ].landIdent.territoryTypeId = zoneId; + m_landFlags[ flagSlot ].landIdent.worldId = 67; + m_landFlags[ flagSlot ].landFlags = landFlags; + m_landFlags[ flagSlot ].unkown1 = 0; } void Core::Entity::Player::sendLandFlags() { - auto landPermissions = makeZonePacket< FFXIVIpcLandPermission >( getId() ); + auto landFlags = makeZonePacket< FFXIVIpcHousingLandFlags >( getId() ); - landPermissions->data().freeCompanyHouse = m_landPermission[ Common::LandStateSlot::FreeCompany ]; - landPermissions->data().privateHouse = m_landPermission[ Common::LandStateSlot::Private ]; - landPermissions->data().apartment = m_landPermission[ Common::LandStateSlot::Apartment ]; - landPermissions->data().sharedHouse[ 0 ] = m_landPermission[ Common::LandStateSlot::SharedHouse1 ]; - landPermissions->data().sharedHouse[ 1 ] = m_landPermission[ Common::LandStateSlot::SharedHouse2 ]; + landFlags->data().freeCompanyHouse = m_landFlags[ Common::LandFlagsSlot::FreeCompany ]; + landFlags->data().privateHouse = m_landFlags[ Common::LandFlagsSlot::Private ]; + landFlags->data().apartment = m_landFlags[ Common::LandFlagsSlot::Apartment ]; + landFlags->data().sharedHouse[ 0 ] = m_landFlags[ Common::LandFlagsSlot::SharedHouse1 ]; + landFlags->data().sharedHouse[ 1 ] = m_landFlags[ Common::LandFlagsSlot::SharedHouse2 ]; - queuePacket( landPermissions ); + queuePacket( landFlags ); } -void Core::Entity::Player::sendLandFlagsSlot( Common::LandStateSlot slot ) +void Core::Entity::Player::sendLandFlagsSlot( Common::LandFlagsSlot slot ) { - auto landPermissions = makeZonePacket< FFXIVIpcLandStateSlot >( getId() ); + auto landFlags = makeZonePacket< FFXIVIpcHousingUpdateLandFlagsSlot >( getId() ); - auto slotId = static_cast< uint8_t >( slot ); + uint32_t type = 0; - landPermissions->data().type = slotId; - landPermissions->data().permissionSet = m_landPermission[ slotId ]; + switch( slot ) + { + case LandFlagsSlot::Private: + type = static_cast< uint32_t >( LandType::Private ); + break; - queuePacket( landPermissions ); + case LandFlagsSlot::FreeCompany: + type = static_cast< uint32_t >( LandType::FreeCompany ); + break; + + default: + // todo: other/unsupported land types + return; + } + + landFlags->data().type = type; + landFlags->data().flagSet = m_landFlags[ slot ]; + + queuePacket( landFlags ); } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index dfc57e7b..9633a618 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -768,7 +768,7 @@ namespace Core::Entity void setLandFlags( uint8_t permissionSet, uint32_t landFlags, int16_t landId, int16_t wardNum, int16_t zoneId ); void sendLandFlags(); - void sendLandFlagsSlot( Common::LandStateSlot slot ); + void sendLandFlagsSlot( Common::LandFlagsSlot slot ); // Player Battle Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1027,7 +1027,7 @@ namespace Core::Entity uint8_t m_searchSelectClass; // class selected to show up in profile // housing info - Common::LandFlagSet m_landPermission[5]; + Common::LandFlagSet m_landFlags[5]; Common::ActiveLand m_activeLand; diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index a6dd416e..898a4845 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -167,10 +167,10 @@ Core::LandPurchaseResult Core::HousingMgr::purchaseLand( Entity::Player& player, pLand->setState( HouseState::sold ); pLand->setLandType( Common::LandType::Private ); - player.setLandFlags( LandStateSlot::Private, 0x00, plot, + player.setLandFlags( LandFlagsSlot::Private, 0x00, plot, pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandFlagsSlot( LandStateSlot::Private ); + player.sendLandFlagsSlot( LandFlagsSlot::Private ); //pLand->setLandName( "Private Estate" + std::to_string( pHousing->getWardNum() ) + "-" + std::to_string( plot ) ); pLand->updateLandDb(); @@ -219,9 +219,9 @@ bool Core::HousingMgr::relinquishLand( Entity::Player& player, uint8_t plot ) pLand->setLandType( Common::LandType::none ); pLand->updateLandDb(); - player.setLandFlags( LandStateSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); + player.setLandFlags( LandFlagsSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); - player.sendLandFlagsSlot( LandStateSlot::Private ); + player.sendLandFlagsSlot( LandFlagsSlot::Private ); auto screenMsgPkt2 = makeActorControl143( player.getId(), ActorControl::LogMsg, 3351, 0x1AA, pLand->getWardNum() + 1, plot + 1 ); @@ -319,8 +319,8 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu // todo: wtf are these flags player.playScene( 0x000B0095, 0, 4164955899, 0, 1, plotNum, nullptr ); - player.setLandFlags( LandStateSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); - player.sendLandFlagsSlot( LandStateSlot::Private ); + player.setLandFlags( LandFlagsSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + player.sendLandFlagsSlot( LandFlagsSlot::Private ); } void Core::HousingMgr::requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) @@ -397,5 +397,6 @@ void Core::HousingMgr::updateEstateGreeting( Entity::Player& player, const Commo house->setHouseGreeting( greeting ); + // Greeting updated. player.sendLogMessage( 3381 ); }