aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2023-11-18 21:04:17 +0100
committerOvahlord <dreadkiller@gmx.de>2023-11-18 21:04:17 +0100
commitcf0ba9f4351053d2d1c82ea769a1a2c1d3c0cb50 (patch)
treef6db6ee5c078e63ec6c8c1b57b12e3bbeefc8a48
parenta1401decb62ae4ab612983e75a99cf917995bd05 (diff)
Core/Units: re-implement the MP5 mana regeneration rule
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Spells/Spell.cpp3
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());
}
}