fix(Core/AI): Reduce movement leash extension interval. (#19923)

* Init.

* Use GetGameTime() instead of system call.

Co-Authored-By: Anton Popovichenko <walkline.ua@gmail.com>

* Update leash timer if rooted.

* Remove unnecessary checks, add extension for fanning.

More parity with VMaNGOS implementation.

---------

Co-authored-by: Anton Popovichenko <walkline.ua@gmail.com>
This commit is contained in:
Benjamin Jackson
2024-09-11 02:25:32 -04:00
committed by GitHub
parent cbd74ae663
commit 00e35a201e
3 changed files with 23 additions and 17 deletions
@@ -3678,7 +3678,7 @@ bool Creature::IsNotReachableAndNeedRegen() const
std::shared_ptr<time_t> const& Creature::GetLastLeashExtensionTimePtr() const std::shared_ptr<time_t> const& Creature::GetLastLeashExtensionTimePtr() const
{ {
if (m_lastLeashExtensionTime == nullptr) if (m_lastLeashExtensionTime == nullptr)
m_lastLeashExtensionTime = std::make_shared<time_t>(time(nullptr)); m_lastLeashExtensionTime = std::make_shared<time_t>(GameTime::GetGameTime().count());
return m_lastLeashExtensionTime; return m_lastLeashExtensionTime;
} }
@@ -3699,7 +3699,7 @@ time_t Creature::GetLastLeashExtensionTime() const
void Creature::UpdateLeashExtensionTime() void Creature::UpdateLeashExtensionTime()
{ {
(*GetLastLeashExtensionTimePtr()) = time(nullptr); (*GetLastLeashExtensionTimePtr()) = GameTime::GetGameTime().count();
} }
bool Creature::CanPeriodicallyCallForAssistance() const bool Creature::CanPeriodicallyCallForAssistance() const
@@ -78,8 +78,11 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
{ {
owner->StopMoving(); owner->StopMoving();
_lastTargetPosition.reset(); _lastTargetPosition.reset();
if (Creature* cOwner2 = owner->ToCreature()) if (cOwner)
cOwner2->SetCannotReachTarget(); {
cOwner->UpdateLeashExtensionTime();
cOwner->SetCannotReachTarget();
}
return true; return true;
} }
@@ -128,8 +131,8 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
{ {
i_recalculateTravel = false; i_recalculateTravel = false;
i_path = nullptr; i_path = nullptr;
if (Creature* cOwner2 = owner->ToCreature()) if (cOwner)
cOwner2->SetCannotReachTarget(); cOwner->SetCannotReachTarget();
owner->StopMoving(); owner->StopMoving();
owner->SetInFront(target); owner->SetInFront(target);
MovementInform(owner); MovementInform(owner);
@@ -143,22 +146,25 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
{ {
i_recalculateTravel = false; i_recalculateTravel = false;
i_path = nullptr; i_path = nullptr;
if (Creature* cOwner2 = owner->ToCreature()) if (cOwner)
cOwner2->SetCannotReachTarget(); cOwner->SetCannotReachTarget();
owner->ClearUnitState(UNIT_STATE_CHASE_MOVE); owner->ClearUnitState(UNIT_STATE_CHASE_MOVE);
owner->SetInFront(target); owner->SetInFront(target);
MovementInform(owner); MovementInform(owner);
} }
// Mobs should chase you infinitely if you stop and wait every few seconds. if (owner->movespline->Finalized())
i_leashExtensionTimer.Update(time_diff); { // Mobs should chase you infinitely if you stop and wait every few seconds.
if (i_leashExtensionTimer.Passed()) i_leashExtensionTimer.Update(time_diff);
{ if (i_leashExtensionTimer.Passed())
i_leashExtensionTimer.Reset(5000); {
if (owner->HasUnitState(UNIT_STATE_CHASE) && owner->movespline->Finalized() && !target->isMoving()) i_leashExtensionTimer.Reset(1500);
if (Creature* creature = owner->ToCreature()) if (cOwner)
creature->UpdateLeashExtensionTime(); cOwner->UpdateLeashExtensionTime();
}
} }
else if (i_recalculateTravel)
i_leashExtensionTimer.Reset(1500);
// 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))
@@ -39,7 +39,7 @@ class ChaseMovementGenerator : public MovementGeneratorMedium<T, ChaseMovementGe
{ {
public: public:
ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {}) ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> 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() { } ~ChaseMovementGenerator() { }
MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; }