mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-30 21:57:01 +01:00
Core/Movement: Properly resume chase/follow movement if it was paused by a spell cast. Closes #21900.
This commit is contained in:
@@ -73,7 +73,7 @@ void ChaseMovementGenerator::Initialize(Unit* owner)
|
||||
|
||||
owner->SetWalk(false);
|
||||
_path = nullptr;
|
||||
_lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f);
|
||||
_lastTargetPosition.reset();
|
||||
}
|
||||
|
||||
void ChaseMovementGenerator::Reset(Unit* owner)
|
||||
@@ -102,6 +102,7 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
|
||||
{
|
||||
owner->StopMoving();
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -142,7 +143,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;
|
||||
|
||||
@@ -40,7 +40,7 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
MovementGeneratorType GetMovementGeneratorType() const override { return CHASE_MOTION_TYPE; }
|
||||
|
||||
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
|
||||
@@ -49,7 +49,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;
|
||||
|
||||
@@ -61,7 +61,7 @@ void FollowMovementGenerator::Initialize(Unit* owner)
|
||||
owner->StopMoving();
|
||||
UpdatePetSpeed(owner);
|
||||
_path = nullptr;
|
||||
_lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f);
|
||||
_lastTargetPosition.reset();
|
||||
}
|
||||
|
||||
void FollowMovementGenerator::Reset(Unit* owner)
|
||||
@@ -85,6 +85,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
|
||||
{
|
||||
owner->StopMoving();
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -112,7 +113,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))
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "AbstractFollower.h"
|
||||
#include "MovementDefines.h"
|
||||
#include "MovementGenerator.h"
|
||||
#include "Optional.h"
|
||||
#include "Position.h"
|
||||
|
||||
class PathGenerator;
|
||||
@@ -41,7 +42,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
MovementGeneratorType GetMovementGeneratorType() const override { return FOLLOW_MOTION_TYPE; }
|
||||
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); }
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.reset(); }
|
||||
|
||||
private:
|
||||
static constexpr uint32 CHECK_INTERVAL = 500;
|
||||
@@ -53,7 +54,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