From 8a39bd050ae7bf9d4f33cfed5169998fe3706192 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 12 Feb 2023 20:53:20 -0300 Subject: [PATCH] feat(Core/SAI): Implement SMART_TARGET_INSTANCE_STORAGE (#14981) --- .../game/AI/SmartScripts/SmartScript.cpp | 27 +++++++++++++++++++ .../game/AI/SmartScripts/SmartScriptMgr.cpp | 10 +++++++ .../game/AI/SmartScripts/SmartScriptMgr.h | 7 +++++ 3 files changed, 44 insertions(+) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index b48d2fb61..ac51d079a 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3367,6 +3367,33 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, } break; } + 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); + } + } + } + else + { + 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()); + } + + break; + } case SMART_TARGET_NONE: case SMART_TARGET_POSITION: default: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index d3d2332ee..5bd1e9494 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -422,6 +422,16 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) } break; } + case SMART_TARGET_INSTANCE_STORAGE: + { + if (e.target.instanceStorage.type != 1 && e.target.instanceStorage.type != 2) + { + LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invalid instance storage type as target ({}).", + e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType(), e.target.instanceStorage.type); + return false; + } + break; + } case SMART_TARGET_HOSTILE_SECOND_AGGRO: case SMART_TARGET_HOSTILE_LAST_AGGRO: case SMART_TARGET_HOSTILE_RANDOM: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 0fc4c2c97..65e43fe2d 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1426,6 +1426,7 @@ enum SMARTAI_TARGETS SMART_TARGET_RANDOM_POINT = 202, // range, amount (for summoning creature), self als middle (0/1) else use xyz SMART_TARGET_ROLE_SELECTION = 203, // Range Max, TargetMask (Tanks (1), Healer (2) Damage (4)), resize list SMART_TARGET_SUMMONED_CREATURES = 204, // Entry + SMART_TARGET_INSTANCE_STORAGE = 205, // Instance data index, Type (creature (1), gameobject (2)) SMART_TARGET_AC_END = 205 // placeholder }; @@ -1595,6 +1596,12 @@ struct SmartTarget uint32 param3; uint32 param4; } raw; + + struct + { + uint32 index; + uint32 type; + } instanceStorage; }; };