From e47aa4d85fd4c1fa751c24c94dac05b2a4f1d5a3 Mon Sep 17 00:00:00 2001 From: r4dish Date: Sun, 25 Feb 2024 13:36:50 +0100 Subject: [PATCH] Core/Players: Auras that change the rate of energy regeneration should have an effect on client prediction. (cherry picked from commit 1a3006b20d8c41139b206f610bcb6c22508ec329) --- src/server/game/Entities/Player/Player.cpp | 6 +++--- src/server/game/Entities/Player/Player.h | 1 + src/server/game/Entities/Unit/StatSystem.cpp | 14 ++++++++++++++ src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 ++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5264f36009..302c22a8c1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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(m_regenTimer) / static_cast(5 * IN_MILLISECONDS); } int32 minPower = powerType->MinPower; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8c4112a6d2..1f405d0759 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2255,6 +2255,7 @@ class TC_GAME_API Player final : public Unit, public GridObject 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); } diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index ecc7f9f35a..ed0f2e138f 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -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(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) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 7e1a9f751c..2111c15169 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -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