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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user