Core/Spells: Implemented SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING
This commit is contained in:
@@ -2980,7 +2980,9 @@ void Unit::SetCurrentCastSpell(Spell* pSpell)
|
||||
InterruptSpell(CURRENT_GENERIC_SPELL, false);
|
||||
|
||||
// generic spells always break channeled not delayed spells
|
||||
if (m_currentSpells[CURRENT_CHANNELED_SPELL] && !m_currentSpells[CURRENT_CHANNELED_SPELL]->GetSpellInfo()->HasAttribute(SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL))
|
||||
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);
|
||||
|
||||
// autorepeat breaking
|
||||
@@ -4095,13 +4097,13 @@ void Unit::RemoveNotOwnSingleTargetAuras(bool onPhaseChange /*= false*/)
|
||||
}
|
||||
|
||||
template<typename InterruptFlag>
|
||||
bool IsInterruptFlagIgnoredForSpell(InterruptFlag /*flag*/, Unit const* /*unit*/, SpellInfo const* /*auraSpellInfo*/, SpellInfo const* /*interruptSource*/)
|
||||
bool IsInterruptFlagIgnoredForSpell(InterruptFlag /*flag*/, Unit const* /*unit*/, SpellInfo const* /*auraSpellInfo*/, bool /*isChannel*/, SpellInfo const* /*interruptSource*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template<>
|
||||
bool IsInterruptFlagIgnoredForSpell(SpellAuraInterruptFlags flag, Unit const* unit, SpellInfo const* auraSpellInfo, SpellInfo const* interruptSource)
|
||||
bool IsInterruptFlagIgnoredForSpell(SpellAuraInterruptFlags flag, Unit const* unit, SpellInfo const* auraSpellInfo, bool isChannel, SpellInfo const* interruptSource)
|
||||
{
|
||||
switch (flag)
|
||||
{
|
||||
@@ -4116,6 +4118,9 @@ bool IsInterruptFlagIgnoredForSpell(SpellAuraInterruptFlags flag, Unit const* un
|
||||
|
||||
if (interruptSource->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_INVISIBLE) && auraSpellInfo->Dispel == DISPEL_INVISIBILITY)
|
||||
return true;
|
||||
|
||||
if (interruptSource->HasAttribute(SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING) && isChannel)
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -4138,7 +4143,7 @@ void Unit::RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const* s
|
||||
++iter;
|
||||
if (aura->GetSpellInfo()->HasAuraInterruptFlag(flag)
|
||||
&& (!source || aura->GetId() != source->Id)
|
||||
&& !IsInterruptFlagIgnoredForSpell(flag, this, aura->GetSpellInfo(), source))
|
||||
&& !IsInterruptFlagIgnoredForSpell(flag, this, aura->GetSpellInfo(), false, source))
|
||||
{
|
||||
uint32 removedAuras = m_removedAurasCount;
|
||||
RemoveAura(aura, AURA_REMOVE_BY_INTERRUPT);
|
||||
@@ -4152,7 +4157,7 @@ void Unit::RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const* s
|
||||
if (spell->getState() == SPELL_STATE_CASTING
|
||||
&& spell->GetSpellInfo()->HasChannelInterruptFlag(flag)
|
||||
&& (!source || spell->GetSpellInfo()->Id != source->Id)
|
||||
&& !IsInterruptFlagIgnoredForSpell(flag, this, spell->GetSpellInfo(), source))
|
||||
&& !IsInterruptFlagIgnoredForSpell(flag, this, spell->GetSpellInfo(), true, source))
|
||||
InterruptNonMeleeSpells(false);
|
||||
|
||||
UpdateInterruptMask();
|
||||
|
||||
@@ -779,7 +779,7 @@ enum SpellAttr9 : uint32
|
||||
SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT = 0x00020000, // TITLE AutoCast Off By Default
|
||||
SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT = 0x00040000, // TITLE Ignore School Lockout
|
||||
SPELL_ATTR9_ALLOW_DARK_SIMULACRUM = 0x00080000, // TITLE Allow Dark Simulacrum
|
||||
SPELL_ATTR9_UNK20 = 0x00100000, // TITLE Unknown attribute 20@Attr9
|
||||
SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING = 0x00100000, // TITLE Allow Cast While Channeling
|
||||
SPELL_ATTR9_UNK21 = 0x00200000, // TITLE Unknown attribute 21@Attr9
|
||||
SPELL_ATTR9_UNK22 = 0x00400000, // TITLE Unknown attribute 22@Attr9
|
||||
SPELL_ATTR9_UNK23 = 0x00800000, // TITLE Unknown attribute 23@Attr9
|
||||
|
||||
@@ -1455,7 +1455,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value)
|
||||
case SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT: return { "SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT", "AutoCast Off By Default", "" };
|
||||
case SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT: return { "SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT", "Ignore School Lockout", "" };
|
||||
case SPELL_ATTR9_ALLOW_DARK_SIMULACRUM: return { "SPELL_ATTR9_ALLOW_DARK_SIMULACRUM", "Allow Dark Simulacrum", "" };
|
||||
case SPELL_ATTR9_UNK20: return { "SPELL_ATTR9_UNK20", "Unknown attribute 20@Attr9", "" };
|
||||
case SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING: return { "SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING", "Allow Cast While Channeling", "" };
|
||||
case SPELL_ATTR9_UNK21: return { "SPELL_ATTR9_UNK21", "Unknown attribute 21@Attr9", "" };
|
||||
case SPELL_ATTR9_UNK22: return { "SPELL_ATTR9_UNK22", "Unknown attribute 22@Attr9", "" };
|
||||
case SPELL_ATTR9_UNK23: return { "SPELL_ATTR9_UNK23", "Unknown attribute 23@Attr9", "" };
|
||||
@@ -1499,7 +1499,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index)
|
||||
case 17: return SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT;
|
||||
case 18: return SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT;
|
||||
case 19: return SPELL_ATTR9_ALLOW_DARK_SIMULACRUM;
|
||||
case 20: return SPELL_ATTR9_UNK20;
|
||||
case 20: return SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING;
|
||||
case 21: return SPELL_ATTR9_UNK21;
|
||||
case 22: return SPELL_ATTR9_UNK22;
|
||||
case 23: return SPELL_ATTR9_UNK23;
|
||||
@@ -1540,7 +1540,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value)
|
||||
case SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT: return 17;
|
||||
case SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT: return 18;
|
||||
case SPELL_ATTR9_ALLOW_DARK_SIMULACRUM: return 19;
|
||||
case SPELL_ATTR9_UNK20: return 20;
|
||||
case SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING: return 20;
|
||||
case SPELL_ATTR9_UNK21: return 21;
|
||||
case SPELL_ATTR9_UNK22: return 22;
|
||||
case SPELL_ATTR9_UNK23: return 23;
|
||||
|
||||
@@ -3482,7 +3482,7 @@ SpellCastResult Spell::prepare(SpellCastTargets const& targets, AuraEffect const
|
||||
}
|
||||
|
||||
// Prevent casting at cast another spell (ServerSide check)
|
||||
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->ToUnit() && m_caster->ToUnit()->IsNonMeleeSpellCast(false, true, true, m_spellInfo->Id == 75) && !m_castId.IsEmpty())
|
||||
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->ToUnit() && m_caster->ToUnit()->IsNonMeleeSpellCast(false, true, true, m_spellInfo->Id == 75))
|
||||
{
|
||||
SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS);
|
||||
finish(SPELL_FAILED_SPELL_IN_PROGRESS);
|
||||
|
||||
Reference in New Issue
Block a user