aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-03-31 00:19:43 +0200
committerShauren <shauren.trinity@gmail.com>2023-03-31 00:19:43 +0200
commit15451ce699540c7d175f4a24d257778dedb0e3d7 (patch)
tree8e31916ab6048d2ec75cfe5b9c66048930e1c865
parent81cf682cfe0ba30931f9588f83e1e072325defce (diff)
Core/Auras: Fixed iterator invalidation crash with procs using SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE attribute
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp23
2 files changed, 14 insertions, 11 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6a422b65201..e3d661a54d2 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -9911,7 +9911,7 @@ void Unit::GetProcAurasTriggeredOnEvent(AuraApplicationProcContainer& aurasTrigg
if (SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(aurApp->GetBase()->GetSpellInfo()))
{
aurApp->GetBase()->PrepareProcChargeDrop(procEntry, eventInfo);
- aurApp->GetBase()->ConsumeProcCharges(procEntry);
+ aurasTriggeringProc.emplace_back(0, aurApp);
}
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 8fd19d2804a..b40083c4d87 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1943,20 +1943,23 @@ float Aura::CalcProcChance(SpellProcEntry const& procEntry, ProcEventInfo& event
void Aura::TriggerProcOnEvent(uint32 procEffectMask, AuraApplication* aurApp, ProcEventInfo& eventInfo)
{
- bool prevented = CallScriptProcHandlers(aurApp, eventInfo);
- if (!prevented)
+ if (procEffectMask)
{
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ bool prevented = CallScriptProcHandlers(aurApp, eventInfo);
+ if (!prevented)
{
- if (!(procEffectMask & (1 << i)))
- continue;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (!(procEffectMask & (1 << i)))
+ continue;
- // OnEffectProc / AfterEffectProc hooks handled in AuraEffect::HandleProc()
- if (aurApp->HasEffect(i))
- GetEffect(i)->HandleProc(aurApp, eventInfo);
- }
+ // OnEffectProc / AfterEffectProc hooks handled in AuraEffect::HandleProc()
+ if (aurApp->HasEffect(i))
+ GetEffect(i)->HandleProc(aurApp, eventInfo);
+ }
- CallScriptAfterProcHandlers(aurApp, eventInfo);
+ CallScriptAfterProcHandlers(aurApp, eventInfo);
+ }
}
ConsumeProcCharges(ASSERT_NOTNULL(sSpellMgr->GetSpellProcEntry(GetSpellInfo())));