diff options
| author | ccrs <ccrs@users.noreply.github.com> | 2026-01-11 18:22:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-11 18:22:16 +0100 |
| commit | 8787dfe6cfca3c5eb32fb024bdaa5e83d725aab8 (patch) | |
| tree | 09217a8eb9748b88bdc0bc4b67f86deb48dab01d | |
| parent | f18131581763b58f6a7b4024ca9c5d70544d051c (diff) | |
Core/Movement: Check that movement generators were properly initialized and fix off-by-one-update-tick time tracking (#31612)3.3.5
28 files changed, 142 insertions, 117 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index b667010f458..41a602d3799 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -300,20 +300,27 @@ void MotionMaster::Update(uint32 diff) AddFlag(MOTIONMASTER_FLAG_UPDATE); + enum class InitState : uint8 + { + Failed, + Success, + AlreadyInitialized + } initializationState = InitState::AlreadyInitialized; + MovementGenerator* top = GetCurrentMovementGenerator(); if (HasFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING) && IsStatic(top)) { RemoveFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING); - top->Initialize(_owner); + initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed; } if (top->HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING)) - top->Initialize(_owner); + initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed; if (top->HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED)) - top->Reset(_owner); + initializationState = top->Reset(_owner) ? InitState::Success : InitState::Failed; ASSERT(!top->HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED), "MotionMaster:Update: update called on an uninitialized top! (%s) (type: %u, flags: %u)", _owner->GetGUID().ToString().c_str(), top->GetMovementGeneratorType(), top->Flags); - if (!top->Update(_owner, diff)) + if (initializationState == InitState::Failed || !top->Update(_owner, initializationState == InitState::AlreadyInitialized ? diff : 0)) { ASSERT(top == GetCurrentMovementGenerator(), "MotionMaster::Update: top was modified while updating! (%s)", _owner->GetGUID().ToString().c_str()); diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h index 9c51fecf9dd..b268f8ee6b4 100755 --- a/src/server/game/Movement/MovementGenerator.h +++ b/src/server/game/Movement/MovementGenerator.h @@ -51,9 +51,9 @@ class TC_GAME_API MovementGenerator virtual ~MovementGenerator(); // on top first update - virtual void Initialize(Unit*) = 0; + virtual bool Initialize(Unit*) = 0; // on top reassign - virtual void Reset(Unit*) = 0; + virtual bool Reset(Unit*) = 0; // on top on MotionMaster::Update virtual bool Update(Unit*, uint32 diff) = 0; // on current top if another movement replaces @@ -86,14 +86,14 @@ template<class T, class D> class MovementGeneratorMedium : public MovementGenerator { public: - void Initialize(Unit* owner) override + bool Initialize(Unit* owner) override { - (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner)); + return (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner)); } - void Reset(Unit* owner) override + bool Reset(Unit* owner) override { - (static_cast<D*>(this))->DoReset(static_cast<T*>(owner)); + return (static_cast<D*>(this))->DoReset(static_cast<T*>(owner)); } bool Update(Unit* owner, uint32 diff) override diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp index e6e68190d80..447fb4629bc 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp @@ -75,20 +75,21 @@ ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange } ChaseMovementGenerator::~ChaseMovementGenerator() = default; -void ChaseMovementGenerator::Initialize(Unit* /*owner*/) +bool ChaseMovementGenerator::Initialize(Unit* /*owner*/) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED); _path = nullptr; _lastTargetPosition.reset(); + return true; } -void ChaseMovementGenerator::Reset(Unit* owner) +bool ChaseMovementGenerator::Reset(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); - Initialize(owner); + return Initialize(owner); } bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h index 6010f164d13..ba23cc0ea2f 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h @@ -34,8 +34,8 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {}); ~ChaseMovementGenerator(); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index 77331379a75..ea6716f9c7f 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -40,29 +40,29 @@ MovementGeneratorType ConfusedMovementGenerator<T>::GetMovementGeneratorType() c } template<class T> -void ConfusedMovementGenerator<T>::DoInitialize(T* owner) +bool ConfusedMovementGenerator<T>::DoInitialize(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); if (!owner || !owner->IsAlive()) - return; + return false; // TODO: UNIT_FIELD_FLAGS should not be handled by generators owner->SetUnitFlag(UNIT_FLAG_CONFUSED); - owner->StopMoving(); _timer.Reset(0); owner->GetPosition(_x, _y, _z); _path = nullptr; + return true; } template<class T> -void ConfusedMovementGenerator<T>::DoReset(T* owner) +bool ConfusedMovementGenerator<T>::DoReset(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } template<class T> @@ -167,10 +167,10 @@ template ConfusedMovementGenerator<Player>::ConfusedMovementGenerator(); template ConfusedMovementGenerator<Creature>::ConfusedMovementGenerator(); template MovementGeneratorType ConfusedMovementGenerator<Player>::GetMovementGeneratorType() const; template MovementGeneratorType ConfusedMovementGenerator<Creature>::GetMovementGeneratorType() const; -template void ConfusedMovementGenerator<Player>::DoInitialize(Player*); -template void ConfusedMovementGenerator<Creature>::DoInitialize(Creature*); -template void ConfusedMovementGenerator<Player>::DoReset(Player*); -template void ConfusedMovementGenerator<Creature>::DoReset(Creature*); +template bool ConfusedMovementGenerator<Player>::DoInitialize(Player*); +template bool ConfusedMovementGenerator<Creature>::DoInitialize(Creature*); +template bool ConfusedMovementGenerator<Player>::DoReset(Player*); +template bool ConfusedMovementGenerator<Creature>::DoReset(Creature*); template bool ConfusedMovementGenerator<Player>::DoUpdate(Player*, uint32); template bool ConfusedMovementGenerator<Creature>::DoUpdate(Creature*, uint32); template void ConfusedMovementGenerator<Player>::DoDeactivate(Player*); diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h index 380c63f861b..ba217a2242f 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h @@ -31,8 +31,8 @@ class ConfusedMovementGenerator : public MovementGeneratorMedium<T, ConfusedMove MovementGeneratorType GetMovementGeneratorType() const override; - void DoInitialize(T*); - void DoReset(T*); + bool DoInitialize(T*); + bool DoReset(T*); bool DoUpdate(T*, uint32); void DoDeactivate(T*); void DoFinalize(T*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 66d596e3c12..95aac0aecf3 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -45,27 +45,28 @@ MovementGeneratorType FleeingMovementGenerator<T>::GetMovementGeneratorType() co } template<class T> -void FleeingMovementGenerator<T>::DoInitialize(T* owner) +bool FleeingMovementGenerator<T>::DoInitialize(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); if (!owner || !owner->IsAlive()) - return; + return false; // TODO: UNIT_FIELD_FLAGS should not be handled by generators owner->SetUnitFlag(UNIT_FLAG_FLEEING); _path = nullptr; SetTargetLocation(owner); + return true; } template<class T> -void FleeingMovementGenerator<T>::DoReset(T* owner) +bool FleeingMovementGenerator<T>::DoReset(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } template<class T> @@ -223,10 +224,10 @@ template FleeingMovementGenerator<Player>::FleeingMovementGenerator(ObjectGuid); template FleeingMovementGenerator<Creature>::FleeingMovementGenerator(ObjectGuid); template MovementGeneratorType FleeingMovementGenerator<Player>::GetMovementGeneratorType() const; template MovementGeneratorType FleeingMovementGenerator<Creature>::GetMovementGeneratorType() const; -template void FleeingMovementGenerator<Player>::DoInitialize(Player*); -template void FleeingMovementGenerator<Creature>::DoInitialize(Creature*); -template void FleeingMovementGenerator<Player>::DoReset(Player*); -template void FleeingMovementGenerator<Creature>::DoReset(Creature*); +template bool FleeingMovementGenerator<Player>::DoInitialize(Player*); +template bool FleeingMovementGenerator<Creature>::DoInitialize(Creature*); +template bool FleeingMovementGenerator<Player>::DoReset(Player*); +template bool FleeingMovementGenerator<Creature>::DoReset(Creature*); template bool FleeingMovementGenerator<Player>::DoUpdate(Player*, uint32); template bool FleeingMovementGenerator<Creature>::DoUpdate(Creature*, uint32); template void FleeingMovementGenerator<Player>::DoDeactivate(Player*); diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h index 1b44e92dff1..cd183efad9f 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h @@ -34,8 +34,8 @@ class FleeingMovementGenerator : public MovementGeneratorMedium<T, FleeingMoveme MovementGeneratorType GetMovementGeneratorType() const override; - void DoInitialize(T*); - void DoReset(T*); + bool DoInitialize(T*); + bool DoReset(T*); bool DoUpdate(T*, uint32); void DoDeactivate(T*); void DoFinalize(T*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp index 3d0bc4f8ee3..52f9fa107a7 100644 --- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp @@ -58,16 +58,17 @@ bool FlightPathMovementGenerator::GetResetPosition(Unit* /*owner*/, float& x, fl return true; } -void FlightPathMovementGenerator::DoInitialize(Player* owner) +bool FlightPathMovementGenerator::DoInitialize(Player* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); - DoReset(owner); + bool returnValue = DoReset(owner); InitEndGridInfo(); + return returnValue; } -void FlightPathMovementGenerator::DoReset(Player* owner) +bool FlightPathMovementGenerator::DoReset(Player* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); @@ -80,7 +81,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner) if (currentNodeId == end) { TC_LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", owner->GetDebugInfo()); - return; + return false; } Movement::MoveSplineInit init(owner); @@ -95,6 +96,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner) init.SetFly(); init.SetVelocity(PLAYER_FLIGHT_SPEED); init.Launch(); + return true; } bool FlightPathMovementGenerator::DoUpdate(Player* owner, uint32 /*diff*/) diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h index 5ed2366fcbb..6fa269a24fb 100644 --- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h @@ -37,8 +37,8 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, Fligh MovementGeneratorType GetMovementGeneratorType() const override; bool GetResetPosition(Unit* owner, float& x, float& y, float& z) override; - void DoInitialize(Player*); - void DoReset(Player*); + bool DoInitialize(Player*); + bool DoReset(Player*); bool DoUpdate(Player*, uint32); void DoDeactivate(Player*); void DoFinalize(Player*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp index 6a66c7ddb96..0a8fbd14f7d 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp @@ -52,22 +52,22 @@ static bool PositionOkay(Unit* owner, Unit* target, float range, Optional<ChaseA return !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner)); } -void FollowMovementGenerator::Initialize(Unit* owner) +bool FollowMovementGenerator::Initialize(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED); - owner->StopMoving(); UpdatePetSpeed(owner); _path = nullptr; _lastTargetPosition.reset(); + return true; } -void FollowMovementGenerator::Reset(Unit* owner) +bool FollowMovementGenerator::Reset(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); - Initialize(owner); + return Initialize(owner); } bool FollowMovementGenerator::Update(Unit* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h index 455a3535921..cc2c483faa3 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h @@ -36,8 +36,8 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe explicit FollowMovementGenerator(Unit* target, float range, ChaseAngle angle); ~FollowMovementGenerator(); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp index b1261f816ed..295a9e16878 100644 --- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp @@ -38,7 +38,7 @@ MovementGeneratorType FormationMovementGenerator::GetMovementGeneratorType() con return FORMATION_MOTION_TYPE; } -void FormationMovementGenerator::DoInitialize(Creature* owner) +bool FormationMovementGenerator::DoInitialize(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); @@ -47,17 +47,18 @@ void FormationMovementGenerator::DoInitialize(Creature* owner) { AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); owner->StopMoving(); - return; + return true; } _nextMoveTimer.Reset(0); + return true; } -void FormationMovementGenerator::DoReset(Creature* owner) +bool FormationMovementGenerator::DoReset(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } bool FormationMovementGenerator::DoUpdate(Creature* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h index 481e050ff07..2bf2c0df76f 100644 --- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h @@ -32,8 +32,8 @@ class FormationMovementGenerator : public MovementGeneratorMedium<Creature, Form MovementGeneratorType GetMovementGeneratorType() const override; - void DoInitialize(Creature*); - void DoReset(Creature*); + bool DoInitialize(Creature*); + bool DoReset(Creature*); bool DoUpdate(Creature*, uint32); void DoDeactivate(Creature*); void DoFinalize(Creature*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.cpp index 9f5b437ba62..860ee97f800 100644 --- a/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.cpp @@ -30,13 +30,13 @@ GenericMovementGenerator::GenericMovementGenerator(std::function<void(Movement:: BaseUnitState = UNIT_STATE_ROAMING; } -void GenericMovementGenerator::Initialize(Unit* owner) +bool GenericMovementGenerator::Initialize(Unit* owner) { if (HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED) && !HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING)) // Resume spline is not supported { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED); - return; + return false; } RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); @@ -45,11 +45,12 @@ void GenericMovementGenerator::Initialize(Unit* owner) Movement::MoveSplineInit init(owner); _splineInit(init); _duration.Reset(init.Launch()); + return _duration.GetExpiry() > 0ms; } -void GenericMovementGenerator::Reset(Unit* owner) +bool GenericMovementGenerator::Reset(Unit* owner) { - Initialize(owner); + return Initialize(owner); } bool GenericMovementGenerator::Update(Unit* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.h b/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.h index 4151d9b1070..f4ba1c7d9f4 100644 --- a/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/GenericMovementGenerator.h @@ -32,8 +32,8 @@ class GenericMovementGenerator : public MovementGenerator public: explicit GenericMovementGenerator(std::function<void(Movement::MoveSplineInit& init)>&& initializer, MovementGeneratorType type, uint32 id); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 9d2f98ac4b4..2400f13f469 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -81,10 +81,10 @@ void HomeMovementGenerator<Creature>::SetTargetLocation(Creature* owner) } template<class T> -void HomeMovementGenerator<T>::DoInitialize(T*) { } +bool HomeMovementGenerator<T>::DoInitialize(T*) { return false; } template<> -void HomeMovementGenerator<Creature>::DoInitialize(Creature* owner) +bool HomeMovementGenerator<Creature>::DoInitialize(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); @@ -92,17 +92,18 @@ void HomeMovementGenerator<Creature>::DoInitialize(Creature* owner) owner->SetNoSearchAssistance(false); SetTargetLocation(owner); + return true; } template<class T> -void HomeMovementGenerator<T>::DoReset(T*) { } +bool HomeMovementGenerator<T>::DoReset(T*) { return false; } template<> -void HomeMovementGenerator<Creature>::DoReset(Creature* owner) +bool HomeMovementGenerator<Creature>::DoReset(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } template<class T> diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h index 3c0dbf696a9..5f26e53298d 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h @@ -28,8 +28,8 @@ class HomeMovementGenerator : public MovementGeneratorMedium< T, HomeMovementGen MovementGeneratorType GetMovementGeneratorType() const override; - void DoInitialize(T*); - void DoReset(T*); + bool DoInitialize(T*); + bool DoReset(T*); bool DoUpdate(T*, uint32); void DoDeactivate(T*); void DoFinalize(T*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index ff42921f53c..ec6b50732fb 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -36,14 +36,16 @@ IdleMovementGenerator::IdleMovementGenerator() * TODO: "if (!owner->IsStopped())" is useless, each generator cleans their own STATE_MOVE, the result is that StopMoving is almost never called * Old comment: "StopMoving is needed to make unit stop if its last movement generator expires but it should not be sent otherwise there are many redundent packets" */ -void IdleMovementGenerator::Initialize(Unit* owner) +bool IdleMovementGenerator::Initialize(Unit* owner) { owner->StopMoving(); + return true; } -void IdleMovementGenerator::Reset(Unit* owner) +bool IdleMovementGenerator::Reset(Unit* owner) { owner->StopMoving(); + return true; } void IdleMovementGenerator::Deactivate(Unit* /*owner*/) @@ -70,13 +72,12 @@ RotateMovementGenerator::RotateMovementGenerator(uint32 id, uint32 time, RotateD BaseUnitState = UNIT_STATE_ROTATING; } -void RotateMovementGenerator::Initialize(Unit* owner) +bool RotateMovementGenerator::Initialize(Unit* /*owner*/) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); - owner->StopMoving(); - + return true; /* * TODO: This code should be handled somewhere else, like MovementInform * @@ -87,11 +88,11 @@ void RotateMovementGenerator::Initialize(Unit* owner) */ } -void RotateMovementGenerator::Reset(Unit* owner) +bool RotateMovementGenerator::Reset(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); - Initialize(owner); + return Initialize(owner); } bool RotateMovementGenerator::Update(Unit* owner, uint32 diff) @@ -148,7 +149,7 @@ DistractMovementGenerator::DistractMovementGenerator(uint32 timer, float orienta BaseUnitState = UNIT_STATE_DISTRACTED; } -void DistractMovementGenerator::Initialize(Unit* owner) +bool DistractMovementGenerator::Initialize(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); @@ -165,13 +166,14 @@ void DistractMovementGenerator::Initialize(Unit* owner) init.DisableTransportPathTransformations(); init.SetFacing(_orientation); init.Launch(); + return true; } -void DistractMovementGenerator::Reset(Unit* owner) +bool DistractMovementGenerator::Reset(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); - Initialize(owner); + return Initialize(owner); } bool DistractMovementGenerator::Update(Unit* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h index 7e0c89c561a..0e42eb4150b 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h @@ -28,8 +28,8 @@ class IdleMovementGenerator : public MovementGenerator public: explicit IdleMovementGenerator(); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override { return true; } void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; @@ -41,8 +41,8 @@ class RotateMovementGenerator : public MovementGenerator public: explicit RotateMovementGenerator(uint32 id, uint32 time, RotateDirection direction); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; @@ -58,8 +58,8 @@ class DistractMovementGenerator : public MovementGenerator public: explicit DistractMovementGenerator(uint32 timer, float orientation); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index 23c4a64025e..765da3694e2 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -43,7 +43,7 @@ MovementGeneratorType PointMovementGenerator<T>::GetMovementGeneratorType() cons } template<class T> -void PointMovementGenerator<T>::DoInitialize(T* owner) +bool PointMovementGenerator<T>::DoInitialize(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); @@ -51,14 +51,14 @@ void PointMovementGenerator<T>::DoInitialize(T* owner) if (_movementId == EVENT_CHARGE_PREPATH) { owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); - return; + return true; } if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting()) { MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); owner->StopMoving(); - return; + return true; } owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); @@ -76,14 +76,15 @@ void PointMovementGenerator<T>::DoInitialize(T* owner) // Call for creature group update if (Creature* creature = owner->ToCreature()) creature->SignalFormationMovement(); + return true; } template<class T> -void PointMovementGenerator<T>::DoReset(T* owner) +bool PointMovementGenerator<T>::DoReset(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } template<class T> @@ -167,10 +168,10 @@ template PointMovementGenerator<Player>::PointMovementGenerator(uint32, float, f template PointMovementGenerator<Creature>::PointMovementGenerator(uint32, float, float, float, bool, float, Optional<float>); template MovementGeneratorType PointMovementGenerator<Player>::GetMovementGeneratorType() const; template MovementGeneratorType PointMovementGenerator<Creature>::GetMovementGeneratorType() const; -template void PointMovementGenerator<Player>::DoInitialize(Player*); -template void PointMovementGenerator<Creature>::DoInitialize(Creature*); -template void PointMovementGenerator<Player>::DoReset(Player*); -template void PointMovementGenerator<Creature>::DoReset(Creature*); +template bool PointMovementGenerator<Player>::DoInitialize(Player*); +template bool PointMovementGenerator<Creature>::DoInitialize(Creature*); +template bool PointMovementGenerator<Player>::DoReset(Player*); +template bool PointMovementGenerator<Creature>::DoReset(Creature*); template bool PointMovementGenerator<Player>::DoUpdate(Player*, uint32); template bool PointMovementGenerator<Creature>::DoUpdate(Creature*, uint32); template void PointMovementGenerator<Player>::DoDeactivate(Player*); diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index c943fa7eadb..e5d4753a35e 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -31,8 +31,8 @@ class PointMovementGenerator : public MovementGeneratorMedium<T, PointMovementGe MovementGeneratorType GetMovementGeneratorType() const override; - void DoInitialize(T*); - void DoReset(T*); + bool DoInitialize(T*); + bool DoReset(T*); bool DoUpdate(T*, uint32); void DoDeactivate(T*); void DoFinalize(T*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index a41db1336df..b5c26c8a952 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -69,19 +69,18 @@ void RandomMovementGenerator<T>::Resume(uint32 overrideTimer /*= 0*/) template MovementGeneratorType RandomMovementGenerator<Creature>::GetMovementGeneratorType() const; template<class T> -void RandomMovementGenerator<T>::DoInitialize(T*) { } +bool RandomMovementGenerator<T>::DoInitialize(T*) { return false; } template<> -void RandomMovementGenerator<Creature>::DoInitialize(Creature* owner) +bool RandomMovementGenerator<Creature>::DoInitialize(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED | MOVEMENTGENERATOR_FLAG_TIMED_PAUSED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); if (!owner || !owner->IsAlive()) - return; + return false; _reference = owner->GetPosition(); - owner->StopMoving(); if (_wanderDistance == 0.f) _wanderDistance = owner->GetWanderDistance(); @@ -91,17 +90,18 @@ void RandomMovementGenerator<Creature>::DoInitialize(Creature* owner) _timer.Reset(0); _path = nullptr; + return true; } template<class T> -void RandomMovementGenerator<T>::DoReset(T*) { } +bool RandomMovementGenerator<T>::DoReset(T*) { return false; } template<> -void RandomMovementGenerator<Creature>::DoReset(Creature* owner) +bool RandomMovementGenerator<Creature>::DoReset(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); - DoInitialize(owner); + return DoInitialize(owner); } template<class T> diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 812297fa212..4098411d7bd 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -35,8 +35,8 @@ class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovement void Pause(uint32 timer = 0) override; void Resume(uint32 overrideTimer = 0) override; - void DoInitialize(T*); - void DoReset(T*); + bool DoInitialize(T*); + bool DoReset(T*); bool DoUpdate(T*, uint32); void DoDeactivate(T*); void DoFinalize(T*, bool, bool); diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp index baf464ebdbc..d322e922a66 100644 --- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp @@ -51,6 +51,8 @@ uint32 SplineChainMovementGenerator::SendPathSpline(Unit* owner, float velocity, uint32 nodeCount = path.size(); ASSERT(nodeCount > 1, "SplineChainMovementGenerator::SendPathSpline: Every path must have source & destination (size > 1)! (%s)", owner->GetGUID().ToString().c_str()); + owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); + Movement::MoveSplineInit init(owner); if (nodeCount > 2) init.MovebyPath(path); @@ -81,7 +83,7 @@ void SplineChainMovementGenerator::SendSplineFor(Unit* owner, uint32 index, uint } } -void SplineChainMovementGenerator::Initialize(Unit* owner) +bool SplineChainMovementGenerator::Initialize(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); @@ -89,20 +91,20 @@ void SplineChainMovementGenerator::Initialize(Unit* owner) if (!_chainSize) { TC_LOG_ERROR("movement", "SplineChainMovementGenerator::Initialize: couldn't initialize generator, referenced spline is empty! ({})", owner->GetGUID().ToString()); - return; + return false; } if (_nextIndex >= _chainSize) { TC_LOG_WARN("movement", "SplineChainMovementGenerator::Initialize: couldn't initialize generator, _nextIndex is >= _chainSize ({})", owner->GetGUID().ToString()); _msToNext = 0; - return; + return false; } if (_nextFirstWP) // this is a resumed movegen that has to start with a partial spline { if (HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED)) - return; + return false; SplineChainLink const& thisLink = _chain[_nextIndex]; if (_nextFirstWP >= thisLink.Points.size()) @@ -111,7 +113,6 @@ void SplineChainMovementGenerator::Initialize(Unit* owner) _nextFirstWP = thisLink.Points.size() - 1; } - owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::PointsArray partial(thisLink.Points.begin() + (_nextFirstWP-1), thisLink.Points.end()); SendPathSpline(owner, thisLink.Velocity, partial); @@ -133,14 +134,15 @@ void SplineChainMovementGenerator::Initialize(Unit* owner) if (_nextIndex >= _chainSize) _msToNext = 0; } + return true; } -void SplineChainMovementGenerator::Reset(Unit* owner) +bool SplineChainMovementGenerator::Reset(Unit* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED); owner->StopMoving(); - Initialize(owner); + return Initialize(owner); } bool SplineChainMovementGenerator::Update(Unit* owner, uint32 diff) @@ -174,7 +176,11 @@ bool SplineChainMovementGenerator::Update(Unit* owner, uint32 diff) } } else + { _msToNext -= diff; + if (owner->movespline->Finalized()) + owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE); + } return true; } diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h index 011f28bf1a3..0c48847dcba 100644 --- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h @@ -31,8 +31,8 @@ class TC_GAME_API SplineChainMovementGenerator : public MovementGenerator explicit SplineChainMovementGenerator(uint32 id, std::vector<SplineChainLink> const& chain, bool walk = false); explicit SplineChainMovementGenerator(SplineChainResumeInfo const& info); - void Initialize(Unit*) override; - void Reset(Unit*) override; + bool Initialize(Unit*) override; + bool Reset(Unit*) override; bool Update(Unit*, uint32) override; void Deactivate(Unit*) override; void Finalize(Unit*, bool, bool) override; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 65181a09ac1..815e51d9512 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -97,7 +97,7 @@ bool WaypointMovementGenerator<Creature>::GetResetPosition(Unit* /*owner*/, floa return true; } -void WaypointMovementGenerator<Creature>::DoInitialize(Creature* owner) +bool WaypointMovementGenerator<Creature>::DoInitialize(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); @@ -112,15 +112,16 @@ void WaypointMovementGenerator<Creature>::DoInitialize(Creature* owner) if (!_path) { TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::DoInitialize: couldn't load path for creature ({}) (_pathId: {})", owner->GetGUID().ToString(), _pathId); - return; + return false; } owner->StopMoving(); _nextMoveTime.Reset(1000); + return true; } -void WaypointMovementGenerator<Creature>::DoReset(Creature* owner) +bool WaypointMovementGenerator<Creature>::DoReset(Creature* owner) { RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); @@ -128,6 +129,7 @@ void WaypointMovementGenerator<Creature>::DoReset(Creature* owner) if (!HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED) && _nextMoveTime.Passed()) _nextMoveTime.Reset(1); // Needed so that Update does not behave as if node was reached + return true; } bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index e265c62522b..acbbf7ef2c8 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -44,8 +44,8 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat void Resume(uint32 overrideTimer = 0) override; bool GetResetPosition(Unit*, float& x, float& y, float& z) override; - void DoInitialize(Creature*); - void DoReset(Creature*); + bool DoInitialize(Creature*); + bool DoReset(Creature*); bool DoUpdate(Creature*, uint32); void DoDeactivate(Creature*); void DoFinalize(Creature*, bool, bool); |
