diff options
author | ariel- <ariel-@users.noreply.github.com> | 2016-10-06 01:06:37 -0300 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-08-21 21:11:05 +0200 |
commit | 2e0d3d25ff9b001d0d5d3c9441b07a3a6ea662b5 (patch) | |
tree | 579913987288a1db238dfe907f6804ec51ef6004 /src | |
parent | 6f7cf0a795308dfa8a99d58974836b4ab0af2177 (diff) |
Core/Unit: implemented crit suppression
Thanks Riztazz for the infos :P
(cherry picked from commit 8a82a3ba81a187b5c76f4065697925a1da15aa13)
# Conflicts:
# src/server/game/Entities/Unit/Unit.cpp
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8f173567a00..b7ef48b619a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2105,10 +2105,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy // 6.CRIT tmp = crit_chance; if (tmp > 0 && roll < (sum += tmp)) - { - if (GetTypeId() != TYPEID_UNIT || !(ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) - return MELEE_HIT_CRIT; - } + return MELEE_HIT_CRIT; // 7. CRUSHING // mobs can score crushing blows if they're 4 or more levels above victim @@ -2686,39 +2683,41 @@ float Unit::GetUnitBlockChance(WeaponAttackType /*attType*/, Unit const* victim) float Unit::GetUnitCriticalChance(WeaponAttackType attackType, Unit const* victim) const { - float crit; - + float chance = 0.0f; if (GetTypeId() == TYPEID_PLAYER) { switch (attackType) { case BASE_ATTACK: - crit = GetFloatValue(PLAYER_CRIT_PERCENTAGE); + chance = GetFloatValue(PLAYER_CRIT_PERCENTAGE); break; case OFF_ATTACK: - crit = GetFloatValue(PLAYER_OFFHAND_CRIT_PERCENTAGE); + chance = GetFloatValue(PLAYER_OFFHAND_CRIT_PERCENTAGE); break; case RANGED_ATTACK: - crit = GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE); + chance = GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE); break; // Just for good manner default: - crit = 0.0f; + chance = 0.0f; break; } } else { - crit = 5.0f; - crit += GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT); - crit += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT); + if (!(ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT)) + { + chance = 5.0f; + chance += GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT); + chance += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT); + } } // flat aura mods if (attackType == RANGED_ATTACK) - crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE); + chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE); else - crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE); + chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE); AuraEffectList const& critChanceForCaster = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER); for (AuraEffect const* aurEff : critChanceForCaster) @@ -2726,14 +2725,12 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, Unit const* victi if (aurEff->GetCasterGUID() != GetGUID()) continue; - crit += aurEff->GetAmount(); + chance += aurEff->GetAmount(); } - crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE); + chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE); - if (crit < 0.0f) - crit = 0.0f; - return crit; + return std::max(chance, 0.0f); } void Unit::_DeleteRemovedAuras() @@ -6762,18 +6759,18 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto } // scripted (increase crit chance ... against ... target by x% AuraEffectList const& mOverrideClassScript = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); - for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i) + for (AuraEffect const* aurEff : mOverrideClassScript) { - if (!((*i)->IsAffectingSpell(spellProto))) + if (!aurEff->IsAffectingSpell(spellProto)) continue; - switch ((*i)->GetMiscValue()) + switch (aurEff->GetMiscValue()) { case 911: // Shatter if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this)) { crit_chance *= 1.5f; - if (AuraEffect const* eff = (*i)->GetBase()->GetEffect(EFFECT_1)) + if (AuraEffect const* eff = aurEff->GetBase()->GetEffect(EFFECT_1)) crit_chance += eff->GetAmount(); } break; @@ -6817,6 +6814,13 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto } break; } + + // Spell crit suppression + if (victim->GetTypeId() == TYPEID_UNIT) + { + int32 const levelDiff = static_cast<int32>(victim->GetLevelForTarget(this)) - getLevel(); + crit_chance -= levelDiff * 1.0f; + } } break; } @@ -6841,7 +6845,7 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto if (aurEff->GetCasterGUID() == GetGUID() && aurEff->IsAffectingSpell(spellProto)) crit_chance += aurEff->GetAmount(); - return crit_chance > 0.0f ? crit_chance : 0.0f; + return std::max(crit_chance, 0.0f); } uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage, Unit* /*victim*/) |