Core/SAI: Implemented new event type SMART_EVENT_AREATRIGGER_EXIT (88)

Port From (https://github.com/TrinityCore/TrinityCore/commit/0d5242daae3fab31ffc73faafa21ad65e5cd9670)
This commit is contained in:
Hondacrx
2024-11-11 10:46:00 -05:00
parent 29acfba7d3
commit 21eca77ad8
5 changed files with 31 additions and 47 deletions
+2 -1
View File
@@ -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
}
+6 -1
View File
@@ -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)
+9 -32
View File
@@ -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;
+3 -8
View File
@@ -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))
+11 -5
View File
@@ -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;
}
}