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;