aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-02-10 21:11:07 +0100
committerShauren <shauren.trinity@gmail.com>2022-02-10 21:11:07 +0100
commit02979daf761a5122efa7b8fa3e70509ecd69789e (patch)
tree19df8dfa3ad4ad9aa69ab08a3b58e42e12fc6994 /src/server/game/Spells/Spell.cpp
parent7295bfb6a09b25d824889cfb3698a0774fc01b34 (diff)
Core/Auras: Proc flag updates
* Rename to official names * Corrected logic selecting flags for each spell cast - determine them by attributes instead of DmgClass * Implemented new proc flags (PROC_FLAG_CAST_ENDED, PROC_FLAG_LOOTED)
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp140
1 files changed, 87 insertions, 53 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 60e4e568402..69db8b9c1fa 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2151,24 +2151,24 @@ void Spell::prepareDataForTriggerSystem()
switch (m_spellInfo->DmgClass)
{
case SPELL_DAMAGE_CLASS_MELEE:
- m_procAttacker = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS;
+ m_procAttacker = PROC_FLAG_DEAL_MELEE_ABILITY;
if (m_attackType == OFF_ATTACK)
- m_procAttacker |= PROC_FLAG_DONE_OFFHAND_ATTACK;
+ m_procAttacker |= PROC_FLAG_OFF_HAND_WEAPON_SWING;
else
- m_procAttacker |= PROC_FLAG_DONE_MAINHAND_ATTACK;
- m_procVictim = PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS;
+ m_procAttacker |= PROC_FLAG_MAIN_HAND_WEAPON_SWING;
+ m_procVictim = PROC_FLAG_TAKE_MELEE_ABILITY;
break;
case SPELL_DAMAGE_CLASS_RANGED:
// Auto attack
if (m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
{
- m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK;
- m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK;
+ m_procAttacker = PROC_FLAG_DEAL_RANGED_ATTACK;
+ m_procVictim = PROC_FLAG_TAKE_RANGED_ATTACK;
}
else // Ranged spell attack
{
- m_procAttacker = PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS;
- m_procVictim = PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS;
+ m_procAttacker = PROC_FLAG_DEAL_RANGED_ABILITY;
+ m_procVictim = PROC_FLAG_TAKE_RANGED_ABILITY;
}
break;
default:
@@ -2176,32 +2176,12 @@ void Spell::prepareDataForTriggerSystem()
m_spellInfo->EquippedItemSubClassMask & (1 << ITEM_SUBCLASS_WEAPON_WAND)
&& m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG)) // Wands auto attack
{
- m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK;
- m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK;
+ m_procAttacker = PROC_FLAG_DEAL_RANGED_ATTACK;
+ m_procVictim = PROC_FLAG_TAKE_RANGED_ATTACK;
}
// For other spells trigger procflags are set in Spell::TargetInfo::DoDamageAndTriggers
// Because spell positivity is dependant on target
}
-
- // Hunter trap spells - activation proc for Lock and Load, Entrapment and Misdirection
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER &&
- (m_spellInfo->SpellFamilyFlags[0] & 0x18 || // Freezing and Frost Trap, Freezing Arrow
- m_spellInfo->Id == 57879 || // Snake Trap - done this way to avoid double proc
- m_spellInfo->SpellFamilyFlags[2] & 0x00024000)) // Explosive and Immolation Trap
- {
- m_procAttacker |= PROC_FLAG_DONE_TRAP_ACTIVATION;
-
- // also fill up other flags (TargetInfo::DoDamageAndTriggers only fills up flag if both are not set)
- m_procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG;
- m_procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG;
- }
-
- // Hellfire Effect - trigger as DOT
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags[0] & 0x00000040)
- {
- m_procAttacker = PROC_FLAG_DONE_PERIODIC;
- m_procVictim = PROC_FLAG_TAKEN_PERIODIC;
- }
}
void Spell::CleanupTargetList()
@@ -2224,7 +2204,7 @@ class ProcReflectDelayed : public BasicEvent
return true;
ProcFlags const typeMaskActor = PROC_FLAG_NONE;
- ProcFlags const typeMaskActionTarget = PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG;
+ ProcFlags const typeMaskActionTarget = PROC_FLAG_TAKE_HARMFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_ABILITY;
ProcFlagsSpellType const spellTypeMask = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL;
ProcFlagsSpellPhase const spellPhaseMask = PROC_SPELL_PHASE_NONE;
ProcFlagsHit const hitMask = PROC_HIT_REFLECT;
@@ -2628,28 +2608,46 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)
switch (spell->m_spellInfo->DmgClass)
{
+ case SPELL_DAMAGE_CLASS_NONE:
case SPELL_DAMAGE_CLASS_MAGIC:
- if (positive)
- {
- procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS;
- procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS;
- }
- else
+ if (spell->m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
{
- procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG;
- procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG;
+ if (positive)
+ {
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC;
+ procVictim |= PROC_FLAG_TAKE_HELPFUL_PERIODIC;
+ }
+ else
+ {
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC;
+ procVictim |= PROC_FLAG_TAKE_HARMFUL_PERIODIC;
+ }
}
- break;
- case SPELL_DAMAGE_CLASS_NONE:
- if (positive)
+ else if (spell->m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
{
- procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS;
- procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS;
+ if (positive)
+ {
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
+ procVictim |= PROC_FLAG_TAKE_HELPFUL_ABILITY;
+ }
+ else
+ {
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY;
+ procVictim |= PROC_FLAG_TAKE_HARMFUL_ABILITY;
+ }
}
else
{
- procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG;
- procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG;
+ if (positive)
+ {
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL;
+ procVictim |= PROC_FLAG_TAKE_HELPFUL_SPELL;
+ }
+ else
+ {
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL;
+ procVictim |= PROC_FLAG_TAKE_HARMFUL_SPELL;
+ }
}
break;
}
@@ -2702,7 +2700,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)
Unit::DealDamageMods(damageInfo.attacker, damageInfo.target, damageInfo.damage, &damageInfo.absorb);
hitMask |= createProcHitMask(&damageInfo, MissCondition);
- procVictim |= PROC_FLAG_TAKEN_DAMAGE;
+ procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE;
spell->m_damage = damageInfo.damage;
@@ -3691,10 +3689,27 @@ void Spell::_cast(bool skipCheck)
ProcFlagsInit procAttacker = m_procAttacker;
if (!procAttacker)
{
- if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC)
- procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG;
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC;
+ }
+ else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY;
+ }
else
- procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG;
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL;
+ }
}
procAttacker |= PROC_FLAG_2_CAST_SUCCESSFUL;
@@ -3952,10 +3967,27 @@ void Spell::_handle_finish_phase()
ProcFlagsInit procAttacker = m_procAttacker;
if (!procAttacker)
{
- if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC)
- procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG;
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC;
+ }
+ else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY;
+ }
else
- procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG;
+ {
+ if (IsPositive())
+ procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL;
+ else
+ procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL;
+ }
}
Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_FINISH, m_hitMask, this, nullptr, nullptr);
@@ -4093,6 +4125,8 @@ void Spell::finish(bool ok)
if (Creature* creatureCaster = unitCaster->ToCreature())
creatureCaster->ReleaseSpellFocus(this);
+ Unit::ProcSkillsAndAuras(unitCaster, nullptr, PROC_FLAG_CAST_ENDED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, this, nullptr, nullptr);
+
if (!ok)
return;