diff --git a/Source/Game/Scripting/CoreScripts.cs b/Source/Game/Scripting/CoreScripts.cs index 466fa3229..0702aee40 100644 --- a/Source/Game/Scripting/CoreScripts.cs +++ b/Source/Game/Scripting/CoreScripts.cs @@ -368,6 +368,24 @@ namespace Game.Scripting public virtual GameObjectAI GetAI(GameObject go) { return null; } } + public class GenericAreaTriggerScript : AreaTriggerEntityScript where AI : AreaTriggerAI + { + public GenericAreaTriggerScript(string name, object[] args) : base(name) + { + _args = args; + } + + public override AreaTriggerAI GetAI(AreaTrigger me) + { + if (me.GetInstanceScript() != null) + return GetInstanceAI(me); + else + return (AI)Activator.CreateInstance(typeof(AI), new object[] { me }.Combine(_args)); + } + + object[] _args; + } + public class AreaTriggerScript : ScriptObject { public AreaTriggerScript(string name) : base(name) diff --git a/Source/Game/Scripting/ScriptManager.cs b/Source/Game/Scripting/ScriptManager.cs index 9d9187b7a..55abbbee2 100644 --- a/Source/Game/Scripting/ScriptManager.cs +++ b/Source/Game/Scripting/ScriptManager.cs @@ -133,6 +133,9 @@ namespace Game.Scripting case nameof(GameObjectAI): genericType = typeof(GenericGameObjectScript<>).MakeGenericType(type); break; + case nameof(AreaTriggerAI): + genericType = typeof(GenericAreaTriggerScript<>).MakeGenericType(type); + break; case "SpellScriptLoader": case "AuraScriptLoader": case "WorldScript": diff --git a/Source/Scripts/Spells/DemonHunter.cs b/Source/Scripts/Spells/DemonHunter.cs index 4d5d3c916..a158f679b 100644 --- a/Source/Scripts/Spells/DemonHunter.cs +++ b/Source/Scripts/Spells/DemonHunter.cs @@ -64,35 +64,20 @@ namespace Scripts.Spells.DemonHunter [Script("areatrigger_dh_sigil_of_silence", SpellIds.SigilOfSilenceAoe)] [Script("areatrigger_dh_sigil_of_misery", SpellIds.SigilOfMiseryAoe)] [Script("areatrigger_dh_sigil_of_flame", SpellIds.SigilOfFlameAoe)] - class areatrigger_dh_generic_sigil : AreaTriggerEntityScript + class areatrigger_dh_generic_sigil : AreaTriggerAI { uint _trigger; - public areatrigger_dh_generic_sigil(string script, uint trigger) : base(script) + public areatrigger_dh_generic_sigil(AreaTrigger at, uint trigger) : base(at) { _trigger = trigger; } - class areatrigger_dh_generic_sigilAI : AreaTriggerAI + public override void OnRemove() { - uint _trigger; - - public areatrigger_dh_generic_sigilAI(AreaTrigger at, uint trigger) : base(at) - { - _trigger = trigger; - } - - public override void OnRemove() - { - Unit caster = at.GetCaster(); - if (caster != null) - caster.CastSpell(at.GetPosition(), _trigger, new CastSpellExtraArgs()); - } - } - - public override AreaTriggerAI GetAI(AreaTrigger at) - { - return new areatrigger_dh_generic_sigilAI(at, _trigger); + Unit caster = at.GetCaster(); + if (caster != null) + caster.CastSpell(at.GetPosition(), _trigger, new CastSpellExtraArgs()); } } diff --git a/Source/Scripts/Spells/Priest.cs b/Source/Scripts/Spells/Priest.cs index af630b580..6cf8b31d7 100644 --- a/Source/Scripts/Spells/Priest.cs +++ b/Source/Scripts/Spells/Priest.cs @@ -1015,45 +1015,35 @@ namespace Scripts.Spells.Priest } [Script] // Angelic Feather areatrigger - created by SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER - class areatrigger_pri_angelic_feather : AreaTriggerEntityScript + class areatrigger_pri_angelic_feather : AreaTriggerAI { - public areatrigger_pri_angelic_feather() : base("areatrigger_pri_angelic_feather") { } + public areatrigger_pri_angelic_feather(AreaTrigger areatrigger) : base(areatrigger) { } - class areatrigger_pri_angelic_featherAI : AreaTriggerAI + // Called when the AreaTrigger has just been initialized, just before added to map + public override void OnInitialize() { - public areatrigger_pri_angelic_featherAI(AreaTrigger areatrigger) : base(areatrigger) { } - - // Called when the AreaTrigger has just been initialized, just before added to map - public override void OnInitialize() + Unit caster = at.GetCaster(); + if (caster) { - Unit caster = at.GetCaster(); - if (caster) - { - List areaTriggers = caster.GetAreaTriggers(SpellIds.AngelicFeatherAreatrigger); + List areaTriggers = caster.GetAreaTriggers(SpellIds.AngelicFeatherAreatrigger); - if (areaTriggers.Count >= 3) - areaTriggers.First().SetDuration(0); - } - } - - public override void OnUnitEnter(Unit unit) - { - Unit caster = at.GetCaster(); - if (caster) - { - if (caster.IsFriendlyTo(unit)) - { - // If target already has aura, increase duration to max 130% of initial duration - caster.CastSpell(unit, SpellIds.AngelicFeatherAura, true); - at.SetDuration(0); - } - } + if (areaTriggers.Count >= 3) + areaTriggers.First().SetDuration(0); } } - public override AreaTriggerAI GetAI(AreaTrigger areatrigger) + public override void OnUnitEnter(Unit unit) { - return new areatrigger_pri_angelic_featherAI(areatrigger); + Unit caster = at.GetCaster(); + if (caster) + { + if (caster.IsFriendlyTo(unit)) + { + // If target already has aura, increase duration to max 130% of initial duration + caster.CastSpell(unit, SpellIds.AngelicFeatherAura, true); + at.SetDuration(0); + } + } } } } \ No newline at end of file diff --git a/Source/Scripts/Spells/Shaman.cs b/Source/Scripts/Spells/Shaman.cs index 54535eee0..aea981cae 100644 --- a/Source/Scripts/Spells/Shaman.cs +++ b/Source/Scripts/Spells/Shaman.cs @@ -1044,61 +1044,51 @@ namespace Scripts.Spells.Shaman // 192078 - Wind Rush Totem (Spell) [Script] // 12676 - AreaTriggerId - class areatrigger_sha_wind_rush_totem : AreaTriggerEntityScript + class areatrigger_sha_wind_rush_totem : AreaTriggerAI { - public areatrigger_sha_wind_rush_totem() : base("areatrigger_sha_wind_rush_totem") { } + static int REFRESH_TIME = 4500; - class areatrigger_sha_wind_rush_totemAI : AreaTriggerAI + int _refreshTimer; + + public areatrigger_sha_wind_rush_totem(AreaTrigger areatrigger) : base(areatrigger) { - static int REFRESH_TIME = 4500; + _refreshTimer = REFRESH_TIME; + } - int _refreshTimer; - - public areatrigger_sha_wind_rush_totemAI(AreaTrigger areatrigger) : base(areatrigger) - { - _refreshTimer = REFRESH_TIME; - } - - public override void OnUpdate(uint diff) - { - _refreshTimer -= (int)diff; - if (_refreshTimer <= 0) - { - Unit caster = at.GetCaster(); - if (caster != null) - { - foreach (ObjectGuid guid in at.GetInsideUnits()) - { - Unit unit = Global.ObjAccessor.GetUnit(caster, guid); - if (unit != null) - { - if (!caster.IsFriendlyTo(unit)) - continue; - - caster.CastSpell(unit, SpellIds.WindRush, true); - } - } - } - _refreshTimer += REFRESH_TIME; - } - } - - public override void OnUnitEnter(Unit unit) + public override void OnUpdate(uint diff) + { + _refreshTimer -= (int)diff; + if (_refreshTimer <= 0) { Unit caster = at.GetCaster(); if (caster != null) { - if (!caster.IsFriendlyTo(unit)) - return; + foreach (ObjectGuid guid in at.GetInsideUnits()) + { + Unit unit = Global.ObjAccessor.GetUnit(caster, guid); + if (unit != null) + { + if (!caster.IsFriendlyTo(unit)) + continue; - caster.CastSpell(unit, SpellIds.WindRush, true); + caster.CastSpell(unit, SpellIds.WindRush, true); + } + } } + _refreshTimer += REFRESH_TIME; } } - public override AreaTriggerAI GetAI(AreaTrigger areatrigger) + public override void OnUnitEnter(Unit unit) { - return new areatrigger_sha_wind_rush_totemAI(areatrigger); + Unit caster = at.GetCaster(); + if (caster != null) + { + if (!caster.IsFriendlyTo(unit)) + return; + + caster.CastSpell(unit, SpellIds.WindRush, true); + } } } } \ No newline at end of file