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:
@@ -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; }
|
||||||
|
|||||||
Reference in New Issue
Block a user