From fd08f6150f0bacfcc3ea5e999e8b22cb20ba7ccd Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Tue, 20 Sep 2022 12:07:30 -0600 Subject: [PATCH] fix(Core): Hunter Readiness crash fix (#12987) Co-authored-by: Angelo Venturini --- src/server/scripts/Spells/spell_hunter.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 759141d94..bead12996 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -655,13 +655,12 @@ class spell_hun_readiness : public SpellScript SpellCooldowns& cooldowns = caster->GetSpellCooldownMap(); - SpellCooldowns::iterator itr, next; - for (itr = cooldowns.begin(); itr != cooldowns.end(); itr = next) - { - next = itr; - ++next; + std::set> spellsToRemove; + std::set categoriesToRemove; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + for (const auto& [spellId, cooldown] : cooldowns) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo && spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != SPELL_HUNTER_READINESS @@ -669,12 +668,18 @@ class spell_hun_readiness : public SpellScript && spellInfo->Id != SPELL_DRAENEI_GIFT_OF_THE_NAARU) { if (spellInfo->RecoveryTime > 0) - caster->RemoveSpellCooldown(spellInfo->Id, itr->second.needSendToClient); + spellsToRemove.insert(std::make_pair(spellInfo->Id, cooldown.needSendToClient)); if (spellInfo->CategoryRecoveryTime > 0) - caster->RemoveCategoryCooldown(spellInfo->GetCategory()); + categoriesToRemove.insert(spellInfo->GetCategory()); } } + + // we can't remove spell cooldowns while iterating. + for (const auto& [spellId, sendToClient] : spellsToRemove) + caster->RemoveSpellCooldown(spellId, sendToClient); + for (const auto& category : categoriesToRemove) + caster->RemoveCategoryCooldown(category); } void Register() override