fix(Core/Player): smooth energy regeneration with SPELL_AURA_MOD_POWER_REGEN_PERCENT mods (#22041)

Co-authored-by: r4dish <ovitnez@gmail.com>
This commit is contained in:
Jelle Meeus
2025-05-04 14:20:59 +02:00
committed by GitHub
parent 3643d80ecf
commit 297f16820e
5 changed files with 32 additions and 35 deletions

View File

@@ -1882,9 +1882,9 @@ void Player::Regenerate(Powers power)
ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA)) * ManaIncreaseRate * 0.001f * m_regenTimer;
else
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA)) * ManaIncreaseRate * 0.001f * m_regenTimer;
}
break;
case POWER_RAGE: // Regenerate rage
@@ -1897,7 +1897,14 @@ void Player::Regenerate(Powers power)
}
break;
case POWER_ENERGY: // Regenerate energy (rogue)
addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
// Regen per second
addvalue += (GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + AsUnderlyingType(POWER_ENERGY)) + 10.f);
// Regen per millisecond
addvalue *= 0.001f;
// Milliseconds passed
addvalue *= m_regenTimer;
// Rate
addvalue *= sWorld->getRate(RATE_POWER_ENERGY);
break;
case POWER_RUNIC_POWER:
{
@@ -1918,8 +1925,8 @@ void Player::Regenerate(Powers power)
break;
}
// Mana regen calculated in Player::UpdateManaRegen()
if (power != POWER_MANA)
// Mana regen calculated in Player::UpdateManaRegen(), energy regen calculated in Player::UpdateEnergyRegen()
if (power != POWER_MANA && power != POWER_ENERGY)
{
AuraEffectList const& ModPowerRegenPCTAuras = GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT);
for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
@@ -1947,7 +1954,6 @@ void Player::Regenerate(Powers power)
addvalue += m_powerFraction[power];
uint32 integerValue = uint32(std::fabs(addvalue));
bool forcedUpdate = false;
if (addvalue < 0.0f)
{
if (curValue > integerValue)
@@ -1959,7 +1965,6 @@ void Player::Regenerate(Powers power)
{
curValue = 0;
m_powerFraction[power] = 0;
forcedUpdate = true;
}
}
else
@@ -1970,22 +1975,15 @@ void Player::Regenerate(Powers power)
{
curValue = maxValue;
m_powerFraction[power] = 0;
forcedUpdate = true;
}
else
{
m_powerFraction[power] = addvalue - integerValue;
}
}
if (m_regenTimerCount >= 2000 || forcedUpdate)
{
if (m_regenTimerCount >= 2000 || curValue == 0 || curValue == maxValue)
SetPower(power, curValue, true, true);
}
else
{
UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
}
UpdateUInt32Value(UNIT_FIELD_POWER1 + AsUnderlyingType(power), curValue);
}
void Player::RegenerateHealth()