Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uint32 Unit::SpellCriticalDamageBonus(SpellEntry const *spellProto, uint32 damage, Unit* victim)
- {
- // Calculate critical bonus
- int32 crit_bonus = 0;
- float crit_mod = 0.0f;
- switch(spellProto->DmgClass)
- {
- case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
- case SPELL_DAMAGE_CLASS_RANGED:
- crit_bonus = damage;
- break;
- default:
- crit_bonus = damage / 2; // for spells is 50%
- break;
- }
- // adds additional damage to crit_bonus (from talents)
- if (Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
- crit_mod_meta += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->SchoolMask));
- if (victim)
- {
- uint32 creatureTypeMask = victim->GetCreatureTypeMask();
- crit_mod += GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask);
- switch (spellProto->DmgClass)
- {
- case SPELL_DAMAGE_CLASS_MELEE:
- crit_mod += (victim->GetTotalAuraMultiplier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE));
- break;
- case SPELL_DAMAGE_CLASS_RANGED:
- crit_mod += (victim->GetTotalAuraMultiplier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE) -1.0f) * 100;
- break;
- default:
- crit_mod += (victim->GetTotalAuraMultiplier(SPELL_AURA_MOD_SCHOOL_CRIT_DMG_TAKEN) -1.0f) * 100;
- break;
- }
- }
- if (crit_bonus != 0)
- {
- crit_bonus = (int32)((((crit_mod_meta * 2) - 1) * crit_mod) + crit_bonus);
- damage += crit_bonus;
- }
- // Resilience - reduce crit damage
- if (victim)
- damage -= victim->GetResilienceDamageReduction(damage, CR_CRIT_TAKEN_SPELL, true);
- return damage;
- }
Add Comment
Please, Sign In to add comment