mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-26 06:27:45 +00:00
handle fc doors properly
This commit is contained in:
parent
a04d01be90
commit
1c890a43bf
4 changed files with 20 additions and 15 deletions
|
@ -869,10 +869,10 @@ namespace Sapphire::Common
|
||||||
enum HouseStatus : uint8_t
|
enum HouseStatus : uint8_t
|
||||||
{
|
{
|
||||||
none,
|
none,
|
||||||
HouseForSale,
|
ForSale,
|
||||||
HouseSold,
|
Sold,
|
||||||
HousePrivateEstate,
|
PrivateEstate,
|
||||||
HouseFreeCompanyEstate,
|
FreeCompanyEstate,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum HouseIconAdd : uint8_t
|
enum HouseIconAdd : uint8_t
|
||||||
|
|
|
@ -365,7 +365,7 @@ Sapphire::LandPurchaseResult Sapphire::World::Manager::HousingMgr::purchaseLand(
|
||||||
if( !pLand )
|
if( !pLand )
|
||||||
return LandPurchaseResult::ERR_INTERNAL;
|
return LandPurchaseResult::ERR_INTERNAL;
|
||||||
|
|
||||||
if( pLand->getStatus() != HouseStatus::HouseForSale )
|
if( pLand->getStatus() != HouseStatus::ForSale )
|
||||||
return LandPurchaseResult::ERR_NOT_AVAILABLE;
|
return LandPurchaseResult::ERR_NOT_AVAILABLE;
|
||||||
|
|
||||||
if( gilAvailable < plotPrice )
|
if( gilAvailable < plotPrice )
|
||||||
|
@ -388,7 +388,7 @@ Sapphire::LandPurchaseResult Sapphire::World::Manager::HousingMgr::purchaseLand(
|
||||||
|
|
||||||
player.removeCurrency( CurrencyType::Gil, plotPrice );
|
player.removeCurrency( CurrencyType::Gil, plotPrice );
|
||||||
pLand->setOwnerId( player.getId() );
|
pLand->setOwnerId( player.getId() );
|
||||||
pLand->setStatus( HouseStatus::HouseSold );
|
pLand->setStatus( HouseStatus::Sold );
|
||||||
pLand->setLandType( Common::LandType::Private );
|
pLand->setLandType( Common::LandType::Private );
|
||||||
|
|
||||||
player.setLandFlags( LandFlagsSlot::Private, 0x00, pLand->getLandIdent() );
|
player.setLandFlags( LandFlagsSlot::Private, 0x00, pLand->getLandIdent() );
|
||||||
|
@ -437,7 +437,7 @@ bool Sapphire::World::Manager::HousingMgr::relinquishLand( Entity::Player& playe
|
||||||
|
|
||||||
pLand->setCurrentPrice( pLand->getMaxPrice() );
|
pLand->setCurrentPrice( pLand->getMaxPrice() );
|
||||||
pLand->setOwnerId( 0 );
|
pLand->setOwnerId( 0 );
|
||||||
pLand->setStatus( HouseStatus::HouseForSale );
|
pLand->setStatus( HouseStatus::ForSale );
|
||||||
pLand->setLandType( Common::LandType::none );
|
pLand->setLandType( Common::LandType::none );
|
||||||
pLand->updateLandDb();
|
pLand->updateLandDb();
|
||||||
|
|
||||||
|
@ -477,11 +477,11 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla
|
||||||
|
|
||||||
auto& entry = wardInfoPacket->data().houseInfoEntry[ i ];
|
auto& entry = wardInfoPacket->data().houseInfoEntry[ i ];
|
||||||
|
|
||||||
// retail always sends the house price in this packet, even after the house has been HouseSold
|
// retail always sends the house price in this packet, even after the house has been Sold
|
||||||
// so I guess we do the same
|
// so I guess we do the same
|
||||||
entry.housePrice = land->getCurrentPrice();
|
entry.housePrice = land->getCurrentPrice();
|
||||||
|
|
||||||
if( land->getStatus() == Common::HouseStatus::HouseForSale )
|
if( land->getStatus() == Common::HouseStatus::ForSale )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( auto house = land->getHouse() )
|
if( auto house = land->getHouse() )
|
||||||
|
@ -682,7 +682,7 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl
|
||||||
|
|
||||||
createHouse( house );
|
createHouse( house );
|
||||||
|
|
||||||
pLand->setStatus( HouseStatus::HousePrivateEstate );
|
pLand->setStatus( HouseStatus::PrivateEstate );
|
||||||
pLand->setLandType( LandType::Private );
|
pLand->setLandType( LandType::Private );
|
||||||
hZone->sendLandUpdate( plotNum );
|
hZone->sendLandUpdate( plotNum );
|
||||||
|
|
||||||
|
|
|
@ -76,14 +76,19 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::onPlayerZone
|
||||||
|
|
||||||
player.queuePacket( indoorInitPacket );
|
player.queuePacket( indoorInitPacket );
|
||||||
|
|
||||||
|
bool isFcHouse = pLand->getStatus() == Common::HouseStatus::PrivateEstate;
|
||||||
|
|
||||||
auto yardPacketTotal = static_cast< uint8_t >( 2 + pLand->getSize() );
|
auto yardPacketTotal = static_cast< uint8_t >( 2 + pLand->getSize() );
|
||||||
for( uint8_t yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ )
|
for( uint8_t yardPacketNum = 0; yardPacketNum < yardPacketTotal; yardPacketNum++ )
|
||||||
{
|
{
|
||||||
auto objectInitPacket = makeZonePacket< Server::FFXIVIpcHousingObjectInitialize >( player.getId() );
|
auto objectInitPacket = makeZonePacket< Server::FFXIVIpcHousingObjectInitialize >( player.getId() );
|
||||||
memcpy( &objectInitPacket->data().landIdent, &m_landIdent, sizeof( Common::LandIdent ) );
|
memcpy( &objectInitPacket->data().landIdent, &m_landIdent, sizeof( Common::LandIdent ) );
|
||||||
// todo: change this when FC houses become a thing
|
|
||||||
|
if( isFcHouse )
|
||||||
objectInitPacket->data().u1 = 2; // 2 = actrl 0x400 will hide the fc door, otherwise it will stay there
|
objectInitPacket->data().u1 = 2; // 2 = actrl 0x400 will hide the fc door, otherwise it will stay there
|
||||||
|
else
|
||||||
|
objectInitPacket->data().u1 = 0;
|
||||||
|
|
||||||
objectInitPacket->data().u2 = 100;
|
objectInitPacket->data().u2 = 100;
|
||||||
objectInitPacket->data().packetNum = yardPacketNum;
|
objectInitPacket->data().packetNum = yardPacketNum;
|
||||||
objectInitPacket->data().packetTotal = yardPacketTotal;
|
objectInitPacket->data().packetTotal = yardPacketTotal;
|
||||||
|
@ -94,7 +99,7 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::onPlayerZone
|
||||||
player.queuePacket( objectInitPacket );
|
player.queuePacket( objectInitPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: if in fc house, don't send this
|
if( isFcHouse )
|
||||||
player.queuePacket( Server::makeActorControl143( player.getId(), Network::ActorControl::HideAdditionalChambersDoor ) );
|
player.queuePacket( Server::makeActorControl143( player.getId(), Network::ActorControl::HideAdditionalChambersDoor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ void Sapphire::Land::updateLandDb()
|
||||||
|
|
||||||
void Sapphire::Land::update( uint32_t currTime )
|
void Sapphire::Land::update( uint32_t currTime )
|
||||||
{
|
{
|
||||||
if( getStatus() == HouseStatus::HouseForSale )
|
if( getStatus() == HouseStatus::ForSale )
|
||||||
{
|
{
|
||||||
if( m_nextDrop < currTime && m_minPrice < m_currentPrice )
|
if( m_nextDrop < currTime && m_minPrice < m_currentPrice )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue