From 981e70a5a1daf98e253fd54128ad6292a33b152e Mon Sep 17 00:00:00 2001 From: Ovahlord <18347559+ovahlord@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:43:17 +0200 Subject: [PATCH] Core/Players: fixed health initialization for players after levelups and fixed adding/reducing health based on the player's current health percentage --- src/server/game/Entities/Player/Player.cpp | 21 +++++++++----------- src/server/game/Entities/Unit/StatSystem.cpp | 4 +++- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7f7854f006..04ce55d579 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2246,13 +2246,13 @@ void Player::GiveLevel(uint8 level) UpdateSkillsForLevel(); + SetCreateHealth(basehp); + SetCreateMana(basemana); + // save base values (bonuses already included in stored stats) for (StatType stat : AllStats) GetStats().SetBaseStatValue(stat, info.stats[AsUnderlyingType(stat)]); - SetCreateHealth(basehp); - SetCreateMana(basemana); - InitTalentForLevel(); InitTaxiNodesForLevel(); InitGlyphsForLevel(); @@ -2376,15 +2376,13 @@ void Player::InitStatsForLevel(bool reapplyMods) // reset size before reapply auras SetObjectScale(1.0f); + SetCreateHealth(basehp); + SetCreateMana(basemana); + // save base values (bonuses already included in stored stats for (StatType stat : AllStats) GetStats().SetBaseStatValue(stat, info.stats[AsUnderlyingType(stat)]); - SetCreateHealth(basehp); - - //set create powers - SetCreateMana(basemana); - //reset rating fields values for (uint16 index = PLAYER_FIELD_COMBAT_RATING_1; index < PLAYER_FIELD_COMBAT_RATING_1 + MAX_COMBAT_RATING; ++index) SetUInt32Value(index, 0); @@ -2470,8 +2468,6 @@ void Player::InitStatsForLevel(bool reapplyMods) for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i) SetMaxPower(PowerType(i), GetCreatePowerValue(PowerType(i))); - SetMaxHealth(basehp); // stamina bonus will applied later - // cleanup mounted state (it will set correctly at aura loading if player saved at mount. SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); @@ -17085,6 +17081,9 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol SetGuidValue(PLAYER_DUEL_ARBITER, ObjectGuid::Empty); SetUInt32Value(PLAYER_DUEL_TEAM, 0); + RegisterPowerTypes(); + UpdateDisplayPower(); + // reset stats before loading any modifiers InitStatsForLevel(); InitGlyphsForLevel(); @@ -17116,8 +17115,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol //mails are loaded only when needed ;-) - when player in game click on mailbox. //_LoadMail(); - RegisterPowerTypes(); - UpdateDisplayPower(); _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 46a1fbde1f..b001b45a97 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -351,7 +351,9 @@ void Player::UpdateMaxHealth() value += GetFlatModifierValue(unitMod, TOTAL_VALUE) + GetHealthBonusFromStamina(); value *= GetPctModifierValue(unitMod, TOTAL_PCT); - SetMaxHealth((uint32)value); + float healthPct = GetHealthPct(); + SetMaxHealth(static_cast(value)); + SetHealth(std::max(1, CalculatePct(GetMaxHealth(), healthPct))); } uint32 Player::GetPowerIndex(PowerType power) const