Core/SAI: Set the trigger player as baseobject when the source type isn't a WorldObject

Port From (https://github.com/TrinityCore/TrinityCore/commit/7b14b9ef22d7869d3630c708c127683c4a59f210)
This commit is contained in:
hondacrx
2023-02-12 01:08:42 -05:00
parent b47f791d8f
commit 97f100c556
2 changed files with 65 additions and 46 deletions
+59 -40
View File
@@ -34,7 +34,7 @@ namespace Game.AI
ObjectGuid _meOrigGUID;
GameObject _go;
ObjectGuid _goOrigGUID;
Player _atPlayer;
Player _player;
AreaTriggerRecord _trigger;
AreaTrigger _areaTrigger;
SceneTemplate _sceneTemplate;
@@ -1135,7 +1135,7 @@ namespace Game.AI
{
SmartActionSummonCreatureFlags flags = (SmartActionSummonCreatureFlags)e.Action.summonCreature.flags;
bool preferUnit = flags.HasAnyFlag(SmartActionSummonCreatureFlags.PreferUnit);
WorldObject summoner = preferUnit ? unit : GetBaseObjectOrPlayerTrigger() ?? unit;
WorldObject summoner = preferUnit ? unit : GetBaseObjectOrUnitInvoker(unit);
if (summoner == null)
break;
@@ -1175,7 +1175,7 @@ namespace Game.AI
}
case SmartActions.SummonGo:
{
WorldObject summoner = GetBaseObjectOrUnit(unit);
WorldObject summoner = GetBaseObjectOrUnitInvoker(unit);
if (!summoner)
break;
@@ -2478,7 +2478,7 @@ namespace Game.AI
}
case SmartActions.TriggerGameEvent:
{
WorldObject sourceObject = GetBaseObjectOrUnit(unit);
WorldObject sourceObject = GetBaseObjectOrUnitInvoker(unit);
foreach (WorldObject target in targets)
{
if (e.Action.triggerGameEvent.useSaiTargetAsGameEventSource != 0)
@@ -2580,7 +2580,7 @@ namespace Game.AI
scriptTrigger = tempLastInvoker;
}
WorldObject baseObject = GetBaseObjectOrPlayerTrigger();
WorldObject baseObject = GetBaseObject();
List<WorldObject> targets = new();
switch (e.GetTargetType())
@@ -3033,7 +3033,7 @@ namespace Game.AI
List<WorldObject> GetWorldObjectsInDist(float dist)
{
List<WorldObject> targets = new();
WorldObject obj = GetBaseObjectOrPlayerTrigger();
WorldObject obj = GetBaseObject();
if (obj == null)
return targets;
@@ -3976,7 +3976,49 @@ namespace Game.AI
public void OnInitialize(WorldObject obj, AreaTriggerRecord at = null, SceneTemplate scene = null, Quest qst = null)
{
if (obj != null)
if (at != null)
{
_scriptType = SmartScriptType.AreaTrigger;
_trigger = at;
_player = obj.ToPlayer();
if (_player == null)
{
Log.outError(LogFilter.Misc, $"SmartScript::OnInitialize: source is AreaTrigger with id {_trigger.Id}, missing trigger player");
return;
}
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::OnInitialize: source is AreaTrigger with id {_trigger.Id}, triggered by player {_player.GetGUID()}");
}
else if (scene != null)
{
_scriptType = SmartScriptType.Scene;
_sceneTemplate = scene;
_player = obj.ToPlayer();
if (_player == null)
{
Log.outError(LogFilter.Misc, $"SmartScript::OnInitialize: source is Scene with id {_sceneTemplate.SceneId}, missing trigger player");
return;
}
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::OnInitialize: source is Scene with id {_sceneTemplate.SceneId}, triggered by player {_player.GetGUID()}");
}
else if (qst != null)
{
_scriptType = SmartScriptType.Quest;
_quest = qst;
_player = obj.ToPlayer();
if (_player == null)
{
Log.outError(LogFilter.Misc, $"SmartScript::OnInitialize: source is Quest with id {qst.Id}, missing trigger player");
return;
}
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::OnInitialize: source is Quest with id {qst.Id}, triggered by player {_player.GetGUID()}");
}
else if (obj != null) // Handle object based scripts
{
switch (obj.GetTypeId())
{
@@ -3990,17 +4032,6 @@ namespace Game.AI
_go = obj.ToGameObject();
Log.outDebug(LogFilter.Scripts, $"SmartScript.OnInitialize: source is GameObject {_go.GetEntry()}");
break;
case TypeId.Player:
if (at != null)
{
_scriptType = SmartScriptType.AreaTrigger;
_trigger = at;
_atPlayer = obj.ToPlayer();
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::OnInitialize: source is AreaTrigger {_trigger.Id}, triggered by player {_atPlayer.GetGUID()}");
}
else
Log.outError(LogFilter.Misc, "SmartScript::OnInitialize: !WARNING! Player TypeID is only allowed for AreaTriggers");
break;
case TypeId.AreaTrigger:
_areaTrigger = obj.ToAreaTrigger();
_scriptType = _areaTrigger.IsServerSide() ? SmartScriptType.AreaTriggerEntityServerside : SmartScriptType.AreaTriggerEntity;
@@ -4011,18 +4042,6 @@ namespace Game.AI
return;
}
}
else if (scene != null)
{
_scriptType = SmartScriptType.Scene;
_sceneTemplate = scene;
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript.OnInitialize: Scene with id {scene.SceneId}");
}
else if (qst != null)
{
_scriptType = SmartScriptType.Quest;
_quest = qst;
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript.OnInitialize: source is Quest with id {qst.Id}");
}
else
{
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized WorldObject is Null.");
@@ -4154,7 +4173,9 @@ namespace Game.AI
}
public void SetPathId(uint id) { _pathId = id; }
public uint GetPathId() { return _pathId; }
WorldObject GetBaseObject()
{
WorldObject obj = null;
@@ -4164,28 +4185,25 @@ namespace Game.AI
obj = _go;
else if (_areaTrigger != null)
obj = _areaTrigger;
else if (_player != null)
obj = _player;
return obj;
}
WorldObject GetBaseObjectOrUnit(Unit unit)
{
WorldObject summoner = GetBaseObject();
if (!summoner && unit)
return unit;
return summoner;
}
WorldObject GetBaseObjectOrPlayerTrigger()
WorldObject GetBaseObjectOrUnitInvoker(Unit invoker)
{
return _trigger != null ? _atPlayer : GetBaseObject();
return GetBaseObject() ?? invoker;
}
public bool HasAnyEventWithFlag(SmartEventFlags flag) { return _allEventFlags.HasAnyFlag(flag); }
public bool IsUnit(WorldObject obj) { return obj != null && (obj.IsTypeId(TypeId.Unit) || obj.IsTypeId(TypeId.Player)); }
public bool IsPlayer(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Player); }
public bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); }
public bool IsCharmedCreature(WorldObject obj)
{
if (!obj)
@@ -4197,6 +4215,7 @@ namespace Game.AI
return false;
}
public bool IsGameObject(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.GameObject); }
bool IsSmart(Creature creature, bool silent = false)