AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
FollowMovementGenerator< T > Class Template Reference

#include "TargetedMovementGenerator.h"

Inheritance diagram for FollowMovementGenerator< T >:
MovementGeneratorMedium< T, FollowMovementGenerator< T > > TargetedMovementGeneratorBase MovementGenerator

Public Member Functions

 FollowMovementGenerator (Unit *target, float range, ChaseAngle angle)
 
 ~FollowMovementGenerator ()
 
MovementGeneratorType GetMovementGeneratorType ()
 
bool DoUpdate (T *, uint32)
 
void DoInitialize (T *)
 
void DoFinalize (T *)
 
void DoReset (T *)
 
void MovementInform (T *)
 
UnitGetTarget () const
 
void unitSpeedChanged ()
 
bool PositionOkay (Unit *target, bool isPlayerPet, bool &targetIsMoving, uint32 diff)
 
float GetFollowRange () const
 
- Public Member Functions inherited from MovementGeneratorMedium< T, FollowMovementGenerator< T > >
void Initialize (Unit *u) override
 
void Finalize (Unit *u) override
 
void Reset (Unit *u) override
 
bool Update (Unit *u, uint32 time_diff) override
 
- Public Member Functions inherited from MovementGenerator
virtual ~MovementGenerator ()
 
virtual void Initialize (Unit *)=0
 
virtual void Finalize (Unit *)=0
 
virtual void Reset (Unit *)=0
 
virtual bool Update (Unit *, uint32 time_diff)=0
 
virtual MovementGeneratorType GetMovementGeneratorType ()=0
 
virtual uint32 GetSplineId () const
 
virtual void unitSpeedChanged ()
 
virtual void Pause (uint32)
 
virtual void Resume (uint32)
 
virtual bool GetResetPosition (float &, float &, float &)
 
- Public Member Functions inherited from TargetedMovementGeneratorBase
 TargetedMovementGeneratorBase (Unit *target)
 
void stopFollowing ()
 

Static Public Member Functions

static void _clearUnitStateMove (T *u)
 
static void _addUnitStateMove (T *u)
 

Private Attributes

std::unique_ptr< PathGeneratori_path
 
TimeTrackerSmall i_recheckPredictedDistanceTimer
 
bool i_recheckPredictedDistance
 
Optional< Position_lastTargetPosition
 
Optional< Position_lastPredictedPosition
 
float _range
 
ChaseAngle _angle
 

Additional Inherited Members

- Protected Attributes inherited from TargetedMovementGeneratorBase
FollowerReference i_target
 

Detailed Description

template<class T>
class FollowMovementGenerator< T >

Constructor & Destructor Documentation

◆ FollowMovementGenerator()

template<class T >
FollowMovementGenerator< T >::FollowMovementGenerator ( Unit target,
float  range,
ChaseAngle  angle 
)
inline
Definition: TargetedMovementGenerator.h:29
float _range
Definition: TargetedMovementGenerator.h:107
std::unique_ptr< PathGenerator > i_path
Definition: TargetedMovementGenerator.h:101
bool i_recheckPredictedDistance
Definition: TargetedMovementGenerator.h:103
ChaseAngle _angle
Definition: TargetedMovementGenerator.h:108
TimeTrackerSmall i_recheckPredictedDistanceTimer
Definition: TargetedMovementGenerator.h:102

◆ ~FollowMovementGenerator()

template<class T >
FollowMovementGenerator< T >::~FollowMovementGenerator ( )
inline
79{ }

Member Function Documentation

◆ _addUnitStateMove()

template<class T >
static void FollowMovementGenerator< T >::_addUnitStateMove ( T *  u)
inlinestatic
96{ u->AddUnitState(UNIT_STATE_FOLLOW_MOVE); }
@ UNIT_STATE_FOLLOW_MOVE
Definition: Unit.h:351

References UNIT_STATE_FOLLOW_MOVE.

◆ _clearUnitStateMove()

