From 97f100c556200eba4ba6d7776d506d2f8e4f64ae Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 12 Feb 2023 01:08:42 -0500 Subject: [PATCH] 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) --- Source/Game/AI/SmartScripts/SmartScript.cs | 99 +++++++++++++--------- Source/Scripts/Smart/SmartAI.cs | 12 +-- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 810a3dc96..f6021d1d7 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -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 targets = new(); switch (e.GetTargetType()) @@ -3033,7 +3033,7 @@ namespace Game.AI List GetWorldObjectsInDist(float dist) { List 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) diff --git a/Source/Scripts/Smart/SmartAI.cs b/Source/Scripts/Smart/SmartAI.cs index ef61f0690..6d740dad1 100644 --- a/Source/Scripts/Smart/SmartAI.cs +++ b/Source/Scripts/Smart/SmartAI.cs @@ -47,28 +47,28 @@ namespace Scripts.Smart public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, sceneTemplate); + smartScript.OnInitialize(player, null, sceneTemplate); smartScript.ProcessEventsFor(SmartEvents.SceneStart, player); } public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, sceneTemplate); + smartScript.OnInitialize(player, null, sceneTemplate); smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName); } public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, sceneTemplate); + smartScript.OnInitialize(player, null, sceneTemplate); smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player); } public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, sceneTemplate); + smartScript.OnInitialize(player, null, sceneTemplate); smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player); } } @@ -82,7 +82,7 @@ namespace Scripts.Smart public override void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, null, quest); + smartScript.OnInitialize(player, null, null, quest); switch (newStatus) { case QuestStatus.Incomplete: @@ -110,7 +110,7 @@ namespace Scripts.Smart if (slot < SharedConst.MaxQuestLogSize && player.IsQuestObjectiveComplete(slot, quest, objective)) { SmartScript smartScript = new(); - smartScript.OnInitialize(null, null, null, quest); + smartScript.OnInitialize(player, null, null, quest); smartScript.ProcessEventsFor(SmartEvents.QuestObjCompletion, player, objective.Id); } }