Core/Players: Auras that change the rate of energy regeneration should have an effect on client prediction.

(cherry picked from commit 1a3006b20d8c41139b206f610bcb6c22508ec329)
This commit is contained in:
r4dish
2026-05-29 17:24:52 +02:00
committed by Shauren
parent 70dae7b844
commit e47aa4d85f
4 changed files with 20 additions and 3 deletions
+3 -3
View File
@@ -1702,12 +1702,12 @@ void Player::Regenerate(Powers power)
if (RatesForPower[power] != MAX_RATES)
addvalue *= sWorld->getRate(RatesForPower[power]);
// 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)
{
addvalue *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, power);
addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * ((power != POWER_ENERGY) ? m_regenTimerCount : m_regenTimer) / (5 * IN_MILLISECONDS);
addvalue += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, power) * static_cast<float>(m_regenTimer) / static_cast<float>(5 * IN_MILLISECONDS);
}
int32 minPower = powerType->MinPower;
+1
View File
@@ -2255,6 +2255,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void ApplyManaRegenBonus(int32 amount, bool apply);
void ApplyHealthRegenBonus(int32 amount, bool apply);
void UpdateManaRegen();
void UpdateEnergyRegen();
void UpdateAllRunesRegen();
void SetPetSpellPower(uint32 spellPower) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::PetSpellPower), spellPower); }
@@ -825,6 +825,20 @@ void Player::UpdateManaRegen()
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenInterruptedFlatModifier, manaIndex), base_regen);
}
void Player::UpdateEnergyRegen()
{
uint32 energyIndex = GetPowerIndex(POWER_ENERGY);
if (energyIndex == MAX_POWERS)
return;
float regenPerSecond = 10.f; // +10 energy per second
regenPerSecond *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_ENERGY);
regenPerSecond += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_ENERGY) / static_cast<float>(5 * IN_MILLISECONDS);
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenFlatModifier, energyIndex), regenPerSecond - 10.f);
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenInterruptedFlatModifier, energyIndex), regenPerSecond - 10.f);
}
void Player::UpdateAllRunesRegen()
{
if (GetClass() != CLASS_DEATH_KNIGHT)
@@ -4085,6 +4085,8 @@ void AuraEffect::HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode,
// Update manaregen value
if (GetMiscValue() == POWER_MANA)
target->ToPlayer()->UpdateManaRegen();
else if (GetMiscValue() == POWER_ENERGY)
target->ToPlayer()->UpdateEnergyRegen();
else if (GetMiscValue() == POWER_RUNES)
target->ToPlayer()->UpdateAllRunesRegen();
// other powers are not immediate effects - implemented in Player::Regenerate, Creature::Regenerate