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 ); }