Core/Movement: Properly resume chase/follow movement if it was paused by a spell cast

This commit is contained in:
Treeston
2019-10-06 06:32:51 +02:00
committed by Ovahlord
parent 6c2b9fd213
commit 3edbb05425
4 changed files with 11 additions and 6 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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))

View File

@@ -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