fix(Core/Movement): Use attack speed for leash reset period and only extend timer if in melee range or can't move freely. (#22350)

Co-authored-by: ratkosrb <35845488+ratkosrb@users.noreply.github.com>
This commit is contained in:
Benjamin Jackson
2025-06-24 16:17:59 -04:00
committed by GitHub
parent e77f5d63da
commit f910147296
3 changed files with 23 additions and 12 deletions

View File

@@ -788,9 +788,7 @@ void Creature::Update(uint32 diff)
m_moveBackwardsMovementTime = urand(MOVE_BACKWARDS_CHECK_INTERVAL, MOVE_BACKWARDS_CHECK_INTERVAL * 3); m_moveBackwardsMovementTime = urand(MOVE_BACKWARDS_CHECK_INTERVAL, MOVE_BACKWARDS_CHECK_INTERVAL * 3);
} }
else else
{
m_moveBackwardsMovementTime -= diff; m_moveBackwardsMovementTime -= diff;
}
// Circling the target // Circling the target
if (diff >= m_moveCircleMovementTime) if (diff >= m_moveCircleMovementTime)
@@ -799,9 +797,17 @@ void Creature::Update(uint32 diff)
m_moveCircleMovementTime = urand(MOVE_CIRCLE_CHECK_INTERVAL, MOVE_CIRCLE_CHECK_INTERVAL * 2); m_moveCircleMovementTime = urand(MOVE_CIRCLE_CHECK_INTERVAL, MOVE_CIRCLE_CHECK_INTERVAL * 2);
} }
else else
{
m_moveCircleMovementTime -= diff; m_moveCircleMovementTime -= diff;
// Periodically check if able to move, if not, extend leash timer
if (diff >= m_extendLeashTime)
{
if (!CanFreeMove())
UpdateLeashExtensionTime();
m_extendLeashTime = EXTEND_LEASH_CHECK_INTERVAL;
} }
else
m_extendLeashTime -= diff;
} }
// Call for assistance if not disabled // Call for assistance if not disabled

View File

@@ -396,8 +396,10 @@ public:
bool IsFreeToMove(); bool IsFreeToMove();
static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000; static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000;
static constexpr uint32 MOVE_BACKWARDS_CHECK_INTERVAL = 2000; static constexpr uint32 MOVE_BACKWARDS_CHECK_INTERVAL = 2000;
static constexpr uint32 EXTEND_LEASH_CHECK_INTERVAL = 3000;
uint32 m_moveCircleMovementTime = MOVE_CIRCLE_CHECK_INTERVAL; uint32 m_moveCircleMovementTime = MOVE_CIRCLE_CHECK_INTERVAL;
uint32 m_moveBackwardsMovementTime = MOVE_BACKWARDS_CHECK_INTERVAL; uint32 m_moveBackwardsMovementTime = MOVE_BACKWARDS_CHECK_INTERVAL;
uint32 m_extendLeashTime = EXTEND_LEASH_CHECK_INTERVAL;
[[nodiscard]] bool HasSwimmingFlagOutOfCombat() const [[nodiscard]] bool HasSwimmingFlagOutOfCombat() const
{ {

View File

@@ -153,18 +153,20 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
MovementInform(owner); MovementInform(owner);
} }
if (owner->movespline->Finalized()) if (cOwner)
{ // Mobs should chase you infinitely if you stop and wait every few seconds. {
i_leashExtensionTimer.Update(time_diff); if (owner->movespline->Finalized() && cOwner->IsWithinMeleeRange(target))
if (i_leashExtensionTimer.Passed()) { // Mobs should chase you infinitely if you stop and wait every few seconds.
{ i_leashExtensionTimer.Update(time_diff);
i_leashExtensionTimer.Reset(5000); if (i_leashExtensionTimer.Passed())
if (cOwner) {
i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK));
cOwner->UpdateLeashExtensionTime(); cOwner->UpdateLeashExtensionTime();
}
} }
else if (i_recalculateTravel)
i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK));
} }
else if (i_recalculateTravel)
i_leashExtensionTimer.Reset(5000);
// if the target moved, we have to consider whether to adjust // if the target moved, we have to consider whether to adjust
if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target)) if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target))
@@ -298,6 +300,7 @@ void ChaseMovementGenerator<Creature>::DoInitialize(Creature* owner)
i_path = nullptr; i_path = nullptr;
_lastTargetPosition.reset(); _lastTargetPosition.reset();
i_recheckDistance.Reset(0); i_recheckDistance.Reset(0);
i_leashExtensionTimer.Reset(owner->GetAttackTime(BASE_ATTACK));
owner->SetWalk(false); owner->SetWalk(false);
owner->AddUnitState(UNIT_STATE_CHASE); owner->AddUnitState(UNIT_STATE_CHASE);
} }