aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorPolarCookie <sei009@post.uit.no>2019-03-08 08:34:16 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-24 20:35:19 +0100
commitf7299dce9770a5b4a3a5ab289e930a390aa0407a (patch)
treece53e0a4ad59df124d923638581eb2bb5b3c0f12 /src/server/game/Spells/Spell.cpp
parent67e0b2573925c323e4fc918311226588248ef35d (diff)
Core/Spell: SpellAura Redux (#22794)
* typo and correction * spell aura no longer shared between targets _spellAura isolated * SPELL_AURA_CONTROL_VEHICLE is not strictly single target spell Steam Tank Control and Wyrmrest Commander units can reseat themselves again * Rename 9999_99_99_99_world.sql to 2019_03_08_00_world.sql (cherry picked from commit ec3cb05d7fbc5cef60d000af910dc39dd3af92bf)
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 2444044c29c..0c4b991ef23 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2671,7 +2671,9 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)
spell->m_caster->ToPlayer()->UpdatePvP(true);
}
+ spell->_spellAura = HitAura;
spell->CallScriptAfterHitHandlers();
+ spell->_spellAura = nullptr;
}
void Spell::GOTargetInfo::DoTargetSpellHit(Spell* spell, SpellEffectInfo const& spellEffectInfo)
@@ -2841,8 +2843,7 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo,
{
bool refresh = false;
- // delayed spells with multiple targets need to create a new aura object, otherwise we'll access a deleted aura
- if (!_spellAura || (m_spellInfo->HasHitDelay() && !m_spellInfo->IsChanneled()))
+ if (!hitInfo.HitAura)
{
bool const resetPeriodicTimer = !(_triggeredCastFlags & TRIGGERED_DONT_RESET_PERIODIC_TIMER);
uint32 const allAuraEffectMask = Aura::BuildEffectMaskForOwner(m_spellInfo, MAX_EFFECT_MASK, unit);
@@ -2858,22 +2859,22 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo,
if (Aura* aura = Aura::TryRefreshStackOrCreate(createInfo))
{
- _spellAura = aura->ToUnitAura();
+ hitInfo.HitAura = aura->ToUnitAura();
// Set aura stack amount to desired value
if (m_spellValue->AuraStackAmount > 1)
{
if (!refresh)
- _spellAura->SetStackAmount(m_spellValue->AuraStackAmount);
+ hitInfo.HitAura->SetStackAmount(m_spellValue->AuraStackAmount);
else
- _spellAura->ModStackAmount(m_spellValue->AuraStackAmount);
+ hitInfo.HitAura->ModStackAmount(m_spellValue->AuraStackAmount);
}
- _spellAura->SetDiminishGroup(hitInfo.DRGroup);
+ hitInfo.HitAura->SetDiminishGroup(hitInfo.DRGroup);
if (!m_spellValue->Duration)
{
- hitInfo.AuraDuration = caster->ModSpellDuration(m_spellInfo, unit, hitInfo.AuraDuration, hitInfo.Positive, _spellAura->GetEffectMask());
+ hitInfo.AuraDuration = caster->ModSpellDuration(m_spellInfo, unit, hitInfo.AuraDuration, hitInfo.Positive, hitInfo.HitAura->GetEffectMask());
if (hitInfo.AuraDuration > 0)
{
@@ -2886,7 +2887,7 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo,
{
int32 origDuration = hitInfo.AuraDuration;
hitInfo.AuraDuration = 0;
- for (AuraEffect const* auraEff : _spellAura->GetAuraEffects())
+ for (AuraEffect const* auraEff : hitInfo.HitAura->GetAuraEffects())
if (auraEff)
if (int32 period = auraEff->GetPeriod()) // period is hastened by UNIT_MOD_CAST_SPEED
hitInfo.AuraDuration = std::max(std::max(origDuration / period, 1) * period, hitInfo.AuraDuration);
@@ -2900,21 +2901,21 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo,
else
hitInfo.AuraDuration = m_spellValue->Duration.get();
- if (hitInfo.AuraDuration != _spellAura->GetMaxDuration())
+ if (hitInfo.AuraDuration != hitInfo.HitAura->GetMaxDuration())
{
- _spellAura->SetMaxDuration(hitInfo.AuraDuration);
- _spellAura->SetDuration(hitInfo.AuraDuration);
+ hitInfo.HitAura->SetMaxDuration(hitInfo.AuraDuration);
+ hitInfo.HitAura->SetDuration(hitInfo.AuraDuration);
}
}
}
else
- _spellAura->AddStaticApplication(unit, aura_effmask);
-
- hitInfo.HitAura = _spellAura;
+ hitInfo.HitAura->AddStaticApplication(unit, aura_effmask);
}
}
+ _spellAura = hitInfo.HitAura;
HandleEffects(unit, nullptr, nullptr, spellEffectInfo, SPELL_EFFECT_HANDLE_HIT_TARGET);
+ _spellAura = nullptr;
}
void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask)