aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-01 00:23:09 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-01 00:23:09 +0100
commita814eb65b15c4fcef6a37adc1b13905d4c13b2a5 (patch)
tree92cdc86ad30e96ba36a60c9448c38b62d554d651
parentede97a52e9077cca59e1dffbc83fbce83fedd031 (diff)
Core/Spells: Implemented pausing spell cooldowns
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp3
-rw-r--r--src/server/game/Spells/SpellHistory.cpp29
-rw-r--r--src/server/game/Spells/SpellHistory.h5
3 files changed, 32 insertions, 5 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 291cfedc05a..b998052f502 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2841,7 +2841,8 @@ void Unit::_DeleteRemovedAuras()
void Unit::_UpdateSpells(uint32 time)
{
- _spellHistory->Update();
+ if (!_spellHistory->IsPaused())
+ _spellHistory->Update();
if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
_UpdateAutoRepeatSpell();
diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp
index 6a53ca3452b..144a45a5687 100644
--- a/src/server/game/Spells/SpellHistory.cpp
+++ b/src/server/game/Spells/SpellHistory.cpp
@@ -236,12 +236,9 @@ void SpellHistory::Update()
++itr;
}
- for (auto& p : _categoryCharges)
- {
- std::deque<ChargeEntry>& chargeRefreshTimes = p.second;
+ for (auto& [chargeCategoryId, chargeRefreshTimes] : _categoryCharges)
while (!chargeRefreshTimes.empty() && chargeRefreshTimes.front().RechargeEnd <= now)
chargeRefreshTimes.pop_front();
- }
}
void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, Item const* item, Spell* spell /*= nullptr*/)
@@ -967,6 +964,30 @@ SpellHistory::Duration SpellHistory::GetRemainingGlobalCooldown(SpellInfo const*
return duration_cast<Milliseconds>(remaining);
}
+void SpellHistory::PauseCooldowns()
+{
+ _pauseTime = time_point_cast<Duration>(GameTime::GetTime<Clock>());
+}
+
+void SpellHistory::ResumeCooldowns()
+{
+ if (!_pauseTime)
+ return;
+
+ Duration pausedDuration = time_point_cast<Duration>(GameTime::GetTime<Clock>()) - *_pauseTime;
+
+ for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end();)
+ itr->second.CooldownEnd += pausedDuration;
+
+ for (auto& [chargeCategoryId, chargeRefreshTimes] : _categoryCharges)
+ for (ChargeEntry& chargeEntry : chargeRefreshTimes)
+ chargeEntry.RechargeEnd += pausedDuration;
+
+ _pauseTime.reset();
+
+ Update();
+}
+
Player* SpellHistory::GetPlayerOwner() const
{
return _owner->GetCharmerOrOwnerPlayerOrPlayerItself();
diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h
index b2df3f803b9..f46bbd0c941 100644
--- a/src/server/game/Spells/SpellHistory.h
+++ b/src/server/game/Spells/SpellHistory.h
@@ -174,6 +174,10 @@ public:
void CancelGlobalCooldown(SpellInfo const* spellInfo);
Duration GetRemainingGlobalCooldown(SpellInfo const* spellInfo) const;
+ bool IsPaused() const { return _pauseTime.has_value(); }
+ void PauseCooldowns();
+ void ResumeCooldowns();
+
void SaveCooldownStateBeforeDuel();
void RestoreCooldownStateAfterDuel();
@@ -200,6 +204,7 @@ private:
TimePoint _schoolLockouts[MAX_SPELL_SCHOOL];
ChargeStorageType _categoryCharges;
GlobalCooldownStorageType _globalCooldowns;
+ Optional<TimePoint> _pauseTime;
template<class T>
struct PersistenceHelper { };