fix(Core/Spells): add per-aura SpellTypeMask for auto-generated procs (#24766)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com> Co-authored-by: ariel- <ariel-@users.noreply.github.com>
This commit is contained in:
@@ -1773,6 +1773,7 @@ void SpellMgr::LoadSpellGroupStackRules()
|
|||||||
static bool InitTriggerAuraData();
|
static bool InitTriggerAuraData();
|
||||||
static bool isTriggerAura[TOTAL_AURAS];
|
static bool isTriggerAura[TOTAL_AURAS];
|
||||||
static bool isAlwaysTriggeredAura[TOTAL_AURAS];
|
static bool isAlwaysTriggeredAura[TOTAL_AURAS];
|
||||||
|
static uint32 spellTypeMask[TOTAL_AURAS];
|
||||||
static bool procPrepared = InitTriggerAuraData();
|
static bool procPrepared = InitTriggerAuraData();
|
||||||
|
|
||||||
// List of auras that CAN trigger but may not exist in spell_proc
|
// List of auras that CAN trigger but may not exist in spell_proc
|
||||||
@@ -1785,6 +1786,7 @@ bool InitTriggerAuraData()
|
|||||||
{
|
{
|
||||||
isTriggerAura[i] = false;
|
isTriggerAura[i] = false;
|
||||||
isAlwaysTriggeredAura[i] = false;
|
isAlwaysTriggeredAura[i] = false;
|
||||||
|
spellTypeMask[i] = PROC_SPELL_TYPE_MASK_ALL;
|
||||||
}
|
}
|
||||||
isTriggerAura[SPELL_AURA_DUMMY] = true; // Most dummy auras should require scripting
|
isTriggerAura[SPELL_AURA_DUMMY] = true; // Most dummy auras should require scripting
|
||||||
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true; // "Any direct damaging attack will revive targets"
|
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true; // "Any direct damaging attack will revive targets"
|
||||||
@@ -1828,6 +1830,13 @@ bool InitTriggerAuraData()
|
|||||||
isAlwaysTriggeredAura[SPELL_AURA_SCHOOL_ABSORB] = true;
|
isAlwaysTriggeredAura[SPELL_AURA_SCHOOL_ABSORB] = true;
|
||||||
isAlwaysTriggeredAura[SPELL_AURA_MOD_STEALTH] = true;
|
isAlwaysTriggeredAura[SPELL_AURA_MOD_STEALTH] = true;
|
||||||
|
|
||||||
|
spellTypeMask[SPELL_AURA_MOD_STEALTH] = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL;
|
||||||
|
spellTypeMask[SPELL_AURA_MOD_CONFUSE] = PROC_SPELL_TYPE_DAMAGE;
|
||||||
|
spellTypeMask[SPELL_AURA_MOD_FEAR] = PROC_SPELL_TYPE_DAMAGE;
|
||||||
|
spellTypeMask[SPELL_AURA_MOD_ROOT] = PROC_SPELL_TYPE_DAMAGE;
|
||||||
|
spellTypeMask[SPELL_AURA_MOD_STUN] = PROC_SPELL_TYPE_DAMAGE;
|
||||||
|
spellTypeMask[SPELL_AURA_TRANSFORM] = PROC_SPELL_TYPE_DAMAGE;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2000,6 +2009,7 @@ void SpellMgr::LoadSpellProcs()
|
|||||||
|
|
||||||
// Check if spell has any trigger aura effects
|
// Check if spell has any trigger aura effects
|
||||||
bool found = false, addTriggerFlag = false;
|
bool found = false, addTriggerFlag = false;
|
||||||
|
uint32 procSpellTypeMask = PROC_SPELL_TYPE_NONE;
|
||||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
{
|
{
|
||||||
if (!spellInfo->Effects[i].IsEffect())
|
if (!spellInfo->Effects[i].IsEffect())
|
||||||
@@ -2013,10 +2023,10 @@ void SpellMgr::LoadSpellProcs()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
|
procSpellTypeMask |= spellTypeMask[auraName];
|
||||||
|
|
||||||
if (!addTriggerFlag && isAlwaysTriggeredAura[auraName])
|
if (!addTriggerFlag && isAlwaysTriggeredAura[auraName])
|
||||||
addTriggerFlag = true;
|
addTriggerFlag = true;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
@@ -2038,7 +2048,7 @@ void SpellMgr::LoadSpellProcs()
|
|||||||
procEntry.SpellFamilyMask |= spellInfo->Effects[i].SpellClassMask;
|
procEntry.SpellFamilyMask |= spellInfo->Effects[i].SpellClassMask;
|
||||||
|
|
||||||
procEntry.ProcFlags = spellInfo->ProcFlags;
|
procEntry.ProcFlags = spellInfo->ProcFlags;
|
||||||
procEntry.SpellTypeMask = PROC_SPELL_TYPE_MASK_ALL;
|
procEntry.SpellTypeMask = procSpellTypeMask;
|
||||||
procEntry.SpellPhaseMask = PROC_SPELL_PHASE_HIT;
|
procEntry.SpellPhaseMask = PROC_SPELL_PHASE_HIT;
|
||||||
procEntry.HitMask = PROC_HIT_NONE; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent
|
procEntry.HitMask = PROC_HIT_NONE; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user