aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-02-12 02:57:55 +0100
committerShauren <shauren.trinity@gmail.com>2021-06-19 23:33:38 +0200
commit6d79b329acd7ad1d81f1f508726f5fad78b70b0e (patch)
tree741ad3f4e6f1a7c48ba15dea7afe43d3fea442ab
parent88c1739e3e1ecf58407b0846f3c8dfeb589f3113 (diff)
Core/Movement: WaypointMovementGenerator cleanup
(cherry picked from commit fe1ba1890540283b8d330fe98b96770fe372ba8d)
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp77
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h10
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;