Core/Spell: SpellAura Redux
Port From (https://github.com/TrinityCore/TrinityCore/commit/f7299dce9770a5b4a3a5ab289e930a390aa0407a)
This commit is contained in:
@@ -3822,14 +3822,14 @@ namespace Game.Entities
|
||||
if (aura.IsRemoved())
|
||||
return;
|
||||
|
||||
aura.SetIsSingleTarget(caster != null && aura.GetSpellInfo().IsSingleTarget() || aura.HasEffectType(AuraType.ControlVehicle));
|
||||
aura.SetIsSingleTarget(caster != null && aura.GetSpellInfo().IsSingleTarget());
|
||||
if (aura.IsSingleTarget())
|
||||
{
|
||||
|
||||
// @HACK: Player is not in world during loading auras.
|
||||
//Single target auras are not saved or loaded from database
|
||||
//but may be created as a result of aura links (player mounts with passengers)
|
||||
Cypher.Assert((IsInWorld && !IsDuringRemoveFromWorld()) || (aura.GetCasterGUID() == GetGUID()) || (IsLoading() && aura.HasEffectType(AuraType.ControlVehicle)));
|
||||
Cypher.Assert((IsInWorld && !IsDuringRemoveFromWorld()) || aura.GetCasterGUID() == GetGUID());
|
||||
|
||||
// register single target aura
|
||||
caster.m_scAuras.Add(aura);
|
||||
|
||||
@@ -900,6 +900,11 @@ namespace Game.Entities
|
||||
}
|
||||
else if (seatId >= 0 && seatId == GetTransSeat())
|
||||
return;
|
||||
else
|
||||
{
|
||||
//Exit the current vehicle because unit will reenter in a new seat.
|
||||
m_vehicle.GetBase().RemoveAurasByType(AuraType.ControlVehicle, GetGUID(), aurApp.GetBase());
|
||||
}
|
||||
}
|
||||
|
||||
if (aurApp.HasRemoveMode())
|
||||
|
||||
@@ -1056,9 +1056,6 @@ namespace Game.Spells
|
||||
break;
|
||||
}
|
||||
|
||||
if (HasEffectType(AuraType.ControlVehicle) && aura.HasEffectType(AuraType.ControlVehicle))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+15
-13
@@ -2012,7 +2012,7 @@ namespace Game.Spells
|
||||
if (caster != null)
|
||||
{
|
||||
// delayed spells with multiple targets need to create a new aura object, otherwise we'll access a deleted aura
|
||||
if (spellAura == null || (m_spellInfo.HasHitDelay() && !m_spellInfo.IsChanneled()))
|
||||
if (hitInfo.HitAura == null)
|
||||
{
|
||||
bool resetPeriodicTimer = !_triggeredCastFlags.HasFlag(TriggerCastFlags.DontResetPeriodicTimer);
|
||||
uint allAuraEffectMask = Aura.BuildEffectMaskForOwner(m_spellInfo, SpellConst.MaxEffectMask, unit);
|
||||
@@ -2027,23 +2027,23 @@ namespace Game.Spells
|
||||
Aura aura = Aura.TryRefreshStackOrCreate(createInfo);
|
||||
if (aura != null)
|
||||
{
|
||||
spellAura = aura.ToUnitAura();
|
||||
hitInfo.HitAura = aura.ToUnitAura();
|
||||
|
||||
// Set aura stack amount to desired value
|
||||
if (m_spellValue.AuraStackAmount > 1)
|
||||
{
|
||||
if (!createInfo.IsRefresh)
|
||||
spellAura.SetStackAmount((byte)m_spellValue.AuraStackAmount);
|
||||
hitInfo.HitAura.SetStackAmount((byte)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.HasValue)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@@ -2056,7 +2056,7 @@ namespace Game.Spells
|
||||
{
|
||||
int origDuration = hitInfo.AuraDuration;
|
||||
hitInfo.AuraDuration = 0;
|
||||
foreach (AuraEffect auraEff in spellAura.GetAuraEffects())
|
||||
foreach (AuraEffect auraEff in hitInfo.HitAura.GetAuraEffects())
|
||||
{
|
||||
if (auraEff != null)
|
||||
{
|
||||
@@ -2075,21 +2075,21 @@ namespace Game.Spells
|
||||
else
|
||||
hitInfo.AuraDuration = m_spellValue.Duration.Value;
|
||||
|
||||
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, null, null, spellEffectInfo, SpellEffectHandleMode.HitTarget);
|
||||
spellAura = null;
|
||||
}
|
||||
|
||||
public void DoTriggersOnSpellHit(Unit unit, uint effMask)
|
||||
@@ -8070,7 +8070,9 @@ namespace Game.Spells
|
||||
spell.GetCaster().ToPlayer().UpdatePvP(true);
|
||||
}
|
||||
|
||||
spell.spellAura = HitAura;
|
||||
spell.CallScriptAfterHitHandlers();
|
||||
spell.spellAura = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -277,6 +277,9 @@ namespace Scripts.Spells.Generic
|
||||
//CorruptinPlagueEntrys
|
||||
public const uint CorruptingPlague = 40350;
|
||||
|
||||
//SiegeTankControl
|
||||
public const uint SiegeTankControl = 47963;
|
||||
|
||||
//FreezingCircleMisc
|
||||
public const uint FreezingCirclePitOfSaronNormal = 69574;
|
||||
public const uint FreezingCirclePitOfSaronHeroic = 70276;
|
||||
@@ -3724,6 +3727,20 @@ namespace Scripts.Spells.Generic
|
||||
}
|
||||
}
|
||||
|
||||
[Script]
|
||||
class spell_gen_vehicle_control_link : AuraScript
|
||||
{
|
||||
void OnRemove(AuraEffect aurEff, AuraEffectHandleModes mode)
|
||||
{
|
||||
GetTarget().RemoveAurasDueToSpell(SpellIds.SiegeTankControl); //aurEff->GetAmount()
|
||||
}
|
||||
|
||||
public override void Register()
|
||||
{
|
||||
AfterEffectRemove.Add(new EffectApplyHandler(OnRemove, 1, AuraType.Dummy, AuraEffectHandleModes.Real));
|
||||
}
|
||||
}
|
||||
|
||||
[Script] // 34779 - Freezing Circle
|
||||
class spell_freezing_circle : SpellScript
|
||||
{
|
||||
|
||||
@@ -233,7 +233,7 @@ namespace Scripts.Spells.Warlock
|
||||
{
|
||||
AuraEffect aurEff = aura.GetEffect(1);
|
||||
if (aurEff != null)
|
||||
aurEff.SetAmount(MathFunctions.CalculatePct(aurEff.GetAmount(), GetHitDamage()));
|
||||
aurEff.SetAmount(MathFunctions.CalculatePct(GetHitDamage(), aurEff.GetAmount()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_vehicle_control_link' AND `spell_id` IN (49078, 50343);
|
||||
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||
(49078, 'spell_gen_vehicle_control_link'),
|
||||
(50343, 'spell_gen_vehicle_control_link');
|
||||
Reference in New Issue
Block a user