aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
2 files changed, 13 insertions, 11 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6bcfcb06fc0..3945343e29a 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2751,15 +2751,10 @@ float Unit::GetUnitParryChance(WeaponAttackType attType, Unit const* victim) con
return std::max(chance, 0.0f);
}
-float Unit::GetUnitMissChance(WeaponAttackType attType) const
+float Unit::GetUnitMissChance() const
{
float miss_chance = 5.0f;
- if (attType == RANGED_ATTACK)
- miss_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE);
- else
- miss_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE);
-
return miss_chance;
}
@@ -12506,7 +12501,7 @@ int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, ObjectGuid co
float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, SpellInfo const* spellInfo) const
{
//calculate miss chance
- float missChance = victim->GetUnitMissChance(attType);
+ float missChance = victim->GetUnitMissChance();
// melee attacks while dual wielding have +19% chance to miss
if (!spellInfo && haveOffhandWeapon() && !IsInFeralForm())
@@ -12525,9 +12520,16 @@ float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, S
else
missChance -= m_modMeleeHitChance;
- // Limit miss chance from 0 to 60%
- RoundToInterval(missChance, 0.f, 60.f);
- return missChance;
+ // Limit miss chance to 60%
+ missChance = std::min(missChance, 60.f);
+
+ // miss chance from SPELL_AURA_MOD_ATTACKER_xxx_HIT_CHANCE can exceed 60% miss cap (eg aura 50240)
+ if (attType == RANGED_ATTACK)
+ missChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE);
+ else
+ missChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE);
+
+ return std::max(missChance, 0.f);
}
void Unit::OnPhaseChange()
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 76fa4764f3e..dcae62ea32e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1064,7 +1064,7 @@ class TC_GAME_API Unit : public WorldObject
float GetUnitDodgeChance(WeaponAttackType attType, Unit const* victim) const;
float GetUnitParryChance(WeaponAttackType attType, Unit const* victim) const;
float GetUnitBlockChance(WeaponAttackType attType, Unit const* victim) const;
- float GetUnitMissChance(WeaponAttackType attType) const;
+ float GetUnitMissChance() const;
float GetUnitCriticalChanceDone(WeaponAttackType attackType) const;
float GetUnitCriticalChanceTaken(Unit const* attacker, WeaponAttackType attackType, float critDone) const;
float GetUnitCriticalChanceAgainst(WeaponAttackType attackType, Unit const* victim) const;