mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 02:46:33 +01:00
Core/Spell: Fixed irregular handling of SPELLMOD_DOT
- Applied twice for some dots - Missing for Health Leech Periodic - Missing in a few scripts Closes #17463
This commit is contained in:
@@ -399,9 +399,9 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
|
||||
// Conflagrate - consumes Immolate or Shadowflame
|
||||
else if (m_spellInfo->TargetAuraState == AURA_STATE_CONFLAGRATE)
|
||||
{
|
||||
AuraEffect const* aura = NULL; // found req. aura for damage calculation
|
||||
AuraEffect const* aura = nullptr; // found req. aura for damage calculation
|
||||
|
||||
Unit::AuraEffectList const &mPeriodic = unitTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||
Unit::AuraEffectList const& mPeriodic = unitTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||
for (Unit::AuraEffectList::const_iterator i = mPeriodic.begin(); i != mPeriodic.end(); ++i)
|
||||
{
|
||||
// for caster applied auras only
|
||||
@@ -424,15 +424,22 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
|
||||
// found Immolate or Shadowflame
|
||||
if (aura)
|
||||
{
|
||||
uint32 pdamage = uint32(std::max(aura->GetAmount(), 0));
|
||||
pdamage = m_caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount());
|
||||
pdamage = unitTarget->SpellDamageBonusTaken(m_caster, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount());
|
||||
uint32 pct_dir = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, (effIndex + 1));
|
||||
uint8 baseTotalTicks = uint8(m_caster->CalcSpellDuration(aura->GetSpellInfo()) / aura->GetSpellInfo()->Effects[EFFECT_0].Amplitude);
|
||||
damage += int32(CalculatePct(pdamage * baseTotalTicks, pct_dir));
|
||||
// Calculate damage of Immolate/Shadowflame tick
|
||||
int32 pdamage = (aura->GetAmount() + aura->GetBonusAmount()) * aura->GetDonePct();
|
||||
if (Player* modOwner = m_caster->GetSpellModOwner())
|
||||
modOwner->ApplySpellMod<SPELLMOD_DOT>(GetSpellInfo()->Id, pdamage);
|
||||
|
||||
uint32 pct_dot = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, (effIndex + 2)) / 3;
|
||||
m_spellValue->EffectBasePoints[1] = m_spellInfo->Effects[EFFECT_1].CalcBaseValue(int32(CalculatePct(pdamage * baseTotalTicks, pct_dot)));
|
||||
pdamage = unitTarget->SpellDamageBonusTaken(m_caster, aura->GetSpellInfo(), pdamage, DOT);
|
||||
|
||||
// And multiply by amount of ticks to get damage potential
|
||||
pdamage *= aura->GetSpellInfo()->GetMaxTicks();
|
||||
|
||||
int32 pct_dir = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_1);
|
||||
damage += CalculatePct(pdamage, pct_dir);
|
||||
|
||||
int32 pct_dot = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_2);
|
||||
int32 const dotBasePoints = CalculatePct(pdamage, pct_dot);
|
||||
m_spellValue->EffectBasePoints[EFFECT_1] = dotBasePoints / m_spellInfo->GetMaxTicks();
|
||||
|
||||
apply_direct_bonus = false;
|
||||
// Glyph of Conflagrate
|
||||
@@ -1397,9 +1404,12 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/)
|
||||
return;
|
||||
}
|
||||
|
||||
int32 tickheal = targetAura->GetAmount();
|
||||
if (Unit* auraCaster = targetAura->GetCaster())
|
||||
tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT);
|
||||
int32 tickheal = (targetAura->GetAmount() + targetAura->GetBonusAmount()) * targetAura->GetDonePct();
|
||||
if (Player* modOwner = m_caster->GetSpellModOwner())
|
||||
modOwner->ApplySpellMod<SPELLMOD_DOT>(targetAura->GetId(), tickheal);
|
||||
|
||||
unitTarget->SpellHealingBonusTaken(m_caster, targetAura->GetSpellInfo(), tickheal, DOT);
|
||||
|
||||
//int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1;
|
||||
//It is said that talent bonus should not be included
|
||||
|
||||
|
||||
Reference in New Issue
Block a user