From 7b7ab34eb95c89bc3c8e0584e9f499c668b51e89 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Nov 2018 23:47:10 +0100 Subject: [PATCH] Houseing data initializing and signs --- src/common/Exd/ExdDataGenerated.cpp | 11 ++++ src/common/Exd/ExdDataGenerated.h | 18 +++++++ src/common/Network/CommonActorControl.h | 1 + src/common/Network/PacketDef/Ipcs.h | 3 +- .../Network/Handlers/ClientTriggerHandler.cpp | 23 ++++++++ .../sapphire_zone/Zone/HousingZone.cpp | 52 ++++++++++++++----- src/servers/sapphire_zone/Zone/HousingZone.h | 11 ++-- src/servers/sapphire_zone/Zone/Land.cpp | 47 ++++++++++++----- src/servers/sapphire_zone/Zone/Land.h | 13 +++-- .../sapphire_zone/Zone/TerritoryMgr.cpp | 2 +- 10 files changed, 146 insertions(+), 35 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 70c0374f..5359bbc7 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -2740,6 +2740,16 @@ Core::Data::HousingFurniture::HousingFurniture( uint32_t row_id, Core::Data::Exd tooltip = exdData->getField< bool >( row, 9 ); } +Core::Data::HousingLandSet::HousingLandSet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingLandSetDat.get_row( row_id ); + for ( int i = 0; i < 60; i++ ) + sizes.push_back( exdData->getField< uint8_t >( row, i ) ); + for ( int i = 300; i < 300 + 60; i++ ) + prices.push_back( exdData->getField< uint32_t >( row, i ) ); + +} + Core::Data::HousingPlacement::HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HousingPlacementDat.get_row( row_id ); @@ -5525,6 +5535,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_HousingEmploymentNpcListDat = setupDatAccess( "HousingEmploymentNpcList", xiv::exd::Language::none ); m_HousingEmploymentNpcRaceDat = setupDatAccess( "HousingEmploymentNpcRace", xiv::exd::Language::en ); m_HousingFurnitureDat = setupDatAccess( "HousingFurniture", xiv::exd::Language::none ); + m_HousingLandSetDat = setupDatAccess( "HousingLandSet", xiv::exd::Language::none ); m_HousingPlacementDat = setupDatAccess( "HousingPlacement", xiv::exd::Language::en ); m_HousingPresetDat = setupDatAccess( "HousingPreset", xiv::exd::Language::en ); m_HousingYardObjectDat = setupDatAccess( "HousingYardObject", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index ea74b624..d77e606e 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -256,6 +256,7 @@ struct HousingAethernet; struct HousingEmploymentNpcList; struct HousingEmploymentNpcRace; struct HousingFurniture; +struct HousingLandSet; struct HousingPlacement; struct HousingPreset; struct HousingYardObject; @@ -2849,6 +2850,14 @@ struct HousingPlacement HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct HousingLandSet +{ + std::vector< uint8_t > sizes; + std::vector< uint32_t > prices; + + HousingLandSet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct HousingPreset { std::string singular; @@ -5054,6 +5063,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_HousingEmploymentNpcListDat; xiv::exd::Exd m_HousingEmploymentNpcRaceDat; xiv::exd::Exd m_HousingFurnitureDat; + xiv::exd::Exd m_HousingLandSetDat; xiv::exd::Exd m_HousingPlacementDat; xiv::exd::Exd m_HousingPresetDat; xiv::exd::Exd m_HousingYardObjectDat; @@ -5484,6 +5494,7 @@ struct ZoneSharedGroup using HousingEmploymentNpcListPtr = std::shared_ptr< HousingEmploymentNpcList >; using HousingEmploymentNpcRacePtr = std::shared_ptr< HousingEmploymentNpcRace >; using HousingFurniturePtr = std::shared_ptr< HousingFurniture >; + using HousingLandSetPtr = std::shared_ptr< HousingLandSet >; using HousingPlacementPtr = std::shared_ptr< HousingPlacement >; using HousingPresetPtr = std::shared_ptr< HousingPreset >; using HousingYardObjectPtr = std::shared_ptr< HousingYardObject >; @@ -5929,6 +5940,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_HousingEmploymentNpcListIdList; std::set< uint32_t > m_HousingEmploymentNpcRaceIdList; std::set< uint32_t > m_HousingFurnitureIdList; + std::set< uint32_t > m_HousingLandSetIdList; std::set< uint32_t > m_HousingPlacementIdList; std::set< uint32_t > m_HousingPresetIdList; std::set< uint32_t > m_HousingYardObjectIdList; @@ -7549,6 +7561,12 @@ const std::set< uint32_t >& getHousingFurnitureIdList() loadIdList( m_HousingFurnitureDat, m_HousingFurnitureIdList ); return m_HousingFurnitureIdList; } +const std::set< uint32_t >& getHousingLandSetIdList() +{ + if( m_HousingLandSetIdList.size() == 0 ) + loadIdList( m_HousingLandSetDat, m_HousingLandSetIdList ); + return m_HousingLandSetIdList; +} const std::set< uint32_t >& getHousingPlacementIdList() { if( m_HousingPlacementIdList.size() == 0 ) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 23a7422a..0d510483 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -286,6 +286,7 @@ enum ClientTriggerType AchievementCritReq = 0x3E8, AchievementList = 0x3E9, + RequestHousingSign = 0x451, RequestSharedEstateSettings = 0x46F, CompanionAction = 0x6A4, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a26c02a3..e909b248 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -188,7 +188,8 @@ namespace Core::Network::Packets LandSetInitialize = 0x0220, // updated 4.4 LandUpdate = 0x0221, // updated 4.4 YardObjectSpawn = 0x0222, // updated 4.4 - LandPriceUpdate = 0x0225, // updated 4.3 + + LandPriceUpdate = 0x0224, // updated 4.3 LandPermission = 0x0229, // updated 4.4 LandSetYardInitialize = 0x022C, // updated 4.4 YardObjectMove = 0x0230, // updated 4.4 diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 4137c521..dfffc85c 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -10,6 +10,8 @@ #include "Zone/Zone.h" #include "Zone/ZonePosition.h" +#include "Zone/HousingZone.h" +#include "Zone/Land.h" #include "Network/GameConnection.h" @@ -307,7 +309,28 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.removeQuest( static_cast< uint16_t >( param1 ) ); break; } + case ClientTriggerType::RequestHousingSign: + { + auto plotPricePacket = makeZonePacket< Server::FFXIVIpcLandPriceUpdate >( player.getId() ); + uint8_t ward = ( param12 & 0xFF00 ) >> 8; + uint8_t plot = ( param12 & 0xFF ); + pLog->debug( " Ward: " + std::to_string( ward ) + " Plot: " + std::to_string( plot ) ); + + auto zone = player.getCurrentZone(); + + auto hZone = std::dynamic_pointer_cast< HousingZone >( zone ); + + if( !hZone ) + return; + + auto land = hZone->getLand( plot ); + plotPricePacket->data().price = land->getCurrentPrice(); + + player.queuePacket( plotPricePacket ); + + break; + } default: { diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index fb2d5705..cad00db9 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -3,7 +3,7 @@ #include #include #include - +#include #include #include @@ -21,24 +21,46 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -Core::HousingZone::HousingZone( uint8_t landSetId, +Core::HousingZone::HousingZone( uint8_t wardNum, uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& contentName ) : Zone( territoryId, guId, internalName, contentName ), - m_landSetId( landSetId ), - m_zoneId( territoryId ) + m_wardNum( wardNum ), + m_zoneId( territoryId ), + m_landSetId( ( static_cast< uint32_t >( territoryId ) << 16 ) | wardNum ) { } bool Core::HousingZone::init() { + + auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto res = pDb->query( "SELECT * FROM landset WHERE landsetid = " + std::to_string( m_landSetId ) ); + if( !res->next() ) + { + pDb->directExecute( "INSERT INTO landset ( landsetid ) VALUES ( " + std::to_string( m_landSetId ) + " );" ); + } + + int housingIndex; + if( m_zoneId == 339 ) + housingIndex = 0; + else if( m_zoneId == 340 ) + housingIndex = 1; + else if( m_zoneId == 341 ) + housingIndex = 2; + else if( m_zoneId == 641 ) + housingIndex = 3; + + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto info = pExdData->get< Core::Data::HousingLandSet >( housingIndex ); + uint32_t landId; for( landId = 0; landId < 60; landId++ ) { - auto pObject = make_Land( m_territoryId, getLandSetId(), landId ); + auto pObject = make_Land( m_territoryId, getWardNum(), landId, m_landSetId, info ); pObject->setHouseSize( 1 ); m_landPtrMap[ landId ] = pObject; } @@ -51,7 +73,7 @@ Core::HousingZone::~HousingZone() } -void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) +void Core::HousingZone::onPlayerZoneIn( Entity::Player& player ) { auto pLog = g_fw.get< Logger >(); pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string( getGuId() ) + "|" @@ -60,7 +82,7 @@ void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) uint32_t yardPacketNum; uint32_t yardPacketTotal = 8; - sendMap( player ); + sendLandSet( player ); for( yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ ) { @@ -78,7 +100,7 @@ void Core::HousingZone::onPlayerZoneIn(Entity::Player& player) } -void Core::HousingZone::sendMap( Entity::Player& player ) +void Core::HousingZone::sendLandSet( Entity::Player& player ) { auto landsetInitializePacket = makeZonePacket< FFXIVIpcLandSetInitialize >( player.getId() ); @@ -89,11 +111,10 @@ void Core::HousingZone::sendMap( Entity::Player& player ) landsetInitializePacket->data().subInstance = isPlayerSubInstance( player ) == false ? 1 : 2; uint8_t startIndex = isPlayerSubInstance( player ) == false ? 0 : 30; - uint8_t count = 0; - for( uint8_t i = startIndex; i < ( startIndex + 30 ); i++ ) + + for( uint8_t i = startIndex, count = 0; i < ( startIndex + 30 ); i++ ) { - memcpy( &landsetInitializePacket->data().land[ count ], &getLand( i )->getLand(), sizeof( Common::LandStruct ) ); - count++; + memcpy( &landsetInitializePacket->data().land[ count++ ], &getLand( i )->getLand(), sizeof( Common::LandStruct ) ); } player.queuePacket( landsetInitializePacket ); @@ -112,7 +133,12 @@ void Core::HousingZone::onUpdate( uint32_t currTime ) } } -uint8_t Core::HousingZone::getLandSetId() const +uint8_t Core::HousingZone::getWardNum() const +{ + return m_wardNum; +} + +uint32_t Core::HousingZone::getLandSetId() const { return m_landSetId; } diff --git a/src/servers/sapphire_zone/Zone/HousingZone.h b/src/servers/sapphire_zone/Zone/HousingZone.h index a3b94d81..9974a906 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.h +++ b/src/servers/sapphire_zone/Zone/HousingZone.h @@ -22,18 +22,21 @@ namespace Core void onPlayerZoneIn( Entity::Player& player ) override; void onUpdate( uint32_t currTime ) override; - void sendMap( Entity::Player& player ); + void sendLandSet( Entity::Player& player ); bool isPlayerSubInstance( Entity::Player& player ); /* returns current ward number for this zone */ - uint8_t getLandSetId() const; + uint8_t getWardNum() const; + + uint32_t getLandSetId() const; Core::LandPtr getLand( uint8_t id ); - const uint32_t m_wardMaxNum = 18; private: using LandPtrMap = std::unordered_map< uint8_t, Core::LandPtr >; + const uint32_t m_landSetMax = 18; LandPtrMap m_landPtrMap; - uint8_t m_landSetId; + uint8_t m_wardNum; + uint32_t m_landSetId; uint32_t m_zoneId; }; diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index ce913113..d9575b31 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -25,14 +25,16 @@ extern Core::Framework g_fw; using namespace Core::Common; -Core::Land::Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId ) : +Core::Land::Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId, uint32_t landSetId, + Core::Data::HousingLandSetPtr info ) : m_zoneId( zoneId ), m_wardNum( wardNum ), m_landId( landId ), m_currentPrice( 0 ), - m_nextDrop( 0 ) + m_nextDrop( 0 ), + m_landSetId( landSetId ), + m_landInfo( info ) { - m_landKey = ( m_zoneId << 16 ) | ( m_wardNum << 8 ) | m_landId; memset( &m_land, 0x00, sizeof( LandStruct ) ); load(); } @@ -44,8 +46,31 @@ Core::Land::~Land() void Core::Land::load() { - m_land.houseSize = 1; + m_land.houseState = HouseState::forSale; + + auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto res = pDb->query( "SELECT * FROM land WHERE landsetid = " + std::to_string( m_landSetId ) + " " + "AND landid = " + std::to_string( m_landId ) ); + if( !res->next() ) + { + + + pDb->directExecute( "INSERT INTO land ( landsetid, landid, size, status, landprice ) " + "VALUES ( " + std::to_string( m_landSetId ) + "," + std::to_string( m_landId ) + "," + + std::to_string( m_landInfo->sizes[ m_landId ] ) + "," + + " 1, " + std::to_string( m_landInfo->prices[ m_landId ] ) + " );" ); + + m_currentPrice = m_landInfo->prices[ m_landId ]; + m_land.houseSize = m_landInfo->sizes[ m_landId ]; + } + else + { + m_land.houseSize = res->getUInt( "size" ); + m_land.houseState = res->getUInt( "status" ); + m_currentPrice = res->getUInt( "LandPrice" );; + } + init(); // setPreset( 262145 ); /* auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); auto res = pDb->query( "SELECT * FROM land WHERE Id = " + std::to_string( m_landKey ) ); @@ -88,6 +113,11 @@ uint16_t Core::Land::convertItemIdToHousingItemId( uint16_t itemId ) return info->additionalData; } +uint32_t Core::Land::getCurrentPrice() const +{ + return m_currentPrice; +} + void Core::Land::setPreset( uint32_t id ) { auto pExdData = g_fw.get< Data::ExdDataGenerated >(); @@ -197,11 +227,6 @@ uint32_t Core::Land::getPlayerOwner() return m_ownerPlayerId; } -uint32_t Core::Land::getLandKey() -{ - return m_landKey; -} - const LandStruct& Core::Land::getLand() { return m_land; @@ -215,19 +240,15 @@ uint32_t Core::Land::getMaxItems() void Core::Land::init() { - switch( getHouseSize() ) { case HouseSize::small: - m_initPrice = 3750000; m_maxItems = 20; break; case HouseSize::medium: - m_initPrice = 20000000; m_maxItems = 30; break; case HouseSize::big: - m_initPrice = 50000000; m_maxItems = 40; break; default: diff --git a/src/servers/sapphire_zone/Zone/Land.h b/src/servers/sapphire_zone/Zone/Land.h index 03a2641a..c3f958f8 100644 --- a/src/servers/sapphire_zone/Zone/Land.h +++ b/src/servers/sapphire_zone/Zone/Land.h @@ -5,11 +5,16 @@ namespace Core { + namespace Data + { + using HousingLandSetPtr = std::shared_ptr< HousingLandSet >; + } + class Land { public: - Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId ); + Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId, uint32_t landSetId, Core::Data::HousingLandSetPtr info ); virtual ~Land(); void load(); @@ -48,21 +53,23 @@ namespace Core void UpdateDatabase(); void Update( uint32_t currTime ); void onUpdate(); - uint32_t getLandKey(); const Common::LandStruct& getLand(); uint32_t getMaxItems(); + uint32_t getCurrentPrice() const; + private: uint16_t convertItemIdToHousingItemId( uint16_t itemId ); void init(); - uint32_t m_landKey; uint8_t m_wardNum; uint8_t m_landId; + uint32_t m_landSetId; uint16_t m_zoneId; Common::LandStruct m_land; uint32_t m_ownerPlayerId; + Core::Data::HousingLandSetPtr m_landInfo; //item storage diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 502cc106..c77d48f3 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -175,7 +175,7 @@ bool Core::TerritoryMgr::createHousingTerritories() auto pHousingZone = make_HousingZone( wardNum, territoryId, guid, territoryInfo->name, pPlaceName->name ); pHousingZone->init(); - wardMaxNum = pHousingZone->m_wardMaxNum; + wardMaxNum = 18; InstanceIdToZonePtrMap instanceMap; instanceMap[ guid ] = pHousingZone;