diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-01 00:23:09 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-01 00:23:09 +0100 |
commit | a814eb65b15c4fcef6a37adc1b13905d4c13b2a5 (patch) | |
tree | 92cdc86ad30e96ba36a60c9448c38b62d554d651 | |
parent | ede97a52e9077cca59e1dffbc83fbce83fedd031 (diff) |
Core/Spells: Implemented pausing spell cooldowns
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellHistory.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Spells/SpellHistory.h | 5 |
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 { }; |