aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-06-28 16:19:14 +0200
committerOvahlord <dreadkiller@gmx.de>2024-06-28 18:40:44 +0200
commit315393f1caacd22dcaf1ed486ca0527444b16b80 (patch)
tree656ec8fc4b8d149b6f3afff77cf92f842810b587 /src
parent857cf14d444b93ae5283e3b22e7c539d75fcf26b (diff)
Core/Spells: Implemented SPELL_ATTR9_ALLOW_CAST_WHILE_CHANNELING
(cherry picked from commit 3365e6a4b84f59cca5f7ef5fca71fb3979697e52)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp15
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp6
-rw-r--r--src/server/game/Spells/Spell.cpp2
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 241fa3767f2..1c25acc41d6 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2957,7 +2957,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
@@ -4072,13 +4074,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)
{
@@ -4093,6 +4095,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:
@@ -4115,7 +4120,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);
@@ -4129,7 +4134,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 4847645a05c..f5c14b033e6 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -782,7 +782,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 a80f0ebead8..b28c21cd516 100644
--- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
+++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
@@ -1458,7 +1458,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", "" };
@@ -1502,7 +1502,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;
@@ -1543,7 +1543,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 af9ed25a9d3..3f58f6ffb71 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3479,7 +3479,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);