diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-02-10 21:11:07 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-10 21:11:07 +0100 |
| commit | 02979daf761a5122efa7b8fa3e70509ecd69789e (patch) | |
| tree | 19df8dfa3ad4ad9aa69ab08a3b58e42e12fc6994 /src/server/game/Spells/Spell.cpp | |
| parent | 7295bfb6a09b25d824889cfb3698a0774fc01b34 (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.cpp | 140 |
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; |
