diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index e65aacf0..3b324f5c 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -774,6 +774,8 @@ uint32_t Sapphire::Entity::Chara::getBonusStat( Sapphire::Common::BaseParam base auto index = static_cast< uint32_t >( baseParam ); assert( index < m_bonusStats.size() ); + if( isPlayer() ) + auto val = m_bonusStats[ index ]; return m_bonusStats[ index ]; } diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index a1971390..b2f80dc9 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -27,8 +27,8 @@ namespace Sapphire::Entity using ActorStatsArray = std::array< uint32_t, STAT_ARRAY_SIZE >; - ActorStatsArray m_baseStats; - ActorStatsArray m_bonusStats; + ActorStatsArray m_baseStats{ 0 }; + ActorStatsArray m_bonusStats{ 0 }; protected: char m_name[34]; diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 1d5118c1..0936ac89 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -227,8 +227,10 @@ void Sapphire::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, Item& auto baseParams = item.getBaseParams(); for( auto i = 0; i < 6; ++i ) { - if( baseParams[ i ].baseParam != static_cast< uint8_t >( Common::BaseParam::None ) ) - m_bonusStats[ baseParams[ i ].baseParam ] += baseParams[ i ].value; + 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(); @@ -257,8 +259,10 @@ void Sapphire::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, Ite auto baseParams = item.getBaseParams(); for( auto i = 0; i < 6; ++i ) { - if( baseParams[ i ].baseParam != static_cast< uint8_t >( Common::BaseParam::None ) ) - m_bonusStats[ baseParams[ i ].baseParam ] -= baseParams[ i ].value; + 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(); diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index 30eeb9ae..6c020626 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -167,7 +167,11 @@ void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player ) void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player ) { + auto& server = Common::Service< World::WorldServer >::ref(); + player.sendToInRangeSet( std::make_shared< UpdateHpMpTpPacket >( player ), true ); + auto hudParamPacket = makeHudParam( player ); + server.queueForPlayer( player.getCharacterId(), hudParamPacket ); } void PlayerMgr::onPlayerItemLevelUpdate( Entity::Player& player ) diff --git a/src/world/Manager/WarpMgr.cpp b/src/world/Manager/WarpMgr.cpp index 3ad81550..f6c67b51 100644 --- a/src/world/Manager/WarpMgr.cpp +++ b/src/world/Manager/WarpMgr.cpp @@ -117,7 +117,6 @@ void WarpMgr::finishWarp( Entity::Player& player ) server.queueForPlayer( player.getCharacterId(), zoneInPacket ); playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas ); - } void WarpMgr::requestPlayerTeleport( Entity::Player& player, uint16_t aetheryteId, uint8_t teleportType ) diff --git a/src/world/Math/CalcStats.cpp b/src/world/Math/CalcStats.cpp index 95d1fbe0..b62070fb 100644 --- a/src/world/Math/CalcStats.cpp +++ b/src/world/Math/CalcStats.cpp @@ -139,15 +139,16 @@ uint32_t CalcStats::calculateMaxHp( Player& player ) auto vitMod = player.getBonusStat( Common::BaseParam::Vitality ); float baseStat = calculateBaseStat( player ); - uint16_t vitStat = static_cast< uint16_t >( player.getStatValue( Common::BaseParam::Vitality ) ) + static_cast< uint16_t >( vitMod ); + auto baseParamVit = player.getStatValue( Common::BaseParam::Vitality ); + auto vitStat = player.getStatValue( Common::BaseParam::Vitality ) + vitMod; uint16_t hpMod = paramGrowthInfo->data().ParamBase; uint16_t jobModHp = classInfo->data().Hp; float approxBaseHp = 0.0f; // Read above approxBaseHp = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::HP ] ); - uint16_t result = static_cast< uint16_t >( floor( jobModHp * ( approxBaseHp / 100.0f ) ) + - floor( hpMod / 100.0f * ( vitStat - baseStat ) ) ); + auto result = static_cast< uint32_t >( floor( jobModHp * ( approxBaseHp / 100.0f ) ) + + floor( hpMod / 100.0f * ( vitStat - baseStat ) ) ); return result; } @@ -176,7 +177,7 @@ uint32_t CalcStats::calculateMaxHp( Chara& chara ) approxBaseHp = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::HP ] ); - uint16_t result = static_cast< uint16_t >( floor( jobModHp * ( approxBaseHp / 100.0f ) ) + + auto result = static_cast< uint32_t >( floor( jobModHp * ( approxBaseHp / 100.0f ) ) + floor( hpMod / 100.0f * ( vitStat - baseStat ) ) ); return result; diff --git a/src/world/Network/PacketWrappers/HudParamPacket.h b/src/world/Network/PacketWrappers/HudParamPacket.h index 2e7f7f71..9ca61bec 100644 --- a/src/world/Network/PacketWrappers/HudParamPacket.h +++ b/src/world/Network/PacketWrappers/HudParamPacket.h @@ -7,7 +7,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server { /** - * @brief The Ping response packet. + * @brief HUD stats packet. */ class HudParamPacket : public ZoneChannelPacket< FFXIVIpcHudParam > {