Core/Players: Move power regeneration calculations to Player::UpdatePowerRegen

(cherry picked from commit a7dab01c2dc7105f5feddcbd4bf5489b330d70b5)
This commit is contained in:
r4dish
2026-05-29 20:04:29 +02:00
committed by Shauren
parent e47aa4d85f
commit 7de1b541e7
5 changed files with 139 additions and 115 deletions
+3 -59
View File
@@ -1647,68 +1647,12 @@ void Player::Regenerate(Powers power)
if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS)
return;
/// @todo possible use of miscvalueb instead of amount
if (HasAuraTypeWithValue(SPELL_AURA_PREVENT_REGENERATE_POWER, power))
return;
int32 curValue = GetPower(power);
// TODO: updating haste should update UnitData::PowerRegenFlatModifier for certain power types
PowerTypeEntry const* powerType = sDB2Manager.GetPowerTypeEntry(power);
if (!powerType)
return;
float addvalue = 0.0f;
if (!IsInCombat())
{
if (powerType->GetFlags().HasFlag(PowerTypeFlags::UseRegenInterrupt) && m_regenInterruptTimestamp + Milliseconds(powerType->RegenInterruptTimeMS) >= GameTime::Now())
return;
addvalue = (powerType->RegenPeace + m_unitData->PowerRegenFlatModifier[powerIndex]) * 0.001f * m_regenTimer;
}
else
addvalue = (powerType->RegenCombat + m_unitData->PowerRegenInterruptedFlatModifier[powerIndex]) * 0.001f * m_regenTimer;
static Rates const RatesForPower[MAX_POWERS] =
{
RATE_POWER_MANA,
RATE_POWER_RAGE_LOSS,
RATE_POWER_FOCUS,
RATE_POWER_ENERGY,
RATE_POWER_COMBO_POINTS_LOSS,
MAX_RATES, // runes
RATE_POWER_RUNIC_POWER_LOSS,
RATE_POWER_SOUL_SHARDS,
RATE_POWER_LUNAR_POWER,
RATE_POWER_HOLY_POWER,
MAX_RATES, // alternate
RATE_POWER_MAELSTROM,
RATE_POWER_CHI,
RATE_POWER_INSANITY,
MAX_RATES, // burning embers, unused
MAX_RATES, // demonic fury, unused
RATE_POWER_ARCANE_CHARGES,
RATE_POWER_FURY,
RATE_POWER_PAIN,
RATE_POWER_ESSENCE,
MAX_RATES, // runes
MAX_RATES, // runes
MAX_RATES, // runes
MAX_RATES, // alternate
MAX_RATES, // alternate
MAX_RATES, // alternate
};
if (RatesForPower[power] != MAX_RATES)
addvalue *= sWorld->getRate(RatesForPower[power]);
// Mana regen calculated in Player::UpdateManaRegen(), energy regen calculated in Player::UpdateEnergyRegen()
if (power != POWER_MANA && power != POWER_ENERGY)
{
addvalue *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, power);
addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * static_cast<float>(m_regenTimer) / static_cast<float>(5 * IN_MILLISECONDS);
}
int32 curValue = GetPower(power);
float addvalue = GetPowerRegen(power) * 0.001f * m_regenTimer;
int32 minPower = powerType->MinPower;
int32 maxPower = GetMaxPower(power);
@@ -5393,7 +5337,7 @@ void Player::UpdateRating(CombatRating cr)
ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true);
ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true);
if (GetClass() == CLASS_DEATH_KNIGHT)
UpdateAllRunesRegen();
UpdatePowerRegen(POWER_RUNES);
break;
case CR_HASTE_RANGED:
ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false);