Misc Fixes
This commit is contained in:
@@ -1711,6 +1711,15 @@ namespace Game.Spells
|
||||
if (!Global.SpellMgr.CanSpellTriggerProcOnEvent(procEntry, eventInfo))
|
||||
return 0;
|
||||
|
||||
// check don't break stealth attr present
|
||||
if (m_spellInfo.HasAura(Difficulty.None, AuraType.ModStealth))
|
||||
{
|
||||
SpellInfo spell = eventInfo.GetSpellInfo();
|
||||
if (spell != null)
|
||||
if (spell.HasAttribute(SpellCustomAttributes.DontBreakStealth))
|
||||
return 0;
|
||||
}
|
||||
|
||||
// check if aura can proc when spell is triggered (exception for hunter auto shot & wands)
|
||||
if (!procEntry.AttributesMask.HasAnyFlag(ProcAttributes.TriggeredCanProc) && !eventInfo.GetTypeMask().HasAnyFlag(ProcFlags.AutoAttackMask))
|
||||
{
|
||||
|
||||
@@ -674,15 +674,12 @@ namespace Game.Spells
|
||||
return false;
|
||||
|
||||
// Spell own damage at apply won't break CC
|
||||
if (spellInfo != null)
|
||||
if (spellInfo != null && spellInfo == GetSpellInfo())
|
||||
{
|
||||
if (spellInfo == GetSpellInfo())
|
||||
{
|
||||
Aura aura = GetBase();
|
||||
// called from spellcast, should not have ticked yet
|
||||
if (aura.GetDuration() == aura.GetMaxDuration())
|
||||
return false;
|
||||
}
|
||||
Aura aura = GetBase();
|
||||
// called from spellcast, should not have ticked yet
|
||||
if (aura.GetDuration() == aura.GetMaxDuration())
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -5544,8 +5541,6 @@ namespace Game.Spells
|
||||
}
|
||||
}
|
||||
|
||||
uint absorb = 0;
|
||||
uint resist = 0;
|
||||
CleanDamage cleanDamage = new CleanDamage(0, 0, WeaponAttackType.BaseAttack, MeleeHitOutcome.Normal);
|
||||
|
||||
// AOE spells are not affected by the new periodic system.
|
||||
@@ -5615,14 +5610,21 @@ namespace Game.Spells
|
||||
if (!GetSpellInfo().HasAttribute(SpellAttr4.FixedDamage))
|
||||
caster.ApplyResilience(target, ref damage);
|
||||
|
||||
caster.CalcAbsorbResist(target, GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, damage, ref absorb, ref resist, GetSpellInfo());
|
||||
DamageInfo damageInfo = new DamageInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, WeaponAttackType.BaseAttack);
|
||||
caster.CalcAbsorbResist(damageInfo);
|
||||
damage = damageInfo.GetDamage();
|
||||
|
||||
uint absorb = damageInfo.GetAbsorb();
|
||||
uint resist = damageInfo.GetResist();
|
||||
caster.DealDamageMods(target, ref damage, ref absorb);
|
||||
|
||||
// Set trigger flag
|
||||
ProcFlags procAttacker = ProcFlags.DonePeriodic;
|
||||
ProcFlags procVictim = ProcFlags.TakenPeriodic;
|
||||
ProcFlagsHit hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||
damage = (damage <= absorb + resist) ? 0 : (damage - absorb - resist);
|
||||
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
||||
if (hitMask == 0)
|
||||
hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||
|
||||
if (damage != 0)
|
||||
procVictim |= ProcFlags.TakenDamage;
|
||||
|
||||
@@ -5632,7 +5634,6 @@ namespace Game.Spells
|
||||
|
||||
SpellPeriodicAuraLogInfo pInfo = new SpellPeriodicAuraLogInfo(this, damage, overkill, absorb, resist, 0.0f, crit);
|
||||
|
||||
DamageInfo damageInfo = new DamageInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, WeaponAttackType.BaseAttack);
|
||||
caster.ProcSkillsAndAuras(target, procAttacker, procVictim, ProcFlagsSpellType.Damage, ProcFlagsSpellPhase.None, hitMask, null, damageInfo, null);
|
||||
|
||||
caster.DealDamage(target, damage, cleanDamage, DamageEffectType.DOT, GetSpellInfo().GetSchoolMask(), GetSpellInfo(), true);
|
||||
@@ -5654,8 +5655,6 @@ namespace Game.Spells
|
||||
caster.SpellHitResult(target, GetSpellInfo(), false) != SpellMissInfo.None)
|
||||
return;
|
||||
|
||||
uint absorb = 0;
|
||||
uint resist = 0;
|
||||
CleanDamage cleanDamage = new CleanDamage(0, 0, WeaponAttackType.BaseAttack, MeleeHitOutcome.Normal);
|
||||
|
||||
bool isAreaAura = GetSpellEffectInfo().IsAreaAuraEffect() || GetSpellEffectInfo().IsEffect(SpellEffectName.PersistentAreaAura);
|
||||
@@ -5698,10 +5697,15 @@ namespace Game.Spells
|
||||
if (!GetSpellInfo().HasAttribute(SpellAttr4.FixedDamage))
|
||||
caster.ApplyResilience(target, ref damage);
|
||||
|
||||
caster.CalcAbsorbResist(target, GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, damage, ref absorb, ref resist, m_spellInfo);
|
||||
DamageInfo damageInfo = new DamageInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, WeaponAttackType.BaseAttack);
|
||||
caster.CalcAbsorbResist(damageInfo);
|
||||
|
||||
uint absorb = damageInfo.GetAbsorb();
|
||||
uint resist = damageInfo.GetResist();
|
||||
|
||||
// SendSpellNonMeleeDamageLog expects non-absorbed/non-resisted damage
|
||||
SpellNonMeleeDamage log = new SpellNonMeleeDamage(caster, target, GetId(), GetBase().GetSpellXSpellVisualId(), GetSpellInfo().GetSchoolMask(), GetBase().GetCastGUID());
|
||||
log.damage = damage - absorb - resist;
|
||||
log.damage = damage;
|
||||
log.absorb = absorb;
|
||||
log.resist = resist;
|
||||
log.periodicLog = true;
|
||||
@@ -5711,16 +5715,15 @@ namespace Game.Spells
|
||||
// Set trigger flag
|
||||
ProcFlags procAttacker = ProcFlags.DonePeriodic;
|
||||
ProcFlags procVictim = ProcFlags.TakenPeriodic;
|
||||
ProcFlagsHit hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||
damage = (damage <= absorb + resist) ? 0 : (damage - absorb - resist);
|
||||
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
||||
if (hitMask == 0)
|
||||
hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||
|
||||
if (damage != 0)
|
||||
procVictim |= ProcFlags.TakenDamage;
|
||||
|
||||
if (caster.IsAlive())
|
||||
{
|
||||
DamageInfo damageInfo = new DamageInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask(), DamageEffectType.DOT, WeaponAttackType.BaseAttack);
|
||||
caster.ProcSkillsAndAuras(target, procAttacker, procVictim, ProcFlagsSpellType.Damage, ProcFlagsSpellPhase.None, hitMask, null, damageInfo, null);
|
||||
}
|
||||
|
||||
int new_damage = (int)caster.DealDamage(target, damage, cleanDamage, DamageEffectType.DOT, GetSpellInfo().GetSchoolMask(), GetSpellInfo(), false);
|
||||
if (caster.IsAlive())
|
||||
|
||||
+13
-5
@@ -1891,7 +1891,19 @@ namespace Game.Spells
|
||||
if (m_damage > 0)
|
||||
positive = false;
|
||||
else if (m_healing == 0)
|
||||
positive = m_spellInfo.IsPositive();
|
||||
{
|
||||
for (byte i = 0; i < SpellConst.MaxEffects; ++i)
|
||||
{
|
||||
if (!Convert.ToBoolean(target.effectMask & (1 << i)))
|
||||
continue;
|
||||
|
||||
if (!m_spellInfo.IsPositiveEffect(i))
|
||||
{
|
||||
positive = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (m_spellInfo.DmgClass)
|
||||
{
|
||||
@@ -2077,11 +2089,7 @@ namespace Game.Spells
|
||||
return SpellMissInfo.Evade;
|
||||
|
||||
if (m_caster._IsValidAttackTarget(unit, m_spellInfo))
|
||||
{
|
||||
unit.RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.Hitbyspell);
|
||||
if (!m_spellInfo.HasAttribute(SpellCustomAttributes.DontBreakStealth))
|
||||
unit.RemoveAurasByType(AuraType.ModStealth);
|
||||
}
|
||||
else if (m_caster.IsFriendlyTo(unit))
|
||||
{
|
||||
// for delayed spells ignore negative spells (after duel end) for friendly targets
|
||||
|
||||
+12
-10
@@ -126,19 +126,21 @@ namespace Game.Spells
|
||||
if (unitTarget == null || !unitTarget.IsAlive())
|
||||
return;
|
||||
|
||||
uint absorb = 0;
|
||||
uint resist = 0;
|
||||
|
||||
m_caster.CalcAbsorbResist(unitTarget, m_spellInfo.GetSchoolMask(), DamageEffectType.SpellDirect, (uint)damage, ref absorb, ref resist, m_spellInfo);
|
||||
|
||||
SpellNonMeleeDamage log = new SpellNonMeleeDamage(m_caster, unitTarget, m_spellInfo.Id, m_SpellVisual, m_spellInfo.GetSchoolMask(), m_castId);
|
||||
log.damage = (uint)(damage - absorb - resist);
|
||||
log.absorb = absorb;
|
||||
log.resist = resist;
|
||||
// CalcAbsorbResist already in Player::EnvironmentalDamage
|
||||
if (unitTarget.IsTypeId(TypeId.Player))
|
||||
unitTarget.ToPlayer().EnvironmentalDamage(EnviromentalDamage.Fire, (uint)damage);
|
||||
else
|
||||
{
|
||||
DamageInfo damageInfo = new DamageInfo(m_caster, unitTarget, (uint)damage, m_spellInfo, m_spellInfo.GetSchoolMask(), DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack);
|
||||
m_caster.CalcAbsorbResist(damageInfo);
|
||||
|
||||
m_caster.SendSpellNonMeleeDamageLog(log);
|
||||
SpellNonMeleeDamage log = new SpellNonMeleeDamage(m_caster, unitTarget, m_spellInfo.Id, m_SpellVisual, m_spellInfo.GetSchoolMask(), m_castId);
|
||||
log.damage = (uint)damage;
|
||||
log.absorb = damageInfo.GetAbsorb();
|
||||
log.resist = damageInfo.GetResist();
|
||||
|
||||
m_caster.SendSpellNonMeleeDamageLog(log);
|
||||
}
|
||||
}
|
||||
|
||||
[SpellEffectHandler(SpellEffectName.SchoolDamage)]
|
||||
|
||||
Reference in New Issue
Block a user