diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator .cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator .cpp index e8d36101cc5..41eddd4c77d 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator .cpp +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator .cpp @@ -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; diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h index 735fd0b7001..fc97fa610e2 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h @@ -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 const _angle; std::unique_ptr _path; - Position _lastTargetPosition; + Optional _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 1cf465c4f19..2b1c121cc08 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp @@ -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)) diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h index 4b7362942de..147daf040f6 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h @@ -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 _path; - Position _lastTargetPosition; + Optional _lastTargetPosition; }; #endif