template<class T >
static void FollowMovementGenerator< T >::_clearUnitStateMove ( T *  u)
inlinestatic
95{ u->ClearUnitState(UNIT_STATE_FOLLOW_MOVE); }

References UNIT_STATE_FOLLOW_MOVE.

◆ DoFinalize()

template<class T >
template void FollowMovementGenerator< T >::DoFinalize ( T *  )
527{
528 owner->ClearUnitState(UNIT_STATE_FOLLOW | UNIT_STATE_FOLLOW_MOVE);
529}
@ UNIT_STATE_FOLLOW
Definition: Unit.h:334

References UNIT_STATE_FOLLOW, and UNIT_STATE_FOLLOW_MOVE.

◆ DoInitialize()

template<class T >
template void FollowMovementGenerator< T >::DoInitialize ( T *  )
519{
520 i_path = nullptr;
521 _lastTargetPosition.reset();
522 owner->AddUnitState(UNIT_STATE_FOLLOW);
523}
Optional< Position > _lastTargetPosition
Definition: TargetedMovementGenerator.h:105

References UNIT_STATE_FOLLOW.

◆ DoReset()

template<class T >
template void FollowMovementGenerator< T >::DoReset ( T *  )
533{
534 DoInitialize(owner);
535}
void DoInitialize(T *)
Definition: TargetedMovementGenerator.cpp:518

◆ DoUpdate()

