AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
FormationMovementGenerator Class Reference

#include "FormationMovementGenerator.h"

Inheritance diagram for FormationMovementGenerator:
MovementGeneratorMedium< Creature, FormationMovementGenerator > AbstractFollower MovementGenerator

Public Member Functions

 FormationMovementGenerator (Unit *leader, float range, float angle, uint32 point1, uint32 point2)
 
MovementGeneratorType GetMovementGeneratorType ()
 
void DoInitialize (Creature *)
 
void DoFinalize (Creature *)
 
void DoReset (Creature *)
 
bool DoUpdate (Creature *, uint32)
 
- Public Member Functions inherited from MovementGeneratorMedium< Creature, FormationMovementGenerator >
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 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 AbstractFollower
 AbstractFollower (Unit *target=nullptr)
 
virtual ~AbstractFollower ()
 
void SetTarget (Unit *unit)
 
UnitGetTarget () const
 

Private Member Functions

void MovementInform (Creature *owner)
 
void LaunchMovement (Creature *owner, Unit *target)
 

Private Attributes

float const _range
 
float _angle
 
uint32 const _point1
 
uint32 const _point2
 
uint32 _lastLeaderSplineID
 
bool _hasPredictedDestination
 
bool _isMoving
 
Position _lastLeaderPosition
 
TimeTracker _nextMoveTimer
 

Static Private Attributes

static constexpr uint32 FORMATION_MOVEMENT_INTERVAL = 1200
 

Detailed Description

Constructor & Destructor Documentation

◆ FormationMovementGenerator()

FormationMovementGenerator::FormationMovementGenerator ( Unit leader,
float  range,
float  angle,
uint32  point1,
uint32  point2 
)
explicit
26 : AbstractFollower(leader), _range(range), _angle(angle), _point1(point1), _point2(point2), _lastLeaderSplineID(0),
28{
29}
Definition AbstractFollower.h:24
bool _hasPredictedDestination
Definition FormationMovementGenerator.h:51
uint32 const _point2
Definition FormationMovementGenerator.h:49
TimeTracker _nextMoveTimer
Definition FormationMovementGenerator.h:55
float const _range
Definition FormationMovementGenerator.h:46
uint32 const _point1
Definition FormationMovementGenerator.h:48
float _angle
Definition FormationMovementGenerator.h:47
bool _isMoving
Definition FormationMovementGenerator.h:52
uint32 _lastLeaderSplineID
Definition FormationMovementGenerator.h:50

Member Function Documentation

◆ DoFinalize()

void FormationMovementGenerator::DoFinalize ( Creature owner)
43{
45}
@ UNIT_STATE_FOLLOW_MOVE
Definition UnitDefines.h:199
void ClearUnitState(uint32 f)
Definition Unit.h:737

References Unit::ClearUnitState(), and UNIT_STATE_FOLLOW_MOVE.

◆ DoInitialize()

void FormationMovementGenerator::DoInitialize ( Creature owner)
32{
34 {
35 owner->StopMoving();
36 return;
37 }
38
40}
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:225
bool IsMovementPreventedByCasting() const override
Definition Creature.cpp:3558
void StopMoving()
Definition Unit.cpp:12997
bool HasUnitState(const uint32 f) const
Definition Unit.h:736
void Reset(time_t interval)
Definition Timer.h:217

References _nextMoveTimer, Unit::HasUnitState(), Creature::IsMovementPreventedByCasting(), TimeTracker::Reset(), Unit::StopMoving(), and UNIT_STATE_NOT_MOVE.

Referenced by DoReset().

◆ DoReset()

void FormationMovementGenerator::DoReset ( Creature owner)
48{
49 DoInitialize(owner);
50}
void DoInitialize(Creature *)
Definition FormationMovementGenerator.cpp:31

References DoInitialize().

◆ DoUpdate()

