diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
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; |