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; ObjectGuid _meOrigGUID;
GameObject _go; GameObject _go;
ObjectGuid _goOrigGUID; ObjectGuid _goOrigGUID;
Player _atPlayer; Player _player;
AreaTriggerRecord _trigger; AreaTriggerRecord _trigger;
AreaTrigger _areaTrigger; AreaTrigger _areaTrigger;
SceneTemplate _sceneTemplate; SceneTemplate _sceneTemplate;
@@ -1135,7 +1135,7 @@ namespace Game.AI
{ {
SmartActionSummonCreatureFlags flags = (SmartActionSummonCreatureFlags)e.Action.summonCreature.flags; SmartActionSummonCreatureFlags flags = (SmartActionSummonCreatureFlags)e.Action.summonCreature.flags;
bool preferUnit = flags.HasAnyFlag(SmartActionSummonCreatureFlags.PreferUnit); bool preferUnit = flags.HasAnyFlag(SmartActionSummonCreatureFlags.PreferUnit);
WorldObject summoner = preferUnit ? unit : GetBaseObjectOrPlayerTrigger() ?? unit; WorldObject summoner = preferUnit ? unit : GetBaseObjectOrUnitInvoker(unit);
if (summoner == null) if (summoner == null)
break; break;
@@ -1175,7 +1175,7 @@ namespace Game.AI
} }
case SmartActions.SummonGo: case SmartActions.SummonGo:
{ {
WorldObject summoner = GetBaseObjectOrUnit(unit); WorldObject summoner = GetBaseObjectOrUnitInvoker(unit);
if (!summoner) if (!summoner)
break; break;
@@ -2478,7 +2478,7 @@ namespace Game.AI
} }
case SmartActions.TriggerGameEvent: case SmartActions.TriggerGameEvent:
{ {
WorldObject sourceObject = GetBaseObjectOrUnit(unit); WorldObject sourceObject = GetBaseObjectOrUnitInvoker(unit);
foreach (WorldObject target in targets) foreach (WorldObject target in targets)
{ {
if (e.Action.triggerGameEvent.useSaiTargetAsGameEventSource != 0) if (e.Action.triggerGameEvent.useSaiTargetAsGameEventSource != 0)
@@ -2580,7 +2580,7 @@ namespace Game.AI
scriptTrigger = tempLastInvoker; scriptTrigger = tempLastInvoker;
} }
WorldObject baseObject = GetBaseObjectOrPlayerTrigger(); WorldObject baseObject = GetBaseObject();
List<WorldObject> targets = new(); List<WorldObject> targets = new();
switch (e.GetTargetType()) switch (e.GetTargetType())
@@ -3033,7 +3033,7 @@ namespace Game.AI
List<WorldObject> GetWorldObjectsInDist(float dist) List<WorldObject> GetWorldObjectsInDist(float dist)
{ {
List<WorldObject> targets = new(); List<WorldObject> targets = new();
WorldObject obj = GetBaseObjectOrPlayerTrigger(); WorldObject obj = GetBaseObject();
if (obj == null) if (obj == null)
return targets; return targets;
@@ -3976,7 +3976,49 @@ namespace Game.AI
public void OnInitialize(WorldObject obj, AreaTriggerRecord at = null, SceneTemplate scene = null, Quest qst = null) 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()) switch (obj.GetTypeId())
{ {
@@ -3990,17 +4032,6 @@ namespace Game.AI
_go = obj.ToGameObject(); _go = obj.ToGameObject();
Log.outDebug(LogFilter.Scripts, $"SmartScript.OnInitialize: source is GameObject {_go.GetEntry()}"); Log.outDebug(LogFilter.Scripts, $"SmartScript.OnInitialize: source is GameObject {_go.GetEntry()}");
break; 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: case TypeId.AreaTrigger:
_areaTrigger = obj.ToAreaTrigger(); _areaTrigger = obj.ToAreaTrigger();
_scriptType = _areaTrigger.IsServerSide() ? SmartScriptType.AreaTriggerEntityServerside : SmartScriptType.AreaTriggerEntity; _scriptType = _areaTrigger.IsServerSide() ? SmartScriptType.AreaTriggerEntityServerside : SmartScriptType.AreaTriggerEntity;
@@ -4011,18 +4042,6 @@ namespace Game.AI
return; 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 else
{ {
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized WorldObject is Null."); 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 void SetPathId(uint id) { _pathId = id; }
public uint GetPathId() { return _pathId; } public uint GetPathId() { return _pathId; }
WorldObject GetBaseObject() WorldObject GetBaseObject()
{ {
WorldObject obj = null; WorldObject obj = null;
@@ -4164,28 +4185,25 @@ namespace Game.AI
obj = _go; obj = _go;
else if (_areaTrigger != null) else if (_areaTrigger != null)
obj = _areaTrigger; obj = _areaTrigger;
else if (_player != null)
obj = _player;
return obj; return obj;
} }
WorldObject GetBaseObjectOrUnit(Unit unit)
{
WorldObject summoner = GetBaseObject();
if (!summoner && unit) WorldObject GetBaseObjectOrUnitInvoker(Unit invoker)
return unit;
return summoner;
}
WorldObject GetBaseObjectOrPlayerTrigger()
{ {
return _trigger != null ? _atPlayer : GetBaseObject(); return GetBaseObject() ?? invoker;
} }
public bool HasAnyEventWithFlag(SmartEventFlags flag) { return _allEventFlags.HasAnyFlag(flag); } 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 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 IsPlayer(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Player); }
public bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); } public bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); }
public bool IsCharmedCreature(WorldObject obj) public bool IsCharmedCreature(WorldObject obj)
{ {
if (!obj) if (!obj)
@@ -4197,6 +4215,7 @@ namespace Game.AI
return false; return false;
} }
public bool IsGameObject(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.GameObject); } public bool IsGameObject(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.GameObject); }
bool IsSmart(Creature creature, bool silent = false) bool IsSmart(Creature creature, bool silent = false)
+6 -6
View File
@@ -47,28 +47,28 @@ namespace Scripts.Smart
public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, sceneTemplate); smartScript.OnInitialize(player, null, sceneTemplate);
smartScript.ProcessEventsFor(SmartEvents.SceneStart, player); smartScript.ProcessEventsFor(SmartEvents.SceneStart, player);
} }
public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName) public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName)
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, sceneTemplate); smartScript.OnInitialize(player, null, sceneTemplate);
smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName); smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName);
} }
public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, sceneTemplate); smartScript.OnInitialize(player, null, sceneTemplate);
smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player); smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player);
} }
public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, sceneTemplate); smartScript.OnInitialize(player, null, sceneTemplate);
smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player); smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player);
} }
} }
@@ -82,7 +82,7 @@ namespace Scripts.Smart
public override void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus) public override void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus)
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, null, quest); smartScript.OnInitialize(player, null, null, quest);
switch (newStatus) switch (newStatus)
{ {
case QuestStatus.Incomplete: case QuestStatus.Incomplete:
@@ -110,7 +110,7 @@ namespace Scripts.Smart
if (slot < SharedConst.MaxQuestLogSize && player.IsQuestObjectiveComplete(slot, quest, objective)) if (slot < SharedConst.MaxQuestLogSize && player.IsQuestObjectiveComplete(slot, quest, objective))
{ {
SmartScript smartScript = new(); SmartScript smartScript = new();
smartScript.OnInitialize(null, null, null, quest); smartScript.OnInitialize(player, null, null, quest);
smartScript.ProcessEventsFor(SmartEvents.QuestObjCompletion, player, objective.Id); smartScript.ProcessEventsFor(SmartEvents.QuestObjCompletion, player, objective.Id);
} }
} }