From b7dfaf0fd649d5fb8ac9aa2668929498f6547269 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Fri, 3 Apr 2026 09:06:50 -0300 Subject: [PATCH] fix(Core/Creature): Implement CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT (#25363) Co-authored-by: Ovahlord Co-authored-by: offl Co-authored-by: Claude Opus 4.6 --- .../rev_1743710400_creature_cannot_enter_combat.sql | 2 ++ src/server/game/Entities/Creature/Creature.cpp | 2 ++ src/server/game/Entities/Creature/CreatureData.h | 2 +- src/server/game/Entities/Creature/enuminfo_CreatureData.cpp | 6 +++--- 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1743710400_creature_cannot_enter_combat.sql diff --git a/data/sql/updates/pending_db_world/rev_1743710400_creature_cannot_enter_combat.sql b/data/sql/updates/pending_db_world/rev_1743710400_creature_cannot_enter_combat.sql new file mode 100644 index 000000000..2657bcb25 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1743710400_creature_cannot_enter_combat.sql @@ -0,0 +1,2 @@ +-- Add CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT to Toxic Tunnel (Naxxramas) +UPDATE `creature_template` SET `flags_extra` = `flags_extra` | 0x00002000 WHERE `entry` = 16400; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index b1ab32562..5d7804d01 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -663,6 +663,8 @@ bool Creature::UpdateEntry(uint32 Entry, const CreatureData* data, bool changele ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); } + SetIsCombatDisallowed(cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT)); + SetDetectionDistance(cInfo->detection_range); // Update movement diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index a79d7f8f0..ec71df83a 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -56,7 +56,7 @@ enum CreatureFlagsExtra : uint32 CREATURE_FLAG_EXTRA_GHOST_VISIBILITY = 0x00000400, // creature will only be visible to dead players CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK = 0x00000800, // creature will use offhand attacks CREATURE_FLAG_EXTRA_NO_SELL_VENDOR = 0x00001000, // players can't sell items to this vendor - CREATURE_FLAG_EXTRA_IGNORE_COMBAT = 0x00002000, + CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT = 0x00002000, // creature is not allowed to enter combat CREATURE_FLAG_EXTRA_WORLDEVENT = 0x00004000, // custom flag for world event creatures (left room for merging) CREATURE_FLAG_EXTRA_GUARD = 0x00008000, // Creature is guard CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH = 0x00010000, // creature ignores feign death diff --git a/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp index 2f0aebeba..15a361fd1 100644 --- a/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp +++ b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp @@ -44,7 +44,7 @@ AC_API_EXPORT EnumText EnumUtils::ToString(CreatureFlagsExtr case CREATURE_FLAG_EXTRA_GHOST_VISIBILITY: return { "CREATURE_FLAG_EXTRA_GHOST_VISIBILITY", "CREATURE_FLAG_EXTRA_GHOST_VISIBILITY", "creature will only be visible to dead players" }; case CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK: return { "CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK", "CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK", "/ @todo: Implement CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK (creature will use offhand attacks)" }; case CREATURE_FLAG_EXTRA_NO_SELL_VENDOR: return { "CREATURE_FLAG_EXTRA_NO_SELL_VENDOR", "CREATURE_FLAG_EXTRA_NO_SELL_VENDOR", "players can't sell items to this vendor" }; - case CREATURE_FLAG_EXTRA_IGNORE_COMBAT: return { "CREATURE_FLAG_EXTRA_IGNORE_COMBAT", "CREATURE_FLAG_EXTRA_IGNORE_COMBAT", "" }; + case CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT: return { "CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT", "CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT", "creature is not allowed to enter combat" }; case CREATURE_FLAG_EXTRA_WORLDEVENT: return { "CREATURE_FLAG_EXTRA_WORLDEVENT", "CREATURE_FLAG_EXTRA_WORLDEVENT", "custom flag for world event creatures (left room for merging)" }; case CREATURE_FLAG_EXTRA_GUARD: return { "CREATURE_FLAG_EXTRA_GUARD", "CREATURE_FLAG_EXTRA_GUARD", "Creature is guard" }; case CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH: return { "CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH", "CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH", "creature ignores feign death" }; @@ -88,7 +88,7 @@ AC_API_EXPORT CreatureFlagsExtra EnumUtils::FromIndex(std::s case 10: return CREATURE_FLAG_EXTRA_GHOST_VISIBILITY; case 11: return CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK; case 12: return CREATURE_FLAG_EXTRA_NO_SELL_VENDOR; - case 13: return CREATURE_FLAG_EXTRA_IGNORE_COMBAT; + case 13: return CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT; case 14: return CREATURE_FLAG_EXTRA_WORLDEVENT; case 15: return CREATURE_FLAG_EXTRA_GUARD; case 16: return CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH; @@ -129,7 +129,7 @@ AC_API_EXPORT std::size_t EnumUtils::ToIndex(CreatureFlagsEx case CREATURE_FLAG_EXTRA_GHOST_VISIBILITY: return 10; case CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK: return 11; case CREATURE_FLAG_EXTRA_NO_SELL_VENDOR: return 12; - case CREATURE_FLAG_EXTRA_IGNORE_COMBAT: return 13; + case CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT: return 13; case CREATURE_FLAG_EXTRA_WORLDEVENT: return 14; case CREATURE_FLAG_EXTRA_GUARD: return 15; case CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH: return 16;