Core/SAI: Added SAI support for new areatriggers
Port From (https://github.com/TrinityCore/TrinityCore/commit/875fd4107f29c00f148ea77c6ff6d49f7ca92b76)
This commit is contained in:
@@ -31,7 +31,9 @@ namespace Framework.Constants
|
|||||||
Transport = 7,
|
Transport = 7,
|
||||||
Instance = 8,
|
Instance = 8,
|
||||||
TimedActionlist = 9,
|
TimedActionlist = 9,
|
||||||
Scene = 10, // done
|
Scene = 10,
|
||||||
|
AreaTriggerEntity = 11,
|
||||||
|
AreaTriggerEntityServerside = 12,
|
||||||
Max = 11
|
Max = 11
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +51,7 @@ namespace Framework.Constants
|
|||||||
public const uint Instance = 256;
|
public const uint Instance = 256;
|
||||||
public const uint TimedActionlist = 512;
|
public const uint TimedActionlist = 512;
|
||||||
public const uint Scene = 1024;
|
public const uint Scene = 1024;
|
||||||
|
public const uint AreatrigggerEntity = 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum SmartPhase
|
public enum SmartPhase
|
||||||
|
|||||||
@@ -1176,6 +1176,37 @@ namespace Game.AI
|
|||||||
bool _gossipReturn;
|
bool _gossipReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SmartAreaTriggerAI : AreaTriggerAI
|
||||||
|
{
|
||||||
|
public SmartAreaTriggerAI(AreaTrigger areaTrigger) : base(areaTrigger) { }
|
||||||
|
|
||||||
|
public override void OnInitialize()
|
||||||
|
{
|
||||||
|
GetScript().OnInitialize(at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnUpdate(uint diff)
|
||||||
|
{
|
||||||
|
GetScript().OnUpdate(diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnUnitEnter(Unit unit)
|
||||||
|
{
|
||||||
|
GetScript().ProcessEventsFor(SmartEvents.AreatriggerOntrigger, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetScript9(SmartScriptHolder e, uint entry, Unit invoker)
|
||||||
|
{
|
||||||
|
if (invoker)
|
||||||
|
GetScript().mLastInvoker = invoker.GetGUID();
|
||||||
|
GetScript().SetScript9(e, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
SmartScript GetScript() { return mScript; }
|
||||||
|
|
||||||
|
SmartScript mScript;
|
||||||
|
}
|
||||||
|
|
||||||
public enum SmartEscortState
|
public enum SmartEscortState
|
||||||
{
|
{
|
||||||
None = 0x00, //nothing in progress
|
None = 0x00, //nothing in progress
|
||||||
|
|||||||
@@ -112,6 +112,24 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
case SmartScriptType.TimedActionlist:
|
case SmartScriptType.TimedActionlist:
|
||||||
break;//nothing to check, really
|
break;//nothing to check, really
|
||||||
|
case SmartScriptType.AreaTriggerEntity:
|
||||||
|
{
|
||||||
|
if (Global.AreaTriggerDataStorage.GetAreaTriggerTemplate(new AreaTriggerId((uint)temp.entryOrGuid, false)) == null)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: AreaTrigger entry ({temp.entryOrGuid} IsServerSide false) does not exist, skipped loading.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SmartScriptType.AreaTriggerEntityServerside:
|
||||||
|
{
|
||||||
|
if (Global.AreaTriggerDataStorage.GetAreaTriggerTemplate(new AreaTriggerId((uint)temp.entryOrGuid, true)) == null)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"SmartAIMgr.LoadSmartAIFromDB: AreaTrigger entry ({temp.entryOrGuid} IsServerSide true) does not exist, skipped loading.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
Log.outError(LogFilter.Sql, "SmartAIMgr.LoadSmartAIFromDB: not yet implemented source_type {0}", source_type);
|
Log.outError(LogFilter.Sql, "SmartAIMgr.LoadSmartAIFromDB: not yet implemented source_type {0}", source_type);
|
||||||
continue;
|
continue;
|
||||||
@@ -647,6 +665,12 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
case SmartEvents.AreatriggerOntrigger:
|
case SmartEvents.AreatriggerOntrigger:
|
||||||
{
|
{
|
||||||
|
if (e.Event.areatrigger.id != 0 && (e.GetScriptType() == SmartScriptType.AreaTriggerEntity || e.GetScriptType() == SmartScriptType.AreaTriggerEntityServerside))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"SmartAIMgr: Entry {e.entryOrGuid} SourceType {e.GetScriptType()} Event {e.event_id} Action {e.GetActionType()} areatrigger param not supported for SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY and SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE, skipped.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (e.Event.areatrigger.id != 0 && !IsAreaTriggerValid(e, e.Event.areatrigger.id))
|
if (e.Event.areatrigger.id != 0 && !IsAreaTriggerValid(e, e.Event.areatrigger.id))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
@@ -1593,23 +1617,25 @@ namespace Game.AI
|
|||||||
|
|
||||||
Dictionary<SmartScriptType, uint> SmartAITypeMask = new Dictionary<SmartScriptType, uint>
|
Dictionary<SmartScriptType, uint> SmartAITypeMask = new Dictionary<SmartScriptType, uint>
|
||||||
{
|
{
|
||||||
{ SmartScriptType.Creature, SmartScriptTypeMaskId.Creature },
|
{ SmartScriptType.Creature, SmartScriptTypeMaskId.Creature },
|
||||||
{ SmartScriptType.GameObject, SmartScriptTypeMaskId.Gameobject },
|
{ SmartScriptType.GameObject, SmartScriptTypeMaskId.Gameobject },
|
||||||
{ SmartScriptType.AreaTrigger, SmartScriptTypeMaskId.Areatrigger },
|
{ SmartScriptType.AreaTrigger, SmartScriptTypeMaskId.Areatrigger },
|
||||||
{ SmartScriptType.Event, SmartScriptTypeMaskId.Event },
|
{ SmartScriptType.Event, SmartScriptTypeMaskId.Event },
|
||||||
{ SmartScriptType.Gossip, SmartScriptTypeMaskId.Gossip },
|
{ SmartScriptType.Gossip, SmartScriptTypeMaskId.Gossip },
|
||||||
{ SmartScriptType.Quest, SmartScriptTypeMaskId.Quest },
|
{ SmartScriptType.Quest, SmartScriptTypeMaskId.Quest },
|
||||||
{ SmartScriptType.Spell, SmartScriptTypeMaskId.Spell },
|
{ SmartScriptType.Spell, SmartScriptTypeMaskId.Spell },
|
||||||
{ SmartScriptType.Transport, SmartScriptTypeMaskId.Transport },
|
{ SmartScriptType.Transport, SmartScriptTypeMaskId.Transport },
|
||||||
{ SmartScriptType.Instance, SmartScriptTypeMaskId.Instance },
|
{ SmartScriptType.Instance, SmartScriptTypeMaskId.Instance },
|
||||||
{ SmartScriptType.TimedActionlist, SmartScriptTypeMaskId.TimedActionlist },
|
{ SmartScriptType.TimedActionlist, SmartScriptTypeMaskId.TimedActionlist },
|
||||||
{ SmartScriptType.Scene, SmartScriptTypeMaskId.Scene }
|
{ SmartScriptType.Scene, SmartScriptTypeMaskId.Scene },
|
||||||
|
{ SmartScriptType.AreaTriggerEntity, SmartScriptTypeMaskId.AreatrigggerEntity },
|
||||||
|
{ SmartScriptType.AreaTriggerEntityServerside, SmartScriptTypeMaskId.AreatrigggerEntity }
|
||||||
};
|
};
|
||||||
|
|
||||||
Dictionary<SmartEvents, uint> SmartAIEventMask = new Dictionary<SmartEvents, uint>
|
Dictionary<SmartEvents, uint> SmartAIEventMask = new Dictionary<SmartEvents, uint>
|
||||||
{
|
{
|
||||||
{ SmartEvents.UpdateIc, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.TimedActionlist },
|
{ SmartEvents.UpdateIc, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.TimedActionlist },
|
||||||
{ SmartEvents.UpdateOoc, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject + SmartScriptTypeMaskId.Instance },
|
{ SmartEvents.UpdateOoc, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject + SmartScriptTypeMaskId.Instance + SmartScriptTypeMaskId.AreatrigggerEntity },
|
||||||
{ SmartEvents.HealthPct, SmartScriptTypeMaskId.Creature },
|
{ SmartEvents.HealthPct, SmartScriptTypeMaskId.Creature },
|
||||||
{ SmartEvents.ManaPct, SmartScriptTypeMaskId.Creature },
|
{ SmartEvents.ManaPct, SmartScriptTypeMaskId.Creature },
|
||||||
{ SmartEvents.Aggro, SmartScriptTypeMaskId.Creature },
|
{ SmartEvents.Aggro, SmartScriptTypeMaskId.Creature },
|
||||||
@@ -1654,7 +1680,7 @@ namespace Game.AI
|
|||||||
{ SmartEvents.TransportRemovePlayer, SmartScriptTypeMaskId.Transport },
|
{ SmartEvents.TransportRemovePlayer, SmartScriptTypeMaskId.Transport },
|
||||||
{ SmartEvents.TransportRelocate, SmartScriptTypeMaskId.Transport },
|
{ SmartEvents.TransportRelocate, SmartScriptTypeMaskId.Transport },
|
||||||
{ SmartEvents.InstancePlayerEnter, SmartScriptTypeMaskId.Instance },
|
{ SmartEvents.InstancePlayerEnter, SmartScriptTypeMaskId.Instance },
|
||||||
{ SmartEvents.AreatriggerOntrigger, SmartScriptTypeMaskId.Areatrigger },
|
{ SmartEvents.AreatriggerOntrigger, SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.AreatrigggerEntity },
|
||||||
{ SmartEvents.QuestAccepted, SmartScriptTypeMaskId.Quest },
|
{ SmartEvents.QuestAccepted, SmartScriptTypeMaskId.Quest },
|
||||||
{ SmartEvents.QuestObjCompletion, SmartScriptTypeMaskId.Quest },
|
{ SmartEvents.QuestObjCompletion, SmartScriptTypeMaskId.Quest },
|
||||||
{ SmartEvents.QuestRewarded, SmartScriptTypeMaskId.Quest },
|
{ SmartEvents.QuestRewarded, SmartScriptTypeMaskId.Quest },
|
||||||
@@ -1668,8 +1694,8 @@ namespace Game.AI
|
|||||||
{ SmartEvents.WaypointStopped, SmartScriptTypeMaskId.Creature },
|
{ SmartEvents.WaypointStopped, SmartScriptTypeMaskId.Creature },
|
||||||
{ SmartEvents.WaypointEnded, SmartScriptTypeMaskId.Creature },
|
{ SmartEvents.WaypointEnded, SmartScriptTypeMaskId.Creature },
|
||||||
{ SmartEvents.TimedEventTriggered, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
{ SmartEvents.TimedEventTriggered, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
||||||
{ SmartEvents.Update, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
{ SmartEvents.Update, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject + SmartScriptTypeMaskId.AreatrigggerEntity },
|
||||||
{ SmartEvents.Link, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject + SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.Event + SmartScriptTypeMaskId.Gossip + SmartScriptTypeMaskId.Quest + SmartScriptTypeMaskId.Spell + SmartScriptTypeMaskId.Transport + SmartScriptTypeMaskId.Instance },
|
{ SmartEvents.Link, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject + SmartScriptTypeMaskId.Areatrigger + SmartScriptTypeMaskId.Event + SmartScriptTypeMaskId.Gossip + SmartScriptTypeMaskId.Quest + SmartScriptTypeMaskId.Spell + SmartScriptTypeMaskId.Transport + SmartScriptTypeMaskId.Instance + SmartScriptTypeMaskId.AreatrigggerEntity },
|
||||||
{ SmartEvents.GossipSelect, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
{ SmartEvents.GossipSelect, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
||||||
{ SmartEvents.JustCreated, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
{ SmartEvents.JustCreated, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
||||||
{ SmartEvents.GossipHello, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
{ SmartEvents.GossipHello, SmartScriptTypeMaskId.Creature + SmartScriptTypeMaskId.Gameobject },
|
||||||
|
|||||||
@@ -1532,7 +1532,7 @@ namespace Game.AI
|
|||||||
if (creature != null)
|
if (creature != null)
|
||||||
{
|
{
|
||||||
if (IsSmart(creature))
|
if (IsSmart(creature))
|
||||||
((SmartAI)creature.GetAI()).SetScript9(e, e.Action.timedActionList.id, GetLastInvoker());
|
creature.GetAI<SmartAI>().SetScript9(e, e.Action.timedActionList.id, GetLastInvoker());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1540,7 +1540,17 @@ namespace Game.AI
|
|||||||
if (go != null)
|
if (go != null)
|
||||||
{
|
{
|
||||||
if (IsSmartGO(go))
|
if (IsSmartGO(go))
|
||||||
((SmartGameObjectAI)go.GetAI()).SetScript9(e, e.Action.timedActionList.id, GetLastInvoker());
|
go.GetAI<SmartGameObjectAI>().SetScript9(e, e.Action.timedActionList.id, GetLastInvoker());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AreaTrigger areaTriggerTarget = target.ToAreaTrigger();
|
||||||
|
if (areaTriggerTarget != null)
|
||||||
|
{
|
||||||
|
SmartAreaTriggerAI atSAI = areaTriggerTarget.GetAI<SmartAreaTriggerAI>();
|
||||||
|
if (atSAI != null)
|
||||||
|
atSAI.SetScript9(e, e.Action.timedActionList.id, GetLastInvoker());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1623,7 +1633,7 @@ namespace Game.AI
|
|||||||
if (creature != null)
|
if (creature != null)
|
||||||
{
|
{
|
||||||
if (IsSmart(creature))
|
if (IsSmart(creature))
|
||||||
((SmartAI)creature.GetAI()).SetScript9(e, randomId, GetLastInvoker());
|
creature.GetAI<SmartAI>().SetScript9(e, randomId, GetLastInvoker());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1631,7 +1641,17 @@ namespace Game.AI
|
|||||||
if (go != null)
|
if (go != null)
|
||||||
{
|
{
|
||||||
if (IsSmartGO(go))
|
if (IsSmartGO(go))
|
||||||
((SmartGameObjectAI)go.GetAI()).SetScript9(e, randomId, GetLastInvoker());
|
go.GetAI<SmartGameObjectAI>().SetScript9(e, randomId, GetLastInvoker());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AreaTrigger areaTriggerTarget = target.ToAreaTrigger();
|
||||||
|
if (areaTriggerTarget != null)
|
||||||
|
{
|
||||||
|
SmartAreaTriggerAI atSAI = areaTriggerTarget.GetAI<SmartAreaTriggerAI>();
|
||||||
|
if (atSAI != null)
|
||||||
|
atSAI.SetScript9(e, randomId, GetLastInvoker());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1652,7 +1672,7 @@ namespace Game.AI
|
|||||||
if (creature != null)
|
if (creature != null)
|
||||||
{
|
{
|
||||||
if (IsSmart(creature))
|
if (IsSmart(creature))
|
||||||
((SmartAI)creature.GetAI()).SetScript9(e, id, GetLastInvoker());
|
creature.GetAI<SmartAI>().SetScript9(e, id, GetLastInvoker());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1660,7 +1680,17 @@ namespace Game.AI
|
|||||||
if (go != null)
|
if (go != null)
|
||||||
{
|
{
|
||||||
if (IsSmartGO(go))
|
if (IsSmartGO(go))
|
||||||
((SmartGameObjectAI)go.GetAI()).SetScript9(e, id, GetLastInvoker());
|
go.GetAI<SmartGameObjectAI>().SetScript9(e, id, GetLastInvoker());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AreaTrigger areaTriggerTarget = target.ToAreaTrigger();
|
||||||
|
if (areaTriggerTarget != null)
|
||||||
|
{
|
||||||
|
SmartAreaTriggerAI atSAI = areaTriggerTarget.GetAI<SmartAreaTriggerAI>();
|
||||||
|
if (atSAI != null)
|
||||||
|
atSAI.SetScript9(e, id, GetLastInvoker());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3584,7 +3614,9 @@ namespace Game.AI
|
|||||||
|
|
||||||
public void OnUpdate(uint diff)
|
public void OnUpdate(uint diff)
|
||||||
{
|
{
|
||||||
if ((mScriptType == SmartScriptType.Creature || mScriptType == SmartScriptType.GameObject) && GetBaseObject() == null)
|
if ((mScriptType == SmartScriptType.Creature || mScriptType == SmartScriptType.GameObject
|
||||||
|
|| mScriptType == SmartScriptType.AreaTriggerEntity || mScriptType == SmartScriptType.AreaTriggerEntityServerside)
|
||||||
|
&& !GetBaseObject())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
InstallEvents();//before UpdateTimers
|
InstallEvents();//before UpdateTimers
|
||||||
@@ -3707,6 +3739,11 @@ namespace Game.AI
|
|||||||
e = Global.SmartAIMgr.GetScript((int)trigger.Id, mScriptType);
|
e = Global.SmartAIMgr.GetScript((int)trigger.Id, mScriptType);
|
||||||
FillScript(e, null, trigger, null);
|
FillScript(e, null, trigger, null);
|
||||||
}
|
}
|
||||||
|
else if (areaTrigger != null)
|
||||||
|
{
|
||||||
|
e = Global.SmartAIMgr.GetScript((int)areaTrigger.GetEntry(), mScriptType);
|
||||||
|
FillScript(e, areaTrigger, null, null);
|
||||||
|
}
|
||||||
else if (sceneTemplate != null)
|
else if (sceneTemplate != null)
|
||||||
{
|
{
|
||||||
e = Global.SmartAIMgr.GetScript((int)sceneTemplate.SceneId, mScriptType);
|
e = Global.SmartAIMgr.GetScript((int)sceneTemplate.SceneId, mScriptType);
|
||||||
@@ -3735,6 +3772,11 @@ namespace Game.AI
|
|||||||
go = obj.ToGameObject();
|
go = obj.ToGameObject();
|
||||||
Log.outDebug(LogFilter.Scripts, "SmartScript.OnInitialize: source is GameObject {0}", go.GetEntry());
|
Log.outDebug(LogFilter.Scripts, "SmartScript.OnInitialize: source is GameObject {0}", go.GetEntry());
|
||||||
break;
|
break;
|
||||||
|
case TypeId.AreaTrigger:
|
||||||
|
areaTrigger = obj.ToAreaTrigger();
|
||||||
|
mScriptType = areaTrigger.IsServerSide() ? SmartScriptType.AreaTriggerEntityServerside : SmartScriptType.AreaTriggerEntity;
|
||||||
|
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript.OnInitialize: source is AreaTrigger {areaTrigger.GetEntry()}, IsServerSide {areaTrigger.IsServerSide()}");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Log.outError(LogFilter.Scripts, "SmartScript.OnInitialize: Unhandled TypeID !WARNING!");
|
Log.outError(LogFilter.Scripts, "SmartScript.OnInitialize: Unhandled TypeID !WARNING!");
|
||||||
return;
|
return;
|
||||||
@@ -4056,6 +4098,7 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
me = m;
|
me = m;
|
||||||
go = null;
|
go = null;
|
||||||
|
areaTrigger = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4066,6 +4109,7 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
me = null;
|
me = null;
|
||||||
go = o;
|
go = o;
|
||||||
|
areaTrigger = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4130,6 +4174,7 @@ namespace Game.AI
|
|||||||
GameObject go;
|
GameObject go;
|
||||||
ObjectGuid goOrigGUID;
|
ObjectGuid goOrigGUID;
|
||||||
AreaTriggerRecord trigger;
|
AreaTriggerRecord trigger;
|
||||||
|
AreaTrigger areaTrigger;
|
||||||
SceneTemplate sceneTemplate;
|
SceneTemplate sceneTemplate;
|
||||||
Spell spellTemplate;
|
Spell spellTemplate;
|
||||||
SmartScriptType mScriptType;
|
SmartScriptType mScriptType;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ namespace Game.DataStorage
|
|||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
AreaTriggerId areaTriggerId = new() { Id = templateActions.Read<uint>(0), IsServerSide = templateActions.Read<byte>(1) == 1 };
|
AreaTriggerId areaTriggerId = new(templateActions.Read<uint>(0), templateActions.Read<byte>(1) == 1);
|
||||||
|
|
||||||
AreaTriggerAction action;
|
AreaTriggerAction action;
|
||||||
action.Param = templateActions.Read<uint>(3);
|
action.Param = templateActions.Read<uint>(3);
|
||||||
@@ -128,7 +128,7 @@ namespace Game.DataStorage
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate();
|
AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate();
|
||||||
areaTriggerTemplate.Id = new() { Id = templates.Read<uint>(0), IsServerSide = templates.Read<byte>(1) == 1 };
|
areaTriggerTemplate.Id = new(templates.Read<uint>(0), templates.Read<byte>(1) == 1);
|
||||||
AreaTriggerTypes type = (AreaTriggerTypes)templates.Read<byte>(2);
|
AreaTriggerTypes type = (AreaTriggerTypes)templates.Read<byte>(2);
|
||||||
|
|
||||||
if (type >= AreaTriggerTypes.Max)
|
if (type >= AreaTriggerTypes.Max)
|
||||||
@@ -176,7 +176,7 @@ namespace Game.DataStorage
|
|||||||
miscTemplate.MiscId = areatriggerSpellMiscs.Read<uint>(0);
|
miscTemplate.MiscId = areatriggerSpellMiscs.Read<uint>(0);
|
||||||
|
|
||||||
uint areatriggerId = areatriggerSpellMiscs.Read<uint>(1);
|
uint areatriggerId = areatriggerSpellMiscs.Read<uint>(1);
|
||||||
miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId() { Id = areatriggerId, IsServerSide = false });
|
miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false));
|
||||||
|
|
||||||
if (miscTemplate.Template == null)
|
if (miscTemplate.Template == null)
|
||||||
{
|
{
|
||||||
@@ -290,7 +290,7 @@ namespace Game.DataStorage
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
ulong spawnId = templates.Read<ulong>(0);
|
ulong spawnId = templates.Read<ulong>(0);
|
||||||
AreaTriggerId areaTriggerId = new() { Id = templates.Read<uint>(1), IsServerSide = templates.Read<byte>(2) == 1 };
|
AreaTriggerId areaTriggerId = new(templates.Read<uint>(1), templates.Read<byte>(2) == 1);
|
||||||
WorldLocation location = new(templates.Read<uint>(3), templates.Read<float>(4), templates.Read<float>(5), templates.Read<float>(6), templates.Read<float>(7));
|
WorldLocation location = new(templates.Read<uint>(3), templates.Read<float>(4), templates.Read<float>(5), templates.Read<float>(6), templates.Read<float>(7));
|
||||||
|
|
||||||
if (GetAreaTriggerTemplate(areaTriggerId) == null)
|
if (GetAreaTriggerTemplate(areaTriggerId) == null)
|
||||||
|
|||||||
@@ -969,7 +969,7 @@ namespace Game.Entities
|
|||||||
base.ClearUpdateMask(remove);
|
base.ClearUpdateMask(remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
AreaTriggerAI GetAI() { return _ai; }
|
public T GetAI<T>() where T : AreaTriggerAI { return (T)_ai; }
|
||||||
|
|
||||||
public bool IsServerSide() { return _areaTriggerTemplate.Id.IsServerSide; }
|
public bool IsServerSide() { return _areaTriggerTemplate.Id.IsServerSide; }
|
||||||
|
|
||||||
|
|||||||
@@ -192,6 +192,12 @@ namespace Game.Entities
|
|||||||
public uint Id;
|
public uint Id;
|
||||||
public bool IsServerSide;
|
public bool IsServerSide;
|
||||||
|
|
||||||
|
public AreaTriggerId(uint id, bool isServerSide)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
IsServerSide = isServerSide;
|
||||||
|
}
|
||||||
|
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
{
|
{
|
||||||
return Id.GetHashCode() ^ IsServerSide.GetHashCode();
|
return Id.GetHashCode() ^ IsServerSide.GetHashCode();
|
||||||
|
|||||||
@@ -1540,7 +1540,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public override bool CanAlwaysSee(WorldObject obj)
|
public override bool CanAlwaysSee(WorldObject obj)
|
||||||
{
|
{
|
||||||
if (IsAIEnabled && GetAI().CanSeeAlways(obj))
|
if (IsAIEnabled && GetAI<CreatureAI>().CanSeeAlways(obj))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -3038,12 +3038,12 @@ namespace Game.Entities
|
|||||||
public bool IsInEvadeMode() { return HasUnitState(UnitState.Evade); }
|
public bool IsInEvadeMode() { return HasUnitState(UnitState.Evade); }
|
||||||
public bool IsEvadingAttacks() { return IsInEvadeMode() || CanNotReachTarget(); }
|
public bool IsEvadingAttacks() { return IsInEvadeMode() || CanNotReachTarget(); }
|
||||||
|
|
||||||
public new CreatureAI GetAI()
|
public override CreatureAI GetAI()
|
||||||
{
|
{
|
||||||
return (CreatureAI)i_AI;
|
return (CreatureAI)i_AI;
|
||||||
}
|
}
|
||||||
|
|
||||||
public T GetAI<T>() where T : UnitAI
|
public T GetAI<T>() where T : CreatureAI
|
||||||
{
|
{
|
||||||
return (T)i_AI;
|
return (T)i_AI;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2779,6 +2779,8 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public GameObjectAI GetAI() { return m_AI; }
|
public GameObjectAI GetAI() { return m_AI; }
|
||||||
|
|
||||||
|
public T GetAI<T>() where T : GameObjectAI { return (T)m_AI; }
|
||||||
|
|
||||||
public uint GetDisplayId() { return m_gameObjectData.DisplayID; }
|
public uint GetDisplayId() { return m_gameObjectData.DisplayID; }
|
||||||
|
|
||||||
public uint GetFaction() { return m_gameObjectData.FactionTemplate; }
|
public uint GetFaction() { return m_gameObjectData.FactionTemplate; }
|
||||||
|
|||||||
@@ -1112,7 +1112,7 @@ namespace Game.Entities
|
|||||||
return m_vehicle != null && m_vehicle == vehicle.GetVehicleKit();
|
return m_vehicle != null && m_vehicle == vehicle.GetVehicleKit();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UnitAI GetAI() { return i_AI; }
|
public virtual UnitAI GetAI() { return i_AI; }
|
||||||
public void SetAI(UnitAI newAI) { i_AI = newAI; }
|
public void SetAI(UnitAI newAI) { i_AI = newAI; }
|
||||||
|
|
||||||
public bool IsPossessing()
|
public bool IsPossessing()
|
||||||
|
|||||||
@@ -42,6 +42,17 @@ namespace Scripts.Smart
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Script]
|
||||||
|
class SmartAreaTriggerEntityScript : AreaTriggerEntityScript
|
||||||
|
{
|
||||||
|
public SmartAreaTriggerEntityScript() : base("SmartAreaTriggerAI") { }
|
||||||
|
|
||||||
|
public override AreaTriggerAI GetAI(AreaTrigger areaTrigger)
|
||||||
|
{
|
||||||
|
return new SmartAreaTriggerAI(areaTrigger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Script]
|
[Script]
|
||||||
class SmartScene : SceneScript
|
class SmartScene : SceneScript
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user