mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Entities: better support of absorb, resist and block procs
2e457b3be4followup Closes #18275 (cherry picked from commit5db308b686) # Conflicts: # src/server/game/Entities/Unit/Unit.cpp # src/server/game/Entities/Unit/Unit.h
This commit is contained in:
@@ -274,7 +274,7 @@ SpellSchoolMask ProcEventInfo::GetSchoolMask() const
|
||||
|
||||
SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _SpellXSpellVisualID, uint32 _schoolMask, ObjectGuid _castId)
|
||||
: target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), schoolMask(_schoolMask),
|
||||
absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), preHitHealth(_target->GetHealth())
|
||||
absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth())
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1135,6 +1135,11 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
|
||||
if (victim->isBlockCritical())
|
||||
value *= 2; // double blocked percent
|
||||
damageInfo->blocked = CalculatePct(damage, value);
|
||||
if (damage <= int32(damageInfo->blocked))
|
||||
{
|
||||
damageInfo->blocked = uint32(damage);
|
||||
damageInfo->fullBlock = true;
|
||||
}
|
||||
damage -= damageInfo->blocked;
|
||||
}
|
||||
|
||||
@@ -1171,6 +1176,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();
|
||||
}
|
||||
|
||||
@@ -10012,14 +10026,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;
|
||||
@@ -10032,6 +10045,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;
|
||||
}
|
||||
@@ -10040,15 +10056,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;
|
||||
|
||||
@@ -687,6 +687,7 @@ struct TC_GAME_API SpellNonMeleeDamage
|
||||
uint32 HitInfo;
|
||||
// Used for help
|
||||
uint32 cleanDamage;
|
||||
bool fullBlock;
|
||||
uint32 preHitHealth;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user