From a7fc43a2d5153a101ad071b674cf8b11ff2715b8 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Tue, 16 Oct 2018 20:06:30 +0300 Subject: [PATCH 1/4] Add ArmorySoulCrystal on new character creation. --- src/servers/sapphire_api/PlayerMinimal.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/servers/sapphire_api/PlayerMinimal.cpp b/src/servers/sapphire_api/PlayerMinimal.cpp index d117eea0..db375d03 100644 --- a/src/servers/sapphire_api/PlayerMinimal.cpp +++ b/src/servers/sapphire_api/PlayerMinimal.cpp @@ -319,6 +319,7 @@ void PlayerMinimal::saveAsNew() createInvDbContainer( InventoryType::ArmoryWrist ); createInvDbContainer( InventoryType::ArmoryRing ); createInvDbContainer( InventoryType::ArmoryMain ); + createInvDbContainer( InventoryType::ArmorySoulCrystal ); createInvDbContainer( InventoryType::Currency ); createInvDbContainer( InventoryType::Crystal ); From 30c80450e23c62f56ec940f4ed174a753d1684db Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Wed, 17 Oct 2018 23:25:41 +0300 Subject: [PATCH 2/4] Implements class change on weapon swap. --- .../sapphire_zone/Actor/PlayerInventory.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index a40ce99f..e8c51b73 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -122,16 +122,12 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - - auto currentClass = getClass(); + auto classJobInfo = exdData->get< Core::Data::ClassJob >( (uint32_t)getClass() ); + auto currentParentClass = static_cast< ClassJob >(classJobInfo->classJobParent); auto newClassJob = static_cast< ClassJob >( itemClassJob ); - if( isClassJobUnlocked( newClassJob ) ) - return; - - // todo: check if soul crystal is equipped and use job instead - - setClassJob( newClassJob ); + if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) + setClassJob( newClassJob ); } // equip an item @@ -160,8 +156,7 @@ void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::It case MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; - // TODO: add job change upon changing weapon if needed - // equipWeapon( pItem ); + equipWeapon( pItem ); break; case OffHand: From 8d96779a8ec2fc60d0d56f76a1503c47544f7c58 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Thu, 18 Oct 2018 07:48:34 +0300 Subject: [PATCH 3/4] Code style. --- src/servers/sapphire_zone/Actor/PlayerInventory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index e8c51b73..80d62605 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -122,8 +122,8 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto itemInfo = exdData->get< Core::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - auto classJobInfo = exdData->get< Core::Data::ClassJob >( (uint32_t)getClass() ); - auto currentParentClass = static_cast< ClassJob >(classJobInfo->classJobParent); + auto classJobInfo = exdData->get< Core::Data::ClassJob >( ( uint32_t )getClass() ); + auto currentParentClass = static_cast< ClassJob >( classJobInfo->classJobParent ); auto newClassJob = static_cast< ClassJob >( itemClassJob ); if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) From 17f342d86cae24dbe2a63a0af653d212e41b2156 Mon Sep 17 00:00:00 2001 From: Squall Leonhart <43782392+Squall5668@users.noreply.github.com> Date: Thu, 18 Oct 2018 20:59:04 +0300 Subject: [PATCH 4/4] Fixes logon crash when using weapon of another class. --- src/servers/sapphire_zone/Actor/Player.h | 4 ++-- .../sapphire_zone/Actor/PlayerInventory.cpp | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index fd5f4a65..ce984909 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -324,7 +324,7 @@ public: void unequipItem( Common::GearSetSlot equipSlotId, ItemPtr pItem ); /*! equip a weapon, possibly forcing a job change */ - void equipWeapon( ItemPtr pItem ); + void equipWeapon( ItemPtr pItem, bool updateClass ); /*! get player ilvl */ uint16_t getItemLevel() const; @@ -356,7 +356,7 @@ 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 ); + void updateModels( Common::GearSetSlot equipSlotId, const Core::ItemPtr& pItem, bool updateClass ); Common::GearModelSlot equipSlotToModelSlot( Common::GearSetSlot slot ); diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 80d62605..bd7c1272 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -114,7 +114,7 @@ void Core::Entity::Player::sendItemLevel() queuePacket( makeActorControl142( getId(), SetItemLevel, getItemLevel(), 0 ) ); } -void Core::Entity::Player::equipWeapon( ItemPtr pItem ) +void Core::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) { auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); if( !exdData ) @@ -127,7 +127,12 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) auto newClassJob = static_cast< ClassJob >( itemClassJob ); if( ( isClassJobUnlocked( newClassJob ) ) && ( currentParentClass != newClassJob ) ) - setClassJob( newClassJob ); + { + if ( updateClass ) + setClassJob( newClassJob ); + else + return; + } } // equip an item @@ -135,18 +140,18 @@ void Core::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, ItemPtr p { //g_framework.getLogger().debug( "Equipping into slot " + std::to_string( equipSlotId ) ); - - updateModels( equipSlotId, pItem ); - if( sendUpdate ) { + updateModels( equipSlotId, pItem, true ); this->sendModel(); m_itemLevel = calculateEquippedGearItemLevel(); sendItemLevel(); } + else + updateModels( equipSlotId, pItem, false ); } -void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::ItemPtr& pItem ) +void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::ItemPtr& pItem, bool updateClass ) { uint64_t model = pItem->getModelId1(); uint64_t model2 = pItem->getModelId2(); @@ -156,7 +161,7 @@ void Core::Entity::Player::updateModels( GearSetSlot equipSlotId, const Core::It case MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; - equipWeapon( pItem ); + equipWeapon( pItem, updateClass ); break; case OffHand: