From 2ae6600a03f5f547d09156a822ba9e3c8c4807e6 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Fri, 10 Feb 2023 17:14:09 -0300 Subject: [PATCH] fix bonus stats being unset on login; --- src/world/Actor/Player.cpp | 2 ++ src/world/Actor/Player.h | 4 +++ src/world/Actor/PlayerInventory.cpp | 56 ++++++++++++++++------------- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 08e10aed..4147b2d5 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -317,6 +317,8 @@ void Player::removeOnlineStatus( const std::vector< Common::OnlineStatus >& stat void Player::calculateStats() { + calculateBonusStats(); + uint8_t tribe = getLookAt( Common::CharaLook::Tribe ); uint8_t level = getLevel(); auto job = static_cast< uint8_t >( getClass() ); diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 756a40d2..9bf2e4c9 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -741,6 +741,10 @@ namespace Sapphire::Entity /*! calculate and return player ilvl based off equipped gear */ uint16_t calculateEquippedGearItemLevel(); + + /*! calculate bonus stats from gear */ + void calculateBonusStats(); + ItemPtr getEquippedWeapon(); /*! return the current amount of currency of type */ diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 0936ac89..ad0e7aed 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -224,18 +224,6 @@ void Sapphire::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, Item& updateModels( equipSlotId, item ); - auto baseParams = item.getBaseParams(); - for( auto i = 0; i < 6; ++i ) - { - auto itemBaseParam = baseParams[ i ].baseParam; - auto itemBaseVal = baseParams[ i ].value; - if( itemBaseParam != static_cast< uint8_t >( Common::BaseParam::None ) ) - m_bonusStats[ itemBaseParam ] += itemBaseVal; - } - - m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::Defense ) ] += item.getDefense(); - m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::MagicDefense ) ] += item.getDefenseMag(); - calculateStats(); if( sendUpdate ) { @@ -256,18 +244,6 @@ void Sapphire::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, Ite if ( equipSlotId == SoulCrystal ) unequipSoulCrystal(); - auto baseParams = item.getBaseParams(); - for( auto i = 0; i < 6; ++i ) - { - auto itemBaseParam = baseParams[ i ].baseParam; - auto itemBaseVal = baseParams[ i ].value; - if( itemBaseParam != static_cast< uint8_t >( Common::BaseParam::None ) ) - m_bonusStats[ itemBaseParam ] -= itemBaseVal; - } - - m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::Defense ) ] -= item.getDefense(); - m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::MagicDefense ) ] -= item.getDefenseMag(); - calculateStats(); if( sendUpdate ) @@ -955,6 +931,38 @@ uint16_t Sapphire::Entity::Player::calculateEquippedGearItemLevel() return ilvl; } +void Sapphire::Entity::Player::calculateBonusStats() +{ + m_bonusStats.fill( 0 ); + + auto gearSetMap = m_storageMap[ GearSet0 ]->getItemMap(); + + auto it = gearSetMap.begin(); + + while( it != gearSetMap.end() ) + { + auto pItem = it->second; + + if( pItem && pItem->getCategory() != Common::ItemUICategory::SoulCrystal ) + { + auto baseParams = pItem->getBaseParams(); + for( auto i = 0; i < 6; ++i ) + { + auto itemBaseParam = baseParams[ i ].baseParam; + auto itemBaseVal = baseParams[ i ].value; + if( itemBaseParam != static_cast< uint8_t >( Common::BaseParam::None ) ) + m_bonusStats[ itemBaseParam ] += itemBaseVal; + } + + m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::Defense ) ] += pItem->getDefense(); + m_bonusStats[ static_cast< uint8_t >( Common::BaseParam::MagicDefense ) ] += pItem->getDefenseMag(); + } + + it++; + } +} + + Sapphire::ItemPtr Sapphire::Entity::Player::getEquippedWeapon() { return m_storageMap[ GearSet0 ]->getItem( GearSetSlot::MainHand );