Core/Entities: better support of absorb, resist and block procs
This commit is contained in:
@@ -460,9 +460,10 @@ namespace Game.Entities
|
|||||||
public uint resist;
|
public uint resist;
|
||||||
public bool periodicLog;
|
public bool periodicLog;
|
||||||
public uint blocked;
|
public uint blocked;
|
||||||
public SpellHitType HitInfo;
|
public HitInfo HitInfo;
|
||||||
// Used for help
|
// Used for help
|
||||||
public uint cleanDamage;
|
public uint cleanDamage;
|
||||||
|
public bool fullBlock;
|
||||||
public uint preHitHealth;
|
public uint preHitHealth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1319,7 +1319,8 @@ namespace Game.Entities
|
|||||||
hitMask |= ProcFlagsHit.Parry;
|
hitMask |= ProcFlagsHit.Parry;
|
||||||
break;
|
break;
|
||||||
case SpellMissInfo.Block:
|
case SpellMissInfo.Block:
|
||||||
hitMask |= ProcFlagsHit.Block;
|
// spells can't be partially blocked (it's damage can though)
|
||||||
|
hitMask |= ProcFlagsHit.Block | ProcFlagsHit.FullBlock;
|
||||||
break;
|
break;
|
||||||
case SpellMissInfo.Evade:
|
case SpellMissInfo.Evade:
|
||||||
hitMask |= ProcFlagsHit.Evade;
|
hitMask |= ProcFlagsHit.Evade;
|
||||||
@@ -1337,6 +1338,9 @@ namespace Game.Entities
|
|||||||
case SpellMissInfo.Reflect:
|
case SpellMissInfo.Reflect:
|
||||||
hitMask |= ProcFlagsHit.Reflect;
|
hitMask |= ProcFlagsHit.Reflect;
|
||||||
break;
|
break;
|
||||||
|
case SpellMissInfo.Resist:
|
||||||
|
hitMask |= ProcFlagsHit.FullResist;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1345,15 +1349,27 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
// On block
|
// On block
|
||||||
if (damageInfo.blocked != 0)
|
if (damageInfo.blocked != 0)
|
||||||
|
{
|
||||||
hitMask |= ProcFlagsHit.Block;
|
hitMask |= ProcFlagsHit.Block;
|
||||||
|
if (damageInfo.fullBlock)
|
||||||
|
hitMask |= ProcFlagsHit.FullBlock;
|
||||||
|
}
|
||||||
// On absorb
|
// On absorb
|
||||||
if (damageInfo.absorb != 0)
|
if (damageInfo.absorb != 0)
|
||||||
hitMask |= ProcFlagsHit.Absorb;
|
hitMask |= ProcFlagsHit.Absorb;
|
||||||
// On crit
|
|
||||||
if (damageInfo.HitInfo.HasAnyFlag(SpellHitType.Crit))
|
// Don't set hit/crit hitMask if damage is nullified
|
||||||
hitMask |= ProcFlagsHit.Critical;
|
bool damageNullified = damageInfo.HitInfo.HasAnyFlag(HitInfo.FullAbsorb | HitInfo.FullResist) || hitMask.HasAnyFlag(ProcFlagsHit.FullBlock);
|
||||||
else
|
if (!damageNullified)
|
||||||
hitMask |= ProcFlagsHit.Normal;
|
{
|
||||||
|
// On crit
|
||||||
|
if (damageInfo.HitInfo.HasAnyFlag(HitInfo.CriticalHit))
|
||||||
|
hitMask |= ProcFlagsHit.Critical;
|
||||||
|
else
|
||||||
|
hitMask |= ProcFlagsHit.Normal;
|
||||||
|
}
|
||||||
|
else if (damageInfo.HitInfo.HasAnyFlag(HitInfo.FullResist))
|
||||||
|
hitMask |= ProcFlagsHit.FullResist;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hitMask;
|
return hitMask;
|
||||||
@@ -2384,7 +2400,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (crit)
|
if (crit)
|
||||||
{
|
{
|
||||||
damageInfo.HitInfo |= SpellHitType.Crit;
|
damageInfo.HitInfo |= HitInfo.CriticalHit;
|
||||||
|
|
||||||
// Calculate crit bonus
|
// Calculate crit bonus
|
||||||
uint crit_bonus = (uint)damage;
|
uint crit_bonus = (uint)damage;
|
||||||
@@ -2409,6 +2425,11 @@ namespace Game.Entities
|
|||||||
if (victim.isBlockCritical())
|
if (victim.isBlockCritical())
|
||||||
value *= 2; // double blocked percent
|
value *= 2; // double blocked percent
|
||||||
damageInfo.blocked = (uint)MathFunctions.CalculatePct(damage, value);
|
damageInfo.blocked = (uint)MathFunctions.CalculatePct(damage, value);
|
||||||
|
if (damage <= damageInfo.blocked)
|
||||||
|
{
|
||||||
|
damageInfo.blocked = (uint)damage;
|
||||||
|
damageInfo.fullBlock = true;
|
||||||
|
}
|
||||||
damage -= (int)damageInfo.blocked;
|
damage -= (int)damageInfo.blocked;
|
||||||
}
|
}
|
||||||
uint dmg = (uint)damage;
|
uint dmg = (uint)damage;
|
||||||
@@ -2423,7 +2444,7 @@ namespace Game.Entities
|
|||||||
// If crit add critical bonus
|
// If crit add critical bonus
|
||||||
if (crit)
|
if (crit)
|
||||||
{
|
{
|
||||||
damageInfo.HitInfo |= SpellHitType.Crit;
|
damageInfo.HitInfo |= HitInfo.CriticalHit;
|
||||||
damage = (int)SpellCriticalDamageBonus(spellInfo, (uint)damage, victim);
|
damage = (int)SpellCriticalDamageBonus(spellInfo, (uint)damage, victim);
|
||||||
}
|
}
|
||||||
uint dmg = (uint)damage;
|
uint dmg = (uint)damage;
|
||||||
@@ -2445,6 +2466,15 @@ namespace Game.Entities
|
|||||||
damageInfo.damage = (uint)damage;
|
damageInfo.damage = (uint)damage;
|
||||||
DamageInfo dmgInfo = new DamageInfo(damageInfo, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack, ProcFlagsHit.None);
|
DamageInfo dmgInfo = new DamageInfo(damageInfo, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack, ProcFlagsHit.None);
|
||||||
CalcAbsorbResist(dmgInfo);
|
CalcAbsorbResist(dmgInfo);
|
||||||
|
damageInfo.absorb = dmgInfo.GetAbsorb();
|
||||||
|
damageInfo.resist = dmgInfo.GetResist();
|
||||||
|
|
||||||
|
if (damageInfo.absorb != 0)
|
||||||
|
damageInfo.HitInfo |= (damageInfo.damage - damageInfo.absorb == 0 ? HitInfo.FullAbsorb : HitInfo.PartialAbsorb);
|
||||||
|
|
||||||
|
if (damageInfo.resist != 0)
|
||||||
|
damageInfo.HitInfo |= (damageInfo.damage - damageInfo.resist == 0 ? HitInfo.FullResist : HitInfo.PartialResist);
|
||||||
|
|
||||||
damageInfo.damage = dmgInfo.GetDamage();
|
damageInfo.damage = dmgInfo.GetDamage();
|
||||||
}
|
}
|
||||||
public void DealSpellDamage(SpellNonMeleeDamage damageInfo, bool durabilityLoss)
|
public void DealSpellDamage(SpellNonMeleeDamage damageInfo, bool durabilityLoss)
|
||||||
|
|||||||
@@ -5431,7 +5431,7 @@ namespace Game.Spells
|
|||||||
log.resist = resist;
|
log.resist = resist;
|
||||||
log.periodicLog = true;
|
log.periodicLog = true;
|
||||||
if (crit)
|
if (crit)
|
||||||
log.HitInfo |= SpellHitType.Crit;
|
log.HitInfo |= HitInfo.CriticalHit;
|
||||||
|
|
||||||
// Set trigger flag
|
// Set trigger flag
|
||||||
ProcFlags procAttacker = ProcFlags.DonePeriodic;
|
ProcFlags procAttacker = ProcFlags.DonePeriodic;
|
||||||
|
|||||||
Reference in New Issue
Block a user