Core/Spells: Fixed PROC_HIT_DISPEL and PROC_HIT_INTERRUPT on procs using PROC_SPELL_PHASE_HIT phase
Port From (https://github.com/TrinityCore/TrinityCore/commit/0706a114bbfd786434921bf95d0fbd6a5596fcb3)
This commit is contained in:
+10
-10
@@ -8839,6 +8839,7 @@ namespace Game.Spells
|
|||||||
public int[] AuraBasePoints = new int[SpellConst.MaxEffects];
|
public int[] AuraBasePoints = new int[SpellConst.MaxEffects];
|
||||||
public bool Positive = true;
|
public bool Positive = true;
|
||||||
public UnitAura HitAura;
|
public UnitAura HitAura;
|
||||||
|
public ProcFlagsHit ProcHitMask;
|
||||||
|
|
||||||
Unit _spellHitTarget; // changed for example by reflect
|
Unit _spellHitTarget; // changed for example by reflect
|
||||||
bool _enablePVP; // need to enable PVP at DoDamageAndTriggers?
|
bool _enablePVP; // need to enable PVP at DoDamageAndTriggers?
|
||||||
@@ -8943,7 +8944,6 @@ namespace Game.Spells
|
|||||||
ProcFlagsInit procAttacker = spell.m_procAttacker;
|
ProcFlagsInit procAttacker = spell.m_procAttacker;
|
||||||
ProcFlagsInit procVictim = spell.m_procVictim;
|
ProcFlagsInit procVictim = spell.m_procVictim;
|
||||||
ProcFlagsSpellType procSpellType = ProcFlagsSpellType.None;
|
ProcFlagsSpellType procSpellType = ProcFlagsSpellType.None;
|
||||||
ProcFlagsHit hitMask = ProcFlagsHit.None;
|
|
||||||
|
|
||||||
// Spells with this flag cannot trigger if effect is cast on self
|
// Spells with this flag cannot trigger if effect is cast on self
|
||||||
bool canEffectTrigger = spell.unitTarget.CanProc();
|
bool canEffectTrigger = spell.unitTarget.CanProc();
|
||||||
@@ -9028,11 +9028,11 @@ namespace Game.Spells
|
|||||||
int addhealth = spell.m_healing;
|
int addhealth = spell.m_healing;
|
||||||
if (IsCrit)
|
if (IsCrit)
|
||||||
{
|
{
|
||||||
hitMask |= ProcFlagsHit.Critical;
|
ProcHitMask |= ProcFlagsHit.Critical;
|
||||||
addhealth = Unit.SpellCriticalHealingBonus(caster, spell.m_spellInfo, addhealth, null);
|
addhealth = Unit.SpellCriticalHealingBonus(caster, spell.m_spellInfo, addhealth, null);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hitMask |= ProcFlagsHit.Normal;
|
ProcHitMask |= ProcFlagsHit.Normal;
|
||||||
|
|
||||||
healInfo = new(caster, spell.unitTarget, (uint)addhealth, spell.m_spellInfo, spell.m_spellInfo.GetSchoolMask());
|
healInfo = new(caster, spell.unitTarget, (uint)addhealth, spell.m_spellInfo, spell.m_spellInfo.GetSchoolMask());
|
||||||
caster.HealBySpell(healInfo, IsCrit);
|
caster.HealBySpell(healInfo, IsCrit);
|
||||||
@@ -9052,7 +9052,7 @@ namespace Game.Spells
|
|||||||
// Check damage immunity
|
// Check damage immunity
|
||||||
if (spell.unitTarget.IsImmunedToDamage(caster, spell.m_spellInfo))
|
if (spell.unitTarget.IsImmunedToDamage(caster, spell.m_spellInfo))
|
||||||
{
|
{
|
||||||
hitMask = ProcFlagsHit.Immune;
|
ProcHitMask = ProcFlagsHit.Immune;
|
||||||
spell.m_damage = 0;
|
spell.m_damage = 0;
|
||||||
|
|
||||||
// no packet found in sniffs
|
// no packet found in sniffs
|
||||||
@@ -9065,7 +9065,7 @@ namespace Game.Spells
|
|||||||
caster.CalculateSpellDamageTaken(damageInfo, spell.m_damage, spell.m_spellInfo, spell.m_attackType, IsCrit, MissCondition == SpellMissInfo.Block, spell);
|
caster.CalculateSpellDamageTaken(damageInfo, spell.m_damage, spell.m_spellInfo, spell.m_attackType, IsCrit, MissCondition == SpellMissInfo.Block, spell);
|
||||||
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
||||||
|
|
||||||
hitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
ProcHitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
||||||
procVictim.Or(ProcFlags.TakeAnyDamage);
|
procVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
|
|
||||||
spell.m_damage = (int)damageInfo.damage;
|
spell.m_damage = (int)damageInfo.damage;
|
||||||
@@ -9087,7 +9087,7 @@ namespace Game.Spells
|
|||||||
// Do triggers for unit
|
// Do triggers for unit
|
||||||
if (canEffectTrigger)
|
if (canEffectTrigger)
|
||||||
{
|
{
|
||||||
spellDamageInfo = new(damageInfo, DamageEffectType.SpellDirect, spell.m_attackType, hitMask);
|
spellDamageInfo = new(damageInfo, DamageEffectType.SpellDirect, spell.m_attackType, ProcHitMask);
|
||||||
procSpellType |= ProcFlagsSpellType.Damage;
|
procSpellType |= ProcFlagsSpellType.Damage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9097,11 +9097,11 @@ namespace Game.Spells
|
|||||||
{
|
{
|
||||||
// Fill base damage struct (unitTarget - is real spell target)
|
// Fill base damage struct (unitTarget - is real spell target)
|
||||||
SpellNonMeleeDamage damageInfo = new(caster, spell.unitTarget, spell.m_spellInfo, spell.m_SpellVisual, spell.m_spellSchoolMask);
|
SpellNonMeleeDamage damageInfo = new(caster, spell.unitTarget, spell.m_spellInfo, spell.m_SpellVisual, spell.m_spellSchoolMask);
|
||||||
hitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
ProcHitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
||||||
// Do triggers for unit
|
// Do triggers for unit
|
||||||
if (canEffectTrigger)
|
if (canEffectTrigger)
|
||||||
{
|
{
|
||||||
spellDamageInfo = new(damageInfo, DamageEffectType.NoDamage, spell.m_attackType, hitMask);
|
spellDamageInfo = new(damageInfo, DamageEffectType.NoDamage, spell.m_attackType, ProcHitMask);
|
||||||
procSpellType |= ProcFlagsSpellType.NoDmgHeal;
|
procSpellType |= ProcFlagsSpellType.NoDmgHeal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9117,7 +9117,7 @@ namespace Game.Spells
|
|||||||
// Do triggers for unit
|
// Do triggers for unit
|
||||||
if (canEffectTrigger)
|
if (canEffectTrigger)
|
||||||
{
|
{
|
||||||
Unit.ProcSkillsAndAuras(caster, spell.unitTarget, procAttacker, procVictim, procSpellType, ProcFlagsSpellPhase.Hit, hitMask, spell, spellDamageInfo, healInfo);
|
Unit.ProcSkillsAndAuras(caster, spell.unitTarget, procAttacker, procVictim, procSpellType, ProcFlagsSpellPhase.Hit, ProcHitMask, spell, spellDamageInfo, healInfo);
|
||||||
|
|
||||||
// item spells (spell hit of non-damage spell may also activate items, for example seal of corruption hidden hit)
|
// item spells (spell hit of non-damage spell may also activate items, for example seal of corruption hidden hit)
|
||||||
if (caster.IsPlayer() && procSpellType.HasAnyFlag(ProcFlagsSpellType.Damage | ProcFlagsSpellType.NoDmgHeal))
|
if (caster.IsPlayer() && procSpellType.HasAnyFlag(ProcFlagsSpellType.Damage | ProcFlagsSpellType.NoDmgHeal))
|
||||||
@@ -9129,7 +9129,7 @@ namespace Game.Spells
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set hitmask for finish procs
|
// set hitmask for finish procs
|
||||||
spell.m_hitMask |= hitMask;
|
spell.m_hitMask |= ProcHitMask;
|
||||||
spell.m_procSpellType |= procSpellType;
|
spell.m_procSpellType |= procSpellType;
|
||||||
|
|
||||||
// _spellHitTarget can be null if spell is missed in DoSpellHitOnUnit
|
// _spellHitTarget can be null if spell is missed in DoSpellHitOnUnit
|
||||||
|
|||||||
@@ -1795,7 +1795,7 @@ namespace Game.Spells
|
|||||||
|
|
||||||
CallScriptSuccessfulDispel(effectInfo.EffectIndex);
|
CallScriptSuccessfulDispel(effectInfo.EffectIndex);
|
||||||
|
|
||||||
m_hitMask |= ProcFlagsHit.Dispel;
|
m_UniqueTargetInfo.Find(p => p.TargetGUID == unitTarget.GetGUID()).ProcHitMask |= ProcFlagsHit.Dispel;
|
||||||
}
|
}
|
||||||
|
|
||||||
[SpellEffectHandler(SpellEffectName.DualWield)]
|
[SpellEffectHandler(SpellEffectName.DualWield)]
|
||||||
@@ -2571,7 +2571,7 @@ namespace Game.Spells
|
|||||||
int duration = m_spellInfo.GetDuration();
|
int duration = m_spellInfo.GetDuration();
|
||||||
duration = unitTarget.ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1u << (int)effectInfo.EffectIndex);
|
duration = unitTarget.ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1u << (int)effectInfo.EffectIndex);
|
||||||
unitTarget.GetSpellHistory().LockSpellSchool(curSpellInfo.GetSchoolMask(), TimeSpan.FromMilliseconds(duration));
|
unitTarget.GetSpellHistory().LockSpellSchool(curSpellInfo.GetSchoolMask(), TimeSpan.FromMilliseconds(duration));
|
||||||
m_hitMask |= ProcFlagsHit.Interrupt;
|
m_UniqueTargetInfo.Find(p => p.TargetGUID == unitTarget.GetGUID()).ProcHitMask |= ProcFlagsHit.Interrupt;
|
||||||
SendSpellInterruptLog(unitTarget, curSpellInfo.Id);
|
SendSpellInterruptLog(unitTarget, curSpellInfo.Id);
|
||||||
unitTarget.InterruptSpell(i, false);
|
unitTarget.InterruptSpell(i, false);
|
||||||
}
|
}
|
||||||
@@ -3882,7 +3882,7 @@ namespace Game.Spells
|
|||||||
dispel_list.RemoveAt(0);
|
dispel_list.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hitMask |= ProcFlagsHit.Dispel;
|
m_UniqueTargetInfo.Find(p => p.TargetGUID == unitTarget.GetGUID()).ProcHitMask |= ProcFlagsHit.Dispel;
|
||||||
}
|
}
|
||||||
|
|
||||||
[SpellEffectHandler(SpellEffectName.ResurrectPet)]
|
[SpellEffectHandler(SpellEffectName.ResurrectPet)]
|
||||||
@@ -4444,7 +4444,7 @@ namespace Game.Spells
|
|||||||
}
|
}
|
||||||
m_caster.SendMessageToSet(spellDispellLog, true);
|
m_caster.SendMessageToSet(spellDispellLog, true);
|
||||||
|
|
||||||
m_hitMask |= ProcFlagsHit.Dispel;
|
m_UniqueTargetInfo.Find(p => p.TargetGUID == unitTarget.GetGUID()).ProcHitMask |= ProcFlagsHit.Dispel;
|
||||||
}
|
}
|
||||||
|
|
||||||
[SpellEffectHandler(SpellEffectName.KillCredit)]
|
[SpellEffectHandler(SpellEffectName.KillCredit)]
|
||||||
|
|||||||
@@ -1005,7 +1005,7 @@ namespace Game.Spells
|
|||||||
GetCooldownDurations(spellInfo, itemId, ref notUsed, ref categoryId, ref notUsed);
|
GetCooldownDurations(spellInfo, itemId, ref notUsed, ref categoryId, ref notUsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetCooldownDurations(SpellInfo spellInfo, uint itemId, ref TimeSpan cooldown, ref uint categoryId, ref TimeSpan categoryCooldown)
|
public static void GetCooldownDurations(SpellInfo spellInfo, uint itemId, ref TimeSpan cooldown, ref uint categoryId, ref TimeSpan categoryCooldown)
|
||||||
{
|
{
|
||||||
TimeSpan tmpCooldown = TimeSpan.MinValue;
|
TimeSpan tmpCooldown = TimeSpan.MinValue;
|
||||||
uint tmpCategoryId = 0;
|
uint tmpCategoryId = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user