From f29869536b77b02dfac5c5a91e3b10d51d7a2359 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 27 Jul 2026 21:31:47 -0300 Subject: [PATCH] fix(Core/SmartAI): Don't add UNIT_STATE_MELEE_ATTACKING if unit is in ranged mode and not chasing (#26796) --- src/server/game/AI/SmartScripts/SmartAI.cpp | 25 ++++++++++++++++++++- src/server/game/AI/SmartScripts/SmartAI.h | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index bdbb5cba5..560b5624e 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -596,7 +596,25 @@ void SmartAI::UpdateAI(uint32 diff) return; if (mCanAutoAttack) + { + UpdateMeleeStance(); DoMeleeAttackIfReady(); + } +} + +void SmartAI::UpdateMeleeStance() +{ + // Ranged creatures should not switch to melee stance at distance + if (!_currentRangeMode || me->IsCrowdControlled()) + return; + + Unit* victim = me->GetVictim(); + if (!victim) + return; + + bool const canMelee = me->IsWithinMeleeRange(victim); + if (canMelee != me->HasUnitState(UNIT_STATE_MELEE_ATTACKING)) + me->Attack(victim, canMelee); } bool SmartAI::IsEscortInvokerInRange() @@ -927,7 +945,7 @@ void SmartAI::AttackStart(Unit* who) return; } - if (who && me->Attack(who, mCanAutoAttack)) + if (who && me->Attack(who, mCanAutoAttack && !_currentRangeMode)) { if (!me->HasUnitState(UNIT_STATE_NO_COMBAT_MOVEMENT)) { @@ -1202,7 +1220,12 @@ void SmartAI::SetCurrentRangeMode(bool on, float range) _attackDistance = range; if (Unit* victim = me->GetVictim()) + { me->GetMotionMaster()->MoveChase(victim, _attackDistance); + + if (!on && mCanAutoAttack && !me->HasUnitState(UNIT_STATE_MELEE_ATTACKING)) + me->Attack(victim, true); + } } void SmartAI::SetMainSpell(uint32 spellId) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index d84c72929..bb4b8f6ea 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -265,6 +265,7 @@ private: uint32 mDespawnState; void UpdateDespawn(const uint32 diff); void UpdateFollow(const uint32 diff); + void UpdateMeleeStance(); uint32 mEscortInvokerCheckTimer; bool mJustReset;