aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2018-02-04 21:28:15 -0300
committerShauren <shauren.trinity@gmail.com>2021-06-19 23:33:23 +0200
commitd34292534c197887cd33c15ff98ca8c96dc4fb99 (patch)
treea7e5e8c63ae4d2af78ea4a57f2e7d747776ca7b2 /src
parent01d9306854618bb66f79e1f0f5d9781ff48ab019 (diff)
Core/Spells: fix SPELLMOD_DAMAGE application order for melee spells
Closes #20597 (cherry picked from commit 2d2c43f4b91fef6fcd4d8c069a9bb41d66c97efe)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp15
-rw-r--r--src/server/game/Spells/SpellEffects.cpp13
2 files changed, 11 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 8902b480c90..f949936fff0 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -7831,22 +7831,17 @@ uint32 Unit::MeleeDamageBonusDone(Unit* pVictim, uint32 damage, WeaponAttackType
if (spellProto)
AddPct(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic));
- float tmpDamage = float(int32(damage) + DoneFlatBenefit) * DoneTotalMod;
+ float damageF = damage;
// apply spellmod to Done damage
if (spellProto)
- {
if (Player* modOwner = GetSpellModOwner())
- {
- if (damagetype == DOT)
- modOwner->ApplySpellMod(spellProto, SpellModOp::PeriodicHealingAndDamage, tmpDamage);
- else
- modOwner->ApplySpellMod(spellProto, SpellModOp::HealingAndDamage, tmpDamage);
- }
- }
+ modOwner->ApplySpellMod(spellProto, damagetype == DOT ? SpellModOp::PeriodicHealingAndDamage : SpellModOp::HealingAndDamage, damageF);
+
+ damageF = (damageF + DoneFlatBenefit) * DoneTotalMod;
// bonus result can be negative
- return uint32(std::max(tmpDamage, 0.0f));
+ return uint32(std::max(damageF, 0.0f));
}
uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, DamageEffectType damagetype, SpellInfo const* spellProto /*= nullptr*/, SpellSchoolMask damageSchoolMask /*= SPELL_SCHOOL_MASK_NORMAL*/)
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index ff0d7043e8b..f400e7f2d79 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2714,7 +2714,7 @@ void Spell::EffectTaunt(SpellEffIndex /*effIndex*/)
mgr.MatchUnitThreatToHighestThreat(m_caster);
}
-void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
+void Spell::EffectWeaponDmg(SpellEffIndex /*effIndex*/)
{
if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET)
return;
@@ -2725,9 +2725,8 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
// multiple weapon dmg effect workaround
// execute only the last weapon damage
// and handle all effects at once
- for (uint8 index = effIndex + 1; index < MAX_SPELL_EFFECTS; ++index)
+ for (SpellEffectInfo const* effect : m_spellInfo->GetEffects())
{
- SpellEffectInfo const* effect = m_spellInfo->GetEffect(index);
if (!effect)
continue;
switch (effect->Effect)
@@ -2889,6 +2888,7 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
break;
case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:
weaponDamage = int32(weaponDamage * weaponDamagePercentMod);
+ break;
default:
break; // not weapon damage effect, just skip
}
@@ -2898,12 +2898,11 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
weaponDamage = int32(weaponDamage * totalDamagePercentMod);
// prevent negative damage
- uint32 eff_damage(std::max(weaponDamage, 0));
+ weaponDamage = std::max(weaponDamage, 0);
// Add melee damage bonuses (also check for negative)
- uint32 damageBonusDone = m_caster->MeleeDamageBonusDone(unitTarget, eff_damage, m_attackType, SPELL_DIRECT_DAMAGE, m_spellInfo);
-
- m_damage += unitTarget->MeleeDamageBonusTaken(m_caster, damageBonusDone, m_attackType, SPELL_DIRECT_DAMAGE, m_spellInfo);
+ weaponDamage = m_caster->MeleeDamageBonusDone(unitTarget, weaponDamage, m_attackType, SPELL_DIRECT_DAMAGE, m_spellInfo);
+ m_damage += unitTarget->MeleeDamageBonusTaken(m_caster, weaponDamage, m_attackType, SPELL_DIRECT_DAMAGE, m_spellInfo);
}
void Spell::EffectThreat(SpellEffIndex /*effIndex*/)