From ec218ca8f9ec653d3ad1d3c98951a3fa6847ac7b Mon Sep 17 00:00:00 2001 From: AlsoNotMehh Date: Thu, 24 Sep 2026 10:47:04 -0400 Subject: [PATCH] fix(Core/Unit): Avoid resetting leash timer when not necessary. (#27390) --- src/server/game/Entities/Unit/Unit.cpp | 8 +++++++- .../TargetedMovementGenerator.cpp | 17 ++--------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index addfb5014b..e4bcd07e87 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1264,7 +1264,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage if (!victim->IsPlayer()) { - /// @fix: Hack to avoid premature leashing + // DoT ticks and passive damage (e.g. Thorns) do not reset leash timer if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))) victim->ToCreature()->UpdateLeashExtensionTime(); @@ -11199,6 +11199,12 @@ void Unit::AtTargetAttacked(Unit* target, bool canInitialAggro) if (!target->IsEngaged() && !canInitialAggro) return; + if (Creature* cTarget = target->ToCreature()) + { + if (!cTarget->GetOwnerGUID().IsPlayer()) + cTarget->UpdateLeashExtensionTime(); + } + target->EngageWithTarget(this); if (Unit* targetOwner = target->GetCharmerOrOwner()) targetOwner->EngageWithTarget(this); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 582bd76851..ce8a7a181b 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -234,12 +234,8 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) _lastTargetPosition.reset(); if (cOwner) - { - if (!isStoppedBecauseOfCasting) - cOwner->UpdateLeashExtensionTime(); - cOwner->SetCannotReachTarget(); - } + return true; } @@ -317,16 +313,7 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) if (cOwner) { - if (owner->movespline->Finalized() && cOwner->IsWithinMeleeRange(target)) - { // Mobs should chase you infinitely if you stop and wait every few seconds. - i_leashExtensionTimer.Update(time_diff); - if (i_leashExtensionTimer.Passed()) - { - i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK)); - cOwner->UpdateLeashExtensionTime(); - } - } - else if (i_recalculateTravel) + if (i_recalculateTravel) i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK)); }