aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2016-10-06 01:06:37 -0300
committerjoschiwald <joschiwald.trinity@gmail.com>2017-08-21 21:11:05 +0200
commit2e0d3d25ff9b001d0d5d3c9441b07a3a6ea662b5 (patch)
tree579913987288a1db238dfe907f6804ec51ef6004 /src
parent6f7cf0a795308dfa8a99d58974836b4ab0af2177 (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.cpp54
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*/)