diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2018-01-01 17:17:49 -0300 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-04-27 23:56:35 +0200 |
| commit | b426e64c39d47b70a92fe029c0af7bbf85ea9d30 (patch) | |
| tree | d993b7b51cdef6f177635f5254f9ea145d8aea58 | |
| parent | e0afca513a9bfbd82134942e1266e46811707cbb (diff) | |
Core/Entities: fix crash
- m_currentSpells and spell would be different in case cancelation of a channeled spell would remove the aura, and aura scripted to cast another channeled spell on remove
- In the above situation, we would lose reference of currentSpell and remove reference from wrong one, this was fixed by clearing the pointer before spell cancelation.
Closes #20172
(cherry picked from commit 5e284d4b3826cd345193298688c1d2bc5b3c8f72)
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 12 |
2 files changed, 11 insertions, 8 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f0fb4fd7efc..91763b7e685 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3093,14 +3093,15 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi if (GetTypeId() == TYPEID_PLAYER) ToPlayer()->SendAutoRepeatCancel(this); + m_currentSpells[spellType] = nullptr; + if (spell->getState() != SPELL_STATE_FINISHED) spell->cancel(); + else + spell->SetReferencedFromCurrent(false); if (GetTypeId() == TYPEID_UNIT && IsAIEnabled) ToCreature()->AI()->OnSpellCastInterrupt(spell->GetSpellInfo()); - - m_currentSpells[spellType] = nullptr; - spell->SetReferencedFromCurrent(false); } } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 83720573430..97cd6f64d20 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3372,13 +3372,15 @@ void Spell::_cast(bool skipCheck) CallScriptAfterCastHandlers(); - if (const std::vector<int32> *spell_triggered = sSpellMgr->GetSpellLinked(m_spellInfo->Id)) + if (std::vector<int32> const* spell_triggered = sSpellMgr->GetSpellLinked(m_spellInfo->Id)) { - for (std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i) - if (*i < 0) - m_caster->RemoveAurasDueToSpell(-(*i)); + for (int32 id : *spell_triggered) + { + if (id < 0) + m_caster->RemoveAurasDueToSpell(-id); else - m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, *i, true); + m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, id, true); + } } if (modOwner) |
