From b3d662e2b2649a517a2b4d2bbdc05e7c3425b6d1 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 27 Nov 2018 21:11:02 +1100 Subject: [PATCH 01/10] refactor landpermission -> landstate --- src/common/Common.h | 4 ++-- src/common/Network/PacketDef/Ipcs.h | 2 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 14 +++++++------- src/servers/sapphire_zone/Actor/Player.cpp | 18 +++++++++--------- src/servers/sapphire_zone/Actor/Player.h | 6 +++--- .../DebugCommand/DebugCommandHandler.cpp | 2 +- src/servers/sapphire_zone/Zone/House.cpp | 16 ++++++++++++++-- src/servers/sapphire_zone/Zone/House.h | 6 ++++++ src/servers/sapphire_zone/Zone/HousingMgr.cpp | 8 ++++---- 9 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 5cfd5a63..c64cbfef 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -758,7 +758,7 @@ namespace Core::Common SubTag2 }; - enum LandPermissionSlot + enum LandStateSlot { FreeCompany, Private, @@ -782,7 +782,7 @@ namespace Core::Common int16_t worldId; //06 }; - struct LandPermissionSet + struct LandStateSet { LandIdent landIdent; uint32_t permissionMask; //08 diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a7c3533f..3dbfc1aa 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -193,7 +193,7 @@ namespace Core::Network::Packets HousingEstateGreeting = 0x0227, // updated 4.4 - LandPermissionSlot = 0x0228, // updated 4.4 + LandStateSlot = 0x0228, // updated 4.4 LandPermission = 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 2c25972d..f04e84ff 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1575,24 +1575,24 @@ struct FFXIVIpcPerformNote : FFXIVIpcBasePacket< PerformNote > uint8_t data[32]; }; -struct FFXIVIpcLandPermissionSlot : FFXIVIpcBasePacket< LandPermissionSlot > +struct FFXIVIpcLandStateSlot : FFXIVIpcBasePacket< LandStateSlot > { uint32_t type; uint32_t unknown; - Common::LandPermissionSet permissionSet; + Common::LandStateSet permissionSet; }; struct FFXIVIpcLandPermission : FFXIVIpcBasePacket< LandPermission > { - Common::LandPermissionSet freeCompanyHouse; // 00 + Common::LandStateSet freeCompanyHouse; // 00 uint64_t unkown1; - Common::LandPermissionSet privateHouse; // 24 + Common::LandStateSet privateHouse; // 24 uint64_t unkown2; - Common::LandPermissionSet apartment; // 48 + Common::LandStateSet apartment; // 48 uint64_t unkown3; - Common::LandPermissionSet sharedHouse[2]; //72 + Common::LandStateSet sharedHouse[2]; //72 uint64_t unkown4; - Common::LandPermissionSet unkownHouse; + Common::LandStateSet unkownHouse; uint64_t unkown5; }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 6f2866d6..c75ef7bc 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1587,7 +1587,7 @@ void Core::Entity::Player::sendZonePackets() auto pHousingMgr = g_fw.get< HousingMgr >(); if( Core::LandPtr pLand = pHousingMgr->getLandByOwnerId( getId() ) ) { - setLandPermissions( LandPermissionSlot::Private, 0x00, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + setLandState( LandStateSlot::Private, 0x00, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); } sendLandPermissions(); @@ -1768,7 +1768,7 @@ bool Core::Entity::Player::isOnEnterEventDone() const return m_onEnterEventDone; } -void Core::Entity::Player::setLandPermissions( uint8_t permissionSet, uint32_t permissionMask, +void Core::Entity::Player::setLandState( uint8_t permissionSet, uint32_t permissionMask, int16_t landId, int16_t wardNum, int16_t zoneId ) { m_landPermission[ permissionSet ].landIdent.landId = landId; @@ -1783,11 +1783,11 @@ void Core::Entity::Player::sendLandPermissions() { auto landPermissions = makeZonePacket< FFXIVIpcLandPermission >( getId() ); - landPermissions->data().freeCompanyHouse = m_landPermission[Common::LandPermissionSlot::FreeCompany]; - landPermissions->data().privateHouse = m_landPermission[Common::LandPermissionSlot::Private]; - landPermissions->data().apartment = m_landPermission[Common::LandPermissionSlot::Apartment]; - landPermissions->data().sharedHouse[0] = m_landPermission[Common::LandPermissionSlot::SharedHouse1]; - landPermissions->data().sharedHouse[1] = m_landPermission[Common::LandPermissionSlot::SharedHouse2]; + 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]; memset( &landPermissions->data().unkownHouse, 0xFF, 8 ); memset( &landPermissions->data().unkownHouse.permissionMask, 0, 8 ); landPermissions->data().unkownHouse.permissionMask = 2; @@ -1800,9 +1800,9 @@ void Core::Entity::Player::sendLandPermissions() queuePacket( landPermissions ); } -void Core::Entity::Player::sendLandPermissionSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ) +void Core::Entity::Player::sendLandStateSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ) { - auto landPermissions = makeZonePacket< FFXIVIpcLandPermissionSlot >( getId() ); + auto landPermissions = makeZonePacket< FFXIVIpcLandStateSlot >( getId() ); landPermissions->data().type = slotId; landPermissions->data().permissionSet.landIdent.landId = landId; diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 6462e6ea..3089dc3b 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -763,10 +763,10 @@ namespace Core::Entity // Housing Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// - void setLandPermissions( uint8_t permissionSet, uint32_t permissionMask, int16_t landId, int16_t wardNum, int16_t zoneId ); + void setLandState( uint8_t permissionSet, uint32_t permissionMask, int16_t landId, int16_t wardNum, int16_t zoneId ); void sendLandPermissions(); - void sendLandPermissionSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ); + void sendLandStateSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ); // Player Battle Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1025,7 +1025,7 @@ namespace Core::Entity uint8_t m_searchSelectClass; // class selected to show up in profile // housing info - Common::LandPermissionSet m_landPermission[5]; + Common::LandStateSet m_landPermission[5]; Common::ActiveLand m_activeLand; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index f1962bf4..72ffb6ee 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -1018,7 +1018,7 @@ void Core::DebugCommandHandler::housing( char* data, Entity::Player& player, std auto pHousing = std::dynamic_pointer_cast< HousingZone >( pZone ); if( pHousing ) { - player.setLandPermissions( permissionSet, 0, pHousing->getLandSetId(), pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); + player.setLandState( permissionSet, 0, pHousing->getLandSetId(), pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); player.sendLandPermissions(); } else diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index 333bfec4..ce1f7a87 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -35,6 +35,9 @@ Core::House::House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_ stmt->setUInt( 2, m_houseId ); pDB->execute( stmt ); + + // todo: make this nicer/configurable? + m_houseName = "Estate #" + std::to_string( landId + 1 ); } else { @@ -45,11 +48,10 @@ Core::House::House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_ auto housePartColours = res->getBlobVector( "HousePartColours" ); auto models = reinterpret_cast< uint32_t* >( &housePartModels[ 0 ] ); - auto colours = &housePartColours[ 0 ]; for( auto i = 0; i < 8; i++ ) { - m_houseParts[ i ] = { models[ i ], colours[ i ] }; + m_houseParts[ i ] = { models[ i ], housePartColours[ i ] }; } } } @@ -143,4 +145,14 @@ uint32_t Core::House::getHousePart( Common::HousePartSlot slot ) const Core::House::HousePartsArray const& Core::House::getHouseParts() const { return m_houseParts; +} + +const std::string& Core::House::getHouseName() const +{ + return m_houseName; +} + +const std::string& Core::House::getHouseGreeting() const +{ + return m_estateMessage; } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/House.h b/src/servers/sapphire_zone/Zone/House.h index 17abaaba..ff2c2af7 100644 --- a/src/servers/sapphire_zone/Zone/House.h +++ b/src/servers/sapphire_zone/Zone/House.h @@ -25,6 +25,12 @@ namespace Core uint16_t getTerritoryTypeId() const; uint32_t getHouseId() const; + const std::string& getHouseName() const; + void setHouseName( std::string& name ); + + const std::string& getHouseGreeting() const; + void setHouseGreeting( std::string& greeting ); + //functions void setHousePart( Common::HousePartSlot slot, uint32_t id ); void setHousePartColor( Common::HousePartSlot slot, uint32_t id ); diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 0ff6dd85..540bac56 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -157,10 +157,10 @@ Core::LandPurchaseResult Core::HousingMgr::purchaseLand( Entity::Player& player, pLand->setState( HouseState::sold ); pLand->setLandType( Common::LandType::Private ); - player.setLandPermissions( LandPermissionSlot::Private, 0x00, plot, + player.setLandState( LandStateSlot::Private, 0x00, plot, pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandPermissionSlot( static_cast< uint8_t >( LandType::Private ), plot, pHousing->getWardNum(), + player.sendLandStateSlot( static_cast< uint8_t >( LandType::Private ), plot, pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); //pLand->setLandName( "Private Estate" + std::to_string( pHousing->getWardNum() ) + "-" + std::to_string( plot ) ); @@ -210,9 +210,9 @@ bool Core::HousingMgr::relinquishLand( Entity::Player& player, uint8_t plot ) pLand->setLandType( Common::LandType::none ); pLand->updateLandDb(); - player.setLandPermissions( LandPermissionSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); + player.setLandState( LandStateSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); - player.sendLandPermissionSlot( static_cast< uint8_t >( LandType::Private ), 0xFF, 0xFF, 0xFF ); + player.sendLandStateSlot( static_cast< uint8_t >( LandType::Private ), 0xFF, 0xFF, 0xFF ); auto screenMsgPkt2 = makeActorControl143( player.getId(), ActorControl::LogMsg, 3351, 0x1AA, pLand->getWardNum() + 1, plot + 1 ); From 2e3a98f9de2ff247709a59a314d761a5a87a5c62 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 27 Nov 2018 21:45:29 +1100 Subject: [PATCH 02/10] send greeting, icon and house name when a house has been built --- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 540bac56..f338aaeb 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -9,6 +9,7 @@ #include #include +#include #include "Actor/Player.h" @@ -19,6 +20,7 @@ #include "Land.h" #include "Framework.h" #include "ServerMgr.h" +#include "House.h" using namespace Core::Common; using namespace Core::Network; @@ -97,7 +99,15 @@ void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t wardId landInfoSignPacket->data().landIdent.wardNum = land->getWardNum(); landInfoSignPacket->data().landIdent.worldId = 67; landInfoSignPacket->data().landIdent.territoryTypeId = land->getTerritoryTypeId(); + landInfoSignPacket->data().houseIconAdd = land->getSharing(); landInfoSignPacket->data().ownerId = player.getContentId(); // should be real owner contentId, not player.contentId() + + if( auto house = land->getHouse() ) + { + std::strcpy( landInfoSignPacket->data().estateName, house->getHouseName().c_str() ); + std::strcpy( landInfoSignPacket->data().estateGreeting, house->getHouseGreeting().c_str() ); + } + memcpy( &landInfoSignPacket->data().ownerName, playerName.c_str(), playerName.size() ); player.queuePacket( landInfoSignPacket ); From f83d6ae35b8845cb208ecc8fee1f8bbe700349fe Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 27 Nov 2018 22:18:50 +1100 Subject: [PATCH 03/10] cleanup and unfuck the perms/state bullshit --- src/common/Common.h | 11 +++- src/servers/sapphire_zone/Actor/Player.cpp | 53 ++++++++++--------- src/servers/sapphire_zone/Actor/Player.h | 6 +-- .../DebugCommand/DebugCommandHandler.cpp | 4 +- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 8 +-- 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index c64cbfef..155b00ee 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -774,6 +774,15 @@ namespace Core::Common Private = 2, }; + enum LandEstateFlags : uint32_t + { + ESTATE_BUILT = 0x1, + ESTATE_HAS_AETHERYTE = 0x2, + UNKNOWN_1 = 0x4, + UNKNOWN_2 = 0x8, + UNKNOWN_3 = 0x10, + }; + struct LandIdent { int16_t landId; //00 @@ -785,7 +794,7 @@ namespace Core::Common struct LandStateSet { LandIdent landIdent; - uint32_t permissionMask; //08 + uint32_t estateFlags; //08 uint32_t unkown1; //12 }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index c75ef7bc..20ae1d12 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -95,7 +95,7 @@ Core::Entity::Player::Player() : for ( uint8_t i = 0; i < 5; i++ ) { memset( &m_landPermission[i], 0xFF, 8 ); - memset( &m_landPermission[i].permissionMask, 0, 8 ); + memset( &m_landPermission[i].estateFlags, 0, 8 ); } m_objSpawnIndexAllocator.init( MAX_DISPLAYED_EOBJS ); @@ -1587,10 +1587,20 @@ void Core::Entity::Player::sendZonePackets() auto pHousingMgr = g_fw.get< HousingMgr >(); if( Core::LandPtr pLand = pHousingMgr->getLandByOwnerId( getId() ) ) { - setLandState( LandStateSlot::Private, 0x00, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + uint32_t state = 0; + + if( pLand->getHouse() ) + { + state |= ESTATE_BUILT; + + // todo: remove this, debug for now + state |= ESTATE_HAS_AETHERYTE; + } + + setLandState( LandStateSlot::Private, state, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); } - sendLandPermissions(); + sendLandStates(); auto initZonePacket = makeZonePacket< FFXIVIpcInitZone >( getId() ); initZonePacket->data().zoneId = getCurrentZone()->getTerritoryTypeId(); @@ -1768,47 +1778,38 @@ bool Core::Entity::Player::isOnEnterEventDone() const return m_onEnterEventDone; } -void Core::Entity::Player::setLandState( uint8_t permissionSet, uint32_t permissionMask, +void Core::Entity::Player::setLandState( uint8_t permissionSet, uint32_t estateFlags, 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 ].permissionMask = permissionMask; + m_landPermission[ permissionSet ].estateFlags = estateFlags; m_landPermission[ permissionSet ].unkown1 = 0; } -void Core::Entity::Player::sendLandPermissions() +void Core::Entity::Player::sendLandStates() { auto landPermissions = makeZonePacket< FFXIVIpcLandPermission >( 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]; - memset( &landPermissions->data().unkownHouse, 0xFF, 8 ); - memset( &landPermissions->data().unkownHouse.permissionMask, 0, 8 ); - landPermissions->data().unkownHouse.permissionMask = 2; - landPermissions->data().unkown1 = 0; - landPermissions->data().unkown2 = 0; - landPermissions->data().unkown3 = 0; - landPermissions->data().unkown4 = 0; - landPermissions->data().unkown5 = 0; + 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 ]; queuePacket( landPermissions ); } -void Core::Entity::Player::sendLandStateSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ) +void Core::Entity::Player::sendLandStateSlot( Common::LandStateSlot slot ) { auto landPermissions = makeZonePacket< FFXIVIpcLandStateSlot >( getId() ); - landPermissions->data().type = slotId; - landPermissions->data().permissionSet.landIdent.landId = landId; - landPermissions->data().permissionSet.landIdent.wardNum = wardId; - landPermissions->data().permissionSet.landIdent.territoryTypeId = zoneId; - landPermissions->data().permissionSet.landIdent.worldId = 67; - landPermissions->data().permissionSet.permissionMask = 0; + auto slotId = static_cast< uint8_t >( slot ); + + landPermissions->data().type = slotId; + landPermissions->data().permissionSet = m_landPermission[ slotId ]; + queuePacket( landPermissions ); } \ 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 3089dc3b..2a7d5ea6 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -763,10 +763,10 @@ namespace Core::Entity // Housing Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// - void setLandState( uint8_t permissionSet, uint32_t permissionMask, int16_t landId, int16_t wardNum, int16_t zoneId ); + void setLandState( uint8_t permissionSet, uint32_t estateFlags, int16_t landId, int16_t wardNum, int16_t zoneId ); - void sendLandPermissions(); - void sendLandStateSlot( uint8_t slotId, uint8_t landId, uint8_t wardId, uint16_t zoneId ); + void sendLandStates(); + void sendLandStateSlot( Common::LandStateSlot slot ); // Player Battle Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 72ffb6ee..64723a1f 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -730,7 +730,7 @@ void Core::DebugCommandHandler::script( char* data, Entity::Player& player, std: for( auto it = scripts.begin(); it != scripts.end(); ++it ) { auto script = *it; - player.sendDebug( " - '" + script->library_name + + player.sendDebug( " - '" + script->library_name + ", num scripts: " + std::to_string( script->scripts.size() ) ); } } @@ -1019,7 +1019,7 @@ void Core::DebugCommandHandler::housing( char* data, Entity::Player& player, std if( pHousing ) { player.setLandState( permissionSet, 0, pHousing->getLandSetId(), pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandPermissions(); + player.sendLandStates(); } else player.sendDebug( "You aren't in a housing Zone." ); diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index f338aaeb..2a88f384 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -170,8 +170,7 @@ Core::LandPurchaseResult Core::HousingMgr::purchaseLand( Entity::Player& player, player.setLandState( LandStateSlot::Private, 0x00, plot, pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandStateSlot( static_cast< uint8_t >( LandType::Private ), plot, pHousing->getWardNum(), - pHousing->getTerritoryTypeId() ); + player.sendLandStateSlot( LandStateSlot::Private ); //pLand->setLandName( "Private Estate" + std::to_string( pHousing->getWardNum() ) + "-" + std::to_string( plot ) ); pLand->updateLandDb(); @@ -222,7 +221,7 @@ bool Core::HousingMgr::relinquishLand( Entity::Player& player, uint8_t plot ) player.setLandState( LandStateSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); - player.sendLandStateSlot( static_cast< uint8_t >( LandType::Private ), 0xFF, 0xFF, 0xFF ); + player.sendLandStateSlot( LandStateSlot::Private ); auto screenMsgPkt2 = makeActorControl143( player.getId(), ActorControl::LogMsg, 3351, 0x1AA, pLand->getWardNum() + 1, plot + 1 ); @@ -321,4 +320,7 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu player.playScene( 0x000B0095, 0, 4164955899, 0, 1, plotNum, nullptr ); // todo: send perms/flags for house + + player.setLandState( LandStateSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + player.sendLandStateSlot( LandStateSlot::Private ); } From 945d91b7832faa85d9a54c657dadc7e99d563227 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 27 Nov 2018 23:12:26 +1100 Subject: [PATCH 04/10] change LandState to LandFlags --- src/common/Common.h | 8 ++++---- .../Network/PacketDef/Zone/ServerZoneDef.h | 12 ++++++------ src/servers/sapphire_zone/Actor/Player.cpp | 14 +++++++------- src/servers/sapphire_zone/Actor/Player.h | 8 ++++---- .../DebugCommand/DebugCommandHandler.cpp | 4 ++-- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 18 ++++++++---------- 6 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 155b00ee..17d7055c 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -774,7 +774,7 @@ namespace Core::Common Private = 2, }; - enum LandEstateFlags : uint32_t + enum LandFlags : uint32_t { ESTATE_BUILT = 0x1, ESTATE_HAS_AETHERYTE = 0x2, @@ -791,10 +791,10 @@ namespace Core::Common int16_t worldId; //06 }; - struct LandStateSet + struct LandFlagSet { LandIdent landIdent; - uint32_t estateFlags; //08 + uint32_t landFlags; //08 uint32_t unkown1; //12 }; @@ -843,7 +843,7 @@ namespace Core::Common Venue = 11, }; - enum WardEstateFlags : uint8_t + enum WardlandFlags : uint8_t { IsEstateOwned = 1, IsPublicEstate = 2, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index f04e84ff..b5a6ebf8 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1579,20 +1579,20 @@ struct FFXIVIpcLandStateSlot : FFXIVIpcBasePacket< LandStateSlot > { uint32_t type; uint32_t unknown; - Common::LandStateSet permissionSet; + Common::LandFlagSet permissionSet; }; struct FFXIVIpcLandPermission : FFXIVIpcBasePacket< LandPermission > { - Common::LandStateSet freeCompanyHouse; // 00 + Common::LandFlagSet freeCompanyHouse; // 00 uint64_t unkown1; - Common::LandStateSet privateHouse; // 24 + Common::LandFlagSet privateHouse; // 24 uint64_t unkown2; - Common::LandStateSet apartment; // 48 + Common::LandFlagSet apartment; // 48 uint64_t unkown3; - Common::LandStateSet sharedHouse[2]; //72 + Common::LandFlagSet sharedHouse[2]; //72 uint64_t unkown4; - Common::LandStateSet unkownHouse; + Common::LandFlagSet unkownHouse; uint64_t unkown5; }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 20ae1d12..95b5d1af 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -95,7 +95,7 @@ Core::Entity::Player::Player() : for ( uint8_t i = 0; i < 5; i++ ) { memset( &m_landPermission[i], 0xFF, 8 ); - memset( &m_landPermission[i].estateFlags, 0, 8 ); + memset( &m_landPermission[i].landFlags, 0, 8 ); } m_objSpawnIndexAllocator.init( MAX_DISPLAYED_EOBJS ); @@ -1597,10 +1597,10 @@ void Core::Entity::Player::sendZonePackets() state |= ESTATE_HAS_AETHERYTE; } - setLandState( LandStateSlot::Private, state, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + setLandFlags( LandStateSlot::Private, state, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); } - sendLandStates(); + sendLandFlags(); auto initZonePacket = makeZonePacket< FFXIVIpcInitZone >( getId() ); initZonePacket->data().zoneId = getCurrentZone()->getTerritoryTypeId(); @@ -1778,18 +1778,18 @@ bool Core::Entity::Player::isOnEnterEventDone() const return m_onEnterEventDone; } -void Core::Entity::Player::setLandState( uint8_t permissionSet, uint32_t estateFlags, +void Core::Entity::Player::setLandFlags( uint8_t permissionSet, 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 ].estateFlags = estateFlags; + m_landPermission[ permissionSet ].landFlags = landFlags; m_landPermission[ permissionSet ].unkown1 = 0; } -void Core::Entity::Player::sendLandStates() +void Core::Entity::Player::sendLandFlags() { auto landPermissions = makeZonePacket< FFXIVIpcLandPermission >( getId() ); @@ -1802,7 +1802,7 @@ void Core::Entity::Player::sendLandStates() queuePacket( landPermissions ); } -void Core::Entity::Player::sendLandStateSlot( Common::LandStateSlot slot ) +void Core::Entity::Player::sendLandFlagsSlot( Common::LandStateSlot slot ) { auto landPermissions = makeZonePacket< FFXIVIpcLandStateSlot >( getId() ); diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 2a7d5ea6..3ca345d2 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -763,10 +763,10 @@ namespace Core::Entity // Housing Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// - void setLandState( uint8_t permissionSet, uint32_t estateFlags, int16_t landId, int16_t wardNum, int16_t zoneId ); + void setLandFlags( uint8_t permissionSet, uint32_t landFlags, int16_t landId, int16_t wardNum, int16_t zoneId ); - void sendLandStates(); - void sendLandStateSlot( Common::LandStateSlot slot ); + void sendLandFlags(); + void sendLandFlagsSlot( Common::LandStateSlot slot ); // Player Battle Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1025,7 +1025,7 @@ namespace Core::Entity uint8_t m_searchSelectClass; // class selected to show up in profile // housing info - Common::LandStateSet m_landPermission[5]; + Common::LandFlagSet m_landPermission[5]; Common::ActiveLand m_activeLand; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 64723a1f..86da3c95 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -1018,8 +1018,8 @@ void Core::DebugCommandHandler::housing( char* data, Entity::Player& player, std auto pHousing = std::dynamic_pointer_cast< HousingZone >( pZone ); if( pHousing ) { - player.setLandState( permissionSet, 0, pHousing->getLandSetId(), pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandStates(); + player.setLandFlags( permissionSet, 0, pHousing->getLandSetId(), pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); + player.sendLandFlags(); } else player.sendDebug( "You aren't in a housing Zone." ); diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 2a88f384..2d2a25fd 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.setLandState( LandStateSlot::Private, 0x00, plot, + player.setLandFlags( LandStateSlot::Private, 0x00, plot, pHousing->getWardNum(), pHousing->getTerritoryTypeId() ); - player.sendLandStateSlot( LandStateSlot::Private ); + player.sendLandFlagsSlot( LandStateSlot::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.setLandState( LandStateSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); + player.setLandFlags( LandStateSlot::Private, 0x00, 0xFF, 0xFF, 0xFF ); - player.sendLandStateSlot( LandStateSlot::Private ); + player.sendLandFlagsSlot( LandStateSlot::Private ); auto screenMsgPkt2 = makeActorControl143( player.getId(), ActorControl::LogMsg, 3351, 0x1AA, pLand->getWardNum() + 1, plot + 1 ); @@ -260,14 +260,14 @@ void Core::HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, switch( land->getLandType() ) { case LandType::FreeCompany: - entry.infoFlags = Common::WardEstateFlags::IsEstateOwned | Common::WardEstateFlags::IsFreeCompanyEstate; + entry.infoFlags = Common::WardlandFlags::IsEstateOwned | Common::WardlandFlags::IsFreeCompanyEstate; // todo: send FC name break; case LandType::Private: - entry.infoFlags = Common::WardEstateFlags::IsEstateOwned; + entry.infoFlags = Common::WardlandFlags::IsEstateOwned; auto owner = land->getPlayerOwner(); std::string playerName = g_fw.get< Core::ServerMgr >()->getPlayerNameFromDb( owner ); @@ -319,8 +319,6 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu // todo: wtf are these flags player.playScene( 0x000B0095, 0, 4164955899, 0, 1, plotNum, nullptr ); - // todo: send perms/flags for house - - player.setLandState( LandStateSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); - player.sendLandStateSlot( LandStateSlot::Private ); + player.setLandFlags( LandStateSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); + player.sendLandFlagsSlot( LandStateSlot::Private ); } From 614439836cb285a7b0f7e271a6b44f63159a4cc9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 00:05:57 +1100 Subject: [PATCH 05/10] house renaming works :tada: --- src/common/Network/PacketDef/Ipcs.h | 2 ++ .../Network/PacketDef/Zone/ClientZoneDef.h | 2 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 9 ++++++++- .../Network/Handlers/ClientTriggerHandler.cpp | 19 ++++++++++++------- .../Network/Handlers/PacketHandlers.cpp | 17 +++++++++++++++-- src/servers/sapphire_zone/Zone/House.cpp | 14 ++++++++++++++ src/servers/sapphire_zone/Zone/House.h | 4 ++-- 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 3dbfc1aa..a8ee1df1 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -204,6 +204,8 @@ namespace Core::Network::Packets SharedEstateSettingsResponse = 0x023C, // updated 4.4 + LandUpdateHouseName = 0x024D, // updated 4.4 + LandSetMap = 0x0251, // updated 4.4 ////////////////////////////////////////////////// diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 88e6134e..3e2ac51b 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -203,7 +203,7 @@ struct FFXIVIpcRenameLandHandler : /* 0002 */ uint16_t wardNum; /* 0004 */ uint16_t zoneId; /* 0006 */ uint16_t worldId; - /* 0008 */ char landName[20]; + /* 0008 */ char houseName[20]; /* 0028 */ uint32_t padding; }; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index b5a6ebf8..c7c80203 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1640,10 +1640,17 @@ struct FFXIVIpcLandInfoSign : FFXIVIpcBasePacket< LandInfoSign > struct FFXIVIpcLandRename : FFXIVIpcBasePacket< LandRename > { Common::LandIdent landIdent; - char landName[20]; + char houseName[20]; uint32_t padding; }; +struct FFXIVIpcLandUpdateHouseName : FFXIVIpcBasePacket< LandUpdateHouseName > +{ + uint32_t unknown[3]; + char houseName[20]; + uint32_t unknown2[2]; +}; + struct FFXIVIpcLandSetMap : FFXIVIpcBasePacket< LandSetMap > { uint8_t u1; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 137e8424..45d6c568 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -13,6 +13,7 @@ #include "Zone/HousingZone.h" #include "Zone/HousingMgr.h" #include "Zone/Land.h" +#include "Zone/House.h" #include "Network/GameConnection.h" @@ -365,7 +366,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR case ClientTriggerType::RequestEstateRename: { // removed temporarly, there is no such thing as a LandName -/* auto landRenamePacket = makeZonePacket< Server::FFXIVIpcLandRename >( player.getId() ); + auto landRenamePacket = makeZonePacket< Server::FFXIVIpcLandRename >( player.getId() ); uint8_t ward = ( param12 & 0xFF00 ) >> 8; uint8_t plot = ( param12 & 0xFF ); @@ -382,13 +383,17 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR land = pHousingMgr->getLandByOwnerId( player.getId() ); } - landRenamePacket->data().landId = land->getLandId(); - landRenamePacket->data().wardNum = land->getWardNum(); - landRenamePacket->data().worldId = 67; - landRenamePacket->data().zoneId = land->getZoneId(); - memcpy( &landRenamePacket->data().landName, land->getLandName().c_str(), 20 ); + auto house = land->getHouse(); + if( !house ) + break; - player.queuePacket( landRenamePacket ); */ + landRenamePacket->data().landIdent.landId = land->getLandId(); + landRenamePacket->data().landIdent.wardNum = land->getWardNum(); + landRenamePacket->data().landIdent.worldId = 67; + landRenamePacket->data().landIdent.territoryTypeId = land->getTerritoryTypeId(); + memcpy( &landRenamePacket->data().houseName, house->getHouseName().c_str(), 20 ); + + player.queuePacket( landRenamePacket ); break; } diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 821b9b3d..16a7d5f0 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -20,6 +20,7 @@ #include "Zone/HousingMgr.h" #include "Zone/Land.h" #include "Zone/ZonePosition.h" +#include "Zone/House.h" #include "Network/PacketWrappers/InitUIPacket.h" #include "Network/PacketWrappers/PingPacket.h" @@ -664,8 +665,20 @@ void Core::Network::GameConnection::landRenameHandler( const Core::Network::Pack if( !pLand ) return; - // TODO set estate name - //pLand->setLandName( packet.data().landName ); + // todo: check perms for fc houses and shit + if( pLand->getPlayerOwner() != player.getId() ) + return; + + auto pHouse = pLand->getHouse(); + if( pHouse ) + pHouse->setHouseName( packet.data().houseName ); + + // todo: this packet is weird, retail sends it with some unknown shit at the start but it doesn't seem to do anything + auto nameUpdatePacket = makeZonePacket< Server::FFXIVIpcLandUpdateHouseName >( player.getId() ); + memcpy( &nameUpdatePacket->data().houseName, &packet.data().houseName, sizeof( packet.data().houseName ) ); + + // todo: who does this get sent to? just the person who renamed it? + player.queuePacket( nameUpdatePacket ); } void Core::Network::GameConnection::buildPresetHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index ce1f7a87..498a0781 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -155,4 +155,18 @@ const std::string& Core::House::getHouseName() const const std::string& Core::House::getHouseGreeting() const { return m_estateMessage; +} + +void Core::House::setHouseGreeting( const std::string& greeting ) +{ + m_estateMessage = greeting; + + updateHouseDb(); +} + +void Core::House::setHouseName( const std::string& name ) +{ + m_houseName = name; + + updateHouseDb(); } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/House.h b/src/servers/sapphire_zone/Zone/House.h index ff2c2af7..ec2d3df4 100644 --- a/src/servers/sapphire_zone/Zone/House.h +++ b/src/servers/sapphire_zone/Zone/House.h @@ -26,10 +26,10 @@ namespace Core uint32_t getHouseId() const; const std::string& getHouseName() const; - void setHouseName( std::string& name ); + void setHouseName( const std::string& name ); const std::string& getHouseGreeting() const; - void setHouseGreeting( std::string& greeting ); + void setHouseGreeting( const std::string& greeting ); //functions void setHousePart( Common::HousePartSlot slot, uint32_t id ); From 855d760382214b3e9a3a9dc02102cb34ec8342c7 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 00:36:45 +1100 Subject: [PATCH 06/10] correctly show edit estate name/greeting windows --- src/common/Network/PacketDef/Ipcs.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 5 +- .../Network/Handlers/ClientTriggerHandler.cpp | 60 +++++++++++++++---- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a8ee1df1..518d1c91 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -304,6 +304,7 @@ namespace Core::Network::Packets LinkshellEventHandler1 = 0x1151, // updated 4.1 ?? LandRenameHandler = 0x0171, // updated 4.4 + LandChangeEstateMessageHandler = 0x0172, // updated 4.4 SetSharedEstateSettings = 0x0177, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index c7c80203..1f603d61 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1730,10 +1730,7 @@ struct FFXIVIpcHousingWardInfo : FFXIVIpcBasePacket< HousingWardInfo > struct FFXIVIpcHousingEstateGreeting : FFXIVIpcBasePacket< HousingEstateGreeting > { - uint8_t plotId; - uint8_t pad[3]; // unsure - uint16_t territoryTypeId; - uint16_t unk; + Common::LandIdent landIdent; char message[200]; }; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 45d6c568..b81133ba 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -365,28 +365,30 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR } case ClientTriggerType::RequestEstateRename: { - // removed temporarly, there is no such thing as a LandName - auto landRenamePacket = makeZonePacket< Server::FFXIVIpcLandRename >( player.getId() ); + uint16_t territoryTypeId = param11 & 0xFFFF; + uint16_t worldId = param11 >> 16; uint8_t ward = ( param12 & 0xFF00 ) >> 8; uint8_t plot = ( param12 & 0xFF ); - auto zone = player.getCurrentZone(); + auto pHousingMgr = g_fw.get< HousingMgr >(); + if( !pHousingMgr ) + break; - auto hZone = std::dynamic_pointer_cast< HousingZone >( zone ); + auto landSetId = pHousingMgr->toLandSetId( territoryTypeId, ward ); + auto hZone = pHousingMgr->getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + break; auto land = hZone->getLand( plot ); - if( !land ) - { - auto pHousingMgr = g_fw.get< HousingMgr >(); - land = pHousingMgr->getLandByOwnerId( player.getId() ); - } - auto house = land->getHouse(); if( !house ) break; + auto landRenamePacket = makeZonePacket< Server::FFXIVIpcLandRename >( player.getId() ); + landRenamePacket->data().landIdent.landId = land->getLandId(); landRenamePacket->data().landIdent.wardNum = land->getWardNum(); landRenamePacket->data().landIdent.worldId = 67; @@ -397,6 +399,44 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR break; } + case ClientTriggerType::RequestEstateEditGreeting: + { + uint16_t territoryTypeId = param11 & 0xFFFF; + uint16_t worldId = param11 >> 16; + + uint8_t ward = ( param12 & 0xFF00 ) >> 8; + uint8_t plot = ( param12 & 0xFF ); + + auto pHousingMgr = g_fw.get< HousingMgr >(); + if( !pHousingMgr ) + break; + + auto landSetId = pHousingMgr->toLandSetId( territoryTypeId, ward ); + auto hZone = pHousingMgr->getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + break; + + auto land = hZone->getLand( plot ); + if( !land ) + break; + + auto house = land->getHouse(); + if( !house ) + break; + + 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(); + memcpy( &estateGreetingPacket->data().message, house->getHouseGreeting().c_str(), sizeof( estateGreetingPacket->data().message ) ); + + player.queuePacket( estateGreetingPacket ); + + break; + } case ClientTriggerType::RequestHousingItemUI: { uint8_t ward = ( param12 & 0xFF00 ) >> 8; From ebee5e854ab14c34559a0c19272e6b6c9346bf29 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 21:24:00 +1100 Subject: [PATCH 07/10] move more housing logic from client trigger handler to housingmgr --- .../Network/Handlers/ClientTriggerHandler.cpp | 49 +---------------- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 52 +++++++++++++++++++ src/servers/sapphire_zone/Zone/HousingMgr.h | 3 ++ 3 files changed, 57 insertions(+), 47 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index b81133ba..d855cd98 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -10,10 +10,7 @@ #include "Zone/Zone.h" #include "Zone/ZonePosition.h" -#include "Zone/HousingZone.h" #include "Zone/HousingMgr.h" -#include "Zone/Land.h" -#include "Zone/House.h" #include "Network/GameConnection.h" @@ -375,27 +372,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR if( !pHousingMgr ) break; - auto landSetId = pHousingMgr->toLandSetId( territoryTypeId, ward ); - auto hZone = pHousingMgr->getHousingZoneByLandSetId( landSetId ); - - if( !hZone ) - break; - - auto land = hZone->getLand( plot ); - - auto house = land->getHouse(); - if( !house ) - break; - - 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(); - memcpy( &landRenamePacket->data().houseName, house->getHouseName().c_str(), 20 ); - - player.queuePacket( landRenamePacket ); + pHousingMgr->requestEstateRename( player, territoryTypeId, worldId, ward, plot ); break; } @@ -411,29 +388,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR if( !pHousingMgr ) break; - auto landSetId = pHousingMgr->toLandSetId( territoryTypeId, ward ); - auto hZone = pHousingMgr->getHousingZoneByLandSetId( landSetId ); - - if( !hZone ) - break; - - auto land = hZone->getLand( plot ); - if( !land ) - break; - - auto house = land->getHouse(); - if( !house ) - break; - - 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(); - memcpy( &estateGreetingPacket->data().message, house->getHouseGreeting().c_str(), sizeof( estateGreetingPacket->data().message ) ); - - player.queuePacket( estateGreetingPacket ); + pHousingMgr->requestEstateEditGreeting( player, territoryTypeId, worldId, ward, plot ); break; } diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 2d2a25fd..bc073f34 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -322,3 +322,55 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu player.setLandFlags( LandStateSlot::Private, ESTATE_BUILT, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); player.sendLandFlagsSlot( LandStateSlot::Private ); } + +void Core::HousingMgr::requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +{ + auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto hZone = getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + return; + + auto land = hZone->getLand( plotId ); + + auto house = land->getHouse(); + if( !house ) + return; + + 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(); + memcpy( &landRenamePacket->data().houseName, house->getHouseName().c_str(), 20 ); + + player.queuePacket( landRenamePacket ); +} + +void Core::HousingMgr::requestEstateEditGreeting( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +{ + auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto hZone = getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + return; + + auto land = hZone->getLand( plotId ); + if( !land ) + return; + + auto house = land->getHouse(); + if( !house ) + return; + + 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(); + memcpy( &estateGreetingPacket->data().message, house->getHouseGreeting().c_str(), sizeof( estateGreetingPacket->data().message ) ); + + player.queuePacket( estateGreetingPacket ); +} diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.h b/src/servers/sapphire_zone/Zone/HousingMgr.h index cacaa9c1..a60fc672 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.h +++ b/src/servers/sapphire_zone/Zone/HousingMgr.h @@ -36,6 +36,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 ); + private: }; From a271ee6d46dc877327da344fe3ccdeab5f797ccf Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 21:59:28 +1100 Subject: [PATCH 08/10] 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: From 392b098a02b1fd9b4cb17fca61aada37883fc41b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 28 Nov 2018 23:29:55 +1100 Subject: [PATCH 09/10] 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 ); } From 84d7159e47f5ccb0ace65acc5a3041e3743e2786 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 29 Nov 2018 00:19:37 +1100 Subject: [PATCH 10/10] add estate guest access menu --- src/common/Network/PacketDef/Ipcs.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 7 +++++ .../Network/Handlers/ClientTriggerHandler.cpp | 16 ++++++++++++ src/servers/sapphire_zone/Zone/HousingMgr.cpp | 26 +++++++++++++++++++ src/servers/sapphire_zone/Zone/HousingMgr.h | 2 ++ 5 files changed, 52 insertions(+) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a50a5c3e..74b997d1 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -195,6 +195,7 @@ namespace Core::Network::Packets HousingUpdateLandFlagsSlot = 0x0228, // updated 4.4 HousingLandFlags = 0x0229, // updated 4.4 + HousingShowEstateGuestAccess = 0x022A, // 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 b6cc582f..215a14d0 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1734,6 +1734,13 @@ struct FFXIVIpcHousingEstateGreeting : FFXIVIpcBasePacket< HousingEstateGreeting char message[200]; }; +struct FFXIVIpcHousingShowEstateGuestAccess : + FFXIVIpcBasePacket< HousingShowEstateGuestAccess > +{ + uint32_t unknown[2]; + Common::LandIdent ident; +}; + /** * Structural representation of the packet sent by the server * to show the current shared estate settings diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index d855cd98..444a01dc 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -392,6 +392,22 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR break; } + case ClientTriggerType::RequestEstateEditGuestAccessSettings: + { + uint16_t territoryTypeId = param11 & 0xFFFF; + uint16_t worldId = param11 >> 16; + + uint8_t ward = ( param12 & 0xFF00 ) >> 8; + uint8_t plot = ( param12 & 0xFF ); + + auto pHousingMgr = g_fw.get< HousingMgr >(); + if( !pHousingMgr ) + break; + + pHousingMgr->requestEstateEditGuestAccess( player, territoryTypeId, worldId, ward, plot ); + + break; + } case ClientTriggerType::RequestHousingItemUI: { uint8_t ward = ( param12 & 0xFF00 ) >> 8; diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 898a4845..09476248 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -400,3 +400,29 @@ void Core::HousingMgr::updateEstateGreeting( Entity::Player& player, const Commo // Greeting updated. player.sendLogMessage( 3381 ); } + +void Core::HousingMgr::requestEstateEditGuestAccess( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) +{ + auto landSetId = toLandSetId( territoryTypeId, wardId ); + auto hZone = getHousingZoneByLandSetId( landSetId ); + + if( !hZone ) + return; + + auto land = hZone->getLand( plotId ); + if( !land ) + return; + + // todo: add proper permission check + if( land->getPlayerOwner() != player.getId() ) + 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; + + player.queuePacket( packet ); +} diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.h b/src/servers/sapphire_zone/Zone/HousingMgr.h index fa117cf4..bd3c39db 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.h +++ b/src/servers/sapphire_zone/Zone/HousingMgr.h @@ -41,6 +41,8 @@ namespace Core 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 requestEstateEditGuestAccess( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ); + private: };