diff options
author | ariel- <ariel-@users.noreply.github.com> | 2018-01-13 23:33:40 -0300 |
---|---|---|
committer | ariel- <ariel-@users.noreply.github.com> | 2018-01-13 23:33:40 -0300 |
commit | 688e96fb4ffcdeb55b58d13285e3cebfbc617614 (patch) | |
tree | 84bfbeae33d40a7b11bce340c43705574a004156 /src | |
parent | 0e9b1635e0a2351342e8ed0ae4a1495479e09ffc (diff) |
Core/Unit: allow miss chance to exceed 60% cap with certain auras
Diffstat (limited to 'src')
-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 88981436b1d..53be3a350bb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2750,18 +2750,13 @@ 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 (Player const* player = ToPlayer()) miss_chance += player->GetMissPercentageFromDefense(); - 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; } @@ -12741,7 +12736,7 @@ int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, ObjectGuid co float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const { //calculate miss chance - float missChance = victim->GetUnitMissChance(attType); + float missChance = victim->GetUnitMissChance(); // melee attacks while dual wielding have +19% chance to miss if (!spellId && haveOffhandWeapon()) @@ -12774,9 +12769,16 @@ float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, i 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::SetPhaseMask(uint32 newPhaseMask, bool update) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 722a21ae05e..7c74d7fa58f 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -977,7 +977,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; |