diff --git a/Source/Framework/Constants/SmartAIConst.cs b/Source/Framework/Constants/SmartAIConst.cs index bb10efaa6..3b318a5e8 100644 --- a/Source/Framework/Constants/SmartAIConst.cs +++ b/Source/Framework/Constants/SmartAIConst.cs @@ -188,7 +188,7 @@ namespace Framework.Constants TransportRemovePlayer = 43, // None TransportRelocate = 44, // Pointid InstancePlayerEnter = 45, // Team (0 Any), Cooldownmin, Cooldownmax - AreatriggerOntrigger = 46, // Triggerid(0 Any) + AreatriggerEnter = 46, // None QuestAccepted = 47, // None QuestObjCompletion = 48, // None QuestCompletion = 49, // None @@ -230,6 +230,7 @@ namespace Framework.Constants OnSpellStart = 85, // SpellID, CooldownMin, CooldownMax OnDespawn = 86, // NONE SendEventTrigger = 87, // NONE + AreatriggerExit = 88, // None End } diff --git a/Source/Game/AI/SmartScripts/SmartAI.cs b/Source/Game/AI/SmartScripts/SmartAI.cs index 0e6c6c33c..96c087d01 100644 --- a/Source/Game/AI/SmartScripts/SmartAI.cs +++ b/Source/Game/AI/SmartScripts/SmartAI.cs @@ -1207,7 +1207,12 @@ namespace Game.AI public override void OnUnitEnter(Unit unit) { - GetScript().ProcessEventsFor(SmartEvents.AreatriggerOntrigger, unit); + GetScript().ProcessEventsFor(SmartEvents.AreatriggerEnter, unit); + } + + public override void OnUnitExit(Unit unit) + { + GetScript().ProcessEventsFor(SmartEvents.AreatriggerExit, unit); } public void SetTimedActionList(SmartScriptHolder e, uint entry, Unit invoker) diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index ecf0c894c..c9367f43e 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -121,7 +121,7 @@ namespace Game.AI { if (Global.AreaTriggerDataStorage.GetAreaTriggerTemplate(new AreaTriggerId((uint)temp.EntryOrGuid, false)) == null) { - Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadFromDB: AreaTrigger entry ({temp.EntryOrGuid} IsServerSide false) does not exist, skipped loading."); + Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadFromDB: AreaTrigger entry ({temp.EntryOrGuid} IsCustom false) does not exist, skipped loading."); continue; } break; @@ -371,7 +371,7 @@ namespace Game.AI case SmartEvents.FollowCompleted: case SmartEvents.OnSpellclick: case SmartEvents.GoLootStateChanged: - case SmartEvents.AreatriggerOntrigger: + case SmartEvents.AreatriggerEnter: case SmartEvents.IcLos: case SmartEvents.OocLos: case SmartEvents.DistanceCreature: @@ -395,6 +395,7 @@ namespace Game.AI case SmartEvents.SceneCancel: case SmartEvents.SceneComplete: case SmartEvents.SendEventTrigger: + case SmartEvents.AreatriggerExit: return true; default: return false; @@ -585,7 +586,7 @@ namespace Game.AI SmartEvents.TransportRemovePlayer => 0, SmartEvents.TransportRelocate => Marshal.SizeOf(typeof(SmartEvent.TransportRelocate)), SmartEvents.InstancePlayerEnter => Marshal.SizeOf(typeof(SmartEvent.InstancePlayerEnter)), - SmartEvents.AreatriggerOntrigger => Marshal.SizeOf(typeof(SmartEvent.Areatrigger)), + SmartEvents.AreatriggerEnter => 0, SmartEvents.QuestAccepted => 0, SmartEvents.QuestObjCompletion => 0, SmartEvents.QuestCompletion => 0, @@ -625,6 +626,7 @@ namespace Game.AI SmartEvents.OnSpellStart => Marshal.SizeOf(typeof(SmartEvent.SpellCast)), SmartEvents.OnDespawn => 0, SmartEvents.SendEventTrigger => 0, + SmartEvents.AreatriggerExit => 0, _ => Marshal.SizeOf(typeof(SmartEvent.Raw)), }; @@ -1173,18 +1175,6 @@ namespace Game.AI return false; break; } - case SmartEvents.AreatriggerOntrigger: - { - if (e.Event.areatrigger.id != 0 && (e.GetScriptType() == SmartScriptType.AreaTriggerEntity || e.GetScriptType() == SmartScriptType.AreaTriggerEntityCustom)) - { - Log.outError(LogFilter.Sql, $"SmartAIMgr: Entry {e.EntryOrGuid} SourceType {e.GetScriptType()} Event {e.EventId} Action {e.GetActionType()} areatrigger param not supported for SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY and SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_CUSTOM, skipped."); - return false; - } - - if (e.Event.areatrigger.id != 0 && !IsAreaTriggerValid(e, e.Event.areatrigger.id)) - return false; - break; - } case SmartEvents.TextOver: { if (!IsTextValid(e, e.Event.textOver.textGroupID)) @@ -1339,6 +1329,8 @@ namespace Game.AI case SmartEvents.WaypointResumed: case SmartEvents.WaypointStopped: case SmartEvents.WaypointEnded: + case SmartEvents.AreatriggerEnter: + case SmartEvents.AreatriggerExit: case SmartEvents.GossipSelect: case SmartEvents.GossipHello: case SmartEvents.JustCreated: @@ -2382,15 +2374,6 @@ namespace Game.AI } return true; } - static bool IsAreaTriggerValid(SmartScriptHolder e, uint entry) - { - if (!CliDB.AreaTriggerStorage.ContainsKey(entry)) - { - Log.outError(LogFilter.ScriptsAi, $"SmartAIMgr: {e} uses non-existent AreaTrigger entry {entry}, skipped."); - return false; - } - return true; - } static bool IsSoundValid(SmartScriptHolder e, uint entry) { if (!CliDB.SoundKitStorage.ContainsKey(entry)) @@ -2504,7 +2487,7 @@ namespace Game.AI SmartEvents.TransportRemovePlayer => SmartScriptTypeMaskId.Transport, SmartEvents.TransportRelocate => SmartScriptTypeMaskId.Transport, SmartEvents.InstancePlayerEnter => SmartScriptTypeMaskId.Instance, - SmartEvents.AreatriggerOntrigger => SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.AreatrigggerEntity, + SmartEvents.AreatriggerEnter => SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.AreatrigggerEntity, SmartEvents.QuestAccepted => SmartScriptTypeMaskId.Quest, SmartEvents.QuestObjCompletion => SmartScriptTypeMaskId.Quest, SmartEvents.QuestRewarded => SmartScriptTypeMaskId.Quest, @@ -2546,6 +2529,7 @@ namespace Game.AI SmartEvents.OnSpellStart => SmartScriptTypeMaskId.Creature, SmartEvents.OnDespawn => SmartScriptTypeMaskId.Creature, SmartEvents.SendEventTrigger => SmartScriptTypeMaskId.Event, + SmartEvents.AreatriggerExit => SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.AreatrigggerEntity, _ => 0, }; @@ -2695,9 +2679,6 @@ namespace Game.AI [FieldOffset(16)] public InstancePlayerEnter instancePlayerEnter; - [FieldOffset(16)] - public Areatrigger areatrigger; - [FieldOffset(16)] public TextOver textOver; @@ -2867,10 +2848,6 @@ namespace Game.AI public uint cooldownMin; public uint cooldownMax; } - public struct Areatrigger - { - public uint id; - } public struct TextOver { public uint textGroupID; diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 23163026a..1dff52620 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -3217,17 +3217,19 @@ namespace Game.AI case SmartEvents.Death: case SmartEvents.Evade: case SmartEvents.ReachedHome: + case SmartEvents.Reset: case SmartEvents.CorpseRemoved: case SmartEvents.AiInit: case SmartEvents.TransportAddplayer: case SmartEvents.TransportRemovePlayer: + case SmartEvents.AreatriggerEnter: case SmartEvents.JustSummoned: - case SmartEvents.Reset: case SmartEvents.JustCreated: case SmartEvents.FollowCompleted: case SmartEvents.OnSpellclick: case SmartEvents.OnDespawn: case SmartEvents.SendEventTrigger: + case SmartEvents.AreatriggerExit: ProcessAction(e, unit, var0, var1, bvar, spell, gob); break; case SmartEvents.GossipHello: @@ -3436,13 +3438,6 @@ namespace Game.AI ProcessAction(e, unit, var0); break; } - case SmartEvents.AreatriggerOntrigger: - { - if (e.Event.areatrigger.id != 0 && var0 != e.Event.areatrigger.id) - return; - ProcessAction(e, unit, var0); - break; - } case SmartEvents.TextOver: { if (var0 != e.Event.textOver.textGroupID || (e.Event.textOver.creatureEntry != 0 && e.Event.textOver.creatureEntry != var1)) diff --git a/Source/Scripts/Smart/SmartAI.cs b/Source/Scripts/Smart/SmartAI.cs index 3564d020a..e5e77a422 100644 --- a/Source/Scripts/Smart/SmartAI.cs +++ b/Source/Scripts/Smart/SmartAI.cs @@ -17,13 +17,19 @@ namespace Scripts.Smart public override bool OnTrigger(Player player, AreaTriggerRecord trigger) { - if (!player.IsAlive()) - return false; - - Log.outDebug(LogFilter.ScriptsAi, "AreaTrigger {0} is using SmartTrigger script", trigger.Id); + Log.outDebug(LogFilter.ScriptsAi, $"AreaTrigger {trigger.Id} is using SmartTrigger script"); SmartScript script = new(); script.OnInitialize(player, trigger); - script.ProcessEventsFor(SmartEvents.AreatriggerOntrigger, player, trigger.Id); + script.ProcessEventsFor(SmartEvents.AreatriggerEnter, player); + return true; + } + + public override bool OnExit(Player player, AreaTriggerRecord trigger) + { + Log.outDebug(LogFilter.ScriptsAi, $"AreaTrigger {trigger.Id} exit is using SmartTrigger script"); + SmartScript script = new(); + script.OnInitialize(player, trigger); + script.ProcessEventsFor(SmartEvents.AreatriggerExit, player); return true; } }