From 69c9149ed3745a72bb1bd40a6a73df1fcabaa3a7 Mon Sep 17 00:00:00 2001 From: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:30:42 +0200 Subject: [PATCH] feat(Core/Conditions): Add new Condition Unit_In_Combat. (#25569) --- data/sql/updates/pending_db_world/rev_1777019405.sql | 5 +++++ src/server/game/Conditions/ConditionMgr.cpp | 11 +++++++++++ src/server/game/Conditions/ConditionMgr.h | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1777019405.sql diff --git a/data/sql/updates/pending_db_world/rev_1777019405.sql b/data/sql/updates/pending_db_world/rev_1777019405.sql new file mode 100644 index 000000000..e7c43479c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1777019405.sql @@ -0,0 +1,5 @@ + +-- Set New Condition (Death Knight Initiate). +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 20) AND (`SourceGroup` = 0) AND (`SourceEntry` = 28406) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 106) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 0) AND (`ConditionValue2` = 0) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(20, 0, 28406, 0, 0, 106, 0, 0, 0, 0, 1, 0, 0, '', 'Death Knight Initiate gossip only available if the npc is not in combat.'); diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index a577bf9a6..90319545d 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -591,6 +591,12 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) condMeets = unit->IsCharmed(); break; } + case CONDITION_UNIT_IN_COMBAT: + { + if (Unit* unit = object->ToUnit()) + condMeets = unit->IsInCombat(); + break; + } case CONDITION_WORLD_SCRIPT: { condMeets = sWorldState->IsConditionFulfilled(ConditionValue1, ConditionValue2); @@ -804,6 +810,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() case CONDITION_CHARMED: mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_UNIT_IN_COMBAT: + mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; + break; case CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON: mask |= GRID_MAP_TYPE_MASK_PLAYER; break; @@ -834,6 +843,7 @@ uint32 Condition::GetMaxAvailableConditionTargets() case CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT: case CONDITION_SOURCE_TYPE_GOSSIP_MENU: case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION: + case CONDITION_SOURCE_TYPE_GOSSIP_HELLO: case CONDITION_SOURCE_TYPE_NPC_VENDOR: case CONDITION_SOURCE_TYPE_SPELL_PROC: case CONDITION_SOURCE_TYPE_OBJECT_VISIBILITY: @@ -2624,6 +2634,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) case CONDITION_TAXI: case CONDITION_IN_WATER: case CONDITION_CHARMED: + case CONDITION_UNIT_IN_COMBAT: default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 585048a83..5cfd108fe 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -89,8 +89,9 @@ enum ConditionTypes CONDITION_WORLD_SCRIPT = 103, // conditionId state 0 true if WorldState::IsConditionFulfilled returns true CONDITION_AI_DATA = 104, // dataId value 0 true if AI::GetData returns value CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON = 105, // checkDifficulty difficulty 0 true if player is queued for a random dungeon via RDF + CONDITION_UNIT_IN_COMBAT = 106, // 0 0 0 true if unit is engaged in combat - CONDITION_AC_END = 106 // placeholder + CONDITION_AC_END = 107 // placeholder }; /*! Documentation on implementing a new ConditionSourceType: