diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 98 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
2 files changed, 27 insertions, 73 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 298ea6b056a..2cfa5155dfb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6800,6 +6800,9 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin // Done fixed damage bonus auras int32 DoneAdvertisedBenefit = SpellBaseDamageBonusDone(spellProto->GetSchoolMask()); + // modify spell power by victim's SPELL_AURA_MOD_DAMAGE_TAKEN auras (eg Amplify/Dampen Magic) + DoneAdvertisedBenefit += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_TAKEN, spellProto->GetSchoolMask()); + // Pets just add their bonus damage to their spell damage // note that their spell damage is just gain of their own auras if (HasUnitTypeMask(UNIT_MASK_GUARDIAN)) @@ -6830,10 +6833,16 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin APbonus += GetTotalAttackPowerValue(attType); DoneTotal += int32(stack * ApCoeffMod * APbonus); } + else + { + // No bonus damage for SPELL_DAMAGE_CLASS_NONE class spells by default + if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) + return uint32(std::max(pdamage * DoneTotalMod, 0.0f)); + } // Default calculation float coeff = effect->BonusCoefficient; - if (coeff && DoneAdvertisedBenefit) + if (DoneAdvertisedBenefit) { if (Player* modOwner = GetSpellModOwner()) { @@ -6940,7 +6949,6 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui if (!spellProto || damagetype == DIRECT_DAMAGE) return pdamage; - int32 TakenTotal = 0; float TakenTotalMod = 1.0f; // Mod damage from spell mechanic @@ -6994,17 +7002,6 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui return aurEff->GetMiscValue() & spellProto->GetSchoolMask(); }); } - - int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask()); - - // Check for table values - float coeff = effect->BonusCoefficient; - - // Default calculation - if (TakenAdvertisedBenefit) - { - TakenTotal += int32(TakenAdvertisedBenefit * coeff * stack); - } } // Sanctified Wrath (bypass damage reduction) @@ -7023,7 +7020,7 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui TakenTotalMod = 1.0f - damageReduction; } - float tmpDamage = float(pdamage + TakenTotal) * TakenTotalMod; + float tmpDamage = pdamage * TakenTotalMod; return uint32(std::max(tmpDamage, 0.0f)); } @@ -7064,11 +7061,6 @@ int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const return DoneAdvertisedBenefit; } -int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask) const -{ - return GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_TAKEN, schoolMask); -} - float Unit::SpellCritChanceDone(Spell* spell, AuraEffect const* aurEff, SpellSchoolMask schoolMask, WeaponAttackType attackType /*= BASE_ATTACK*/) const { SpellInfo const* spellInfo = spell ? spell->GetSpellInfo() : aurEff->GetSpellInfo(); @@ -7310,23 +7302,33 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui // Done fixed damage bonus auras int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask()); + // modify spell power by victim's SPELL_AURA_MOD_HEALING auras (eg Amplify/Dampen Magic) + DoneAdvertisedBenefit += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_HEALING, spellProto->GetSchoolMask()); + + // Pets just add their bonus damage to their spell damage + // note that their spell damage is just gain of their own auras + if (HasUnitTypeMask(UNIT_MASK_GUARDIAN)) + DoneAdvertisedBenefit += static_cast<Guardian const*>(this)->GetBonusDamage(); // Check for table values float coeff = spellEffect->BonusCoefficient; if (spellEffect->BonusCoefficientFromAP > 0.0f) { - DoneTotal += int32(spellEffect->BonusCoefficientFromAP * stack * GetTotalAttackPowerValue( - (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK)); + WeaponAttackType const attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK; + float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS)); + APbonus += GetTotalAttackPowerValue(attType); + + DoneTotal += int32(spellEffect->BonusCoefficientFromAP * stack * APbonus); } - else if (coeff <= 0.0f) + else if (coeff <= 0.0f) // no AP and no SP coefs, skip { // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) - return healamount; + return uint32(std::max(healamount * DoneTotalMod, 0.0f)); } // Default calculation - if (coeff && DoneAdvertisedBenefit) + if (DoneAdvertisedBenefit) { if (Player* modOwner = GetSpellModOwner()) { @@ -7431,12 +7433,6 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0)) AddPct(TakenTotalMod, Tenacity->GetAmount()); - // Healing Done - int32 TakenTotal = 0; - - // Taken fixed damage bonus auras - int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask()); - // Nourish cast if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000) { @@ -7446,24 +7442,6 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u TakenTotalMod *= 1.2f; } - // Check for table values - float coeff = spellEffect->BonusCoefficient; - if (coeff <= 0.0f) - { - // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default - if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE) - { - healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f)); - return healamount; - } - } - - // Default calculation - if (TakenAdvertisedBenefit) - { - TakenTotal += int32(TakenAdvertisedBenefit * coeff * stack); - } - if (damagetype == DOT) { // Healing over time taken percent @@ -7486,24 +7464,7 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u }); } - for (SpellEffectInfo const* effect : spellProto->GetEffects()) - { - if (!effect) - continue; - switch (effect->ApplyAuraName) - { - // Bonus healing does not apply to these spells - case SPELL_AURA_PERIODIC_LEECH: - case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: - TakenTotal = 0; - break; - } - if (effect->Effect == SPELL_EFFECT_HEALTH_LEECH) - TakenTotal = 0; - } - - float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod; - + float heal = healamount * TakenTotalMod; return uint32(std::max(heal, 0.0f)); } @@ -7545,11 +7506,6 @@ int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const return advertisedBenefit; } -int32 Unit::SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) const -{ - return GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_HEALING, schoolMask); -} - bool Unit::IsImmunedToDamage(SpellSchoolMask schoolMask) const { if (schoolMask == SPELL_SCHOOL_MASK_NONE) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f7b32848a8a..4cf7cffa9fe 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1691,12 +1691,10 @@ class TC_GAME_API Unit : public WorldObject Unit* GetMeleeHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo = nullptr); int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const; - int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask) const; uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; float SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype) const; uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const; - int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) const; uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; float SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const; uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack = 1) const; |