diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f0af80b721e..94cfa7d68b6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1599,18 +1599,21 @@ uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 d // Apply Player CR_ARMOR_PENETRATION rating if (GetTypeId() == TYPEID_PLAYER) { - float maxArmorPen = 0; + float arpPct = ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION); + + // no more than 100% + RoundToInterval(arpPct, 0.f, 100.f); + + float maxArmorPen = 0.f; if (victim->GetLevelForTarget(attacker) < 60) maxArmorPen = float(400 + 85 * victim->GetLevelForTarget(attacker)); else maxArmorPen = 400 + 85 * victim->GetLevelForTarget(attacker) + 4.5f * 85 * (victim->GetLevelForTarget(attacker) - 59); // Cap armor penetration to this number - maxArmorPen = std::min((armor + maxArmorPen) / 3, armor); + maxArmorPen = std::min((armor + maxArmorPen) / 3.f, armor); // Figure out how much armor do we ignore - float armorPen = CalculatePct(maxArmorPen, ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION)); - // Got the value, apply it - armor -= std::min(armorPen, maxArmorPen); + armor -= CalculatePct(maxArmorPen, arpPct); } if (G3D::fuzzyLe(armor, 0.0f)) |