diff options
author | Andrew <47818697+Nyeriah@users.noreply.github.com> | 2025-09-27 12:09:27 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-27 12:09:27 -0300 |
commit | 84d55972fd4b07aeb45adf98c08c31e5a602421f (patch) | |
tree | 58179f41bbd04d75deb33bb2511dc89713a97760 | |
parent | 1736b7501f479723bba9fcfa4435e1b55e499d09 (diff) |
fix(Core/SAI): Fix crash when using SMART_TARGET_INSTANCE_STORAGE in … (#23033)
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 38 | ||||
-rw-r--r-- | 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; |