diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 9f23f425054..a16e3283410 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4903,7 +4903,7 @@ void Spell::SendChannelStart(uint32 duration) { packet.InterruptImmunities.emplace(); packet.InterruptImmunities->SchoolImmunities = schoolImmunityMask; // CastSchoolImmunities - packet.InterruptImmunities->SchoolImmunities = mechanicImmunityMask; // CastImmunities + packet.InterruptImmunities->Immunities = mechanicImmunityMask; // CastImmunities } if (m_spellInfo->HasAttribute(SPELL_ATTR8_HEAL_PREDICTION)) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index c9d028ac661..23a0f22dde8 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3280,12 +3280,17 @@ uint32 SpellInfo::GetAllowedMechanicMask() const uint32 SpellInfo::GetMechanicImmunityMask(Unit* caster) const { - if (HasAttribute(SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED)) - return 0; + bool canBeInterrupted = [&]() + { + return HasAttribute(SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED) + || HasChannelInterruptFlag(SpellAuraInterruptFlags::Damage | SpellAuraInterruptFlags::EnteringCombat) + || (caster->IsPlayer() && InterruptFlags.HasFlag(SpellInterruptFlags::DamageCancelsPlayerOnly)) + || PreventionType & SPELL_PREVENTION_TYPE_SILENCE; + }(); uint32 casterMechanicImmunityMask = caster->GetMechanicImmunityMask(); uint32 mechanicImmunityMask = 0; - if (CanBeInterrupted(caster)) + if (canBeInterrupted) { if (casterMechanicImmunityMask & (1 << MECHANIC_INTERRUPT)) mechanicImmunityMask |= (1 << MECHANIC_INTERRUPT);