aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-07-23 12:15:06 +0200
committerTreeston <treeston.mmoc@gmail.com>2018-07-23 12:15:06 +0200
commitc031167e067dd0903c6fa4db4ea88cd5279039d2 (patch)
tree235dffef1c90da2b0f6d43071d6a05efa9f0fc17 /src
parent0aeb4cbeff4ed09a963b4aeffd32dc832bb209d6 (diff)
Core/Movement: Properly resume chase/follow movement if it was paused by a spell cast. Closes #21900.
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp5
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h4
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp5
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h5
4 files changed, 11 insertions, 8 deletions
diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
index f83c7e8b16a..28928cdeacb 100644
--- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp
@@ -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;
diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
index 48d828b7602..33252de524e 100644
--- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h
@@ -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;
diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
index 817401da6ad..e4b7fc78832 100644
--- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp
@@ -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))
diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
index 91d99bb8fb5..0dd2a434cd0 100644
--- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h
@@ -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