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
This commit is contained in:
PolarCookie
2019-03-08 08:34:16 +01:00
committed by Giacomo Pozzoni
parent 3eecadcebf
commit ec3cb05d7f
7 changed files with 49 additions and 22 deletions

View File

@@ -2577,7 +2577,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, uint8 effIndex)
@@ -2762,8 +2764,7 @@ void Spell::DoSpellEffectHit(Unit* unit, uint8 effIndex, TargetInfo& hitInfo)
{
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->Speed > 0.0f && !m_spellInfo->IsChanneled()))
if (!hitInfo.HitAura)
{
bool const resetPeriodicTimer = !(_triggeredCastFlags & TRIGGERED_DONT_RESET_PERIODIC_TIMER);
uint8 const allAuraEffectMask = Aura::BuildEffectMaskForOwner(hitInfo.AuraSpellInfo, MAX_EFFECT_MASK, unit);
@@ -2782,20 +2783,20 @@ void Spell::DoSpellEffectHit(Unit* unit, uint8 effIndex, TargetInfo& hitInfo)
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);
hitInfo.AuraDuration = caster->ModSpellDuration(hitInfo.AuraSpellInfo, unit, hitInfo.AuraDuration, hitInfo.Positive, _spellAura->GetEffectMask());
hitInfo.AuraDuration = caster->ModSpellDuration(hitInfo.AuraSpellInfo, unit, hitInfo.AuraDuration, hitInfo.Positive, hitInfo.HitAura->GetEffectMask());
// Haste modifies duration of channeled spells
if (m_spellInfo->IsChanneled())
@@ -2804,21 +2805,21 @@ void Spell::DoSpellEffectHit(Unit* unit, uint8 effIndex, TargetInfo& hitInfo)
else if (m_originalCaster && (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, hitInfo.AuraSpellInfo) || m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION)))
hitInfo.AuraDuration = int32(hitInfo.AuraDuration * m_originalCaster->GetFloatValue(UNIT_MOD_CAST_SPEED));
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, effIndex, SPELL_EFFECT_HANDLE_HIT_TARGET);
_spellAura = nullptr;
}
void Spell::DoTriggersOnSpellHit(Unit* unit, uint8 effMask)