Skip to content

Commit 8787dfe

Browse files
authored
Core/Movement: Check that movement generators were properly initialized and fix off-by-one-update-tick time tracking (#31612)
1 parent f181315 commit 8787dfe

28 files changed

+142
-117
lines changed

src/server/game/Movement/MotionMaster.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,20 +300,27 @@ void MotionMaster::Update(uint32 diff)
300300

301301
AddFlag(MOTIONMASTER_FLAG_UPDATE);
302302

303+
enum class InitState : uint8
304+
{
305+
Failed,
306+
Success,
307+
AlreadyInitialized
308+
} initializationState = InitState::AlreadyInitialized;
309+
303310
MovementGenerator* top = GetCurrentMovementGenerator();
304311
if (HasFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING) && IsStatic(top))
305312
{
306313
RemoveFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING);
307-
top->Initialize(_owner);
314+
initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed;
308315
}
309316
if (top->HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING))
310-
top->Initialize(_owner);
317+
initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed;
311318
if (top->HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED))
312-
top->Reset(_owner);
319+
initializationState = top->Reset(_owner) ? InitState::Success : InitState::Failed;
313320

314321
ASSERT(!top->HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED), "MotionMaster:Update: update called on an uninitialized top! (%s) (type: %u, flags: %u)", _owner->GetGUID().ToString().c_str(), top->GetMovementGeneratorType(), top->Flags);
315322

