diff options
3 files changed, 22 insertions, 13 deletions
| 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<Creature>::WaypointMovementGenerator(WaypointPath& pat      _repeating = repeating;      _loadedFromDB = false;      _stalled = false; +    _done = false;  }  void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) @@ -67,6 +68,7 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature)  void WaypointMovementGenerator<Creature>::DoInitialize(Creature* creature)  { +    _done = false;      LoadPath(creature);  } @@ -78,8 +80,14 @@ void WaypointMovementGenerator<Creature>::DoFinalize(Creature* creature)  void WaypointMovementGenerator<Creature>::DoReset(Creature* creature)  { -    if (CanMove(creature)) +    if (!_done && CanMove(creature))          StartMoveNow(creature); +    else if (_done) +    { +        // mimic IdleMovementGenerator +        if (!creature->IsStopped()) +            creature->StopMoving(); +    }  }  void WaypointMovementGenerator<Creature>::OnArrived(Creature* creature) @@ -116,10 +124,10 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature* creature)  bool WaypointMovementGenerator<Creature>::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<Creature>::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<Creature>::StartMove(Creature* creature)  bool WaypointMovementGenerator<Creature>::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<Creature>::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<Creature>::DoUpdate(Creature* creature, uint32 di                  StartMove(creature);          }      } -     return true; +    return true;   }  void WaypointMovementGenerator<Creature>::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<Creature> : public MovementGeneratorMedium<Creature, WaypointMovementGenerator<Creature>>, public PathMovementBase<Creature, WaypointPath const*>  {      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<Creature> : public MovementGeneratorMedium<Creat          bool _repeating;          bool _loadedFromDB;          bool _stalled; +        bool _done;  };  /** | 
