diff options
| author | funjoker <torti-esser@web.de> | 2016-05-03 14:09:57 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-05-03 14:09:57 +0200 |
| commit | 7eab3d37160b1092413a8fa1df73b5d5679ee2b8 (patch) | |
| tree | 25cda270e83c995edae7a3cbdceba11ca48bfe03 /src/server/game/Entities/Unit | |
| parent | 8e84cd760a3485a1011567486644e7b7ba9c0cc3 (diff) | |
Core/Units: Updated armor damage reduction calculation
Merge #17069
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 29 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
2 files changed, 14 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 46fce40bc0d..c77e3785924 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1001,7 +1001,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama if (!spellInfo->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE)) { if (IsDamageReducedByArmor(damageSchoolMask, spellInfo)) - damage = CalcArmorReducedDamage(victim, damage, spellInfo, attackType); + damage = CalcArmorReducedDamage(damageInfo->attacker, victim, damage, spellInfo, attackType); bool blocked = false; // Per-school calc @@ -1182,7 +1182,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam // Calculate armor reduction if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask))) { - damageInfo->damage = CalcArmorReducedDamage(damageInfo->target, damage, NULL, damageInfo->attackType); + damageInfo->damage = CalcArmorReducedDamage(damageInfo->attacker, damageInfo->target, damage, NULL, damageInfo->attackType); damageInfo->cleanDamage += damage - damageInfo->damage; } else @@ -1473,7 +1473,7 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s return true; } -uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/) +uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/) { float armor = float(victim->GetArmor()); @@ -1516,22 +1516,19 @@ uint32 Unit::CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo armor -= std::min(armorPen, maxArmorPen); } - if (armor < 0.0f) - armor = 0.0f; + if (G3D::fuzzyLe(armor, 0.0f)) + return damage; - float levelModifier = getLevel(); - if (levelModifier > 59) - levelModifier = levelModifier + 4.5f * (levelModifier - 59); + uint8 attackerLevel = attacker->getLevel(); + if (attackerLevel > sGtArmorMitigationByLvlStore.GetTableRowCount()) + attackerLevel = sGtArmorMitigationByLvlStore.GetTableRowCount(); - float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40); - tmpvalue = tmpvalue / (1.0f + tmpvalue); + GtArmorMitigationByLvlEntry const* ambl = sGtArmorMitigationByLvlStore.EvaluateTable(attackerLevel - 1, 0); + if (!ambl) + return damage; - if (tmpvalue < 0.0f) - tmpvalue = 0.0f; - if (tmpvalue > 0.75f) - tmpvalue = 0.75f; - - return std::max<uint32>(uint32(damage * (1.0f - tmpvalue)), 1); + float mitigation = std::min(armor / (armor + ambl->KFactor), 0.85f); + return std::max<uint32>(damage * (1.0f - mitigation), 1); } uint32 Unit::CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5eddf7cc6b5..76df842862e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2079,7 +2079,7 @@ class TC_GAME_API Unit : public WorldObject virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS); - uint32 CalcArmorReducedDamage(Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); + uint32 CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK); uint32 CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const; void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, uint32 const damage, uint32* absorb, uint32* resist, SpellInfo const* spellInfo = NULL); void CalcHealAbsorb(Unit* victim, SpellInfo const* spellInfo, uint32& healAmount, uint32& absorb); |
