From 6ff116a9e1923c9365a75846c427d94a0d644d5d Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 17 Sep 2018 22:52:57 +0200 Subject: [PATCH 1/3] Inventory fix --- src/common/Common.h | 18 +++- src/libraries | 2 +- src/servers/sapphire_zone/Actor/Player.cpp | 11 +- src/servers/sapphire_zone/Actor/Player.h | 11 +- .../sapphire_zone/Actor/PlayerInventory.cpp | 100 +++++++++++++----- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 6 +- .../DebugCommand/DebugCommandHandler.cpp | 10 -- .../Network/PacketWrappers/ModelEquipPacket.h | 15 ++- .../PacketWrappers/PlayerSpawnPacket.h | 15 ++- 9 files changed, 123 insertions(+), 65 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 4241bd78..1562c051 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -118,8 +118,22 @@ enum GearSetSlot : SoulCrystal = 13, }; -enum EquipSlotCategory : - uint8_t +enum GearModelSlot : int8_t +{ + ModelInvalid = -1, + ModelHead = 0, + ModelBody = 1, + ModelHands = 2, + ModelLegs = 3, + ModelFeet = 4, + ModelNeck = 5, + ModelEar = 6, + ModelWrist = 7, + ModelRing1 = 8, + ModelRing2 = 9 +}; + +enum EquipSlotCategory : uint8_t { Unequippable = 0, diff --git a/src/libraries b/src/libraries index 8c260396..b89d9a2d 160000 --- a/src/libraries +++ b/src/libraries @@ -1 +1 @@ -Subproject commit 8c260396dde22977cbee4af537757427d2049ee2 +Subproject commit b89d9a2dfcca81ab4241e791a0a78bb9ea34036c diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 05af90bb..a413069f 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -522,9 +522,9 @@ void Core::Entity::Player::discover( int16_t map_id, int16_t sub_id ) auto info = pExdData->get< Core::Data::Map >( pExdData->get< Core::Data::TerritoryType >( getCurrentZone()->getTerritoryId() )->map ); if( info->discoveryArrayByte ) - offset = 4 + 2 * info->discoveryIndex; + offset = 5 + 2 * info->discoveryIndex; else - offset = 324 + 4 * info->discoveryIndex; + offset = 325 + 4 * info->discoveryIndex; int32_t index = offset + sub_id / 8; uint8_t bitIndex = sub_id % 8; @@ -777,16 +777,11 @@ void Core::Entity::Player::sendModel() sendToInRangeSet( boost::make_shared< ModelEquipPacket >( *getAsPlayer() ), true ); } -uint32_t Core::Entity::Player::getModelForSlot( Common::GearSetSlot slot ) +uint32_t Core::Entity::Player::getModelForSlot( Common::GearModelSlot slot ) { return m_modelEquip[ slot ]; } -void Core::Entity::Player::setModelForSlot( Common::GearSetSlot slot, uint32_t val ) -{ - m_modelEquip[ slot ] = val; -} - uint64_t Core::Entity::Player::getModelMainWeapon() const { return m_modelMainWeapon; diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index cb5d31a3..2e163940 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -345,10 +345,7 @@ public: const uint32_t* getModelArray() const; /*! return the equipment model in a specified equipment slot */ - uint32_t getModelForSlot( Common::GearSetSlot slot ); - - /*! set the equipment model in a specified equipment slot */ - void setModelForSlot( Common::GearSetSlot slot, uint32_t val ); + uint32_t getModelForSlot( Common::GearModelSlot slot ); /*! add amount to the currency of type */ void addCurrency( Common::CurrencyType type, uint32_t amount ); @@ -359,6 +356,10 @@ public: /*! return the current amount of crystals of type */ uint32_t getCrystal( uint8_t type ) const; + void updateModels( Common::GearSetSlot equipSlotId, const Core::ItemPtr& pItem ); + + Common::GearModelSlot equipSlotToModelSlot( Common::GearSetSlot slot ); + // Class / Job / Exp ////////////////////////////////////////////////////////////////////////////////////////////////////// /*! returns the level of the currently active class / job */ @@ -956,7 +957,7 @@ private: uint16_t m_classArray[25]; uint32_t m_expArray[25]; - uint8_t m_aetheryte[16]; + uint8_t m_aetheryte[17]; uint8_t m_unlocks[64]; uint8_t m_orchestrion[40]; diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 0d3b49c0..e83db92c 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -140,32 +140,7 @@ void Core::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, ItemPtr p //g_framework.getLogger().debug( "Equipping into slot " + std::to_string( equipSlotId ) ); - uint64_t model = pItem->getModelId1(); - uint64_t model2 = pItem->getModelId2(); - - switch( equipSlotId ) - { - case Common::GearSetSlot::MainHand: - m_modelMainWeapon = model; - m_modelSubWeapon = model2; - // TODO: add job change upon changing weapon if needed - // equipWeapon( pItem ); - break; - - case Common::GearSetSlot::OffHand: - m_modelSubWeapon = model; - break; - - case Common::GearSetSlot::SoulCrystal: - // TODO: add Job change on equipping crystal - // change job - break; - - default: // any other slot - m_modelEquip[ static_cast< uint8_t >( equipSlotId ) ] = static_cast< uint32_t >( model ); - break; - - } + updateModels( equipSlotId, pItem ); if( sendUpdate ) { @@ -175,9 +150,80 @@ void Core::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, ItemPtr p } } +void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::ItemPtr& pItem ) +{ + uint64_t model = pItem->getModelId1(); + uint64_t model2 = pItem->getModelId2(); + + switch( equipSlotId ) + { + case MainHand: + m_modelMainWeapon = model; + m_modelSubWeapon = model2; + // TODO: add job change upon changing weapon if needed + // equipWeapon( pItem ); + break; + + case OffHand: + m_modelSubWeapon = model; + break; + + case SoulCrystal: + // TODO: add Job change on equipping crystal + // change job + break; + + case Waist: + break; + + default: // any other slot + auto modelSlot = equipSlotToModelSlot( equipSlotId ); + if( modelSlot == GearModelSlot::ModelInvalid ) + break; + m_modelEquip[ static_cast< uint8_t >( modelSlot ) ] = static_cast< uint32_t >( model ); + break; + + } +} + +Core::Common::GearModelSlot Core::Entity::Player::equipSlotToModelSlot( Common::GearSetSlot slot ) +{ + switch( slot ) + { + case MainHand: + case OffHand: + case Waist: + case SoulCrystal: + default: + return GearModelSlot::ModelInvalid; + case Head: + return GearModelSlot::ModelHead; + case Body: + return GearModelSlot::ModelBody; + case Hands: + return GearModelSlot::ModelHands; + case Legs: + return GearModelSlot::ModelLegs; + case Feet: + return GearModelSlot::ModelFeet; + case Neck: + return GearModelSlot::ModelNeck; + case Ear: + return GearModelSlot::ModelEar; + case Wrist: + return GearModelSlot::ModelWrist; + case Ring1: + return GearModelSlot::ModelRing1; + case Ring2: + return GearModelSlot::ModelRing2; + } +} + void Core::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, ItemPtr pItem ) { - m_modelEquip[ static_cast< uint8_t >( equipSlotId ) ] = 0; + auto modelSlot = equipSlotToModelSlot( equipSlotId ); + if( modelSlot != GearModelSlot::ModelInvalid ) + m_modelEquip[ static_cast< uint8_t >( modelSlot ) ] = 0; sendModel(); m_itemLevel = calculateEquippedGearItemLevel(); diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 6043b1d1..55214b4c 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -136,7 +136,6 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_homePoint = res->getUInt8( "Homepoint" ); // Additional data - m_contentId = res->getUInt64( "ContentId" ); m_voice = res->getUInt8( "Voice" ); m_startTown = res->getUInt8( "StartTown" ); @@ -333,6 +332,9 @@ void Core::Entity::Player::updateSql() "EquippedMannequin 44, ConfigFlags 45, QuestCompleteFlags 46, OpeningSequence 47, " "QuestTracking 48, GrandCompany 49, GrandCompanyRank 50, Discovery 51, GMRank 52, Unlocks 53, " "CFPenaltyUntil 54, Pose 55"*/ + + + auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_UP ); stmt->setInt( 1, getHp() ); @@ -605,7 +607,7 @@ bool Core::Entity::Player::loadInventory() { uint16_t storageId = res->getUInt16( 1 ); - for( uint32_t i = 1; i <= 14; i++ ) + for( uint32_t i = 1; i <= 13; i++ ) { uint64_t uItemId = res->getUInt64( i + 1 ); if( uItemId == 0 ) diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index d62c5a39..d615d5a1 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -263,16 +263,6 @@ void Core::DebugCommandHandler::set( char* data, Entity::Player& player, boost:: player.setEorzeaTimeOffset( timestamp ); player.sendNotice( "Eorzea time offset: " + std::to_string( timestamp ) ); } - else if( subCommand == "model" ) - { - uint32_t slot; - uint32_t val; - sscanf( params.c_str(), "%d %d", &slot, &val ); - - player.setModelForSlot( static_cast< Common::GearSetSlot >( slot ), val ); - player.sendModel(); - player.sendDebug( "Model updated" ); - } else if( subCommand == "mount" ) { int32_t id; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h index 018b4232..fd2801fa 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h @@ -28,11 +28,16 @@ private: { m_data.mainWeapon = player.getModelMainWeapon(); m_data.offWeapon = player.getModelSubWeapon(); - m_data.models[ 0 ] = player.getModelForSlot( Common::GearSetSlot::Head ); - m_data.models[ 1 ] = player.getModelForSlot( Common::GearSetSlot::Body ); - m_data.models[ 2 ] = player.getModelForSlot( Common::GearSetSlot::Hands ); - m_data.models[ 3 ] = player.getModelForSlot( Common::GearSetSlot::Legs ); - m_data.models[ 4 ] = player.getModelForSlot( Common::GearSetSlot::Feet ); + m_data.models[ Common::GearModelSlot::ModelHead ] = player.getModelForSlot( Common::GearModelSlot::ModelHead ); + m_data.models[ Common::GearModelSlot::ModelBody ] = player.getModelForSlot( Common::GearModelSlot::ModelBody ); + m_data.models[ Common::GearModelSlot::ModelHands ] = player.getModelForSlot( Common::GearModelSlot::ModelHands ); + m_data.models[ Common::GearModelSlot::ModelLegs ] = player.getModelForSlot( Common::GearModelSlot::ModelLegs ); + m_data.models[ Common::GearModelSlot::ModelFeet ] = player.getModelForSlot( Common::GearModelSlot::ModelFeet ); + m_data.models[ Common::GearModelSlot::ModelNeck ] = player.getModelForSlot( Common::GearModelSlot::ModelNeck ); + m_data.models[ Common::GearModelSlot::ModelEar ] = player.getModelForSlot( Common::GearModelSlot::ModelEar ); + m_data.models[ Common::GearModelSlot::ModelRing1 ] = player.getModelForSlot( Common::GearModelSlot::ModelRing1 ); + m_data.models[ Common::GearModelSlot::ModelRing2 ] = player.getModelForSlot( Common::GearModelSlot::ModelRing2 ); + m_data.models[ Common::GearModelSlot::ModelWrist ] = player.getModelForSlot( Common::GearModelSlot::ModelWrist ); }; }; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 091c46d6..9fdbb033 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -51,11 +51,16 @@ private: m_data.mainWeaponModel = item->getModelId1(); m_data.secWeaponModel = player.getModelSubWeapon(); - m_data.models[ 0 ] = player.getModelForSlot( Common::GearSetSlot::Head ); - m_data.models[ 1 ] = player.getModelForSlot( Common::GearSetSlot::Body ); - m_data.models[ 2 ] = player.getModelForSlot( Common::GearSetSlot::Hands ); - m_data.models[ 3 ] = player.getModelForSlot( Common::GearSetSlot::Legs ); - m_data.models[ 4 ] = player.getModelForSlot( Common::GearSetSlot::Feet ); + m_data.models[ Common::GearModelSlot::ModelHead ] = player.getModelForSlot( Common::GearModelSlot::ModelHead ); + m_data.models[ Common::GearModelSlot::ModelBody ] = player.getModelForSlot( Common::GearModelSlot::ModelBody ); + m_data.models[ Common::GearModelSlot::ModelHands ] = player.getModelForSlot( Common::GearModelSlot::ModelHands ); + m_data.models[ Common::GearModelSlot::ModelLegs ] = player.getModelForSlot( Common::GearModelSlot::ModelLegs ); + m_data.models[ Common::GearModelSlot::ModelFeet ] = player.getModelForSlot( Common::GearModelSlot::ModelFeet ); + m_data.models[ Common::GearModelSlot::ModelNeck ] = player.getModelForSlot( Common::GearModelSlot::ModelNeck ); + m_data.models[ Common::GearModelSlot::ModelEar ] = player.getModelForSlot( Common::GearModelSlot::ModelEar ); + m_data.models[ Common::GearModelSlot::ModelRing1 ] = player.getModelForSlot( Common::GearModelSlot::ModelRing1 ); + m_data.models[ Common::GearModelSlot::ModelRing2 ] = player.getModelForSlot( Common::GearModelSlot::ModelRing2 ); + m_data.models[ Common::GearModelSlot::ModelWrist ] = player.getModelForSlot( Common::GearModelSlot::ModelWrist ); strcpy( m_data.name, player.getName().c_str() ); m_data.pos.x = player.getPos().x; From 60c23d986ed97412a9247b9de74c3c8864c40444 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 17 Sep 2018 23:26:56 +0200 Subject: [PATCH 2/3] Fixed neck and ear being mixed up --- src/common/Common.h | 4 ++-- src/servers/sapphire_api/PlayerMinimal.cpp | 26 +++++++++------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 1562c051..a9e84949 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -110,8 +110,8 @@ enum GearSetSlot : Waist = 5, Legs = 6, Feet = 7, - Neck = 8, - Ear = 9, + Ear = 8, + Neck = 9, Wrist = 10, Ring1 = 11, Ring2 = 12, diff --git a/src/servers/sapphire_api/PlayerMinimal.cpp b/src/servers/sapphire_api/PlayerMinimal.cpp index 175acdb9..cb2006e7 100644 --- a/src/servers/sapphire_api/PlayerMinimal.cpp +++ b/src/servers/sapphire_api/PlayerMinimal.cpp @@ -358,21 +358,17 @@ void PlayerMinimal::saveAsNew() g_charaDb.execute( "INSERT INTO charaitemgearset (storageId, CharacterId, " "container_" + std::to_string( GearSetSlot::MainHand ) + ", " - "container_" + - std::to_string( GearSetSlot::Body ) + ", " - "container_" + std::to_string( GearSetSlot::Hands ) + ", " - "container_" + - std::to_string( GearSetSlot::Legs ) + ", " - "container_" + std::to_string( GearSetSlot::Feet ) + ", " - "container_" + - std::to_string( GearSetSlot::Neck ) + ", " - "container_" + std::to_string( GearSetSlot::Ear ) + ", " - "container_" + - std::to_string( GearSetSlot::Wrist ) + ", " - "container_" + std::to_string( GearSetSlot::Ring1 ) + ", " - "UPDATE_DATE ) " - "VALUES ( " + - std::to_string( InventoryType::GearSet0 ) + ", " + std::to_string( m_id ) + ", " + + "container_" + std::to_string( GearSetSlot::Body ) + ", " + "container_" + std::to_string( GearSetSlot::Hands ) + ", " + "container_" + std::to_string( GearSetSlot::Legs ) + ", " + "container_" + std::to_string( GearSetSlot::Feet ) + ", " + "container_" + std::to_string( GearSetSlot::Neck ) + ", " + "container_" + std::to_string( GearSetSlot::Ear ) + ", " + "container_" + std::to_string( GearSetSlot::Wrist ) + ", " + "container_" + std::to_string( GearSetSlot::Ring1 ) + ", UPDATE_DATE ) " + "VALUES ( " + + std::to_string( InventoryType::GearSet0 ) + ", " + + std::to_string( m_id ) + ", " + std::to_string( uniqueId ) + ", " + std::to_string( bodyUid ) + ", " + std::to_string( handsUid ) + ", " + From b51af5fd66e91f48d7c3f916d53d7fbd58f9d4e8 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 17 Sep 2018 23:28:29 +0200 Subject: [PATCH 3/3] Indices for models also adjusted --- src/common/Common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index a9e84949..96d33e30 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -126,8 +126,8 @@ enum GearModelSlot : int8_t ModelHands = 2, ModelLegs = 3, ModelFeet = 4, - ModelNeck = 5, - ModelEar = 6, + ModelEar = 5, + ModelNeck = 6, ModelWrist = 7, ModelRing1 = 8, ModelRing2 = 9