bool FormationMovementGenerator::DoUpdate ( Creature owner,
uint32  diff 
)
53{
54 Unit* target = GetTarget();
55 if (!owner || !target)
56 return false;
57
59 {
60 owner->StopMoving();
63 _isMoving = false;
64 return true;
65 }
66
68 {
69 owner->StopMoving();
72 _isMoving = false;
73 return true;
74 }
75
76 if (!owner->movespline->Finalized())
77 owner->SetHomePosition(owner->GetPosition());
78
79 if (!target->movespline->Finalized() && target->movespline->GetId() != _lastLeaderSplineID)
80 {
81 if (_point1 && target->IsCreature())
82 {
83 if (CreatureGroup* formation = target->ToCreature()->GetFormation())
84 {
85 if (Creature* leader = formation->GetLeader())
86 {
87 uint32 currentWaypoint = leader->GetCurrentWaypointID() + 1;
88 if (currentWaypoint == _point1 || currentWaypoint == _point2)
89 _angle = Position::NormalizeOrientation(float(2 * M_PI) - _angle);
90 }
91 }
92 }
93
94 LaunchMovement(owner, target);
96 return true;
97 }
98
101 {
103
104 if (_lastLeaderPosition != target->GetPosition())
105 {
106 LaunchMovement(owner, target);
107 return true;
108 }
109 }
110
111 if (_isMoving && owner->movespline->Finalized())
112 {
113 _isMoving = false;
114 owner->SetFacingTo(target->GetOrientation());
115 MovementInform(owner);
116 }
117
118 return true;
119}
std::uint32_t uint32
Definition Define.h:107
Unit * GetTarget() const
Definition AbstractFollower.h:30
Definition CreatureGroups.h:90
Definition Creature.h:47
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:345
CreatureGroup const * GetFormation() const
Definition Creature.h:370
void MovementInform(Creature *owner)
Definition FormationMovementGenerator.cpp:169
static constexpr uint32 FORMATION_MOVEMENT_INTERVAL
Definition FormationMovementGenerator.h:44
Position _lastLeaderPosition
Definition FormationMovementGenerator.h:54
void LaunchMovement(Creature *owner, Unit *target)
Definition FormationMovementGenerator.cpp:121
uint32 GetId() const
Definition MoveSpline.h:117
bool Finalized() const
Definition MoveSpline.h:118
bool IsCreature() const
Definition Object.h:205
Creature * ToCreature()
Definition Object.h:206
Definition Unit.h:664
void SetFacingTo(float ori)
Definition Unit.cpp:16411
Movement::MoveSpline * movespline
Definition Unit.h:2114
static float NormalizeOrientation(float o)
Definition Position.h:238
float GetOrientation() const
Definition Position.h:124
void GetPosition(float &x, float &y) const
Definition Position.h:126
void Update(time_t diff)
Definition Timer.h:207
bool Passed() const
Definition Timer.h:212

References _angle, _hasPredictedDestination, _isMoving, _lastLeaderPosition, _lastLeaderSplineID, _nextMoveTimer, _point1, _point2, Movement::MoveSpline::Finalized(), FORMATION_MOVEMENT_INTERVAL, Creature::GetFormation(), Movement::MoveSpline::GetId(), Position::GetOrientation(), Position::GetPosition(), AbstractFollower::GetTarget(), Unit::HasUnitState(), Object::IsCreature(), Creature::IsMovementPreventedByCasting(), LaunchMovement(), MovementInform(), Unit::movespline, Position::NormalizeOrientation(), TimeTracker::Passed(), TimeTracker::Reset(), Unit::SetFacingTo(), Creature::SetHomePosition(), Unit::StopMoving(), Object::ToCreature(), UNIT_STATE_NOT_MOVE, and TimeTracker::Update().

◆ GetMovementGeneratorType()

MovementGeneratorType FormationMovementGenerator::GetMovementGeneratorType ( )
inlinevirtual

Implements MovementGenerator.

33{ return FORMATION_MOTION_TYPE; }
@ FORMATION_MOTION_TYPE
Definition MotionMaster.h:58

References FORMATION_MOTION_TYPE.

◆ LaunchMovement()

