Core/Movement: Check that movement generators were properly initialized and fix off-by-one-update-tick time tracking (#31612)
(cherry picked from commit 8787dfe6cfca3c5eb32fb024bdaa5e83d725aab8)
This commit is contained in:
@@ -299,20 +299,27 @@ void MotionMaster::Update(uint32 diff)
|
||||
|
||||
AddFlag(MOTIONMASTER_FLAG_UPDATE);
|
||||
|
||||
enum class InitState : uint8
|
||||
{
|
||||
Failed,
|
||||
Success,
|
||||
AlreadyInitialized
|
||||
} initializationState = InitState::AlreadyInitialized;
|
||||
|
||||
MovementGenerator* top = GetCurrentMovementGenerator();
|
||||
if (HasFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING) && IsStatic(top))
|
||||
{
|
||||
RemoveFlag(MOTIONMASTER_FLAG_STATIC_INITIALIZATION_PENDING);
|
||||
top->Initialize(_owner);
|
||||
initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed;
|
||||
}
|
||||
if (top->HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING))
|
||||
top->Initialize(_owner);
|
||||
initializationState = top->Initialize(_owner) ? InitState::Success : InitState::Failed;
|
||||
if (top->HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED))
|
||||
top->Reset(_owner);
|
||||
initializationState = top->Reset(_owner) ? InitState::Success : InitState::Failed;
|
||||
|
||||
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);
|
||||
|
||||
if (!top->Update(_owner, diff))
|
||||
if (initializationState == InitState::Failed || !top->Update(_owner, initializationState == InitState::AlreadyInitialized ? diff : 0))
|
||||
{
|
||||
ASSERT(top == GetCurrentMovementGenerator(), "MotionMaster::Update: top was modified while updating! (%s)", _owner->GetGUID().ToString().c_str());
|
||||
|
||||
|
||||
@@ -57,9 +57,9 @@ class TC_GAME_API MovementGenerator
|
||||
virtual ~MovementGenerator();
|
||||
|
||||
// on top first update
|
||||
virtual void Initialize(Unit* owner) = 0;
|
||||
virtual bool Initialize(Unit* owner) = 0;
|
||||
// on top reassign
|
||||
virtual void Reset(Unit* owner) = 0;
|
||||
virtual bool Reset(Unit* owner) = 0;
|
||||
// on top on MotionMaster::Update
|
||||
virtual bool Update(Unit* owner, uint32 diff) = 0;
|
||||
// on current top if another movement replaces
|
||||
@@ -96,14 +96,14 @@ template<class T, class D>
|
||||
class MovementGeneratorMedium : public MovementGenerator
|
||||
{
|
||||
public:
|
||||
void Initialize(Unit* owner) override
|
||||
bool Initialize(Unit* owner) override
|
||||
{
|
||||
(static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
|
||||
return (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
|
||||
}
|
||||
|
||||
void Reset(Unit* owner) override
|
||||
bool Reset(Unit* owner) override
|
||||
{
|
||||
(static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
|
||||
return (static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
|
||||
}
|
||||
|
||||
bool Update(Unit* owner, uint32 diff) override
|
||||
|
||||
@@ -73,20 +73,21 @@ ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange
|
||||
}
|
||||
ChaseMovementGenerator::~ChaseMovementGenerator() = default;
|
||||
|
||||
void ChaseMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
bool ChaseMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
|
||||
_path = nullptr;
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
void ChaseMovementGenerator::Reset(Unit* owner)
|
||||
bool ChaseMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
@@ -34,8 +34,8 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
|
||||
explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {});
|
||||
~ChaseMovementGenerator();
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
|
||||
@@ -40,29 +40,29 @@ MovementGeneratorType ConfusedMovementGenerator<T>::GetMovementGeneratorType() c
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void ConfusedMovementGenerator<T>::DoInitialize(T* owner)
|
||||
bool ConfusedMovementGenerator<T>::DoInitialize(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
this->AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
if (!owner->IsAlive())
|
||||
return;
|
||||
return false;
|
||||
|
||||
// TODO: UNIT_FIELD_FLAGS should not be handled by generators
|
||||
owner->SetUnitFlag(UNIT_FLAG_CONFUSED);
|
||||
owner->StopMoving();
|
||||
|
||||
_timer.Reset(0);
|
||||
owner->GetPosition(_reference.m_positionX, _reference.m_positionY, _reference.m_positionZ);
|
||||
_path = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void ConfusedMovementGenerator<T>::DoReset(T* owner)
|
||||
bool ConfusedMovementGenerator<T>::DoReset(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
DoInitialize(owner);
|
||||
return DoInitialize(owner);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
|
||||
@@ -32,8 +32,8 @@ class ConfusedMovementGenerator : public MovementGeneratorMedium<T, ConfusedMove
|
||||
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
|
||||
void DoInitialize(T*);
|
||||
void DoReset(T*);
|
||||
bool DoInitialize(T*);
|
||||
bool DoReset(T*);
|
||||
bool DoUpdate(T*, uint32);
|
||||
void DoDeactivate(T*);
|
||||
void DoFinalize(T*, bool, bool);
|
||||
|
||||
@@ -43,23 +43,24 @@ MovementGeneratorType FleeingMovementGenerator::GetMovementGeneratorType() const
|
||||
return FLEEING_MOTION_TYPE;
|
||||
}
|
||||
|
||||
void FleeingMovementGenerator::Initialize(Unit* owner)
|
||||
bool FleeingMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
if (!owner || !owner->IsAlive())
|
||||
return;
|
||||
return false;
|
||||
|
||||
_path = nullptr;
|
||||
SetTargetLocation(owner);
|
||||
return true;
|
||||
}
|
||||
|
||||
void FleeingMovementGenerator::Reset(Unit* owner)
|
||||
bool FleeingMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool FleeingMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
@@ -38,8 +38,8 @@ class FleeingMovementGenerator : public MovementGenerator
|
||||
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
|
||||
void Initialize(Unit* owner) override;
|
||||
void Reset(Unit* owner) override;
|
||||
bool Initialize(Unit* owner) override;
|
||||
bool Reset(Unit* owner) override;
|
||||
bool Update(Unit* owner, uint32 diff) override;
|
||||
void Deactivate(Unit* owner) override;
|
||||
void Finalize(Unit* owner, bool, bool) override;
|
||||
|
||||
@@ -62,16 +62,17 @@ bool FlightPathMovementGenerator::GetResetPosition(Unit* /*owner*/, float& x, fl
|
||||
return true;
|
||||
}
|
||||
|
||||
void FlightPathMovementGenerator::DoInitialize(Player* owner)
|
||||
bool FlightPathMovementGenerator::DoInitialize(Player* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
DoReset(owner);
|
||||
bool returnValue = DoReset(owner);
|
||||
InitEndGridInfo();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
void FlightPathMovementGenerator::DoReset(Player* owner)
|
||||
bool FlightPathMovementGenerator::DoReset(Player* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
@@ -84,7 +85,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner)
|
||||
if (currentNodeId == end)
|
||||
{
|
||||
TC_LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", owner->GetDebugInfo());
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
Movement::MoveSplineInit init(owner);
|
||||
@@ -101,6 +102,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner)
|
||||
init.SetWalk(true);
|
||||
init.SetVelocity(_speed.value_or(PLAYER_FLIGHT_SPEED));
|
||||
init.Launch();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FlightPathMovementGenerator::DoUpdate(Player* owner, uint32 /*diff*/)
|
||||
|
||||
@@ -39,8 +39,8 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, Fligh
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
bool GetResetPosition(Unit* owner, float& x, float& y, float& z) override;
|
||||
|
||||
void DoInitialize(Player*);
|
||||
void DoReset(Player*);
|
||||
bool DoInitialize(Player*);
|
||||
bool DoReset(Player*);
|
||||
bool DoUpdate(Player*, uint32);
|
||||
void DoDeactivate(Player*);
|
||||
void DoFinalize(Player*, bool, bool);
|
||||
|
||||
@@ -56,22 +56,22 @@ static bool PositionOkay(Unit* owner, Unit* target, float range, Optional<ChaseA
|
||||
return !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner));
|
||||
}
|
||||
|
||||
void FollowMovementGenerator::Initialize(Unit* owner)
|
||||
bool FollowMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
|
||||
owner->StopMoving();
|
||||
UpdatePetSpeed(owner);
|
||||
_path = nullptr;
|
||||
_lastTargetPosition.reset();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FollowMovementGenerator::Reset(Unit* owner)
|
||||
bool FollowMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
@@ -36,8 +36,8 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
|
||||
bool ignoreTargetWalk = false, Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult = {});
|
||||
~FollowMovementGenerator();
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
|
||||
@@ -38,7 +38,7 @@ MovementGeneratorType FormationMovementGenerator::GetMovementGeneratorType() con
|
||||
return FORMATION_MOTION_TYPE;
|
||||
}
|
||||
|
||||
void FormationMovementGenerator::DoInitialize(Creature* owner)
|
||||
bool FormationMovementGenerator::DoInitialize(Creature* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
@@ -47,17 +47,18 @@ void FormationMovementGenerator::DoInitialize(Creature* owner)
|
||||
{
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
|
||||
owner->StopMoving();
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
_nextMoveTimer.Reset(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
void FormationMovementGenerator::DoReset(Creature* owner)
|
||||
bool FormationMovementGenerator::DoReset(Creature* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
DoInitialize(owner);
|
||||
return DoInitialize(owner);
|
||||
}
|
||||
|
||||
bool FormationMovementGenerator::DoUpdate(Creature* owner, uint32 diff)
|
||||
|
||||
@@ -32,8 +32,8 @@ class FormationMovementGenerator : public MovementGeneratorMedium<Creature, Form
|
||||
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
|
||||
void DoInitialize(Creature*);
|
||||
void DoReset(Creature*);
|
||||
bool DoInitialize(Creature*);
|
||||
bool DoReset(Creature*);
|
||||
bool DoUpdate(Creature*, uint32);
|
||||
void DoDeactivate(Creature*);
|
||||
void DoFinalize(Creature*, bool, bool);
|
||||
|
||||
@@ -43,13 +43,13 @@ GenericMovementGenerator::GenericMovementGenerator(std::function<void(Movement::
|
||||
ScriptResult = std::move(args.ScriptResult);
|
||||
}
|
||||
|
||||
void GenericMovementGenerator::Initialize(Unit* owner)
|
||||
bool GenericMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED) && !HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING)) // Resume spline is not supported
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_FINALIZED);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
@@ -60,11 +60,12 @@ void GenericMovementGenerator::Initialize(Unit* owner)
|
||||
int32 duration = init.Launch();
|
||||
if (_durationTracksSpline)
|
||||
_duration.emplace(duration);
|
||||
return duration > 0;
|
||||
}
|
||||
|
||||
void GenericMovementGenerator::Reset(Unit* owner)
|
||||
bool GenericMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool GenericMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
@@ -41,8 +41,8 @@ class GenericMovementGenerator : public MovementGenerator
|
||||
explicit GenericMovementGenerator(std::function<void(Movement::MoveSplineInit& init)>&& initializer, MovementGeneratorType type, uint32 id,
|
||||
GenericMovementGeneratorArgs&& args = {});
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
|
||||
@@ -81,10 +81,10 @@ void HomeMovementGenerator<Creature>::SetTargetLocation(Creature* owner)
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void HomeMovementGenerator<T>::DoInitialize(T*) { }
|
||||
bool HomeMovementGenerator<T>::DoInitialize(T*) { return false; }
|
||||
|
||||
template<>
|
||||
void HomeMovementGenerator<Creature>::DoInitialize(Creature* owner)
|
||||
bool HomeMovementGenerator<Creature>::DoInitialize(Creature* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
@@ -92,17 +92,18 @@ void HomeMovementGenerator<Creature>::DoInitialize(Creature* owner)
|
||||
owner->SetNoSearchAssistance(false);
|
||||
|
||||
SetTargetLocation(owner);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void HomeMovementGenerator<T>::DoReset(T*) { }
|
||||
bool HomeMovementGenerator<T>::DoReset(T*) { return false; }
|
||||
|
||||
template<>
|
||||
void HomeMovementGenerator<Creature>::DoReset(Creature* owner)
|
||||
bool HomeMovementGenerator<Creature>::DoReset(Creature* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
DoInitialize(owner);
|
||||
return DoInitialize(owner);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
|
||||
@@ -28,8 +28,8 @@ class HomeMovementGenerator : public MovementGeneratorMedium< T, HomeMovementGen
|
||||
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
|
||||
void DoInitialize(T*);
|
||||
void DoReset(T*);
|
||||
bool DoInitialize(T*);
|
||||
bool DoReset(T*);
|
||||
bool DoUpdate(T*, uint32);
|
||||
void DoDeactivate(T*);
|
||||
void DoFinalize(T*, bool, bool);
|
||||
|
||||
@@ -36,14 +36,16 @@ IdleMovementGenerator::IdleMovementGenerator()
|
||||
* TODO: "if (!owner->IsStopped())" is useless, each generator cleans their own STATE_MOVE, the result is that StopMoving is almost never called
|
||||
* Old comment: "StopMoving is needed to make unit stop if its last movement generator expires but it should not be sent otherwise there are many redundent packets"
|
||||
*/
|
||||
void IdleMovementGenerator::Initialize(Unit* owner)
|
||||
bool IdleMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
owner->StopMoving();
|
||||
return true;
|
||||
}
|
||||
|
||||
void IdleMovementGenerator::Reset(Unit* owner)
|
||||
bool IdleMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
owner->StopMoving();
|
||||
return true;
|
||||
}
|
||||
|
||||
void IdleMovementGenerator::Deactivate(Unit* /*owner*/)
|
||||
@@ -81,13 +83,12 @@ RotateMovementGenerator::RotateMovementGenerator(uint32 id, RotateDirection dire
|
||||
ScriptResult = std::move(scriptResult);
|
||||
}
|
||||
|
||||
void RotateMovementGenerator::Initialize(Unit* owner)
|
||||
bool RotateMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
owner->StopMoving();
|
||||
|
||||
return true;
|
||||
/*
|
||||
* TODO: This code should be handled somewhere else, like MovementInform
|
||||
*
|
||||
@@ -97,11 +98,11 @@ void RotateMovementGenerator::Initialize(Unit* owner)
|
||||
* owner->AttackStop();
|
||||
*/
|
||||
}
|
||||
void RotateMovementGenerator::Reset(Unit* owner)
|
||||
bool RotateMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool RotateMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
@@ -174,7 +175,7 @@ DistractMovementGenerator::DistractMovementGenerator(uint32 timer, float orienta
|
||||
BaseUnitState = UNIT_STATE_DISTRACTED;
|
||||
}
|
||||
|
||||
void DistractMovementGenerator::Initialize(Unit* owner)
|
||||
bool DistractMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
@@ -191,13 +192,14 @@ void DistractMovementGenerator::Initialize(Unit* owner)
|
||||
init.DisableTransportPathTransformations();
|
||||
init.SetFacing(_orientation);
|
||||
init.Launch();
|
||||
return true;
|
||||
}
|
||||
|
||||
void DistractMovementGenerator::Reset(Unit* owner)
|
||||
bool DistractMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool DistractMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
@@ -29,8 +29,8 @@ class IdleMovementGenerator : public MovementGenerator
|
||||
public:
|
||||
explicit IdleMovementGenerator();
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override { return true; }
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
@@ -46,8 +46,8 @@ class RotateMovementGenerator : public MovementGenerator
|
||||
Optional<float> turnSpeed, Optional<float> totalTurnAngle,
|
||||
Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult);
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
@@ -67,8 +67,8 @@ class DistractMovementGenerator : public MovementGenerator
|
||||
public:
|
||||
explicit DistractMovementGenerator(uint32 timer, float orientation);
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
|
||||
@@ -53,7 +53,7 @@ MovementGeneratorType PointMovementGenerator::GetMovementGeneratorType() const
|
||||
return POINT_MOTION_TYPE;
|
||||
}
|
||||
|
||||
void PointMovementGenerator::Initialize(Unit* owner)
|
||||
bool PointMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
@@ -61,14 +61,14 @@ void PointMovementGenerator::Initialize(Unit* owner)
|
||||
if (_movementId == EVENT_CHARGE_PREPATH)
|
||||
{
|
||||
owner->AddUnitState(UNIT_STATE_ROAMING_MOVE);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
|
||||
{
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
|
||||
owner->StopMoving();
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
owner->AddUnitState(UNIT_STATE_ROAMING_MOVE);
|
||||
@@ -126,13 +126,14 @@ void PointMovementGenerator::Initialize(Unit* owner)
|
||||
// Call for creature group update
|
||||
if (Creature* creature = owner->ToCreature())
|
||||
creature->SignalFormationMovement();
|
||||
return true;
|
||||
}
|
||||
|
||||
void PointMovementGenerator::Reset(Unit* owner)
|
||||
bool PointMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool PointMovementGenerator::Update(Unit* owner, uint32 /*diff*/)
|
||||
|
||||
@@ -43,8 +43,8 @@ class PointMovementGenerator : public MovementGenerator
|
||||
|
||||
MovementGeneratorType GetMovementGeneratorType() const override;
|
||||
|
||||
void Initialize(Unit* owner) override;
|
||||
void Reset(Unit* owner) override;
|
||||
bool Initialize(Unit* owner) override;
|
||||
bool Reset(Unit* owner) override;
|
||||
bool Update(Unit* owner, uint32 diff) override;
|
||||
void Deactivate(Unit* owner) override;
|
||||
void Finalize(Unit* owner, bool active, bool movementInform) override;
|
||||
|
||||
@@ -72,30 +72,30 @@ void RandomMovementGenerator<T>::Resume(uint32 overrideTimer)
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void RandomMovementGenerator<T>::DoInitialize(T* owner)
|
||||
bool RandomMovementGenerator<T>::DoInitialize(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED | MOVEMENTGENERATOR_FLAG_TIMED_PAUSED);
|
||||
this->AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
if (!owner->IsAlive())
|
||||
return;
|
||||
return false;
|
||||
|
||||
_reference = owner->GetPosition();
|
||||
owner->StopMoving();
|
||||
|
||||
// Retail seems to let a creature walk 2 up to 10 splines before triggering a pause
|
||||
_wanderSteps = urand(2, 10);
|
||||
|
||||
_timer.Reset(0);
|
||||
_path = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void RandomMovementGenerator<T>::DoReset(T* owner)
|
||||
bool RandomMovementGenerator<T>::DoReset(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
DoInitialize(owner);
|
||||
return DoInitialize(owner);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
|
||||
@@ -38,8 +38,8 @@ class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovement
|
||||
void Pause(uint32 timer) override;
|
||||
void Resume(uint32 overrideTimer) override;
|
||||
|
||||
void DoInitialize(T*);
|
||||
void DoReset(T*);
|
||||
bool DoInitialize(T*);
|
||||
bool DoReset(T*);
|
||||
bool DoUpdate(T*, uint32);
|
||||
void DoDeactivate(T*);
|
||||
void DoFinalize(T*, bool, bool);
|
||||
|
||||
@@ -51,6 +51,8 @@ uint32 SplineChainMovementGenerator::SendPathSpline(Unit* owner, float velocity,
|
||||
uint32 nodeCount = path.size();
|
||||
ASSERT(nodeCount > 1, "SplineChainMovementGenerator::SendPathSpline: Every path must have source & destination (size > 1)! (%s)", owner->GetGUID().ToString().c_str());
|
||||
|
||||
owner->AddUnitState(UNIT_STATE_ROAMING_MOVE);
|
||||
|
||||
Movement::MoveSplineInit init(owner);
|
||||
if (nodeCount > 2)
|
||||
init.MovebyPath(path);
|
||||
@@ -81,7 +83,7 @@ void SplineChainMovementGenerator::SendSplineFor(Unit* owner, uint32 index, uint
|
||||
}
|
||||
}
|
||||
|
||||
void SplineChainMovementGenerator::Initialize(Unit* owner)
|
||||
bool SplineChainMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
@@ -89,20 +91,20 @@ void SplineChainMovementGenerator::Initialize(Unit* owner)
|
||||
if (!_chainSize)
|
||||
{
|
||||
TC_LOG_ERROR("movement", "SplineChainMovementGenerator::Initialize: couldn't initialize generator, referenced spline is empty! ({})", owner->GetGUID().ToString());
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_nextIndex >= _chainSize)
|
||||
{
|
||||
TC_LOG_WARN("movement", "SplineChainMovementGenerator::Initialize: couldn't initialize generator, _nextIndex is >= _chainSize ({})", owner->GetGUID().ToString());
|
||||
_msToNext = 0;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_nextFirstWP) // this is a resumed movegen that has to start with a partial spline
|
||||
{
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED))
|
||||
return;
|
||||
return false;
|
||||
|
||||
SplineChainLink const& thisLink = _chain[_nextIndex];
|
||||
if (_nextFirstWP >= thisLink.Points.size())
|
||||
@@ -111,7 +113,6 @@ void SplineChainMovementGenerator::Initialize(Unit* owner)
|
||||
_nextFirstWP = thisLink.Points.size() - 1;
|
||||
}
|
||||
|
||||
owner->AddUnitState(UNIT_STATE_ROAMING_MOVE);
|
||||
Movement::PointsArray partial(thisLink.Points.begin() + (_nextFirstWP-1), thisLink.Points.end());
|
||||
SendPathSpline(owner, thisLink.Velocity, partial);
|
||||
|
||||
@@ -133,14 +134,15 @@ void SplineChainMovementGenerator::Initialize(Unit* owner)
|
||||
if (_nextIndex >= _chainSize)
|
||||
_msToNext = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SplineChainMovementGenerator::Reset(Unit* owner)
|
||||
bool SplineChainMovementGenerator::Reset(Unit* owner)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
owner->StopMoving();
|
||||
Initialize(owner);
|
||||
return Initialize(owner);
|
||||
}
|
||||
|
||||
bool SplineChainMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
@@ -174,7 +176,11 @@ bool SplineChainMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_msToNext -= diff;
|
||||
if (owner->movespline->Finalized())
|
||||
owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -31,8 +31,8 @@ class TC_GAME_API SplineChainMovementGenerator : public MovementGenerator
|
||||
explicit SplineChainMovementGenerator(uint32 id, std::vector<SplineChainLink> const& chain, bool walk = false);
|
||||
explicit SplineChainMovementGenerator(SplineChainResumeInfo const& info);
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
bool Initialize(Unit*) override;
|
||||
bool Reset(Unit*) override;
|
||||
bool Update(Unit*, uint32) override;
|
||||
void Deactivate(Unit*) override;
|
||||
void Finalize(Unit*, bool, bool) override;
|
||||
|
||||
@@ -137,7 +137,7 @@ bool WaypointMovementGenerator<T>::GetResetPosition(Unit* /*owner*/, float& x, f
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void WaypointMovementGenerator<T>::DoInitialize(T* owner)
|
||||
bool WaypointMovementGenerator<T>::DoInitialize(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
@@ -145,7 +145,7 @@ void WaypointMovementGenerator<T>::DoInitialize(T* owner)
|
||||
if (!path)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::DoInitialize: couldn't load path for {}", owner->GetGUID());
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (path->Nodes.size() == 1)
|
||||
@@ -154,10 +154,11 @@ void WaypointMovementGenerator<T>::DoInitialize(T* owner)
|
||||
owner->StopMoving();
|
||||
|
||||
_nextMoveTime.Reset(1000);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void WaypointMovementGenerator<T>::DoReset(T* owner)
|
||||
bool WaypointMovementGenerator<T>::DoReset(T* owner)
|
||||
{
|
||||
this->RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
|
||||
@@ -165,6 +166,7 @@ void WaypointMovementGenerator<T>::DoReset(T* owner)
|
||||
|
||||
if (!this->HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED) && _nextMoveTime.Passed())
|
||||
_nextMoveTime.Reset(1); // Needed so that Update does not behave as if node was reached
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
||||
@@ -52,8 +52,8 @@ class WaypointMovementGenerator : public MovementGeneratorMedium<T, WaypointMove
|
||||
void Resume(uint32 overrideTimer) override;
|
||||
bool GetResetPosition(Unit*, float& x, float& y, float& z) override;
|
||||
|
||||
void DoInitialize(T* owner);
|
||||
void DoReset(T* owner);
|
||||
bool DoInitialize(T* owner);
|
||||
bool DoReset(T* owner);
|
||||
bool DoUpdate(T* owner, uint32 diff);
|
||||
void DoDeactivate(T* owner);
|
||||
void DoFinalize(T* owner, bool active, bool movementInform);
|
||||
|
||||
Reference in New Issue
Block a user