Core/Entities: better support of absorb, resist and block procs

This commit is contained in:
hondacrx
2018-01-13 13:24:20 -05:00
parent 5587505199
commit a96e26329f
3 changed files with 41 additions and 10 deletions
+2 -1
View File
@@ -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;
} }
+34 -4
View File
@@ -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,16 +1349,28 @@ 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;
// Don't set hit/crit hitMask if damage is nullified
bool damageNullified = damageInfo.HitInfo.HasAnyFlag(HitInfo.FullAbsorb | HitInfo.FullResist) || hitMask.HasAnyFlag(ProcFlagsHit.FullBlock);
if (!damageNullified)
{
// On crit // On crit
if (damageInfo.HitInfo.HasAnyFlag(SpellHitType.Crit)) if (damageInfo.HitInfo.HasAnyFlag(HitInfo.CriticalHit))
hitMask |= ProcFlagsHit.Critical; hitMask |= ProcFlagsHit.Critical;
else else
hitMask |= ProcFlagsHit.Normal; 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)
+1 -1
View File
@@ -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;