diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-06-28 16:19:14 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-06-28 16:19:14 +0200 |
commit | 3365e6a4b84f59cca5f7ef5fca71fb3979697e52 (patch) | |
tree | 8318d3cb0a2b820a35ba3e4242d1b108d3c622db /src | |
parent | 270b53b26ad833314321a1d93a9415ee068b970d (diff) |
Core/Spells: Implemented SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 2 |
4 files changed, 15 insertions, 10 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d8e841dcbba..acbcac3d13c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -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(); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 5e123b642df..108d1d1ea5b 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -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 diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index e6fb8369fe9..270ad107787 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -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; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c3774b97172..5b6d62d1f3f 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -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); |