mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-31 06:07:37 +01:00
Core/Movement: Properly resume chase/follow movement if it was paused by a spell cast
This commit is contained in:
@@ -63,6 +63,7 @@ void ChaseMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
owner->AddUnitState(UNIT_STATE_CHASE);
|
||||
owner->SetWalk(false);
|
||||
_lastTargetPosition.reset();
|
||||
}
|
||||
|
||||
bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
@@ -86,6 +87,7 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
owner->StopMoving();
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
cOwner->SetCannotReachTarget(false);
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -128,7 +130,7 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
}
|
||||
|
||||
// if the target moved, we have to consider whether to adjust
|
||||
if (_lastTargetPosition != target->GetPosition() || mutualChase != _mutualChase)
|
||||
if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.get() || mutualChase != _mutualChase)
|
||||
{
|
||||
_lastTargetPosition = target->GetPosition();
|
||||
_mutualChase = mutualChase;
|
||||
|
||||
@@ -38,7 +38,7 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
|
||||
bool Update(Unit* owner, uint32 diff) override;
|
||||
void Finalize(Unit* owner) override;
|
||||
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f,0.0f,0.0f); }
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.reset(); }
|
||||
|
||||
private:
|
||||
static constexpr uint32 RANGE_CHECK_INTERVAL = 100; // time (ms) until we attempt to recalculate
|
||||
@@ -47,7 +47,7 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
|
||||
Optional<ChaseAngle> const _angle;
|
||||
|
||||
std::unique_ptr<PathGenerator> _path;
|
||||
Position _lastTargetPosition;
|
||||
Optional<Position> _lastTargetPosition;
|
||||
uint32 _rangeCheckTimer = RANGE_CHECK_INTERVAL;
|
||||
bool _movingTowards = true;
|
||||
bool _mutualChase = true;
|
||||
|
||||
@@ -46,6 +46,7 @@ void FollowMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
owner->AddUnitState(UNIT_STATE_FOLLOW);
|
||||
UpdatePetSpeed(owner);
|
||||
_lastTargetPosition.reset();
|
||||
}
|
||||
|
||||
bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
@@ -62,6 +63,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
|
||||
{
|
||||
owner->StopMoving();
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -89,7 +91,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
DoMovementInform(owner, target);
|
||||
}
|
||||
|
||||
if (_lastTargetPosition.GetExactDistSq(target->GetPosition()) > 0.0f)
|
||||
if (!_lastTargetPosition || _lastTargetPosition->GetExactDistSq(target->GetPosition()) > 0.0f)
|
||||
{
|
||||
_lastTargetPosition = target->GetPosition();
|
||||
if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) || !PositionOkay(owner, target, _range + FOLLOW_RANGE_TOLERANCE))
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "AbstractFollower.h"
|
||||
#include "MovementGenerator.h"
|
||||
#include "Optional.h"
|
||||
|
||||
class PathGenerator;
|
||||
class Unit;
|
||||
@@ -37,7 +38,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
|
||||
bool Update(Unit* owner, uint32 diff) override;
|
||||
void Finalize(Unit* owner) override;
|
||||
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); }
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.reset(); }
|
||||
|
||||
private:
|
||||
static constexpr uint32 CHECK_INTERVAL = 500;
|
||||
@@ -51,7 +52,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
|
||||
|
||||
uint32 _checkTimer = CHECK_INTERVAL;
|
||||
std::unique_ptr<PathGenerator> _path;
|
||||
Position _lastTargetPosition;
|
||||
Optional<Position> _lastTargetPosition;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user