aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp8
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h4
-rw-r--r--src/server/game/Entities/Object/Object.h12
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h34
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;