diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 07207e0904..ad04e619a1 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2656,7 +2656,6 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) ProcFlags procAttacker = spell->m_procAttacker; ProcFlags procVictim = spell->m_procVictim; ProcFlagsSpellType procSpellType = PROC_SPELL_TYPE_NONE; - ProcFlagsHit hitMask = PROC_HIT_NONE; // Spells with this flag cannot trigger if effect is cast on self bool const canEffectTrigger = spell->unitTarget->CanProc(); @@ -2735,11 +2734,11 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) uint32 addhealth = spell->m_healing; if (IsCrit) { - hitMask |= PROC_HIT_CRITICAL; + ProcHitMask |= PROC_HIT_CRITICAL; addhealth = Unit::SpellCriticalHealingBonus(caster, addhealth); } else - hitMask |= PROC_HIT_NORMAL; + ProcHitMask |= PROC_HIT_NORMAL; healInfo = std::make_unique(caster, spell->unitTarget, addhealth, spell->m_spellInfo, spell->m_spellInfo->GetSchoolMask()); caster->HealBySpell(*healInfo, IsCrit); @@ -2759,7 +2758,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Check damage immunity if (spell->unitTarget->IsImmunedToDamage(spell->m_spellInfo)) { - hitMask = PROC_HIT_IMMUNE; + ProcHitMask = PROC_HIT_IMMUNE; spell->m_damage = 0; // no packet found in sniffs @@ -2777,7 +2776,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) caster->SendSpellNonMeleeDamageLog(&damageInfo); - hitMask |= createProcHitMask(&damageInfo, MissCondition); + ProcHitMask |= createProcHitMask(&damageInfo, MissCondition); procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; spell->m_damage = damageInfo.damage; @@ -2787,7 +2786,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Do triggers for unit if (canEffectTrigger) { - spellDamageInfo = std::make_unique(damageInfo, SPELL_DIRECT_DAMAGE, spell->m_attackType, hitMask); + spellDamageInfo = std::make_unique(damageInfo, SPELL_DIRECT_DAMAGE, spell->m_attackType, ProcHitMask); procSpellType |= PROC_SPELL_TYPE_DAMAGE; } } @@ -2797,11 +2796,11 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) { // Fill base damage struct (unitTarget - is real spell target) SpellNonMeleeDamage damageInfo(caster, spell->unitTarget, spell->m_spellInfo->Id, spell->m_spellSchoolMask); - hitMask |= createProcHitMask(&damageInfo, MissCondition); + ProcHitMask |= createProcHitMask(&damageInfo, MissCondition); // Do triggers for unit if (canEffectTrigger) { - spellDamageInfo = std::make_unique(damageInfo, NODAMAGE, spell->m_attackType, hitMask); + spellDamageInfo = std::make_unique(damageInfo, NODAMAGE, spell->m_attackType, ProcHitMask); procSpellType |= PROC_SPELL_TYPE_NO_DMG_HEAL; } @@ -2817,7 +2816,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Do triggers for unit if (canEffectTrigger) { - Unit::ProcSkillsAndAuras(caster, spell->unitTarget, procAttacker, procVictim, procSpellType, PROC_SPELL_PHASE_HIT, hitMask, spell, spellDamageInfo.get(), healInfo.get()); + Unit::ProcSkillsAndAuras(caster, spell->unitTarget, procAttacker, procVictim, procSpellType, PROC_SPELL_PHASE_HIT, ProcHitMask, spell, spellDamageInfo.get(), healInfo.get()); // item spells (spell hit of non-damage spell may also activate items, for example seal of corruption hidden hit) if (caster->GetTypeId() == TYPEID_PLAYER && (procSpellType & (PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL))) @@ -2829,7 +2828,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) } // set hitmask for finish procs - spell->m_hitMask |= hitMask; + spell->m_hitMask |= ProcHitMask; spell->m_procSpellType |= procSpellType; // Do not take combo points on dodge and miss diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index e4ae08d122..040766a80a 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -607,6 +607,7 @@ class TC_GAME_API Spell int32 AuraBasePoints[MAX_SPELL_EFFECTS] = { }; bool Positive = true; UnitAura* HitAura = nullptr; + ProcFlagsHit ProcHitMask = { }; private: Unit* _spellHitTarget = nullptr; // changed for example by reflect diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9ee3571065..d95854faef 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2204,7 +2204,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex) CallScriptSuccessfulDispel(effIndex); - m_hitMask |= PROC_HIT_DISPEL; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; // On success dispel // Devour Magic @@ -2987,7 +2987,7 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex) 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; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_INTERRUPT; ExecuteLogEffectInterruptCast(effIndex, unitTarget, curSpellInfo->Id); unitTarget->InterruptSpell(CurrentSpellTypes(i), false); @@ -4690,6 +4690,8 @@ void Spell::EffectDispelMechanic(SpellEffIndex effIndex) for (auto itr = dispel_list.begin(); itr != dispel_list.end(); ++itr) unitTarget->RemoveAura(itr->first, itr->second, 0, AuraRemoveFlags::ByEnemySpell); + + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; } void Spell::EffectResurrectPet(SpellEffIndex /*effIndex*/) @@ -5223,6 +5225,8 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) unitTarget->RemoveAurasDueToSpellBySteal(spellId, auraCaster, m_caster, stolenCharges); } m_caster->SendMessageToSet(&dataSuccess, true); + + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; } void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex)