aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement
diff options
context:
space:
mode:
authorccrs <ccrs@users.noreply.github.com>2020-05-02 22:52:01 +0200
committerccrs <ccrs@users.noreply.github.com>2020-05-02 22:52:01 +0200
commitb8422e667b242ae4ab2bbdfda43656ed1fe485ae (patch)
tree9c11718e8b4269f6d80c8590726c580f4f15f312 /src/server/game/Movement
parent9b5375f858b7a9bac409cc0b17c56391f2787f5b (diff)
Core/Movement: 0e2342c followup
Diffstat (limited to 'src/server/game/Movement')
-rw-r--r--src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp35
-rw-r--r--src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h1
2 files changed, 13 insertions, 23 deletions
diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
index 9bc79afcee0..b1261f816ed 100644
--- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp
@@ -30,7 +30,7 @@ FormationMovementGenerator::FormationMovementGenerator(Unit* leader, float range
Mode = MOTION_MODE_DEFAULT;
Priority = MOTION_PRIORITY_NORMAL;
Flags = MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING;
- BaseUnitState = UNIT_STATE_ROAMING;
+ BaseUnitState = UNIT_STATE_FOLLOW_FORMATION;
}
MovementGeneratorType FormationMovementGenerator::GetMovementGeneratorType() const
@@ -71,35 +71,25 @@ bool FormationMovementGenerator::DoUpdate(Creature* owner, uint32 diff)
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
{
AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
- owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
- owner->StopMoving();
- return true;
- }
-
- // Leader has stopped moving, so do we as well
- if (target->movespline->Finalized() && target->movespline->GetId() == _lastLeaderSplineID && _hasPredictedDestination)
- {
- owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
owner->StopMoving();
_nextMoveTimer.Reset(0);
_hasPredictedDestination = false;
return true;
}
- // Update home position
- owner->SetHomePosition(owner->GetPosition());
- if (HasFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED))
- RemoveFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
-
- // Leader has stopped moving, so do we as well
- if (owner->HasUnitState(UNIT_STATE_ROAMING_MOVE) && _hasPredictedDestination && target->movespline->Finalized() && target->movespline->GetId() == _lastLeaderSplineID)
+ // If target is not moving and destination has been predicted and if we are on the same spline, we stop as well
+ if (target->movespline->Finalized() && target->movespline->GetId() == _lastLeaderSplineID && _hasPredictedDestination)
{
+ AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
owner->StopMoving();
_nextMoveTimer.Reset(0);
_hasPredictedDestination = false;
return true;
}
+ if (!owner->movespline->Finalized())
+ owner->SetHomePosition(owner->GetPosition());
+
// Formation leader has launched a new spline, launch a new one for our member as well
// This action does not reset the regular movement launch cycle interval
if (!target->movespline->Finalized() && target->movespline->GetId() != _lastLeaderSplineID)
@@ -137,9 +127,9 @@ bool FormationMovementGenerator::DoUpdate(Creature* owner, uint32 diff)
}
// We have reached our destination before launching a new movement. Alling facing with leader
- if (owner->HasUnitState(UNIT_STATE_ROAMING_MOVE) && owner->movespline->Finalized())
+ if (owner->HasUnitState(UNIT_STATE_FOLLOW_FORMATION_MOVE) && owner->movespline->Finalized())
{
- owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
+ owner->ClearUnitState(UNIT_STATE_FOLLOW_FORMATION_MOVE);
owner->SetFacingTo(target->GetOrientation());
MovementInform(owner);
}
@@ -205,20 +195,21 @@ void FormationMovementGenerator::LaunchMovement(Creature* owner, Unit* target)
init.Launch();
_lastLeaderPosition = target->GetPosition();
- owner->AddUnitState(UNIT_STATE_ROAMING_MOVE);
+ owner->AddUnitState(UNIT_STATE_FOLLOW_FORMATION_MOVE);
+ RemoveFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
}
void FormationMovementGenerator::DoDeactivate(Creature* owner)
{
AddFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
- owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
+ owner->ClearUnitState(UNIT_STATE_FOLLOW_FORMATION_MOVE);
}
void FormationMovementGenerator::DoFinalize(Creature* owner, bool active, bool movementInform)
{
AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED);
if (active)
- owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
+ owner->ClearUnitState(UNIT_STATE_FOLLOW_FORMATION_MOVE);
if (movementInform && HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED))
MovementInform(owner);
diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
index 0b6d89b9b08..4c3adaf192b 100644
--- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.h
@@ -40,7 +40,6 @@ class FormationMovementGenerator : public MovementGeneratorMedium<Creature, Form
private:
void MovementInform(Creature*);
-
void LaunchMovement(Creature* owner, Unit* target);
static constexpr uint32 FORMATION_MOVEMENT_INTERVAL = 1200; // sniffed (3 batch update cycles)