From 92efc2523b75e4ca01be7d0894ed8bc979cb3049 Mon Sep 17 00:00:00 2001 From: ModoX Date: Sun, 22 Dec 2024 12:59:57 +0100 Subject: Core/Objects: Allow more specific checks to include or exclude feign death units in CreatureWithOptionsInObjectRangeCheck::IsAlive check (#30361) * this also extends SMART_TARGET_CLOSEST_CREATURE dead param --- src/server/game/AI/SmartScripts/SmartScript.cpp | 2 +- src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 8 +++++++- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src/server/game/AI/SmartScripts') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index d1b7aec16fe..46913f33f66 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2966,7 +2966,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, Creature* target = ref->FindNearestCreatureWithOptions(float(e.target.unitClosest.dist ? e.target.unitClosest.dist : 100), { .CreatureId = e.target.unitClosest.entry, .StringId = !e.target.param_string.empty() ? Optional(e.target.param_string) : Optional(), - .IsAlive = !e.target.unitClosest.dead + .IsAlive = (FindCreatureAliveState)e.target.unitClosest.findCreatureAliveState }); if (target) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 845cfbb3ef6..cd55b364889 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -594,8 +594,14 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) TC_SAI_IS_BOOLEAN_VALID(e, e.target.farthest.isInLos); break; case SMART_TARGET_CLOSEST_CREATURE: - TC_SAI_IS_BOOLEAN_VALID(e, e.target.unitClosest.dead); + { + if (e.target.unitClosest.findCreatureAliveState < (uint32)FindCreatureAliveState::Alive || e.target.unitClosest.findCreatureAliveState >= (uint32)FindCreatureAliveState::Max) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invalid alive state {}", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType(), e.target.unitClosest.findCreatureAliveState); + return false; + } break; + } case SMART_TARGET_CLOSEST_ENEMY: TC_SAI_IS_BOOLEAN_VALID(e, e.target.closestAttackable.playerOnly); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index fd849eb10d3..0c3da4870a7 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1289,7 +1289,7 @@ enum SMARTAI_TARGETS SMART_TARGET_INVOKER_PARTY = 16, // invoker's party members SMART_TARGET_PLAYER_RANGE = 17, // min, max SMART_TARGET_PLAYER_DISTANCE = 18, // maxDist - SMART_TARGET_CLOSEST_CREATURE = 19, // CreatureEntry(0any), maxDist, dead?, StringId + SMART_TARGET_CLOSEST_CREATURE = 19, // CreatureEntry(0any), maxDist, findCreatureAliveState, StringId SMART_TARGET_CLOSEST_GAMEOBJECT = 20, // entry(0any), maxDist, StringId SMART_TARGET_CLOSEST_PLAYER = 21, // maxDist SMART_TARGET_ACTION_INVOKER_VEHICLE = 22, // Unit's vehicle who caused this Event to occur @@ -1399,7 +1399,7 @@ struct SmartTarget { uint32 entry; uint32 dist; - SAIBool dead; + uint32 findCreatureAliveState; } unitClosest; struct -- cgit v1.2.3