From 40b63666adbd980f33171eca204d264e2db054db Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Wed, 26 Jun 2024 22:24:59 +0200 Subject: [PATCH] feat(Core/Movement): implement Pause and Resume to WaypointMovementGenerator (#19176) * implement Pause and Resume for WaypointMovementGenerator Co-authored-by: ccrs * prevent restart from external sources if wp is paused * don't update stopmove on every update SetFacing breaks otherwise * timer args not used --------- Co-authored-by: ccrs --- .../WaypointMovementGenerator.cpp | 20 +++++++++++++++++++ .../WaypointMovementGenerator.h | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index cbb948950..449dafaf0 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -61,6 +61,10 @@ void WaypointMovementGenerator::DoFinalize(Creature* creature) void WaypointMovementGenerator::DoReset(Creature* creature) { + if (stalled) + { + return; + } creature->AddUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE); StartMoveNow(creature); } @@ -209,6 +213,11 @@ bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 di { // Waypoint movement can be switched on/off // This is quite handy for escort quests and other stuff + if (stalled) + { + Stop(1000); + return true; + } if (creature->HasUnitState(UNIT_STATE_NOT_MOVE) || creature->IsMovementPreventedByCasting()) { creature->StopMoving(); @@ -278,6 +287,17 @@ void WaypointMovementGenerator::MovementInform(Creature* creature) } } +void WaypointMovementGenerator::Pause(uint32 /*timer*/) +{ + stalled = true; + i_nextMoveTime.Reset(1); +} + +void WaypointMovementGenerator::Resume(uint32 /*overrideTimer/*/) +{ + stalled = false; +} + //----------------------------------------------------// uint32 FlightPathMovementGenerator::GetPathAtMapEnd() const diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 1699a71a6..84d1279c2 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -54,13 +54,15 @@ class WaypointMovementGenerator : public MovementGeneratorMedium< Crea public PathMovementBase { public: - WaypointMovementGenerator(uint32 _path_id = 0, bool _repeating = true) - : PathMovementBase((WaypointPath const*)nullptr), i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating) {} + WaypointMovementGenerator(uint32 _path_id = 0, bool _repeating = true, bool _stalled = false) + : PathMovementBase((WaypointPath const*)nullptr), i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating), stalled(_stalled) {} ~WaypointMovementGenerator() { i_path = nullptr; } void DoInitialize(Creature*); void DoFinalize(Creature*); void DoReset(Creature*); bool DoUpdate(Creature*, uint32 diff); + void Pause(uint32 timer/* = 0*/); + void Resume(uint32 overrideTimer/* = 0*/); void MovementInform(Creature*); @@ -93,6 +95,7 @@ private: bool m_isArrivalDone; uint32 path_id; bool repeating; + bool stalled; }; /** FlightPathMovementGenerator generates movement of the player for the paths