From 6e6ffc7cf3da3751546176dadb4ed0726719708d Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 10 Jan 2019 20:38:27 +1100 Subject: [PATCH] fix housing object init structure, game no longer crashes/doesn't load --- sql/schema/schema.sql | 2 +- src/common/Common.h | 5 ++--- src/tools/exd_struct_gen/main.cpp | 2 +- src/world/Inventory/HousingItem.cpp | 4 ++-- src/world/Inventory/HousingItem.h | 6 +++--- src/world/Manager/HousingMgr.cpp | 2 +- src/world/Territory/Housing/HousingInteriorTerritory.cpp | 4 ++-- src/world/Territory/HousingZone.cpp | 4 ++-- 8 files changed, 14 insertions(+), 15 deletions(-) diff --git a/sql/schema/schema.sql b/sql/schema/schema.sql index b2975d2b..100308c6 100644 --- a/sql/schema/schema.sql +++ b/sql/schema/schema.sql @@ -579,7 +579,7 @@ CREATE TABLE `landplaceditems` ( `PosX` FLOAT NOT NULL, `PosY` FLOAT NOT NULL, `PosZ` FLOAT NOT NULL, - `Rotation` INT(10) NOT NULL, + `Rotation` FLOAT NOT NULL, PRIMARY KEY (`ItemId`) ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB; diff --git a/src/common/Common.h b/src/common/Common.h index 3b3af244..c688d088 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -855,10 +855,9 @@ namespace Sapphire::Common struct HousingObject { uint32_t itemId; - uint16_t itemRotation; + uint32_t padding; // was itemrotation + unknown/pad, looks unused now + float rotation; Common::FFXIVARR_POSITION3 pos; - uint32_t unknown; - uint16_t padding; }; enum HouseSize : uint8_t diff --git a/src/tools/exd_struct_gen/main.cpp b/src/tools/exd_struct_gen/main.cpp index 13a29feb..0226134b 100644 --- a/src/tools/exd_struct_gen/main.cpp +++ b/src/tools/exd_struct_gen/main.cpp @@ -45,7 +45,7 @@ std::vector< std::string > cppKeyWords }; //std::string datLocation( "/home/mordred/sqpack" ); -std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); +std::string datLocation( "/mnt/c/Program Files (x86)/Steam/steamapps/common/FINAL FANTASY XIV Online/game/sqpack" ); std::map< uint8_t, std::string > g_typeMap; diff --git a/src/world/Inventory/HousingItem.cpp b/src/world/Inventory/HousingItem.cpp index 44b0da90..f4fe35da 100644 --- a/src/world/Inventory/HousingItem.cpp +++ b/src/world/Inventory/HousingItem.cpp @@ -8,12 +8,12 @@ Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId, m_reservedFlag = 1092616192; // wat? } -uint16_t Sapphire::Inventory::HousingItem::getRot() const +float Sapphire::Inventory::HousingItem::getRot() const { return m_rotation; } -void Sapphire::Inventory::HousingItem::setRot( uint16_t rot ) +void Sapphire::Inventory::HousingItem::setRot( float rot ) { m_rotation = rot; } diff --git a/src/world/Inventory/HousingItem.h b/src/world/Inventory/HousingItem.h index 1460d6d6..ba208ddc 100644 --- a/src/world/Inventory/HousingItem.h +++ b/src/world/Inventory/HousingItem.h @@ -11,15 +11,15 @@ namespace Sapphire::Inventory HousingItem( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw ); virtual ~HousingItem() = default; - void setRot( uint16_t rot ); - uint16_t getRot() const; + void setRot( float rot ); + float getRot() const; void setPos( Common::FFXIVARR_POSITION3 pos ); Common::FFXIVARR_POSITION3 getPos() const; private: Common::FFXIVARR_POSITION3 m_position; - uint16_t m_rotation; + float m_rotation; }; } diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 41c8da64..ad8831c2 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1187,7 +1187,7 @@ Sapphire::Common::HousingObject Sapphire::World::Manager::HousingMgr::getYardObj Sapphire::Common::HousingObject obj {}; obj.pos = item->getPos(); - obj.itemRotation = item->getRot(); + obj.rotation = item->getRot(); obj.itemId = item->getAdditionalData(); return obj; diff --git a/src/world/Territory/Housing/HousingInteriorTerritory.cpp b/src/world/Territory/Housing/HousingInteriorTerritory.cpp index 9b311177..98b7cc41 100644 --- a/src/world/Territory/Housing/HousingInteriorTerritory.cpp +++ b/src/world/Territory/Housing/HousingInteriorTerritory.cpp @@ -202,7 +202,7 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::updateHousin auto& obj = m_housingObjects[ slot ]; obj.pos = pos; - obj.itemRotation = rot; + obj.rotation = rot; // todo: how does this update on other clients? @@ -213,7 +213,7 @@ void Sapphire::World::Territory::Housing::HousingInteriorTerritory::updateHousin auto moveObjPkt = makeZonePacket< Server::FFXIVIpcHousingObjectMove >( player.second->getId() ); - moveObjPkt->data().itemRotation = obj.itemRotation; + moveObjPkt->data().itemRotation = obj.rotation; moveObjPkt->data().pos = obj.pos; // todo: how does this work when an item is in a slot >50 or u8 max? my guess is landid is the container index, but not sure... diff --git a/src/world/Territory/HousingZone.cpp b/src/world/Territory/HousingZone.cpp index 793f8c8a..022e7a24 100644 --- a/src/world/Territory/HousingZone.cpp +++ b/src/world/Territory/HousingZone.cpp @@ -353,7 +353,7 @@ void Sapphire::HousingZone::spawnYardObject( uint8_t landId, uint16_t slotId, In Common::HousingObject obj {}; obj.itemId = item.getAdditionalData(); - obj.itemRotation = item.getRot(); + obj.rotation = item.getRot(); obj.pos = item.getPos(); @@ -383,7 +383,7 @@ void Sapphire::HousingZone::updateYardObjectPos( Entity::Player& sourcePlayer, u auto& obj = m_yardObjects[ yardMapIndex ][ offset ]; - obj.itemRotation = item.getRot(); + obj.rotation = item.getRot(); obj.pos = item.getPos(); for( const auto& player : m_playerMap )