diff options
Diffstat (limited to 'src/server')
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 50 | 
1 files changed, 48 insertions, 2 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 73d28fe2fa9..157b60e2d99 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10676,6 +10676,15 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui      int32 TakenTotal = 0;      float TakenTotalMod = 1.0f; +    float TakenTotalCasterMod = 0.0f; + +    // get all auras from caster that allow the spell to ignore resistance (sanctified wrath) +    AuraEffectList const& IgnoreResistAuras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); +    for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i) +    { +        if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) +            TakenTotalCasterMod += ((*i)->GetBaseAmount()/100); +    }      // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN      // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) @@ -10740,7 +10749,21 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui          TakenTotal+= int32(TakenAdvertisedBenefit * coeff * factorMod);      } -    float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod; +    float tmpDamage = 0.0f; + +    if (TakenTotalCasterMod) +    { +        if (TakenTotal < 0) +            if (TakenTotalMod < 1) +                tmpDamage = ((float(CalculatePctF(pdamage, TakenTotalCasterMod) + TakenTotal) * TakenTotalMod) + CalculatePctF(pdamage, TakenTotalCasterMod)); +            else +                tmpDamage = ((float(CalculatePctF(pdamage, TakenTotalCasterMod) + TakenTotal) + CalculatePctF(pdamage, TakenTotalCasterMod)) * TakenTotalMod); +        else +            if (TakenTotalMod < 1) +                tmpDamage = ((CalculatePctF(float(pdamage) + TakenTotal, TakenTotalCasterMod) * TakenTotalMod) + CalculatePctF(float(pdamage) + TakenTotal, TakenTotalCasterMod)); +    } +    if (!tmpDamage) +        tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;      return uint32(std::max(tmpDamage, 0.0f));  } @@ -11692,6 +11715,15 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT          return 0;      int32 TakenFlatBenefit = 0; +    float TakenTotalCasterMod = 0.0f; + +    // get all auras from caster that allow the spell to ignore resistance (sanctified wrath) +    AuraEffectList const& IgnoreResistAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); +    for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i) +    { +        if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) +            TakenTotalCasterMod += ((*i)->GetBaseAmount()/100); +    }      // ..taken      AuraEffectList const& mDamageTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); @@ -11776,7 +11808,21 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT              AddPctN(TakenTotalMod, (*i)->GetAmount());      } -    float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod; +    float tmpDamage = 0.0f; + +    if (TakenTotalCasterMod) +    { +        if (TakenFlatBenefit < 0) +            if (TakenTotalMod < 1) +                tmpDamage = ((float(CalculatePctF(pdamage, TakenTotalCasterMod) + TakenFlatBenefit) * TakenTotalMod) + CalculatePctF(pdamage, TakenTotalCasterMod)); +            else +                tmpDamage = ((float(CalculatePctF(pdamage, TakenTotalCasterMod) + TakenFlatBenefit) + CalculatePctF(pdamage, TakenTotalCasterMod)) * TakenTotalMod); +        else +            if (TakenTotalMod < 1) +                tmpDamage = ((CalculatePctF(float(pdamage) + TakenFlatBenefit, TakenTotalCasterMod) * TakenTotalMod) + CalculatePctF(float(pdamage) + TakenFlatBenefit, TakenTotalCasterMod)); +    } +    if (!tmpDamage) +        tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;      // bonus result can be negative      return uint32(std::max(tmpDamage, 0.0f));  | 
