From d366182faeea9355113606360ebce38a1ae55591 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 1 Aug 2026 00:35:32 +0200 Subject: [PATCH] Core/Spells: Improve spell interruption for SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL and SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING * Fixed spells being interrupted when casting channeled spells with SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL * Check both attributes when starting autorepeat spells --- src/server/game/Entities/Unit/Unit.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d2434ee8f4..797058035b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3118,17 +3118,23 @@ void Unit::SetCurrentCastSpell(Spell* pSpell) } case CURRENT_CHANNELED_SPELL: { - // channel spells always break generic non-delayed and any channeled spells - InterruptSpell(CURRENT_GENERIC_SPELL, false); + // channel spells always break other channeled spells InterruptSpell(CURRENT_CHANNELED_SPELL); - // it also does break autorepeat if not Auto Shot - if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && - m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->GetSpellInfo()->Id != 75) - InterruptSpell(CURRENT_AUTOREPEAT_SPELL); - if (!pSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL)) + { + // channel spells break generic non-delayed + if (m_currentSpells[CURRENT_GENERIC_SPELL] + && !m_currentSpells[CURRENT_GENERIC_SPELL]->GetSpellInfo()->HasAttribute(SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING)) + InterruptSpell(CURRENT_GENERIC_SPELL, false); + + // it also does break autorepeat if not Auto Shot + if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && + m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->GetSpellInfo()->Id != 75) + InterruptSpell(CURRENT_AUTOREPEAT_SPELL); + AddUnitState(UNIT_STATE_CASTING); + } break; } @@ -3142,7 +3148,11 @@ void Unit::SetCurrentCastSpell(Spell* pSpell) { // generic autorepeats break generic non-delayed and channeled non-delayed spells InterruptSpell(CURRENT_GENERIC_SPELL, false); - InterruptSpell(CURRENT_CHANNELED_SPELL, false); + + if (m_currentSpells[CURRENT_CHANNELED_SPELL] + && !m_currentSpells[CURRENT_CHANNELED_SPELL]->GetSpellInfo()->HasAttribute(SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL) + && !pSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING)) + InterruptSpell(CURRENT_CHANNELED_SPELL, false); } break;