aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp98
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
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;