diff options
author | Ovahlord <dreadkiller@gmx.de> | 2023-11-18 21:04:17 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2023-11-18 21:04:17 +0100 |
commit | cf0ba9f4351053d2d1c82ea769a1a2c1d3c0cb50 (patch) | |
tree | f6db6ee5c078e63ec6c8c1b57b12e3bbeefc8a48 | |
parent | a1401decb62ae4ab612983e75a99cf917995bd05 (diff) |
Core/Units: re-implement the MP5 mana regeneration rule
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 |
6 files changed, 22 insertions, 5 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d4f83a03d87..9abcc58623b 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -929,9 +929,13 @@ void Creature::Regenerate(Powers power) // Combat and any controlled creature if (IsInCombat() || GetCharmerOrOwnerGUID().IsEmpty()) { - float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA); + if (!IsPowerRegenInterruptedByMP5Rule()) + { + float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA); + float Spirit = GetStat(STAT_SPIRIT); - addvalue = uint32((27.0f / 5.0f + 17.0f) * ManaIncreaseRate); + addvalue = uint32((Spirit / 5.0f + 17.0f) * ManaIncreaseRate); + } } else addvalue = maxValue / 3; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f1a9831ab7b..8bbb5fceb4d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1770,7 +1770,7 @@ void Player::Regenerate(Powers power) addvalue = (powerType->RegenPeace + m_unitData->PowerRegenFlatModifier[powerIndex]) * 0.001f * m_regenTimer; } - else + else if (power != POWER_MANA || !IsPowerRegenInterruptedByMP5Rule()) addvalue = (powerType->RegenCombat + m_unitData->PowerRegenInterruptedFlatModifier[powerIndex]) * 0.001f * m_regenTimer; static Rates const RatesForPower[MAX_POWERS] = diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index fd5464cdddd..b6b33a2b5c3 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -813,8 +813,8 @@ void Player::UpdateManaRegen() if (modManaRegenInterrupt > 100) modManaRegenInterrupt = 100; - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenFlatModifier, manaIndex), power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt)); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenInterruptedFlatModifier, manaIndex), power_regen_mp5 + power_regen); + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenInterruptedFlatModifier, manaIndex), power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt)); + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PowerRegenFlatModifier, manaIndex), power_regen_mp5 + power_regen); } void Player::UpdateAllRunesRegen() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6a82f474d95..d9f169de1cb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -325,6 +325,7 @@ Unit::Unit(bool isWorldObject) : m_movementCounter = 0; + _regenMP5InterruptStartTime = 0; m_state = 0; m_deathState = ALIVE; @@ -7712,6 +7713,11 @@ int32 Unit::MeleeDamageBonusTaken(Unit* attacker, int32 pdamage, WeaponAttackTyp return int32(std::max(tmpDamage, 0.0f)); } +bool Unit::IsPowerRegenInterruptedByMP5Rule() const +{ + return Milliseconds(getMSTimeDiff(_regenMP5InterruptStartTime, GameTime::GetGameTimeMS())) < 5s; +} + void Unit::ApplySpellImmune(uint32 spellId, SpellImmunity op, uint32 type, bool apply) { if (apply) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 4da6b7e7dbe..96c3ae25602 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1688,6 +1688,9 @@ class TC_GAME_API Unit : public WorldObject static uint32 SpellCriticalDamageBonus(Unit const* caster, SpellInfo const* spellProto, uint32 damage, Unit* victim); static uint32 SpellCriticalHealingBonus(Unit const* caster, SpellInfo const* spellProto, uint32 damage, Unit* victim); + void SetMP5RegenerationInterruptTime(uint32 spellCastTime) { _regenMP5InterruptStartTime = spellCastTime; } + bool IsPowerRegenInterruptedByMP5Rule() const; + void ApplySpellImmune(uint32 spellId, SpellImmunity op, uint32 type, bool apply); bool IsImmunedToSpell(SpellInfo const* spellInfo, WorldObject const* caster, bool requireImmunityPurgesEffectAttribute = false) const; uint32 GetSchoolImmunityMask() const; @@ -2011,6 +2014,7 @@ class TC_GAME_API Unit : public WorldObject private: + uint32 _regenMP5InterruptStartTime; uint32 m_state; // Even derived shouldn't modify TimeTracker m_splineSyncTimer; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 1f322e5ace2..88375d16867 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5438,6 +5438,9 @@ void Spell::TakePower() } unitCaster->ModifyPower(powerType, -cost.Amount); + + if (powerType == POWER_MANA) + unitCaster->SetMP5RegenerationInterruptTime(GameTime::GetGameTimeMS()); } } |