diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 8 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 12 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 34 |
5 files changed, 53 insertions, 7 deletions
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<std::string_view>(e.target.param_string) : Optional<std::string_view>(), - .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 diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 4b553171706..5297de5fef4 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -563,12 +563,22 @@ class FlaggedValuesArray32 T_FLAGS m_flags; }; +enum class FindCreatureAliveState : uint8 +{ + Alive = 0, // includes feign death + Dead = 1, // excludes feign death + EffectivelyAlive = 2, // excludes feign death + EffectivelyDead = 3, // includes feign death + + Max +}; + struct FindCreatureOptions { Optional<uint32> CreatureId; Optional<std::string_view> StringId; - Optional<bool> IsAlive; + Optional<FindCreatureAliveState> IsAlive; Optional<bool> IsInCombat; Optional<bool> IsSummon; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index ad3f9888c02..1abf2c06d96 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1435,8 +1435,38 @@ namespace Trinity if (i_args.StringId && !u->HasStringId(*i_args.StringId)) return false; - if (i_args.IsAlive.has_value() && u->IsAlive() != i_args.IsAlive) - return false; + if (i_args.IsAlive.has_value()) + { + switch (*i_args.IsAlive) + { + case FindCreatureAliveState::Alive: + { + if (!u->IsAlive()) + return false; + break; + } + case FindCreatureAliveState::Dead: + { + if (u->IsAlive()) + return false; + break; + } + case FindCreatureAliveState::EffectivelyAlive: + { + if (!u->IsAlive() || u->HasUnitFlag2(UNIT_FLAG2_FEIGN_DEATH)) + return false; + break; + } + case FindCreatureAliveState::EffectivelyDead: + { + if (u->IsAlive() && !u->HasUnitFlag2(UNIT_FLAG2_FEIGN_DEATH)) + return false; + break; + } + default: + break; + } + } if (i_args.IsSummon.has_value() && u->IsSummon() != i_args.IsSummon) return false; |