316-
if (!top->Update(_owner, diff))
323+
if (initializationState == InitState::Failed || !top->Update(_owner, initializationState == InitState::AlreadyInitialized ? diff : 0))
317324
{
318325
ASSERT(top == GetCurrentMovementGenerator(), "MotionMaster::Update: top was modified while updating! (%s)", _owner->GetGUID().ToString().c_str());
319326

src/server/game/Movement/MovementGenerator.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ class TC_GAME_API MovementGenerator
5151
virtual ~MovementGenerator();
5252

5353
// on top first update
54-
virtual void Initialize(Unit*) = 0;
54+
virtual bool Initialize(Unit*) = 0;
5555
// on top reassign
56-
virtual void Reset(Unit*) = 0;
56+
virtual bool Reset(Unit*) = 0;
5757
// on top on MotionMaster::Update
5858
virtual bool Update(Unit*, uint32 diff) = 0;
5959
// on current top if another movement replaces
@@ -86,14 +86,14 @@ template<class T, class D>
8686
class MovementGeneratorMedium : public MovementGenerator
8787
{
8888
public:
89-
void Initialize(Unit* owner) override
89+
bool Initialize(Unit* owner) override
9090
{
91-
(static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
91+
return (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
9292
}
9393

94-
void Reset(Unit* owner) override
94+
bool Reset(Unit* owner) override
9595
{
96-
(static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
96+
return (static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
9797
}
9898

9999
bool Update(Unit* owner, uint32 diff) override

src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,21 @@ ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange
7575
}
7676
ChaseMovementGenerator::~ChaseMovementGenerator() = default;
7777

78-
void ChaseMovementGenerator::Initialize(Unit* /*owner*/)
78+
bool ChaseMovementGenerator::Initialize(Unit* /*owner*/)
7979
{
8080
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
8181
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
8282

8383
_path = nullptr;
8484
_lastTargetPosition.reset();
85+
return true;
8586
}
8687

87-
void ChaseMovementGenerator::Reset(Unit* owner)
88+
bool ChaseMovementGenerator::Reset(Unit* owner)
8889
{
8990
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
9091

91-
Initialize(owner);
92+
return Initialize(owner);
9293
}
9394

9495
bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)

src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
3434
explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {});
3535
~ChaseMovementGenerator();
3636

37-
void Initialize(Unit*) override;
38-
void Reset(Unit*) override;
37+
bool Initialize(Unit*) override;
38+
bool Reset(Unit*) override;
3939
bool Update(Unit*, uint32) override;
4040
void Deactivate(Unit*) override;
4141
void Finalize(Unit*, bool, bool) override;

src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,29 @@ MovementGeneratorType ConfusedMovementGenerator<T>::GetMovementGeneratorType() c
4040
}
4141

4242
template<class T>
43-
void ConfusedMovementGenerator<T>::DoInitialize(T* owner)
43+
bool ConfusedMovementGenerator<T>::DoInitialize(T* owner)
4444
{
4545
MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
4646
MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
4747

4848
if (!owner || !owner->IsAlive())
49-
return;
49+
return false;
5050

5151
// TODO: UNIT_FIELD_FLAGS should not be handled by generators
5252
owner->SetUnitFlag(UNIT_FLAG_CONFUSED);
53-
owner->StopMoving();
5453

5554
_timer.Reset(0);
5655
owner->GetPosition(_x, _y, _z);
5756
_path = nullptr;
57+
return true;
5858
}
5959

6060
template<class T>
61-
void ConfusedMovementGenerator<T>::DoReset(T* owner)
61+
bool ConfusedMovementGenerator<T>::DoReset(T* owner)
6262
{
6363
MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
6464

65-
DoInitialize(owner);
65+
return DoInitialize(owner);
6666
}
6767

6868
template<class T>
@@ -167,10 +167,10 @@ template ConfusedMovementGenerator<Player>::ConfusedMovementGenerator();
167167
template ConfusedMovementGenerator<Creature>::ConfusedMovementGenerator();
168168
template MovementGeneratorType ConfusedMovementGenerator<Player>::GetMovementGeneratorType() const;
169169
template MovementGeneratorType ConfusedMovementGenerator<Creature>::GetMovementGeneratorType() const;
170-
template void ConfusedMovementGenerator<Player>::DoInitialize(Player*);
171-
template void ConfusedMovementGenerator<Creature>::DoInitialize(Creature*);
172-
template void ConfusedMovementGenerator<Player>::DoReset(Player*);
173-
template void ConfusedMovementGenerator<Creature>::DoReset(Creature*);
170+
template bool ConfusedMovementGenerator<Player>::DoInitialize(Player*);
171+
template bool ConfusedMovementGenerator<Creature>::DoInitialize(Creature*);
172+
template bool ConfusedMovementGenerator<Player>::DoReset(Player*);
173+
template bool ConfusedMovementGenerator<Creature>::DoReset(Creature*);
174174
template bool ConfusedMovementGenerator<Player>::DoUpdate(Player*, uint32);
175175
template bool ConfusedMovementGenerator<Creature>::DoUpdate(Creature*, uint32);
176176
template void ConfusedMovementGenerator<Player>::DoDeactivate(Player*);

src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ class ConfusedMovementGenerator : public MovementGeneratorMedium<T, ConfusedMove
3131

3232
MovementGeneratorType GetMovementGeneratorType() const override;
3333

34-
void DoInitialize(T*);
35-
void DoReset(T*);
34+
bool DoInitialize(T*);
35+
bool DoReset(T*);
3636
bool DoUpdate(T*, uint32);
3737
void DoDeactivate(T*);
3838
void DoFinalize(T*, bool, bool);

src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,28 @@ MovementGeneratorType FleeingMovementGenerator<T>::GetMovementGeneratorType() co
4545
}
4646

4747
template<class T>
48-
void FleeingMovementGenerator<T>::DoInitialize(T* owner)
48+
bool FleeingMovementGenerator<T>::DoInitialize(T* owner)
4949
{
5050
MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
5151
MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
5252

5353
if (!owner || !owner->IsAlive())
54-
return;
54+
return false;
5555

5656
// TODO: UNIT_FIELD_FLAGS should not be handled by generators
5757
owner->SetUnitFlag(UNIT_FLAG_FLEEING);
5858

5959
_path = nullptr;
6060
SetTargetLocation(owner);
61+
return true;
6162
}
6263

6364
template<class T>
64-
void FleeingMovementGenerator<T>::DoReset(T* owner)
65+
bool FleeingMovementGenerator<T>::DoReset(T* owner)
6566
{
6667
MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
6768

68-
DoInitialize(owner);
69+
return DoInitialize(owner);
6970
}
7071

7172
template<class T>
@@ -223,10 +224,10 @@ template FleeingMovementGenerator<Player>::FleeingMovementGenerator(ObjectGuid);
223224
template FleeingMovementGenerator<Creature>::FleeingMovementGenerator(ObjectGuid);
224225
template MovementGeneratorType FleeingMovementGenerator<Player>::GetMovementGeneratorType() const;
225226
template MovementGeneratorType FleeingMovementGenerator<Creature>::GetMovementGeneratorType() const;
226-
template void FleeingMovementGenerator<Player>::DoInitialize(Player*);
227-
template void FleeingMovementGenerator<Creature>::DoInitialize(Creature*);
228-
template void FleeingMovementGenerator<Player>::DoReset(Player*);
229-
template void FleeingMovementGenerator<Creature>::DoReset(Creature*);
227+
template bool FleeingMovementGenerator<Player>::DoInitialize(Player*);
228+
template bool FleeingMovementGenerator<Creature>::DoInitialize(Creature*);
229+
template bool FleeingMovementGenerator<Player>::DoReset(Player*);
230+
template bool FleeingMovementGenerator<Creature>::DoReset(Creature*);
230231
template bool FleeingMovementGenerator<Player>::DoUpdate(Player*, uint32);
231232
template bool FleeingMovementGenerator<Creature>::DoUpdate(Creature*, uint32);
232233
template void FleeingMovementGenerator<Player>::DoDeactivate(Player*);

src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class FleeingMovementGenerator : public MovementGeneratorMedium<T, FleeingMoveme
3434

3535
MovementGeneratorType GetMovementGeneratorType() const override;
3636

37-
void DoInitialize(T*);
38-
void DoReset(T*);
37+
bool DoInitialize(T*);
38+
bool DoReset(T*);
3939
bool DoUpdate(T*, uint32);
4040
void DoDeactivate(T*);
4141
void DoFinalize(T*, bool, bool);

src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,17 @@ bool FlightPathMovementGenerator::GetResetPosition(Unit* /*owner*/, float& x, fl
5858
return true;
5959
}
6060

61-
void FlightPathMovementGenerator::DoInitialize(Player* owner)
61+
bool FlightPathMovementGenerator::DoInitialize(Player* owner)
6262
{
6363
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
6464
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
6565

66-
DoReset(owner);
66+
bool returnValue = DoReset(owner);
6767
InitEndGridInfo();
68+
return returnValue;
6869
}
6970

70-
void FlightPathMovementGenerator::DoReset(Player* owner)
71+
bool FlightPathMovementGenerator::DoReset(Player* owner)
7172
{
7273
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
7374

@@ -80,7 +81,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner)
8081
if (currentNodeId == end)
8182
{
8283
TC_LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", owner->GetDebugInfo());
83-
return;
84+
return false;
8485
}
8586

8687
Movement::MoveSplineInit init(owner);
@@ -95,6 +96,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner)
9596
init.SetFly();
9697
init.SetVelocity(PLAYER_FLIGHT_SPEED);
9798
init.Launch();
99+
return true;
98100
}
99101

100102
bool FlightPathMovementGenerator::DoUpdate(Player* owner, uint32 /*diff*/)

src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, Fligh
3737
MovementGeneratorType GetMovementGeneratorType() const override;
3838
bool GetResetPosition(Unit* owner, float& x, float& y, float& z) override;
3939

40-
void DoInitialize(Player*);
41-
void DoReset(Player*);
40+
bool DoInitialize(Player*);
41+
bool DoReset(Player*);
4242
bool DoUpdate(Player*, uint32);
4343
void DoDeactivate(Player*);
4444
void DoFinalize(Player*, bool, bool);

0 commit comments

Comments
 (0)