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
This commit is contained in:
Shauren
2026-08-01 00:35:32 +02:00
parent d9f4b7b646
commit d366182fae
+18 -8
View File
@@ -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;