diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-14 18:55:25 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-12-14 18:55:25 +0100 |
commit | 0706a114bbfd786434921bf95d0fbd6a5596fcb3 (patch) | |
tree | 2116487860ddb4a154c419e9322445fdb8415883 /src/server | |
parent | f92b5316ab1c7b1ea4202b6808a436d40dd25c4d (diff) |
Core/Spells: Fixed PROC_HIT_DISPEL and PROC_HIT_INTERRUPT on procs using PROC_SPELL_PHASE_HIT phase
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 8 |
3 files changed, 14 insertions, 14 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f4f0cc25ac4..c4a6f8ae029 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2813,7 +2813,6 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) ProcFlagsInit procAttacker = spell->m_procAttacker; ProcFlagsInit 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(); @@ -2898,11 +2897,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, spell->m_spellInfo, addhealth, nullptr); } else - hitMask |= PROC_HIT_NORMAL; + ProcHitMask |= PROC_HIT_NORMAL; healInfo = std::make_unique<HealInfo>(caster, spell->unitTarget, addhealth, spell->m_spellInfo, spell->m_spellInfo->GetSchoolMask()); caster->HealBySpell(*healInfo, IsCrit); @@ -2922,7 +2921,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Check damage immunity if (spell->unitTarget->IsImmunedToDamage(caster, spell->m_spellInfo)) { - hitMask = PROC_HIT_IMMUNE; + ProcHitMask = PROC_HIT_IMMUNE; spell->m_damage = 0; // no packet found in sniffs @@ -2935,7 +2934,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) caster->CalculateSpellDamageTaken(&damageInfo, spell->m_damage, spell->m_spellInfo, spell->m_attackType, IsCrit, MissCondition == SPELL_MISS_BLOCK, spell); Unit::DealDamageMods(damageInfo.attacker, damageInfo.target, damageInfo.damage, &damageInfo.absorb); - hitMask |= createProcHitMask(&damageInfo, MissCondition); + ProcHitMask |= createProcHitMask(&damageInfo, MissCondition); procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; // sparring @@ -2955,7 +2954,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Do triggers for unit if (canEffectTrigger) { - spellDamageInfo = std::make_unique<DamageInfo>(damageInfo, SPELL_DIRECT_DAMAGE, spell->m_attackType, hitMask); + spellDamageInfo = std::make_unique<DamageInfo>(damageInfo, SPELL_DIRECT_DAMAGE, spell->m_attackType, ProcHitMask); procSpellType |= PROC_SPELL_TYPE_DAMAGE; } } @@ -2965,11 +2964,11 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) { // Fill base damage struct (unitTarget - is real spell target) SpellNonMeleeDamage damageInfo(caster, spell->unitTarget, spell->m_spellInfo, spell->m_SpellVisual, spell->m_spellSchoolMask); - hitMask |= createProcHitMask(&damageInfo, MissCondition); + ProcHitMask |= createProcHitMask(&damageInfo, MissCondition); // Do triggers for unit if (canEffectTrigger) { - spellDamageInfo = std::make_unique<DamageInfo>(damageInfo, NODAMAGE, spell->m_attackType, hitMask); + spellDamageInfo = std::make_unique<DamageInfo>(damageInfo, NODAMAGE, spell->m_attackType, ProcHitMask); procSpellType |= PROC_SPELL_TYPE_NO_DMG_HEAL; } @@ -2985,7 +2984,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))) @@ -2997,7 +2996,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) } // set hitmask for finish procs - spell->m_hitMask |= hitMask; + spell->m_hitMask |= ProcHitMask; spell->m_procSpellType |= procSpellType; // _spellHitTarget can be null if spell is missed in DoSpellHitOnUnit diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 3e85b39f501..f38f06826a7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -832,6 +832,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 f21deeb03c4..18990648d1e 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2182,7 +2182,7 @@ void Spell::EffectDispel() CallScriptSuccessfulDispel(SpellEffIndex(effectInfo->EffectIndex)); - m_hitMask |= PROC_HIT_DISPEL; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; } void Spell::EffectDualWield() @@ -2938,7 +2938,7 @@ void Spell::EffectInterruptCast() int32 duration = m_spellInfo->GetDuration(); duration = unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effectInfo->EffectIndex); unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), Milliseconds(duration)); - m_hitMask |= PROC_HIT_INTERRUPT; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_INTERRUPT; SendSpellInterruptLog(unitTarget, curSpellInfo->Id); unitTarget->InterruptSpell(CurrentSpellTypes(i), false); } @@ -4176,7 +4176,7 @@ void Spell::EffectDispelMechanic() for (auto itr = dispel_list.begin(); itr != dispel_list.end(); ++itr) unitTarget->RemoveAura(itr->first, itr->second, 0, AURA_REMOVE_BY_ENEMY_SPELL); - m_hitMask |= PROC_HIT_DISPEL; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; } void Spell::EffectResurrectPet() @@ -4741,7 +4741,7 @@ void Spell::EffectStealBeneficialBuff() m_caster->SendMessageToSet(spellDispellLog.Write(), true); - m_hitMask |= PROC_HIT_DISPEL; + std::ranges::find(m_UniqueTargetInfo, unitTarget->GetGUID(), &TargetInfo::TargetGUID)->ProcHitMask |= PROC_HIT_DISPEL; } void Spell::EffectKillCreditPersonal() |