1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-22 20:57:46 +00:00

Houseing data initializing and signs

This commit is contained in:
Mordred 2018-11-04 23:47:10 +01:00
parent a0616c8d7c
commit 7b7ab34eb9
10 changed files with 146 additions and 35 deletions

View file

@ -2740,6 +2740,16 @@ Core::Data::HousingFurniture::HousingFurniture( uint32_t row_id, Core::Data::Exd
tooltip = exdData->getField< bool >( row, 9 ); 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 ) Core::Data::HousingPlacement::HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData )
{ {
auto row = exdData->m_HousingPlacementDat.get_row( row_id ); 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_HousingEmploymentNpcListDat = setupDatAccess( "HousingEmploymentNpcList", xiv::exd::Language::none );
m_HousingEmploymentNpcRaceDat = setupDatAccess( "HousingEmploymentNpcRace", xiv::exd::Language::en ); m_HousingEmploymentNpcRaceDat = setupDatAccess( "HousingEmploymentNpcRace", xiv::exd::Language::en );
m_HousingFurnitureDat = setupDatAccess( "HousingFurniture", xiv::exd::Language::none ); 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_HousingPlacementDat = setupDatAccess( "HousingPlacement", xiv::exd::Language::en );
m_HousingPresetDat = setupDatAccess( "HousingPreset", xiv::exd::Language::en ); m_HousingPresetDat = setupDatAccess( "HousingPreset", xiv::exd::Language::en );
m_HousingYardObjectDat = setupDatAccess( "HousingYardObject", xiv::exd::Language::none ); m_HousingYardObjectDat = setupDatAccess( "HousingYardObject", xiv::exd::Language::none );

View file

@ -256,6 +256,7 @@ struct HousingAethernet;
struct HousingEmploymentNpcList; struct HousingEmploymentNpcList;
struct HousingEmploymentNpcRace; struct HousingEmploymentNpcRace;
struct HousingFurniture; struct HousingFurniture;
struct HousingLandSet;
struct HousingPlacement; struct HousingPlacement;
struct HousingPreset; struct HousingPreset;
struct HousingYardObject; struct HousingYardObject;
@ -2849,6 +2850,14 @@ struct HousingPlacement
HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); 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 struct HousingPreset
{ {
std::string singular; std::string singular;
@ -5054,6 +5063,7 @@ struct ZoneSharedGroup
xiv::exd::Exd m_HousingEmploymentNpcListDat; xiv::exd::Exd m_HousingEmploymentNpcListDat;
xiv::exd::Exd m_HousingEmploymentNpcRaceDat; xiv::exd::Exd m_HousingEmploymentNpcRaceDat;
xiv::exd::Exd m_HousingFurnitureDat; xiv::exd::Exd m_HousingFurnitureDat;
xiv::exd::Exd m_HousingLandSetDat;
xiv::exd::Exd m_HousingPlacementDat; xiv::exd::Exd m_HousingPlacementDat;
xiv::exd::Exd m_HousingPresetDat; xiv::exd::Exd m_HousingPresetDat;
xiv::exd::Exd m_HousingYardObjectDat; xiv::exd::Exd m_HousingYardObjectDat;
@ -5484,6 +5494,7 @@ struct ZoneSharedGroup
using HousingEmploymentNpcListPtr = std::shared_ptr< HousingEmploymentNpcList >; using HousingEmploymentNpcListPtr = std::shared_ptr< HousingEmploymentNpcList >;
using HousingEmploymentNpcRacePtr = std::shared_ptr< HousingEmploymentNpcRace >; using HousingEmploymentNpcRacePtr = std::shared_ptr< HousingEmploymentNpcRace >;
using HousingFurniturePtr = std::shared_ptr< HousingFurniture >; using HousingFurniturePtr = std::shared_ptr< HousingFurniture >;
using HousingLandSetPtr = std::shared_ptr< HousingLandSet >;
using HousingPlacementPtr = std::shared_ptr< HousingPlacement >; using HousingPlacementPtr = std::shared_ptr< HousingPlacement >;
using HousingPresetPtr = std::shared_ptr< HousingPreset >; using HousingPresetPtr = std::shared_ptr< HousingPreset >;
using HousingYardObjectPtr = std::shared_ptr< HousingYardObject >; using HousingYardObjectPtr = std::shared_ptr< HousingYardObject >;
@ -5929,6 +5940,7 @@ struct ZoneSharedGroup
std::set< uint32_t > m_HousingEmploymentNpcListIdList; std::set< uint32_t > m_HousingEmploymentNpcListIdList;
std::set< uint32_t > m_HousingEmploymentNpcRaceIdList; std::set< uint32_t > m_HousingEmploymentNpcRaceIdList;
std::set< uint32_t > m_HousingFurnitureIdList; std::set< uint32_t > m_HousingFurnitureIdList;
std::set< uint32_t > m_HousingLandSetIdList;
std::set< uint32_t > m_HousingPlacementIdList; std::set< uint32_t > m_HousingPlacementIdList;
std::set< uint32_t > m_HousingPresetIdList; std::set< uint32_t > m_HousingPresetIdList;
std::set< uint32_t > m_HousingYardObjectIdList; std::set< uint32_t > m_HousingYardObjectIdList;
@ -7549,6 +7561,12 @@ const std::set< uint32_t >& getHousingFurnitureIdList()
loadIdList( m_HousingFurnitureDat, m_HousingFurnitureIdList ); loadIdList( m_HousingFurnitureDat, m_HousingFurnitureIdList );
return 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() const std::set< uint32_t >& getHousingPlacementIdList()
{ {
if( m_HousingPlacementIdList.size() == 0 ) if( m_HousingPlacementIdList.size() == 0 )

View file

@ -286,6 +286,7 @@ enum ClientTriggerType
AchievementCritReq = 0x3E8, AchievementCritReq = 0x3E8,
AchievementList = 0x3E9, AchievementList = 0x3E9,
RequestHousingSign = 0x451,
RequestSharedEstateSettings = 0x46F, RequestSharedEstateSettings = 0x46F,
CompanionAction = 0x6A4, CompanionAction = 0x6A4,

View file

@ -188,7 +188,8 @@ namespace Core::Network::Packets
LandSetInitialize = 0x0220, // updated 4.4 LandSetInitialize = 0x0220, // updated 4.4
LandUpdate = 0x0221, // updated 4.4 LandUpdate = 0x0221, // updated 4.4
YardObjectSpawn = 0x0222, // updated 4.4 YardObjectSpawn = 0x0222, // updated 4.4
LandPriceUpdate = 0x0225, // updated 4.3
LandPriceUpdate = 0x0224, // updated 4.3
LandPermission = 0x0229, // updated 4.4 LandPermission = 0x0229, // updated 4.4
LandSetYardInitialize = 0x022C, // updated 4.4 LandSetYardInitialize = 0x022C, // updated 4.4
YardObjectMove = 0x0230, // updated 4.4 YardObjectMove = 0x0230, // updated 4.4

View file

@ -10,6 +10,8 @@
#include "Zone/Zone.h" #include "Zone/Zone.h"
#include "Zone/ZonePosition.h" #include "Zone/ZonePosition.h"
#include "Zone/HousingZone.h"
#include "Zone/Land.h"
#include "Network/GameConnection.h" #include "Network/GameConnection.h"
@ -307,7 +309,28 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR
player.removeQuest( static_cast< uint16_t >( param1 ) ); player.removeQuest( static_cast< uint16_t >( param1 ) );
break; 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: default:
{ {

View file

@ -3,7 +3,7 @@
#include <Util/Util.h> #include <Util/Util.h>
#include <Util/UtilMath.h> #include <Util/UtilMath.h>
#include <Database/DatabaseDef.h> #include <Database/DatabaseDef.h>
#include <Exd/ExdDataGenerated.h>
#include <Network/GamePacketNew.h> #include <Network/GamePacketNew.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h> #include <Network/PacketDef/Zone/ServerZoneDef.h>
@ -21,24 +21,46 @@ using namespace Core::Common;
using namespace Core::Network::Packets; using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server; using namespace Core::Network::Packets::Server;
Core::HousingZone::HousingZone( uint8_t landSetId, Core::HousingZone::HousingZone( uint8_t wardNum,
uint16_t territoryId, uint16_t territoryId,
uint32_t guId, uint32_t guId,
const std::string& internalName, const std::string& internalName,
const std::string& contentName ) : const std::string& contentName ) :
Zone( territoryId, guId, internalName, contentName ), Zone( territoryId, guId, internalName, contentName ),
m_landSetId( landSetId ), m_wardNum( wardNum ),
m_zoneId( territoryId ) m_zoneId( territoryId ),
m_landSetId( ( static_cast< uint32_t >( territoryId ) << 16 ) | wardNum )
{ {
} }
bool Core::HousingZone::init() 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; uint32_t landId;
for( landId = 0; landId < 60; 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 ); pObject->setHouseSize( 1 );
m_landPtrMap[ landId ] = pObject; 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 >(); auto pLog = g_fw.get< Logger >();
pLog->debug( "HousingZone::onPlayerZoneIn: Zone#" + std::to_string( getGuId() ) + "|" 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 yardPacketNum;
uint32_t yardPacketTotal = 8; uint32_t yardPacketTotal = 8;
sendMap( player ); sendLandSet( player );
for( yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ ) 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() ); 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; landsetInitializePacket->data().subInstance = isPlayerSubInstance( player ) == false ? 1 : 2;
uint8_t startIndex = isPlayerSubInstance( player ) == false ? 0 : 30; 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 ) ); memcpy( &landsetInitializePacket->data().land[ count++ ], &getLand( i )->getLand(), sizeof( Common::LandStruct ) );
count++;
} }
player.queuePacket( landsetInitializePacket ); 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; return m_landSetId;
} }

View file

@ -22,18 +22,21 @@ namespace Core
void onPlayerZoneIn( Entity::Player& player ) override; void onPlayerZoneIn( Entity::Player& player ) override;
void onUpdate( uint32_t currTime ) override; void onUpdate( uint32_t currTime ) override;
void sendMap( Entity::Player& player ); void sendLandSet( Entity::Player& player );
bool isPlayerSubInstance( Entity::Player& player ); bool isPlayerSubInstance( Entity::Player& player );
/* returns current ward number for this zone */ /* 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 ); Core::LandPtr getLand( uint8_t id );
const uint32_t m_wardMaxNum = 18;
private: private:
using LandPtrMap = std::unordered_map< uint8_t, Core::LandPtr >; using LandPtrMap = std::unordered_map< uint8_t, Core::LandPtr >;
const uint32_t m_landSetMax = 18;
LandPtrMap m_landPtrMap; LandPtrMap m_landPtrMap;
uint8_t m_landSetId; uint8_t m_wardNum;
uint32_t m_landSetId;
uint32_t m_zoneId; uint32_t m_zoneId;
}; };

View file

@ -25,14 +25,16 @@ extern Core::Framework g_fw;
using namespace Core::Common; 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_zoneId( zoneId ),
m_wardNum( wardNum ), m_wardNum( wardNum ),
m_landId( landId ), m_landId( landId ),
m_currentPrice( 0 ), 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 ) ); memset( &m_land, 0x00, sizeof( LandStruct ) );
load(); load();
} }
@ -44,8 +46,31 @@ Core::Land::~Land()
void Core::Land::load() void Core::Land::load()
{ {
m_land.houseSize = 1;
m_land.houseState = HouseState::forSale; 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 ); // setPreset( 262145 );
/* auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); /* auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >();
auto res = pDb->query( "SELECT * FROM land WHERE Id = " + std::to_string( m_landKey ) ); 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; return info->additionalData;
} }
uint32_t Core::Land::getCurrentPrice() const
{
return m_currentPrice;
}
void Core::Land::setPreset( uint32_t id ) void Core::Land::setPreset( uint32_t id )
{ {
auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >();
@ -197,11 +227,6 @@ uint32_t Core::Land::getPlayerOwner()
return m_ownerPlayerId; return m_ownerPlayerId;
} }
uint32_t Core::Land::getLandKey()
{
return m_landKey;
}
const LandStruct& Core::Land::getLand() const LandStruct& Core::Land::getLand()
{ {
return m_land; return m_land;
@ -215,19 +240,15 @@ uint32_t Core::Land::getMaxItems()
void Core::Land::init() void Core::Land::init()
{ {
switch( getHouseSize() ) switch( getHouseSize() )
{ {
case HouseSize::small: case HouseSize::small:
m_initPrice = 3750000;
m_maxItems = 20; m_maxItems = 20;
break; break;
case HouseSize::medium: case HouseSize::medium:
m_initPrice = 20000000;
m_maxItems = 30; m_maxItems = 30;
break; break;
case HouseSize::big: case HouseSize::big:
m_initPrice = 50000000;
m_maxItems = 40; m_maxItems = 40;
break; break;
default: default:

View file

@ -5,11 +5,16 @@
namespace Core namespace Core
{ {
namespace Data
{
using HousingLandSetPtr = std::shared_ptr< HousingLandSet >;
}
class Land class Land
{ {
public: 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(); virtual ~Land();
void load(); void load();
@ -48,21 +53,23 @@ namespace Core
void UpdateDatabase(); void UpdateDatabase();
void Update( uint32_t currTime ); void Update( uint32_t currTime );
void onUpdate(); void onUpdate();
uint32_t getLandKey();
const Common::LandStruct& getLand(); const Common::LandStruct& getLand();
uint32_t getMaxItems(); uint32_t getMaxItems();
uint32_t getCurrentPrice() const;
private: private:
uint16_t convertItemIdToHousingItemId( uint16_t itemId ); uint16_t convertItemIdToHousingItemId( uint16_t itemId );
void init(); void init();
uint32_t m_landKey;
uint8_t m_wardNum; uint8_t m_wardNum;
uint8_t m_landId; uint8_t m_landId;
uint32_t m_landSetId;
uint16_t m_zoneId; uint16_t m_zoneId;
Common::LandStruct m_land; Common::LandStruct m_land;
uint32_t m_ownerPlayerId; uint32_t m_ownerPlayerId;
Core::Data::HousingLandSetPtr m_landInfo;
//item storage //item storage

View file

@ -175,7 +175,7 @@ bool Core::TerritoryMgr::createHousingTerritories()
auto pHousingZone = make_HousingZone( wardNum, territoryId, guid, territoryInfo->name, pPlaceName->name ); auto pHousingZone = make_HousingZone( wardNum, territoryId, guid, territoryInfo->name, pPlaceName->name );
pHousingZone->init(); pHousingZone->init();
wardMaxNum = pHousingZone->m_wardMaxNum; wardMaxNum = 18;
InstanceIdToZonePtrMap instanceMap; InstanceIdToZonePtrMap instanceMap;
instanceMap[ guid ] = pHousingZone; instanceMap[ guid ] = pHousingZone;