diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 22c07e60..44247c6d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1607,7 +1607,7 @@ struct LandStruct uint32_t fcIcon;// 12 uint32_t fcIconColor; // 16 uint16_t housePart[ 8 ]; // 34 - uint8_t color[ 8 ]; // 36 + uint8_t houseColour[ 8 ]; // 36 }; struct FFXIVIpcLandUpdate : FFXIVIpcBasePacket< LandUpdate > diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index 55ca5b1d..40aa2b73 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -67,20 +67,25 @@ uint32_t Core::House::getHouseId() const uint8_t Core::House::getHousePartColor( Common::HousePartSlot slot ) const { - return m_housePartsColor[ slot ]; + return std::get< 1 >( m_houseParts[ slot ] ); } void Core::House::setHousePart( Common::HousePartSlot slot, uint32_t id ) { - m_houseParts[ slot ] = id; + std::get< 0 >( m_houseParts[ slot ] ) = id; } void Core::House::setHousePartColor( Common::HousePartSlot slot, uint32_t id ) { - m_housePartsColor[ slot ] = id; + std::get< 1 >( m_houseParts[ slot ] ) = id; } uint32_t Core::House::getHousePart( Common::HousePartSlot slot ) const { - return m_houseParts[ slot ]; + return std::get< 0 >( m_houseParts[ slot ] ); +} + +Core::House::HousePartsArray const& Core::House::getHouseParts() const +{ + return m_houseParts; } \ 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 080aea2e..410ab80d 100644 --- a/src/servers/sapphire_zone/Zone/House.h +++ b/src/servers/sapphire_zone/Zone/House.h @@ -11,11 +11,13 @@ namespace Core class House { - public: House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_t wardNum, uint16_t territoryTypeId ); virtual ~House(); + using HousePart = std::tuple< uint32_t, uint8_t >; + using HousePartsArray = std::array< HousePart, 8 >; + //gerneral uint32_t getLandSetId() const; uint8_t getLandId() const; @@ -29,6 +31,8 @@ namespace Core uint32_t getHousePart( Common::HousePartSlot slot ) const; uint8_t getHousePartColor( Common::HousePartSlot slot ) const; + HousePartsArray const& getHouseParts() const; + private: uint32_t m_landSetId; uint8_t m_landId; @@ -36,8 +40,7 @@ namespace Core uint16_t m_territoryTypeId; uint32_t m_houseId; - uint32_t m_houseParts[ 8 ]; - uint8_t m_housePartsColor[ 8 ]; + HousePartsArray m_houseParts; char m_commentMsg[ 193 ]; }; diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 8ca52012..37beafcd 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -127,13 +127,30 @@ void Core::HousingZone::sendLandSet( Entity::Player& player ) for( uint8_t i = startIndex, count = 0; i < ( startIndex + 30 ); ++i, ++count ) { auto pLand = getLand( i ); - landsetInitializePacket->data().land[ count ].plotSize = pLand->getSize(); - landsetInitializePacket->data().land[ count ].houseState = pLand->getState(); - landsetInitializePacket->data().land[ count ].type = static_cast< uint8_t >( pLand->getLandType() ); - landsetInitializePacket->data().land[ count ].iconAddIcon = pLand->getSharing(); - landsetInitializePacket->data().land[ count ].fcId = pLand->getFcId(); - landsetInitializePacket->data().land[ count ].fcIcon = pLand->getFcIcon(); - landsetInitializePacket->data().land[ count ].fcIconColor = pLand->getFcColor(); + + // todo: move this and sendLandUpdate building logic to its own function + auto& landData = landsetInitializePacket->data().land[ count ]; + + landData.plotSize = pLand->getSize(); + landData.houseState = pLand->getState(); + landData.type = static_cast< uint8_t >( pLand->getLandType() ); + landData.iconAddIcon = pLand->getSharing(); + landData.fcId = pLand->getFcId(); + landData.fcIcon = pLand->getFcIcon(); + landData.fcIconColor = pLand->getFcColor(); + + if( auto house = pLand->getHouse() ) + { + auto& parts = house->getHouseParts(); + + for( auto i = 0; i != parts.size(); i++ ) + { + auto [ part, colour ] = parts[ i ]; + + landData.housePart[ i ] = part; + landData.houseColour[ i ] = colour; + } + } } player.queuePacket( landsetInitializePacket ); @@ -148,23 +165,28 @@ void Core::HousingZone::sendLandUpdate( uint8_t landId ) auto landUpdatePacket = makeZonePacket< FFXIVIpcLandUpdate >( pPlayer->getId() ); landUpdatePacket->data().landId = landId; - landUpdatePacket->data().land.plotSize = pLand->getSize(); - landUpdatePacket->data().land.houseState = pLand->getState(); - landUpdatePacket->data().land.type = 0; - landUpdatePacket->data().land.iconAddIcon = pLand->getSharing(); - landUpdatePacket->data().land.fcId = pLand->getFcId(); - landUpdatePacket->data().land.fcIcon = pLand->getFcIcon(); - landUpdatePacket->data().land.fcIconColor = pLand->getFcColor(); + + auto& landData = landUpdatePacket->data().land; + + landData.plotSize = pLand->getSize(); + landData.houseState = pLand->getState(); + landData.type = static_cast< uint8_t >( pLand->getLandType() ); + landData.iconAddIcon = pLand->getSharing(); + landData.fcId = pLand->getFcId(); + landData.fcIcon = pLand->getFcIcon(); + landData.fcIconColor = pLand->getFcColor(); + if( auto house = pLand->getHouse() ) { - // todo: this is retarded, need a getter to the internal array - for( int i = 0; i < 8; i++ ) - { - auto slot = static_cast< Common::HousePartSlot >( i ); - auto part = pLand->getHouse()->getHousePart( slot ); + auto& parts = house->getHouseParts(); - landUpdatePacket->data().land.housePart[ slot ] = part; + for( auto i = 0; i != parts.size(); i++ ) + { + auto [ part, colour ] = parts[ i ]; + + landData.housePart[ i ] = part; + landData.houseColour[ i ] = colour; } } diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index 26335d5a..81ce268e 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -306,10 +306,10 @@ bool Core::Land::setPreset( uint32_t itemId ) m_pHouse = make_House( newId, getLandSetId(), getLandId(), getWardNum(), getTerritoryTypeId() ); } - getHouse()->setHousePart( Common::HousePartSlot::ExteriorRoof, housingPreset->exteriorRoof ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorWall, housingPreset->exteriorWall ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorWindow, housingPreset->exteriorWindow ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorDoor, housingPreset->exteriorDoor ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorRoof, convertItemIdToHousingItemId( housingPreset->exteriorRoof ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWall, convertItemIdToHousingItemId( housingPreset->exteriorWall ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWindow, convertItemIdToHousingItemId( housingPreset->exteriorWindow ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorDoor, convertItemIdToHousingItemId( housingPreset->exteriorDoor ) ); return true; }