From 00e35a201e0430f5f856eb16ca9125e9e26e53e6 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Wed, 11 Sep 2024 02:25:32 -0400 Subject: [PATCH] fix(Core/AI): Reduce movement leash extension interval. (#19923) * Init. * Use GetGameTime() instead of system call. Co-Authored-By: Anton Popovichenko * Update leash timer if rooted. * Remove unnecessary checks, add extension for fanning. More parity with VMaNGOS implementation. --------- Co-authored-by: Anton Popovichenko --- .../game/Entities/Creature/Creature.cpp | 4 +-- .../TargetedMovementGenerator.cpp | 34 +++++++++++-------- .../TargetedMovementGenerator.h | 2 +- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7fe1b532b..d52ea0411 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3678,7 +3678,7 @@ bool Creature::IsNotReachableAndNeedRegen() const std::shared_ptr const& Creature::GetLastLeashExtensionTimePtr() const { if (m_lastLeashExtensionTime == nullptr) - m_lastLeashExtensionTime = std::make_shared(time(nullptr)); + m_lastLeashExtensionTime = std::make_shared(GameTime::GetGameTime().count()); return m_lastLeashExtensionTime; } @@ -3699,7 +3699,7 @@ time_t Creature::GetLastLeashExtensionTime() const void Creature::UpdateLeashExtensionTime() { - (*GetLastLeashExtensionTimePtr()) = time(nullptr); + (*GetLastLeashExtensionTimePtr()) = GameTime::GetGameTime().count(); } bool Creature::CanPeriodicallyCallForAssistance() const diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index a394c7758..0a58d1450 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -78,8 +78,11 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) { owner->StopMoving(); _lastTargetPosition.reset(); - if (Creature* cOwner2 = owner->ToCreature()) - cOwner2->SetCannotReachTarget(); + if (cOwner) + { + cOwner->UpdateLeashExtensionTime(); + cOwner->SetCannotReachTarget(); + } return true; } @@ -128,8 +131,8 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) { i_recalculateTravel = false; i_path = nullptr; - if (Creature* cOwner2 = owner->ToCreature()) - cOwner2->SetCannotReachTarget(); + if (cOwner) + cOwner->SetCannotReachTarget(); owner->StopMoving(); owner->SetInFront(target); MovementInform(owner); @@ -143,22 +146,25 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) { i_recalculateTravel = false; i_path = nullptr; - if (Creature* cOwner2 = owner->ToCreature()) - cOwner2->SetCannotReachTarget(); + if (cOwner) + cOwner->SetCannotReachTarget(); owner->ClearUnitState(UNIT_STATE_CHASE_MOVE); owner->SetInFront(target); MovementInform(owner); } - // 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(5000); - if (owner->HasUnitState(UNIT_STATE_CHASE) && owner->movespline->Finalized() && !target->isMoving()) - if (Creature* creature = owner->ToCreature()) - creature->UpdateLeashExtensionTime(); + if (owner->movespline->Finalized()) + { // 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(1500); + if (cOwner) + cOwner->UpdateLeashExtensionTime(); + } } + else if (i_recalculateTravel) + i_leashExtensionTimer.Reset(1500); // if the target moved, we have to consider whether to adjust if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target)) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 003e967d4..fd3064b51 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -39,7 +39,7 @@ class ChaseMovementGenerator : public MovementGeneratorMedium range = {}, Optional angle = {}) - : TargetedMovementGeneratorBase(target), i_leashExtensionTimer(5000), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} + : TargetedMovementGeneratorBase(target), i_leashExtensionTimer(1500), i_path(nullptr), i_recheckDistance(0), i_recalculateTravel(true), _range(range), _angle(angle) {} ~ChaseMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; }