From eb2769996f01bfd7d7118503a44705711eb309a3 Mon Sep 17 00:00:00 2001 From: ccrs Date: Sat, 12 Aug 2017 19:43:37 +0200 Subject: Core/Movement: 7fff83d6752 followup since MOTION_SLOT_IDLE cannot be expired, signal path done and behave like IdleMotionGenerator --- src/server/game/Movement/MotionMaster.cpp | 2 +- .../WaypointMovementGenerator.cpp | 30 ++++++++++++++-------- .../MovementGenerators/WaypointMovementGenerator.h | 3 ++- 3 files changed, 22 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 2c9899ed43a..b2027144487 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -73,7 +73,7 @@ void MotionMaster::Initialize() // clear ALL movement generators (including default) while (!empty()) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); if (curr) DirectDelete(curr); diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 3ca1d581982..6171afc5274 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -40,6 +40,7 @@ WaypointMovementGenerator::WaypointMovementGenerator(WaypointPath& pat _repeating = repeating; _loadedFromDB = false; _stalled = false; + _done = false; } void WaypointMovementGenerator::LoadPath(Creature* creature) @@ -67,6 +68,7 @@ void WaypointMovementGenerator::LoadPath(Creature* creature) void WaypointMovementGenerator::DoInitialize(Creature* creature) { + _done = false; LoadPath(creature); } @@ -78,8 +80,14 @@ void WaypointMovementGenerator::DoFinalize(Creature* creature) void WaypointMovementGenerator::DoReset(Creature* creature) { - if (CanMove(creature)) + if (!_done && CanMove(creature)) StartMoveNow(creature); + else if (_done) + { + // mimic IdleMovementGenerator + if (!creature->IsStopped()) + creature->StopMoving(); + } } void WaypointMovementGenerator::OnArrived(Creature* creature) @@ -116,10 +124,10 @@ void WaypointMovementGenerator::OnArrived(Creature* creature) bool WaypointMovementGenerator::StartMove(Creature* creature) { if (!creature || !creature->IsAlive()) - return false; + return true; - if (!_path || _path->nodes.empty()) - return false; + if (_done || !_path || _path->nodes.empty()) + return true; // if the owner is the leader of its formation, check members status if (creature->IsFormationLeader() && !creature->IsFormationLeaderMoveAllowed()) @@ -156,7 +164,8 @@ bool WaypointMovementGenerator::StartMove(Creature* creature) transportPath = false; // else if (vehicle) - this should never happen, vehicle offsets are const } - return false; + _done = true; + return true; } _currentNode = (_currentNode + 1) % _path->nodes.size(); @@ -228,7 +237,10 @@ bool WaypointMovementGenerator::StartMove(Creature* creature) bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 diff) { if (!creature || !creature->IsAlive()) - return false; + return true; + + if (_done || !_path || _path->nodes.empty()) + return true; if (_stalled || creature->HasUnitState(UNIT_STATE_NOT_MOVE) || creature->IsMovementPreventedByCasting()) { @@ -236,10 +248,6 @@ bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 di return true; } - // prevent a crash at empty waypoint path. - if (!_path || _path->nodes.empty()) - return false; - if (!_nextMoveTime.Passed()) { _nextMoveTime.Update(diff); @@ -266,7 +274,7 @@ bool WaypointMovementGenerator::DoUpdate(Creature* creature, uint32 di StartMove(creature); } } - return true; + return true; } void WaypointMovementGenerator::MovementInform(Creature* creature) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 2ea92f021da..3a0140ffa91 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -55,7 +55,7 @@ template<> class WaypointMovementGenerator : public MovementGeneratorMedium>, public PathMovementBase { public: - explicit WaypointMovementGenerator(uint32 pathId = 0, bool repeating = true) : _nextMoveTime(0), _recalculateSpeed(false), _isArrivalDone(false), _pathId(pathId), _repeating(repeating), _loadedFromDB(true), _stalled(false) { } + explicit WaypointMovementGenerator(uint32 pathId = 0, bool repeating = true) : _nextMoveTime(0), _recalculateSpeed(false), _isArrivalDone(false), _pathId(pathId), _repeating(repeating), _loadedFromDB(true), _stalled(false), _done(false) { } explicit WaypointMovementGenerator(WaypointPath& path, bool repeating = true); ~WaypointMovementGenerator() { _path = nullptr; } @@ -92,6 +92,7 @@ class WaypointMovementGenerator : public MovementGeneratorMedium