template<class T >
template bool FollowMovementGenerator< T >::DoUpdate ( T *  ,
uint32   
)
411{
412 if (!i_target.isValid() || !i_target->IsInWorld() || !owner->IsInMap(i_target.getTarget()))
413 return false;
414
415 if (!owner || !owner->IsAlive())
416 return false;
417
418 Creature* cOwner = owner->ToCreature();
419 Unit* target = i_target.getTarget();
420
421 // the owner might be unable to move (rooted or casting), or we have lost the target, pause movement
422 if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || (cOwner && owner->ToCreature()->IsMovementPreventedByCasting()))
423 {
424 i_path = nullptr;
425 owner->StopMoving();
426 _lastTargetPosition.reset();
427 return true;
428 }
429
430 bool followingMaster = false;
431 Pet* oPet = owner->ToPet();
432 if (oPet)
433 {
434 if (target->GetGUID() == oPet->GetOwnerGUID())
435 followingMaster = true;
436 }
437
438 bool forceDest =
439 (followingMaster) || // allow pets following their master to cheat while generating paths
440 (i_target->GetTypeId() == TYPEID_PLAYER && i_target->ToPlayer()->IsGameMaster()) // for .npc follow
441 ; // closes "bool forceDest", that way it is more appropriate, so we can comment out crap whenever we need to
442
443 bool targetIsMoving = false;
444 if (PositionOkay(target, owner->IsGuardian() && target->GetTypeId() == TYPEID_PLAYER, targetIsMoving, time_diff))
445 {
446 if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) && owner->movespline->Finalized())
447 {
449 i_path = nullptr;
450 MovementInform(owner);
451
453 {
455 }
456
457 owner->SetFacingTo(target->GetOrientation());
458 }
459 }
460 else
461 {
462 Position targetPosition = target->GetPosition();
463 _lastTargetPosition = targetPosition;
464
465 // If player is moving and their position is not updated, we need to predict position
466 if (targetIsMoving)
467 {
468 Position predictedPosition = PredictPosition(target);
469 if (_lastPredictedPosition && _lastPredictedPosition->GetExactDistSq(&predictedPosition) < 0.25f)
470 return true;
471
472 _lastPredictedPosition = predictedPosition;
473 targetPosition = predictedPosition;
475 }
476 else
477 {
480 }
481
482 if (!i_path)
483 i_path = std::make_unique<PathGenerator>(owner);
484 else
485 i_path->Clear();
486
487 target->MovePositionToFirstCollision(targetPosition, owner->GetCombatReach() + _range, target->ToAbsoluteAngle(_angle.RelativeAngle) - target->GetOrientation());
488
489 float x, y, z;
490 targetPosition.GetPosition(x, y, z);
491
492 if (owner->IsHovering())
493 owner->UpdateAllowedPositionZ(x, y, z);
494
495 bool success = i_path->CalculatePath(x, y, z, forceDest);
496 if (!success || (i_path->GetPathType() & PATHFIND_NOPATH && !followingMaster))
497 {
498 if (!owner->IsStopped())
499 owner->StopMoving();
500
501 return true;
502 }
503
504 owner->AddUnitState(UNIT_STATE_FOLLOW_MOVE);
505
506 Movement::MoveSplineInit init(owner);
507 init.MovebyPath(i_path->GetPath());
508 init.SetWalk(target->IsWalking() || target->movespline->isWalking());
509 if (Optional<float> velocity = GetVelocity(owner, target, i_path->GetActualEndPosition(), owner->IsGuardian()))
510 init.SetVelocity(*velocity);
511 init.Launch();
512 }
513
514 return true;
515}
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
@ UNIT_STATE_NOT_MOVE
Definition: Unit.h:371
@ PATHFIND_NOPATH
Definition: PathGenerator.h:51
static Optional< float > GetVelocity(Unit *owner, Unit *target, G3D::Vector3 const &dest, bool playerPet)
Definition: TargetedMovementGenerator.cpp:303
static Position const PredictPosition(Unit *target)
Definition: TargetedMovementGenerator.cpp:331
TO * getTarget() const
Definition: Reference.h:95
bool isValid() const
Definition: Reference.h:79
void Reset(int32 interval)
Definition: Timer.h:249
Definition: Creature.h:46
TypeID GetTypeId() const
Definition: Object.h:121
Creature * ToCreature()
Definition: Object.h:197
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition: Object.cpp:2846
Definition: Position.h:28
float ToAbsoluteAngle(float relAngle) const
Definition: Position.h:203
float GetOrientation() const
Definition: Position.h:120
void GetPosition(float &x, float &y) const
Definition: Position.h:122
Definition: Pet.h:40
Definition: Unit.h:1302
void ClearUnitState(uint32 f)
Definition: Unit.h:1411
Pet * ToPet()
Definition: Unit.h:2412
Movement::MoveSpline * movespline
Definition: Unit.h:2454
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:1828
bool IsWalking() const
Definition: Unit.h:2393
float RelativeAngle
Definition: MotionMaster.h:98
FollowerReference i_target
Definition: TargetedMovementGenerator.h:34
bool PositionOkay(Unit *target, bool isPlayerPet, bool &targetIsMoving, uint32 diff)
Definition: TargetedMovementGenerator.cpp:365
void MovementInform(T *)
Definition: TargetedMovementGenerator.cpp:538
Optional< Position > _lastPredictedPosition
Definition: TargetedMovementGenerator.h:106
bool isWalking() const
Definition: MoveSpline.h:119
Definition: MoveSplineInit.h:71

