aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2016-11-19 13:56:19 -0300
committerariel- <ariel-@users.noreply.github.com>2016-11-19 13:56:19 -0300
commit5db308b686993653d2bd2861254e10cc1cd5e645 (patch)
treed8441b16e0710580e0321ad4ac7a38bee11c65a2
parent5b56c94e6d9510fb9cd835216dde7181371a2454 (diff)
Core/Entities: better support of absorb, resist and block procs
2e457b3be418ce75b0e0ca901e84ebcdaf02ad18 followup Closes #18275
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp44
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
2 files changed, 37 insertions, 10 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index ca47f27f4c3..3891dad310b 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1148,8 +1148,11 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
// double blocked amount if block is critical
if (victim->isBlockCritical())
damageInfo->blocked += damageInfo->blocked;
- if (damage < int32(damageInfo->blocked))
+ if (damage <= int32(damageInfo->blocked))
+ {
damageInfo->blocked = uint32(damage);
+ damageInfo->fullBlock = true;
+ }
damage -= damageInfo->blocked;
}
@@ -1188,6 +1191,15 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
damageInfo->damage = damage;
DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE, BASE_ATTACK, PROC_HIT_NONE);
CalcAbsorbResist(dmgInfo);
+ damageInfo->absorb = dmgInfo.GetAbsorb();
+ damageInfo->resist = dmgInfo.GetResist();
+
+ if (damageInfo->absorb)
+ damageInfo->HitInfo |= (damageInfo->damage - damageInfo->absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
+
+ if (damageInfo->resist)
+ damageInfo->HitInfo |= (damageInfo->damage - damageInfo->resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
+
damageInfo->damage = dmgInfo.GetDamage();
}
@@ -10763,14 +10775,13 @@ uint32 createProcHitMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCond
hitMask |= PROC_HIT_PARRY;
break;
case SPELL_MISS_BLOCK:
- hitMask |= PROC_HIT_BLOCK;
+ // spells can't be partially blocked (it's damage can though)
+ hitMask |= PROC_HIT_BLOCK | PROC_HIT_FULL_BLOCK;
break;
case SPELL_MISS_EVADE:
hitMask |= PROC_HIT_EVADE;
break;
case SPELL_MISS_IMMUNE:
- hitMask |= PROC_HIT_IMMUNE;
- break;
case SPELL_MISS_IMMUNE2:
hitMask |= PROC_HIT_IMMUNE;
break;
@@ -10783,6 +10794,9 @@ uint32 createProcHitMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCond
case SPELL_MISS_REFLECT:
hitMask |= PROC_HIT_REFLECT;
break;
+ case SPELL_MISS_RESIST:
+ hitMask |= PROC_HIT_FULL_RESIST;
+ break;
default:
break;
}
@@ -10791,15 +10805,27 @@ uint32 createProcHitMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCond
{
// On block
if (damageInfo->blocked)
+ {
hitMask |= PROC_HIT_BLOCK;
+ if (damageInfo->fullBlock)
+ hitMask |= PROC_HIT_FULL_BLOCK;
+ }
// On absorb
if (damageInfo->absorb)
hitMask |= PROC_HIT_ABSORB;
- // On crit
- if (damageInfo->HitInfo & SPELL_HIT_TYPE_CRIT)
- hitMask |= PROC_HIT_CRITICAL;
- else
- hitMask |= PROC_HIT_NORMAL;
+
+ // Don't set hit/crit hitMask if damage is nullified
+ bool const damageNullified = (damageInfo->HitInfo & (HITINFO_FULL_ABSORB | HITINFO_FULL_RESIST)) != 0 || (hitMask & PROC_HIT_FULL_BLOCK) != 0;
+ if (!damageNullified)
+ {
+ // On crit
+ if (damageInfo->HitInfo & SPELL_HIT_TYPE_CRIT)
+ hitMask |= PROC_HIT_CRITICAL;
+ else
+ hitMask |= PROC_HIT_NORMAL;
+ }
+ else if ((damageInfo->HitInfo & HITINFO_FULL_RESIST) != 0)
+ hitMask |= PROC_HIT_FULL_RESIST;
}
return hitMask;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index b0d90382d65..917e5d24c79 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -983,7 +983,7 @@ struct TC_GAME_API SpellNonMeleeDamage
{
SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask)
: target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask),
- absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0)
+ absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false)
{ }
Unit *target;
@@ -1000,6 +1000,7 @@ struct TC_GAME_API SpellNonMeleeDamage
uint32 HitInfo;
// Used for help
uint32 cleanDamage;
+ bool fullBlock;
};
struct SpellPeriodicAuraLogInfo