diff options
| author | PolarCookie <sei009@post.uit.no> | 2019-03-08 08:34:16 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-11-24 20:35:19 +0100 |
| commit | f7299dce9770a5b4a3a5ab289e930a390aa0407a (patch) | |
| tree | ce53e0a4ad59df124d923638581eb2bb5b3c0f12 /src/server/game/Spells/Spell.cpp | |
| parent | 67e0b2573925c323e4fc918311226588248ef35d (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.cpp | 29 |
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) |