void FormationMovementGenerator::LaunchMovement ( Creature owner,
Unit target 
)
private
122{
123 float relativeAngle = 0.0f;
124
125 if (!target->movespline->Finalized())
126 {
127 G3D::Vector3 const leaderDestination = target->movespline->CurrentDestination();
128 relativeAngle = target->GetRelativeAngle(leaderDestination.x, leaderDestination.y);
129 }
130
131 Position dest = target->GetPosition();
132 float velocity = 0.0f;
133
134 if (!target->movespline->Finalized())
135 {
136 // Pick up leader's spline velocity
137 velocity = target->movespline->Velocity();
138
139 // Calculate travel distance to get a 1650ms result
140 float travelDist = velocity * 1.65f;
141 target->MovePositionToFirstCollision(dest, travelDist, relativeAngle);
142 target->MovePositionToFirstCollision(dest, _range, _angle + relativeAngle);
143
144 float distance = owner->GetExactDist(dest);
145 float velocityMod = std::min<float>(distance / travelDist, 1.5f);
146
147 velocity *= velocityMod;
149 }
150 else
151 {
152 target->MovePositionToFirstCollision(dest, _range, _angle + relativeAngle);
154 }
155
156 if (velocity == 0.0f)
157 velocity = target->GetSpeed(MOVE_WALK);
158
159 Movement::MoveSplineInit init(owner);
160 init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
161 init.SetVelocity(velocity);
162 init.Launch();
163
165 _isMoving = true;
167}
@ MOVE_WALK
Definition UnitDefines.h:356
Definition MoveSplineInit.h:63
float Velocity() const
Definition MoveSpline.h:89
Vector3 CurrentDestination() const
Definition MoveSpline.h:123
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:11265
void AddUnitState(uint32 f)
Definition Unit.h:735
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition Object.cpp:2925
Definition Position.h:27
float GetRelativeAngle(const Position *pos) const
Definition Position.h:201
float GetExactDist(float x, float y, float z) const
Definition Position.h:182
float GetPositionZ() const
Definition Position.h:123
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122
void Relocate(float x, float y)
Definition Position.h:77

References _angle, _hasPredictedDestination, _isMoving, _lastLeaderPosition, _range, Unit::AddUnitState(), Movement::MoveSpline::CurrentDestination(), Movement::MoveSpline::Finalized(), Position::GetExactDist(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Position::GetRelativeAngle(), Unit::GetSpeed(), Movement::MoveSplineInit::Launch(), MOVE_WALK, WorldObject::MovePositionToFirstCollision(), Unit::movespline, Movement::MoveSplineInit::MoveTo(), Position::Relocate(), Movement::MoveSplineInit::SetVelocity(), UNIT_STATE_FOLLOW_MOVE, and Movement::MoveSpline::Velocity().

Referenced by DoUpdate().

◆ MovementInform()

void FormationMovementGenerator::MovementInform ( Creature owner)
private
170{
171 if (owner->AI())
173}
virtual void MovementInform(uint32, uint32)
Definition CreatureAI.h:184
CreatureAI * AI() const
Definition Creature.h:143

References Creature::AI(), FORMATION_MOTION_TYPE, and CreatureAI::MovementInform().

Referenced by DoUpdate().

Member Data Documentation

◆ _angle

float FormationMovementGenerator::_angle
private

Referenced by DoUpdate(), and LaunchMovement().

◆ _hasPredictedDestination

bool FormationMovementGenerator::_hasPredictedDestination
private

Referenced by DoUpdate(), and LaunchMovement().

◆ _isMoving

bool FormationMovementGenerator::_isMoving
private

Referenced by DoUpdate(), and LaunchMovement().

◆ _lastLeaderPosition

Position FormationMovementGenerator::_lastLeaderPosition
private

Referenced by DoUpdate(), and LaunchMovement().

◆ _lastLeaderSplineID

uint32 FormationMovementGenerator::_lastLeaderSplineID
private

Referenced by DoUpdate().

◆ _nextMoveTimer

TimeTracker FormationMovementGenerator::_nextMoveTimer
private

Referenced by DoInitialize(), and DoUpdate().

◆ _point1

uint32 const FormationMovementGenerator::_point1
private

Referenced by DoUpdate().

◆ _point2

uint32 const FormationMovementGenerator::_point2
private

Referenced by DoUpdate().

◆ _range

float const FormationMovementGenerator::_range
private

Referenced by LaunchMovement().

◆ FORMATION_MOVEMENT_INTERVAL

constexpr uint32 FormationMovementGenerator::FORMATION_MOVEMENT_INTERVAL = 1200
staticconstexprprivate

Referenced by DoUpdate().


The documentation for this class was generated from the following files: