aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp63
1 files changed, 52 insertions, 11 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 837d8fa0947..ee3b371f632 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -6833,12 +6833,12 @@ int32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, int3
// Check for table values
if (spellEffectInfo.BonusCoefficientFromAP > 0.0f)
{
- float ApCoeffMod = spellEffectInfo.BonusCoefficientFromAP;
+ float attackPowerCoeff = spellEffectInfo.BonusCoefficientFromAP;
if (Player* modOwner = GetSpellModOwner())
{
- ApCoeffMod *= 100.0f;
- modOwner->ApplySpellMod(spellProto, SpellModOp::BonusCoefficient, ApCoeffMod);
- ApCoeffMod /= 100.0f;
+ attackPowerCoeff *= 100.0f;
+ modOwner->ApplySpellMod(spellProto, SpellModOp::BonusCoefficient, attackPowerCoeff);
+ attackPowerCoeff /= 100.0f;
}
WeaponAttackType const attType = [&]()
@@ -6851,9 +6851,9 @@ int32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, int3
return BASE_ATTACK;
}();
- float APbonus = float(victim->GetTotalAuraModifier(attType != RANGED_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
- APbonus += GetTotalAttackPowerValue(attType);
- DoneTotal += int32(stack * ApCoeffMod * APbonus);
+ float attackPowerBonus = float(victim->GetTotalAuraModifier(attType != RANGED_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
+ attackPowerBonus += GetTotalAttackPowerValue(attType);
+ DoneTotal += int32(stack * attackPowerCoeff * attackPowerBonus);
}
// Default calculation
@@ -7352,11 +7352,27 @@ int32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, int
// Check for table values
if (spellEffectInfo.BonusCoefficientFromAP > 0.0f)
{
- 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);
+ float attackPowerCoeff = spellEffectInfo.BonusCoefficientFromAP;
+ if (Player* modOwner = GetSpellModOwner())
+ {
+ attackPowerCoeff *= 100.0f;
+ modOwner->ApplySpellMod(spellProto, SpellModOp::BonusCoefficient, attackPowerCoeff);
+ attackPowerCoeff /= 100.0f;
+ }
+
+ WeaponAttackType const attType = [&]()
+ {
+ if ((spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE))
+ return RANGED_ATTACK;
- DoneTotal += int32(spellEffectInfo.BonusCoefficientFromAP * stack * APbonus);
+ if (spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON) && !spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON))
+ return OFF_ATTACK;
+
+ return BASE_ATTACK;
+ }();
+ float attackPowerBonus = float(victim->GetTotalAuraModifier(attType != RANGED_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
+ attackPowerBonus += GetTotalAttackPowerValue(attType);
+ DoneTotal += int32(stack * attackPowerCoeff * attackPowerBonus);
}
// Default calculation
@@ -7609,6 +7625,31 @@ int32 Unit::SpellAbsorbBonusDone(Unit* victim, SpellInfo const* spellProto, int3
if (HasUnitTypeMask(UNIT_MASK_GUARDIAN))
doneAdvertisedBenefit += static_cast<Guardian const*>(this)->GetBonusDamage();
+ if (spellEffectInfo.BonusCoefficientFromAP > 0.0f)
+ {
+ float attackPowerCoeff = spellEffectInfo.BonusCoefficientFromAP;
+ if (Player* modOwner = GetSpellModOwner())
+ {
+ attackPowerCoeff *= 100.0f;
+ modOwner->ApplySpellMod(spellProto, SpellModOp::BonusCoefficient, attackPowerCoeff);
+ attackPowerCoeff /= 100.0f;
+ }
+
+ WeaponAttackType const attType = [&]()
+ {
+ if ((spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE))
+ return RANGED_ATTACK;
+
+ if (spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON) && !spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON))
+ return OFF_ATTACK;
+
+ return BASE_ATTACK;
+ }();
+ float attackPowerBonus = float(victim->GetTotalAuraModifier(attType != RANGED_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
+ attackPowerBonus += GetTotalAttackPowerValue(attType);
+ doneTotal += int32(stack * attackPowerCoeff * attackPowerBonus);
+ }
+
if (doneAdvertisedBenefit)
{
float coeff = spellEffectInfo.BonusCoefficient;