diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-02-12 02:57:55 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-06-19 23:33:38 +0200 |
commit | 6d79b329acd7ad1d81f1f508726f5fad78b70b0e (patch) | |
tree | 741ad3f4e6f1a7c48ba15dea7afe43d3fea442ab | |
parent | 88c1739e3e1ecf58407b0846f3c8dfeb589f3113 (diff) |
Core/Movement: WaypointMovementGenerator cleanup
(cherry picked from commit fe1ba1890540283b8d330fe98b96770fe372ba8d)
-rw-r--r-- | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 77 | ||||
-rwxr-xr-x | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h | 10 |
2 files changed, 31 insertions, 56 deletions
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index e5b0c475f0c..43207d01568 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -42,8 +42,10 @@ WaypointMovementGenerator<Creature>::~WaypointMovementGenerator() _path = nullptr; } -void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) +void WaypointMovementGenerator<Creature>::DoInitialize(Creature* creature) { + _done = false; + if (_loadedFromDB) { if (!_pathId) @@ -55,7 +57,7 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) if (!_path) { // No path id found for entry - TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature %s (%s DB GUID: " UI64FMTD ") doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetGUID().ToString().c_str(), creature->GetSpawnId(), _pathId); + TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::DoInitialize: creature %s (%s DB GUID: " UI64FMTD ") doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetGUID().ToString().c_str(), creature->GetSpawnId(), _pathId); return; } @@ -66,12 +68,6 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) creature->AI()->WaypointPathStarted(_path->id); } -void WaypointMovementGenerator<Creature>::DoInitialize(Creature* creature) -{ - _done = false; - LoadPath(creature); -} - void WaypointMovementGenerator<Creature>::DoFinalize(Creature* creature) { creature->ClearUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE); @@ -80,8 +76,8 @@ void WaypointMovementGenerator<Creature>::DoFinalize(Creature* creature) void WaypointMovementGenerator<Creature>::DoReset(Creature* creature) { - if (!_done && CanMove(creature)) - StartMoveNow(creature); + if (!_done && _nextMoveTime.Passed() && CanMove(creature)) + StartMove(creature); else if (_done) { // mimic IdleMovementGenerator @@ -120,19 +116,19 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature* creature) creature->UpdateCurrentWaypointInfo(waypoint.id, _path->id); } -bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) +void WaypointMovementGenerator<Creature>::StartMove(Creature* creature) { if (!creature || !creature->IsAlive()) - return true; + return; if (_done || !_path || _path->nodes.empty()) - return true; + return; // if the owner is the leader of its formation, check members status - if (creature->IsFormationLeader() && !creature->IsFormationLeaderMoveAllowed()) + if (!CanMove(creature) || (creature->IsFormationLeader() && !creature->IsFormationLeaderMoveAllowed())) { _nextMoveTime.Reset(1000); - return true; + return; } bool transportPath = creature->GetTransport() != nullptr; @@ -170,7 +166,7 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) // inform AI if (creature->IsAIEnabled) creature->AI()->WaypointPathEnded(waypoint.id, _path->id); - return true; + return; } _currentNode = (_currentNode + 1) % _path->nodes.size(); @@ -181,7 +177,7 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) } ASSERT(_currentNode < _path->nodes.size(), "WaypointMovementGenerator::StartMove: tried to reference a node id (%u) which is not included in path (%u)", _currentNode, _path->id); - WaypointNode const &waypoint = _path->nodes.at(_currentNode); + WaypointNode const &waypoint = _path->nodes[_currentNode]; Position formationDest(waypoint.x, waypoint.y, waypoint.z, (waypoint.orientation && waypoint.delay) ? waypoint.orientation : 0.0f); _isArrivalDone = false; @@ -234,7 +230,7 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) // inform formation creature->SignalFormationMovement(formationDest, waypoint.id, waypoint.moveType, (waypoint.orientation && waypoint.delay) ? true : false); - return true; + return; } bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 diff) @@ -243,46 +239,31 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di return true; if (_done || !_path || _path->nodes.empty()) - return true; + return false; if (_stalled || creature->HasUnitState(UNIT_STATE_NOT_MOVE) || creature->IsMovementPreventedByCasting()) { + creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); creature->StopMoving(); return true; } if (!_nextMoveTime.Passed()) + _nextMoveTime.Update(diff); + + if (creature->HasUnitState(UNIT_STATE_ROAMING_MOVE) && creature->movespline->Finalized() && !_isArrivalDone) { - if (creature->movespline->Finalized()) - { - _nextMoveTime.Update(diff); - if (_nextMoveTime.Passed()) - return StartMoveNow(creature); - } + OnArrived(creature); + _isArrivalDone = true; } - else - { - if (creature->movespline->Finalized()) - { - OnArrived(creature); - _isArrivalDone = true; - if (_nextMoveTime.Passed()) - return StartMove(creature); - } - else - { - // Set home position at place on waypoint movement. - if (creature->GetTransGUID().IsEmpty()) - creature->SetHomePosition(creature->GetPosition()); + // Set home position at place on waypoint movement. + if (creature->GetTransGUID().IsEmpty()) + creature->SetHomePosition(creature->GetPosition()); + + if (_recalculateSpeed || (_nextMoveTime.Passed() && (!creature->HasUnitState(UNIT_STATE_ROAMING_MOVE) || creature->movespline->Finalized()))) + StartMove(creature); - if (_recalculateSpeed) - { - if (_nextMoveTime.Passed()) - StartMove(creature); - } - } - } return true; } @@ -320,7 +301,7 @@ void WaypointMovementGenerator<Creature>::Resume(uint32 overrideTimer/* = 0*/) _nextMoveTime.Reset(overrideTimer); } -bool WaypointMovementGenerator<Creature>::CanMove(Creature* creature) +/*static*/ bool WaypointMovementGenerator<Creature>::CanMove(Creature* creature) { - return _nextMoveTime.Passed() && !creature->HasUnitState(UNIT_STATE_NOT_MOVE) && !creature->IsMovementPreventedByCasting(); + return !creature->HasUnitState(UNIT_STATE_NOT_MOVE) && !creature->IsMovementPreventedByCasting(); } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 33989bf89de..eecb4c2d7f6 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -60,15 +60,9 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat bool GetResetPos(Creature*, float& x, float& y, float& z); private: - void LoadPath(Creature*); void OnArrived(Creature*); - bool StartMove(Creature*); - bool CanMove(Creature*); - bool StartMoveNow(Creature* creature) - { - _nextMoveTime.Reset(0); - return StartMove(creature); - } + void StartMove(Creature*); + static bool CanMove(Creature*); TimeTrackerSmall _nextMoveTime; bool _recalculateSpeed; |