From 84d55972fd4b07aeb45adf98c08c31e5a602421f Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 27 Sep 2025 12:09:27 -0300 Subject: fix(Core/SAI): Fix crash when using SMART_TARGET_INSTANCE_STORAGE in … (#23033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/AI/SmartScripts/SmartScript.cpp | 38 +++++++++++++----------- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 2 ++ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index f4f9e82da9..1a64641e95 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -640,7 +640,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u Unit* caster = me; // Areatrigger Cast! - if (e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER) + if (e.IsAreatriggerScript()) caster = unit->SummonTrigger(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetOrientation(), 5000); if (e.action.cast.targetsLimit) @@ -3990,27 +3990,29 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, } case SMART_TARGET_INSTANCE_STORAGE: { - if (InstanceScript* instance = GetBaseObject()->GetInstanceScript()) - { - if (e.target.instanceStorage.type == 1) - { - if (Creature* creature = instance->GetCreature(e.target.instanceStorage.index)) - { - targets.push_back(creature); - } - } - else if (e.target.instanceStorage.type == 2) - { - if (GameObject* go = instance->GetGameObject(e.target.instanceStorage.index)) - { - targets.push_back(go); - } - } - } + InstanceScript* instance = nullptr; + + if (e.IsAreatriggerScript() && scriptTrigger) + instance = scriptTrigger->GetInstanceScript(); else + instance = GetBaseObject()->GetInstanceScript(); + + if (!instance) { LOG_ERROR("scripts.ai.sai", "SMART_TARGET_INSTANCE_STORAGE: Entry {} SourceType {} Event {} Action {} Target {} called outside an instance map.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType()); + return; + } + + if (e.target.instanceStorage.type == 1) + { + if (Creature* creature = instance->GetCreature(e.target.instanceStorage.index)) + targets.push_back(creature); + } + else if (e.target.instanceStorage.type == 2) + { + if (GameObject* go = instance->GetGameObject(e.target.instanceStorage.index)) + targets.push_back(go); } break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index e589d7bf1a..47b0d47961 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1993,6 +1993,8 @@ public: uint32 GetActionType() const { return (uint32)action.type; } uint32 GetTargetType() const { return (uint32)target.type; } + [[nodiscard]] bool IsAreatriggerScript() const { return source_type == SMART_SCRIPT_TYPE_AREATRIGGER; } + uint32 timer; uint32 priority; bool active; -- cgit v1.2.3