diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9acb4646bc..6e3eea8f8c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1257,12 +1257,12 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam switch (attackType) { case BASE_ATTACK: - damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_MAINHAND_ATTACK; - damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + damageInfo->procAttacker = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_MAIN_HAND_WEAPON_SWING; + damageInfo->procVictim = PROC_FLAG_TAKE_MELEE_SWING; break; case OFF_ATTACK: - damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK; - damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + damageInfo->procAttacker = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING; + damageInfo->procVictim = PROC_FLAG_TAKE_MELEE_SWING; damageInfo->HitInfo = HITINFO_OFFHAND; break; default: @@ -1397,7 +1397,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam // Calculate absorb resist if (int32(damageInfo->damage) > 0) { - damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE; + damageInfo->procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; // Calculate absorb & resists DamageInfo dmgInfo(*damageInfo); CalcAbsorbResist(dmgInfo); @@ -1931,7 +1931,7 @@ void Unit::CalcAbsorbResist(DamageInfo& damageInfo) DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false); // break 'Fear' and similar auras - ProcSkillsAndAuras(caster, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_SPELL_TYPE_DAMAGE, PROC_SPELL_PHASE_HIT, PROC_HIT_NONE, nullptr, &damageInfo, nullptr); + ProcSkillsAndAuras(caster, PROC_FLAG_NONE, PROC_FLAG_TAKE_HARMFUL_SPELL, PROC_SPELL_TYPE_DAMAGE, PROC_SPELL_PHASE_HIT, PROC_HIT_NONE, nullptr, &damageInfo, nullptr); } } } @@ -11853,7 +11853,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) } if (!victim->IsCritter()) - ProcSkillsAndAuras(victim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); + ProcSkillsAndAuras(victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); // Proc auras on death - must be before aura/combat remove victim->ProcSkillsAndAuras(victim, PROC_FLAG_NONE, PROC_FLAG_DEATH, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 82ac56467f..c842943f97 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5787,16 +5787,16 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const // Set trigger flag uint32 procAttacker = PROC_FLAG_NONE, procVictim = PROC_FLAG_NONE; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) - procAttacker = PROC_FLAG_DONE_PERIODIC; + procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim = PROC_FLAG_TAKEN_PERIODIC; + procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; uint32 hitMask = damageInfo.GetHitMask(); if (damage) { hitMask |= crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; } int32 overkill = damage - target->GetHealth(); @@ -5886,9 +5886,9 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c // Set trigger flag uint32 procAttacker = PROC_FLAG_NONE, procVictim = PROC_FLAG_NONE; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) - procAttacker = PROC_FLAG_DONE_PERIODIC; + procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim = PROC_FLAG_TAKEN_PERIODIC; + procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; uint32 hitMask = damageInfo.GetHitMask(); if (damage) @@ -5896,7 +5896,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c hitMask |= crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; } int32 new_damage = caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), false); @@ -5913,7 +5913,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c caster->HealBySpell(healInfo); caster->GetThreatManager().ForwardThreatForAssistingMe(caster, healInfo.GetEffectiveHeal() * 0.5f, GetSpellInfo()); - caster->ProcSkillsAndAuras(caster, PROC_FLAG_DONE_PERIODIC, PROC_FLAG_TAKEN_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, hitMask, nullptr, nullptr, &healInfo); + caster->ProcSkillsAndAuras(caster, PROC_FLAG_DEAL_HELPFUL_PERIODIC, PROC_FLAG_NONE, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, hitMask, nullptr, nullptr, &healInfo); } } @@ -5944,7 +5944,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) HealInfo healInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo()->GetSchoolMask()); caster->HealBySpell(healInfo); - caster->ProcSkillsAndAuras(target, PROC_FLAG_DONE_PERIODIC, PROC_FLAG_TAKEN_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, PROC_HIT_NORMAL, nullptr, nullptr, &healInfo); + caster->ProcSkillsAndAuras(target, PROC_FLAG_DEAL_HARMFUL_PERIODIC, PROC_FLAG_TAKE_HARMFUL_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, PROC_HIT_NORMAL, nullptr, nullptr, &healInfo); } void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const @@ -6067,9 +6067,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const uint32 procAttacker = PROC_FLAG_NONE, procVictim = PROC_FLAG_NONE; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) - procAttacker = PROC_FLAG_DONE_PERIODIC; - if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim = PROC_FLAG_TAKEN_PERIODIC; + procAttacker = PROC_FLAG_DEAL_HELPFUL_PERIODIC; uint32 hitMask = crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; // ignore item heals @@ -6243,16 +6241,16 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con // Set trigger flag uint32 procAttacker = PROC_FLAG_NONE, procVictim = PROC_FLAG_NONE; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) - procAttacker = PROC_FLAG_DONE_PERIODIC; + procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim = PROC_FLAG_TAKEN_PERIODIC; + procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; uint32 hitMask = createProcHitMask(&damageInfo, SPELL_MISS_NONE); uint32 spellTypeMask = PROC_SPELL_TYPE_NO_DMG_HEAL; if (damageInfo.damage) { if (!m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_TARGET_PROCS)) - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; spellTypeMask |= PROC_SPELL_TYPE_DAMAGE; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index de0655b7e3..6589aa957c 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2088,24 +2088,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: @@ -2113,33 +2113,13 @@ 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::DoAllEffectOnTarget // 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 (DoAllEffectOnTarget 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; - } - // Some spells may not trigger any procs at all. if (m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) m_procAttacker = PROC_FLAG_NONE; @@ -2167,7 +2147,7 @@ class ProcReflectDelayed : public BasicEvent return true; uint32 const typeMaskActor = PROC_FLAG_NONE; - uint32 const typeMaskActionTarget = PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG; + uint32 const typeMaskActionTarget = PROC_FLAG_TAKE_HARMFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_ABILITY; uint32 const spellTypeMask = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL; uint32 const spellPhaseMask = PROC_SPELL_PHASE_NONE; uint32 const hitMask = PROC_HIT_REFLECT; @@ -2614,17 +2594,22 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) { switch (m_spellInfo->DmgClass) { - case SPELL_DAMAGE_CLASS_MAGIC: - if (positive) - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS; - else - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; - break; case SPELL_DAMAGE_CLASS_NONE: - if (positive) - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS; - else - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; + case SPELL_DAMAGE_CLASS_MAGIC: + if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC)) + { + if (positive) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (positive) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + } break; default: break; @@ -2635,17 +2620,20 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) { switch (m_spellInfo->DmgClass) { - case SPELL_DAMAGE_CLASS_MAGIC: - if (positive) - procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS; - else - procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG; - break; case SPELL_DAMAGE_CLASS_NONE: - if (positive) - procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS; - else - procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG; + case SPELL_DAMAGE_CLASS_MAGIC: + if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC)) + { + if (!positive) + procVictim |= PROC_FLAG_TAKE_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (positive) + procVictim |= PROC_FLAG_TAKE_HELPFUL_ABILITY; + else + procVictim |= PROC_FLAG_TAKE_HARMFUL_ABILITY; + } break; default: break; @@ -2708,7 +2696,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) caster->SendSpellNonMeleeDamageLog(&damageInfo); hitMask |= createProcHitMask(&damageInfo, missInfo); - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; m_damage = damageInfo.damage; caster->DealSpellDamage(&damageInfo, true); @@ -3690,10 +3678,27 @@ void Spell::_cast(bool skipCheck) uint32 procAttacker = m_procAttacker; if (!procAttacker && !m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) { - if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) - procAttacker = m_spellInfo->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 (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + } else - procAttacker = m_spellInfo->IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; + { + if (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL; + } } uint32 hitMask = m_hitMask; @@ -3901,10 +3906,27 @@ void Spell::_handle_finish_phase() uint32 procAttacker = m_procAttacker; if (!procAttacker && !m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_CASTER_PROCS)) { - if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) - procAttacker = m_spellInfo->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 (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + } else - procAttacker = m_spellInfo->IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; + { + if (m_spellInfo->IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL; + } } m_originalCaster->ProcSkillsAndAuras(nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_FINISH, m_hitMask, this, nullptr, nullptr); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9682734a47..1c14aa1211 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2903,14 +2903,11 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex) || (spell->getState() == SPELL_STATE_PREPARING && spell->GetCastTime() > 0.0f)) && curSpellInfo->CanBeInterrupted(unitTarget)) { - if (m_originalCaster) - { - int32 duration = m_spellInfo->GetDuration(); - unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effIndex)); - m_originalCaster->ProcSkillsAndAuras(unitTarget, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS, - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS, PROC_SPELL_TYPE_MASK_ALL, - PROC_SPELL_PHASE_HIT, PROC_HIT_INTERRUPT, nullptr, nullptr, nullptr); - } + int32 duration = m_spellInfo->GetDuration(); + duration = unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effIndex); + unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), duration); + m_hitMask |= PROC_HIT_INTERRUPT; + ExecuteLogEffectInterruptCast(effIndex, unitTarget, curSpellInfo->Id); unitTarget->InterruptSpell(CurrentSpellTypes(i), false); } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 94243cedea..aa64d1170a 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -519,7 +519,7 @@ bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcE return false; // always trigger for these types - if (eventInfo.GetTypeMask() & (PROC_FLAG_KILLED | PROC_FLAG_KILL | PROC_FLAG_DEATH)) + if (eventInfo.GetTypeMask() & (PROC_FLAG_HEARTBEAT | PROC_FLAG_KILL | PROC_FLAG_DEATH)) return true; // check school mask (if set) for other trigger types diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index ba8d7bd435..470e87488f 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -108,97 +108,98 @@ enum SpellLinkedType // Spell proc event related declarations (accessed using SpellMgr functions) enum ProcFlags { - PROC_FLAG_NONE = 0x00000000, + PROC_FLAG_NONE = 0x00000000, - PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor - not sure about this flag - PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward) + PROC_FLAG_HEARTBEAT = 0x00000001, // 00 Killed by agressor - not sure about this flag + PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward) - PROC_FLAG_DONE_MELEE_AUTO_ATTACK = 0x00000004, // 02 Done melee auto attack - PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK = 0x00000008, // 03 Taken melee auto attack + PROC_FLAG_DEAL_MELEE_SWING = 0x00000004, // 02 Done melee auto attack + PROC_FLAG_TAKE_MELEE_SWING = 0x00000008, // 03 Taken melee auto attack - PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS = 0x00000010, // 04 Done attack by Spell that has dmg class melee - PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS = 0x00000020, // 05 Taken attack by Spell that has dmg class melee + PROC_FLAG_DEAL_MELEE_ABILITY = 0x00000010, // 04 Done attack by Spell that has dmg class melee + PROC_FLAG_TAKE_MELEE_ABILITY = 0x00000020, // 05 Taken attack by Spell that has dmg class melee - PROC_FLAG_DONE_RANGED_AUTO_ATTACK = 0x00000040, // 06 Done ranged auto attack - PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK = 0x00000080, // 07 Taken ranged auto attack + PROC_FLAG_DEAL_RANGED_ATTACK = 0x00000040, // 06 Done ranged auto attack + PROC_FLAG_TAKE_RANGED_ATTACK = 0x00000080, // 07 Taken ranged auto attack - PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS = 0x00000100, // 08 Done attack by Spell that has dmg class ranged - PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS = 0x00000200, // 09 Taken attack by Spell that has dmg class ranged + PROC_FLAG_DEAL_RANGED_ABILITY = 0x00000100, // 08 Done attack by Spell that has dmg class ranged + PROC_FLAG_TAKE_RANGED_ABILITY = 0x00000200, // 09 Taken attack by Spell that has dmg class ranged - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS = 0x00000400, // 10 Done positive spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS = 0x00000800, // 11 Taken positive spell that has dmg class none + PROC_FLAG_DEAL_HELPFUL_ABILITY = 0x00000400, // 10 Done positive spell that has dmg class none + PROC_FLAG_TAKE_HELPFUL_ABILITY = 0x00000800, // 11 Taken positive spell that has dmg class none - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG = 0x00001000, // 12 Done negative spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG = 0x00002000, // 13 Taken negative spell that has dmg class none + PROC_FLAG_DEAL_HARMFUL_ABILITY = 0x00001000, // 12 Done negative spell that has dmg class none + PROC_FLAG_TAKE_HARMFUL_ABILITY = 0x00002000, // 13 Taken negative spell that has dmg class none - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS = 0x00004000, // 14 Done positive spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS = 0x00008000, // 15 Taken positive spell that has dmg class magic + PROC_FLAG_DEAL_HELPFUL_SPELL = 0x00004000, // 14 Done positive spell that has dmg class magic + PROC_FLAG_TAKE_HELPFUL_SPELL = 0x00008000, // 15 Taken positive spell that has dmg class magic - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG = 0x00010000, // 16 Done negative spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG = 0x00020000, // 17 Taken negative spell that has dmg class magic + PROC_FLAG_DEAL_HARMFUL_SPELL = 0x00010000, // 16 Done negative spell that has dmg class magic + PROC_FLAG_TAKE_HARMFUL_SPELL = 0x00020000, // 17 Taken negative spell that has dmg class magic - PROC_FLAG_DONE_PERIODIC = 0x00040000, // 18 Successful do periodic (damage / healing) - PROC_FLAG_TAKEN_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage / healing) + PROC_FLAG_DEAL_HARMFUL_PERIODIC = 0x00040000, // 18 Successful do periodic (damage) + PROC_FLAG_TAKE_HARMFUL_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage) - PROC_FLAG_TAKEN_DAMAGE = 0x00100000, // 20 Taken any damage - PROC_FLAG_DONE_TRAP_ACTIVATION = 0x00200000, // 21 On trap activation (possibly needs name change to ON_GAMEOBJECT_CAST or USE) + PROC_FLAG_TAKE_ANY_DAMAGE = 0x00100000, // 20 Taken any damage - PROC_FLAG_DONE_MAINHAND_ATTACK = 0x00400000, // 22 Done main-hand melee attacks (spell and autoattack) - PROC_FLAG_DONE_OFFHAND_ATTACK = 0x00800000, // 23 Done off-hand melee attacks (spell and autoattack) + PROC_FLAG_DEAL_HELPFUL_PERIODIC = 0x00200000, // 21 On trap activation (possibly needs name change to ON_GAMEOBJECT_CAST or USE) - PROC_FLAG_DEATH = 0x01000000, // 24 Died in any way + PROC_FLAG_MAIN_HAND_WEAPON_SWING = 0x00400000, // 22 Done main-hand melee attacks (spell and autoattack) + PROC_FLAG_OFF_HAND_WEAPON_SWING = 0x00800000, // 23 Done off-hand melee attacks (spell and autoattack) - PROC_FLAG_JUMP = 0x02000000, // 25 Jumped + PROC_FLAG_DEATH = 0x01000000, // 24 Died in any way - PROC_FLAG_CLONE_SPELL = 0x04000000, // Proc Clone Spell + PROC_FLAG_JUMP = 0x02000000, // 25 Jumped - PROC_FLAG_ENTER_COMBAT = 0x08000000, // Enter Combat + PROC_FLAG_PROC_CLONE_SPELL = 0x04000000, // 26 Proc Clone Spell + + PROC_FLAG_ENTER_COMBAT = 0x08000000, // 27 Entered combat // flag masks - AUTO_ATTACK_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK - | PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK, + AUTO_ATTACK_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_TAKE_MELEE_SWING + | PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK, - MELEE_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS - | PROC_FLAG_DONE_MAINHAND_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK, + MELEE_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_TAKE_MELEE_SWING + | PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_TAKE_MELEE_ABILITY + | PROC_FLAG_MAIN_HAND_WEAPON_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING, - RANGED_PROC_FLAG_MASK = PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS, + RANGED_PROC_FLAG_MASK = PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_DEAL_RANGED_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY, - SPELL_PROC_FLAG_MASK = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS - | PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_DONE_PERIODIC | PROC_FLAG_TAKEN_PERIODIC - | PROC_FLAG_DONE_TRAP_ACTIVATION, + SPELL_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_TAKE_MELEE_ABILITY + | PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_DEAL_RANGED_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY + | PROC_FLAG_DEAL_HELPFUL_ABILITY | PROC_FLAG_TAKE_HELPFUL_ABILITY + | PROC_FLAG_DEAL_HARMFUL_ABILITY | PROC_FLAG_TAKE_HARMFUL_ABILITY + | PROC_FLAG_DEAL_HELPFUL_SPELL | PROC_FLAG_TAKE_HELPFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_PERIODIC | PROC_FLAG_TAKE_HARMFUL_PERIODIC + | PROC_FLAG_DEAL_HELPFUL_PERIODIC, - DONE_HIT_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_DONE_PERIODIC | PROC_FLAG_DONE_TRAP_ACTIVATION - | PROC_FLAG_DONE_MAINHAND_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK, + DONE_HIT_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_DEAL_RANGED_ATTACK + | PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_DEAL_RANGED_ABILITY + | PROC_FLAG_DEAL_HELPFUL_ABILITY | PROC_FLAG_DEAL_HARMFUL_ABILITY + | PROC_FLAG_DEAL_HELPFUL_SPELL | PROC_FLAG_DEAL_HARMFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_PERIODIC | PROC_FLAG_DEAL_HELPFUL_PERIODIC + | PROC_FLAG_MAIN_HAND_WEAPON_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING, - TAKEN_HIT_PROC_FLAG_MASK = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_TAKEN_DAMAGE, + TAKEN_HIT_PROC_FLAG_MASK = PROC_FLAG_TAKE_MELEE_SWING | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_TAKE_MELEE_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY + | PROC_FLAG_TAKE_HELPFUL_ABILITY | PROC_FLAG_TAKE_HARMFUL_ABILITY + | PROC_FLAG_TAKE_HELPFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_SPELL + | PROC_FLAG_TAKE_HARMFUL_PERIODIC | PROC_FLAG_TAKE_ANY_DAMAGE, REQ_SPELL_PHASE_PROC_FLAG_MASK = SPELL_PROC_FLAG_MASK & DONE_HIT_PROC_FLAG_MASK }; -#define MELEE_BASED_TRIGGER_MASK (PROC_FLAG_DONE_MELEE_AUTO_ATTACK | \ - PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | \ - PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | \ - PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | \ - PROC_FLAG_DONE_RANGED_AUTO_ATTACK | \ - PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK | \ - PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | \ - PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS) +#define MELEE_BASED_TRIGGER_MASK (PROC_FLAG_DEAL_MELEE_SWING | \ + PROC_FLAG_TAKE_MELEE_SWING | \ + PROC_FLAG_DEAL_MELEE_ABILITY | \ + PROC_FLAG_TAKE_MELEE_ABILITY | \ + PROC_FLAG_DEAL_RANGED_ATTACK | \ + PROC_FLAG_TAKE_RANGED_ATTACK | \ + PROC_FLAG_DEAL_RANGED_ABILITY | \ + PROC_FLAG_TAKE_RANGED_ABILITY) enum ProcFlagsSpellType { diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index fb4d896163..4e33867bc3 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -1304,7 +1304,7 @@ class spell_item_mark_of_conquest : public SpellScriptLoader void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - if (eventInfo.GetTypeMask() & (PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS)) + if (eventInfo.GetTypeMask() & (PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_DEAL_RANGED_ABILITY)) { // in that case, do not cast heal spell PreventDefaultAction(); @@ -3627,10 +3627,10 @@ class spell_item_shard_of_the_scale : public SpellScriptLoader Unit* caster = eventInfo.GetActor(); Unit* target = eventInfo.GetProcTarget(); - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) + if (eventInfo.GetTypeMask() & PROC_FLAG_DEAL_HELPFUL_SPELL) caster->CastSpell(target, HealProc, aurEff); - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) + if (eventInfo.GetTypeMask() & PROC_FLAG_DEAL_HARMFUL_SPELL) caster->CastSpell(target, DamageProc, aurEff); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 5e07d4deeb..f5be442e98 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -1015,7 +1015,7 @@ class spell_rog_main_gauche : public AuraScript if (!item || !item->IsEquipped()) return false; - if (!(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) + if (!(eventInfo.GetTypeMask() & PROC_FLAG_MAIN_HAND_WEAPON_SWING)) return false; return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 5ade84821e..ddb1413958 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1387,8 +1387,8 @@ class spell_sha_flametongue_weapon : public AuraScript if (attType != BASE_ATTACK && attType != OFF_ATTACK) return false; - if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) || - ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK))) + if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_MAIN_HAND_WEAPON_SWING)) || + ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_OFF_HAND_WEAPON_SWING))) return false; return true; @@ -1401,7 +1401,7 @@ class spell_sha_flametongue_weapon : public AuraScript Player* player = eventInfo.GetActor()->ToPlayer(); Unit* target = eventInfo.GetProcTarget(); WeaponAttackType attType = BASE_ATTACK; - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK) + if (eventInfo.GetTypeMask() & PROC_FLAG_OFF_HAND_WEAPON_SWING) attType = OFF_ATTACK; Item* item = ASSERT_NOTNULL(player->GetWeaponForAttack(attType)); @@ -1461,8 +1461,8 @@ class spell_sha_windfury_weapon : public AuraScript if (attType != BASE_ATTACK && attType != OFF_ATTACK) return false; - if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) || - ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK))) + if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_MAIN_HAND_WEAPON_SWING)) || + ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_OFF_HAND_WEAPON_SWING))) return false; return true; @@ -1475,7 +1475,7 @@ class spell_sha_windfury_weapon : public AuraScript Player* player = eventInfo.GetActor()->ToPlayer(); Unit* target = eventInfo.GetProcTarget(); WeaponAttackType attType = BASE_ATTACK; - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK) + if (eventInfo.GetTypeMask() & PROC_FLAG_OFF_HAND_WEAPON_SWING) attType = OFF_ATTACK; Item* item = ASSERT_NOTNULL(player->GetWeaponForAttack(attType));