References Unit::ClearUnitState(), Object::GetGUID(), Position::GetOrientation(), Unit::GetOwnerGUID(), Position::GetPosition(), Object::GetTypeId(), GetVelocity(), Unit::IsGuardian(), Creature::IsMovementPreventedByCasting(), Unit::IsWalking(), Movement::MoveSpline::isWalking(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MovebyPath(), WorldObject::MovePositionToFirstCollision(), Unit::movespline, PATHFIND_NOPATH, PredictPosition(), Movement::MoveSplineInit::SetVelocity(), Movement::MoveSplineInit::SetWalk(), Unit::StopMoving(), Position::ToAbsoluteAngle(), Object::ToCreature(), Unit::ToPet(), TYPEID_PLAYER, UNIT_STATE_FOLLOW_MOVE, and UNIT_STATE_NOT_MOVE.

◆ GetFollowRange()

template<class T >
float FollowMovementGenerator< T >::GetFollowRange ( ) const
inline
98{ return _range; }

References FollowMovementGenerator< T >::_range.

◆ GetMovementGeneratorType()

template<class T >
MovementGeneratorType FollowMovementGenerator< T >::GetMovementGeneratorType ( )
inlinevirtual

Implements MovementGenerator.

81{ return FOLLOW_MOTION_TYPE; }
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:52

References FOLLOW_MOTION_TYPE.

◆ GetTarget()

template<class T >
Unit * FollowMovementGenerator< T >::GetTarget ( ) const
inline

◆ MovementInform()

template<class T >
void FollowMovementGenerator< T >::MovementInform ( T *  owner)
539{
540 if (owner->GetTypeId() != TYPEID_UNIT)
541 return;
542
543 // Pass back the GUIDLow of the target. If it is pet's owner then PetAI will handle
544 if (CreatureAI* AI = owner->ToCreature()->AI())
545 AI->MovementInform(FOLLOW_MOTION_TYPE, i_target.getTarget()->GetGUID().GetCounter());
546}
@ TYPEID_UNIT
Definition: ObjectGuid.h:37
Definition: CreatureAI.h:71
LowType GetCounter() const
Definition: ObjectGuid.h:147

References FOLLOW_MOTION_TYPE, and TYPEID_UNIT.

◆ PositionOkay()

template<class T >
bool FollowMovementGenerator< T >::PositionOkay ( Unit target,
bool  isPlayerPet,
bool &  targetIsMoving,
uint32  diff 
)
366{
368 return false;
369
370 float exactDistSq = target->GetExactDistSq(_lastTargetPosition->GetPositionX(), _lastTargetPosition->GetPositionY(), _lastTargetPosition->GetPositionZ());
371 float distanceTolerance = 0.25f;
372 // For creatures, increase tolerance
373 if (target->GetTypeId() == TYPEID_UNIT)
374 {
375 distanceTolerance += _range + _range;
376 }
377
378 if (isPlayerPet)
379 {
381 }
382
383 if (exactDistSq > distanceTolerance)
384 return false;
385
386 if (isPlayerPet)
387 {
388 if (!targetIsMoving)
389 {
391 {
394 {
396 return false;
397 }
398 }
399
400 return true;
401 }
402
403 return false;
404 }
405
406 return true;
407}
@ MOVEMENTFLAG_FORWARD
Definition: Unit.h:552
@ MOVEMENTFLAG_STRAFE_LEFT
Definition: Unit.h:554
@ MOVEMENTFLAG_BACKWARD
Definition: Unit.h:553
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition: Unit.h:555
int32 GetExpiry() const
Definition: Timer.h:254
void Update(int32 diff)
Definition: Timer.h:239
bool Passed() const
Definition: Timer.h:244
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:322
MovementInfo m_movementInfo
Definition: Object.h:595
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:170

References Position::GetExactDistSq(), Object::GetTypeId(), MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, MOVEMENTFLAG_BACKWARD, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, MOVEMENTFLAG_STRAFE_RIGHT, and TYPEID_UNIT.

◆ unitSpeedChanged()

template<class T >
void FollowMovementGenerator< T >::unitSpeedChanged ( )
inlinevirtual

Member Data Documentation

◆ _angle

template<class T >
ChaseAngle FollowMovementGenerator< T >::_angle
private

◆ _lastPredictedPosition

template<class T >
Optional<Position> FollowMovementGenerator< T >::_lastPredictedPosition
private

◆ _lastTargetPosition

template<class T >
Optional<Position> FollowMovementGenerator< T >::_lastTargetPosition
private

◆ _range

template<class T >
float FollowMovementGenerator< T >::_range
private

◆ i_path

template<class T >
std::unique_ptr<PathGenerator> FollowMovementGenerator< T >::i_path
private

◆ i_recheckPredictedDistance

template<class T >
bool FollowMovementGenerator< T >::i_recheckPredictedDistance
private

◆ i_recheckPredictedDistanceTimer

template<class T >
TimeTrackerSmall FollowMovementGenerator< T >::i_recheckPredictedDistanceTimer
private