From b5f8b485a8e4408e776783218c97ba069b5f7f79 Mon Sep 17 00:00:00 2001 From: Andrius Peleckas <32540208+sanctum32@users.noreply.github.com> Date: Wed, 13 Oct 2021 15:54:33 +0300 Subject: [PATCH] feat(Core/SAI): implemented boss state handling in SMART_ACTION_SET_INST_DATA + added additional data checks (#8369) --- .../game/AI/SmartScripts/SmartScript.cpp | 22 +++++++++++++++---- .../game/AI/SmartScripts/SmartScriptMgr.cpp | 18 ++++++++++++++- .../game/AI/SmartScripts/SmartScriptMgr.h | 1 + 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 938345929..72a0ac417 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1186,13 +1186,27 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u InstanceScript* instance = obj->GetInstanceScript(); if (!instance) { - LOG_ERROR("sql.sql", "SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid); + LOG_ERROR("scripts.ai.sai", "SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid); break; } - instance->SetData(e.action.setInstanceData.field, e.action.setInstanceData.data); - LOG_DEBUG("sql.sql", "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA: Field: %u, data: %u", - e.action.setInstanceData.field, e.action.setInstanceData.data); + switch (e.action.setInstanceData.type) + { + case 0: + { + instance->SetData(e.action.setInstanceData.field, e.action.setInstanceData.data); + LOG_DEBUG("scripts.ai.sai", "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA: Field: %u, data: %u", e.action.setInstanceData.field, e.action.setInstanceData.data); + } break; + case 1: + { + instance->SetBossState(e.action.setInstanceData.field, static_cast(e.action.setInstanceData.data)); + LOG_DEBUG("scripts.ai.sai", "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA: SetBossState BossId: %u, State: %u (%s)", e.action.setInstanceData.field, e.action.setInstanceData.data, InstanceScript::GetBossStateName(e.action.setInstanceData.data).c_str()); + } break; + default: + { + break; + } + } break; } case SMART_ACTION_SET_INST_DATA64: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 23efd6f6c..d3c184488 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1147,6 +1147,23 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; } + case SMART_ACTION_SET_INST_DATA: + { + if (e.action.setInstanceData.type == 1) + { + if (e.action.setInstanceData.data >= EncounterState::TO_BE_DECIDED) + { + LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INST_DATA with type 1 (bossState) uses invalid encounter state %u. Source entry %u, type %u", e.action.setInstanceData.data, e.entryOrGuid, e.GetScriptType()); + return false; + } + } + else if (e.action.setInstanceData.type > 1) + { + LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INST_DATA uses unsupported data type %u. Source entry %u, type %u", e.action.setInstanceData.type, e.entryOrGuid, e.GetScriptType()); + return false; + } + break; + } case SMART_ACTION_START_CLOSEST_WAYPOINT: case SMART_ACTION_FOLLOW: case SMART_ACTION_SET_ORIENTATION: @@ -1163,7 +1180,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_ATTACK_START: case SMART_ACTION_THREAT_ALL_PCT: case SMART_ACTION_THREAT_SINGLE_PCT: - case SMART_ACTION_SET_INST_DATA: case SMART_ACTION_SET_INST_DATA64: case SMART_ACTION_AUTO_ATTACK: case SMART_ACTION_ALLOW_COMBAT_MOVEMENT: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 78ad6847f..3288c3efc 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -844,6 +844,7 @@ struct SmartAction { uint32 field; uint32 data; + uint32 type; } setInstanceData; struct