aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-14 18:55:25 +0100
committerShauren <shauren.trinity@gmail.com>2024-12-14 18:55:25 +0100
commit0706a114bbfd786434921bf95d0fbd6a5596fcb3 (patch)
tree2116487860ddb4a154c419e9322445fdb8415883 /src/server
parentf92b5316ab1c7b1ea4202b6808a436d40dd25c4d (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.cpp19
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
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()