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

#include "FleeingMovementGenerator.h"

Inheritance diagram for FleeingMovementGenerator< T >:
MovementGeneratorMedium< T, FleeingMovementGenerator< T > > MovementGenerator

Public Member Functions

 FleeingMovementGenerator (ObjectGuid fleeTargetGUID)
 
MovementGeneratorType GetMovementGeneratorType () override
 
void DoInitialize (T *)
 
void DoFinalize (T *)
 
void DoReset (T *)
 
bool DoUpdate (T *, uint32)
 
void DoFinalize (Player *owner)
 
- Public Member Functions inherited from MovementGeneratorMedium< T, FleeingMovementGenerator< 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 uint32 GetSplineId () const
 
virtual void unitSpeedChanged ()
 
virtual void Pause (uint32)
 
virtual void Resume (uint32)
 
virtual bool GetResetPosition (float &, float &, float &)
 

Private Member Functions

void SetTargetLocation (T *)
 
void GetPoint (T *, Position &position)
 

Private Attributes

std::unique_ptr< PathGenerator_path
 
ObjectGuid _fleeTargetGUID
 
TimeTracker _timer
 
bool _interrupt
 
uint8 _invalidPathsCount
 

Detailed Description

template<class T>
class FleeingMovementGenerator< T >

Constructor & Destructor Documentation

◆ FleeingMovementGenerator()

template<class T >
FleeingMovementGenerator< T >::FleeingMovementGenerator ( ObjectGuid  fleeTargetGUID)
inlineexplicit
29: _path(nullptr), _fleeTargetGUID(fleeTargetGUID), _timer(0), _interrupt(false), _invalidPathsCount(0) { }
bool _interrupt
Definition FleeingMovementGenerator.h:45
TimeTracker _timer
Definition FleeingMovementGenerator.h:44
std::unique_ptr< PathGenerator > _path
Definition FleeingMovementGenerator.h:42
uint8 _invalidPathsCount
Definition FleeingMovementGenerator.h:46
ObjectGuid _fleeTargetGUID
Definition FleeingMovementGenerator.h:43

Member Function Documentation

◆ DoFinalize() [1/2]

void FleeingMovementGenerator< Player >::DoFinalize ( Player owner)
52{
55 owner->StopMoving();
56}
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:273
void ClearUnitState(uint32 f)
Definition Unit.h:692
void StopMoving()
Definition Unit.cpp:16724
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:704

References Unit::ClearUnitState(), Unit::RemoveUnitFlag(), Unit::StopMoving(), UNIT_FLAG_FLEEING, and UNIT_STATE_FLEEING.

◆ DoFinalize() [2/2]

template<class T >
void FleeingMovementGenerator< T >::DoFinalize ( T *  )
47{
48}

◆ DoInitialize()

template<class T >
template void FleeingMovementGenerator< T >::DoInitialize ( T *  )
32{
33 if (!owner)
34 {
35 return;
36 }
37
38 owner->StopMoving();
39 _path = nullptr;
40 owner->SetUnitFlag(UNIT_FLAG_FLEEING);
41 owner->AddUnitState(UNIT_STATE_FLEEING);
42 SetTargetLocation(owner);
43}
void SetTargetLocation(T *)
Definition FleeingMovementGenerator.cpp:104

◆ DoReset()

template<class T >
template void FleeingMovementGenerator< T >::DoReset ( T *  )
72{
73 DoInitialize(owner);
74}
void DoInitialize(T *)
Definition FleeingMovementGenerator.cpp:31

◆ DoUpdate()

template<class T >
template bool FleeingMovementGenerator< T >::DoUpdate ( T *  ,
uint32   
)
78{
79 if (!owner || !owner->IsAlive())
80 {
81 return false;
82 }
83
84 if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
85 {
86 _path = nullptr;
87 _interrupt = true;
88 owner->StopMoving();
89 return true;
90 }
91 else
92 _interrupt = false;
93
94 _timer.Update(diff);
95 if (!_interrupt && _timer.Passed() && owner->movespline->Finalized())
96 {
97 SetTargetLocation(owner);
98 }
99
100 return true;
101}
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:218
void Update(time_t diff)
Definition Timer.h:207
bool Passed() const
Definition Timer.h:212

References UNIT_STATE_NOT_MOVE.

◆ GetMovementGeneratorType()

template<class T >
MovementGeneratorType FleeingMovementGenerator< T >::GetMovementGeneratorType ( )
inlineoverridevirtual

Implements MovementGenerator.

Reimplemented in TimedFleeingMovementGenerator.

31{ return FLEEING_MOTION_TYPE; }
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49

References FLEEING_MOTION_TYPE.

◆ GetPoint()

template<class T >
template void FleeingMovementGenerator< T >::GetPoint ( T *  ,
Position position 
)
private
175{
176 float casterDistance = 0.f;
177 float casterAngle = 0.f;
178 Unit* fleeTarget = nullptr;
179 if (_invalidPathsCount < 5)
180 fleeTarget = ObjectAccessor::GetUnit(*owner, _fleeTargetGUID);
181
182 if (fleeTarget)
183 {
184 casterDistance = fleeTarget->GetDistance(owner);
185 if (casterDistance > 0.2f)
186 {
187 casterAngle = fleeTarget->GetAngle(owner);
188 }
189 else
190 {
191 casterAngle = frand(0.0f, 2.0f * float(M_PI));
192 }
193 }
194 else
195 {
196 casterDistance = 0.0f;
197 casterAngle = frand(0.0f, 2.0f * float(M_PI));
198 }
199
200 float distance = 0.f;
201 float angle = 0.f;
202 if (casterDistance < MIN_QUIET_DISTANCE)
203 {
204 distance = frand(0.4f, 1.3f) * (MIN_QUIET_DISTANCE - casterDistance);
205 angle = casterAngle + frand(-float(M_PI) / 8.0f, float(M_PI) / 8.0f);
206 }
207 else if (casterDistance > MAX_QUIET_DISTANCE)
208 {
209 distance = frand(0.4f, 1.0f) * (MAX_QUIET_DISTANCE - MIN_QUIET_DISTANCE);
210 angle = -casterAngle + frand(-float(M_PI) / 4.0f, float(M_PI) / 4.0f);
211 }
212 else // we are inside quiet range
213 {
214 distance = frand(0.6f, 1.2f) * (MAX_QUIET_DISTANCE - MIN_QUIET_DISTANCE);
215 angle = frand(0.0f, 2.0f * float(M_PI));
216 }
217
218 // In MovePositionToFirstCollision we have added owner's orientation
219 // so now let's subtract it
220 angle -= owner->GetOrientation();
221
222 owner->MovePositionToFirstCollision(position, distance, angle);
223}
#define MAX_QUIET_DISTANCE
Definition FleeingMovementGenerator.cpp:27
#define MIN_QUIET_DISTANCE
Definition FleeingMovementGenerator.cpp:26
float frand(float min, float max)
Definition Random.cpp:57
Definition Unit.h:620
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1238
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:199
float GetAngle(const Position *pos) const
Definition Position.cpp:78

References frand(), Position::GetAngle(), WorldObject::GetDistance(), ObjectAccessor::GetUnit(), MAX_QUIET_DISTANCE, and MIN_QUIET_DISTANCE.

◆ SetTargetLocation()

template<class T >
template void FleeingMovementGenerator< T >::SetTargetLocation ( T *  )
private
105{
106 if (!owner)
107 {
108 return;
109 }
110
111 if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
112 {
113 _path = nullptr;
114 _interrupt = true;
115 owner->StopMoving();
116 return;
117 }
118
119 owner->AddUnitState(UNIT_STATE_FLEEING_MOVE);
120
121 Position destination = owner->GetPosition();
122 GetPoint(owner, destination);
123
124 // Add LOS check for target point
125 if (!owner->IsWithinLOS(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()))
126 {
127 _timer.Reset(200);
128 return;
129 }
130
131 if (!_path)
132 {
133 _path = std::make_unique<PathGenerator>(owner);
134 }
135 else
136 {
137 _path->Clear();
138 }
139
140 if (owner->IsPlayer())
141 _path->SetSlopeCheck(true);
142
143 _path->SetPathLengthLimit(30.0f);
144 bool result = _path->CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
146 {
147 if (_fleeTargetGUID)
149
150 _timer.Reset(100);
151 return;
152 }
153
154 // Same position - recheck
155 if (_path->getPathLength() < MIN_PATH_LENGTH)
156 {
157 if (_fleeTargetGUID)
159
160 _timer.Reset(100);
161 return;
162 }
163
165
166 Movement::MoveSplineInit init(owner);
167 init.MovebyPath(_path->GetPath());
168 init.SetWalk(false);
169 int32 traveltime = init.Launch();
170 _timer.Reset(traveltime + urand(800, 1500));
171}
std::int32_t int32
Definition Define.h:103
#define MIN_PATH_LENGTH
Definition FleeingMovementGenerator.cpp:28
PathType
Definition PathGenerator.h:45
@ PATHFIND_NOT_USING_PATH
Definition PathGenerator.h:51
@ PATHFIND_NOPATH
Definition PathGenerator.h:50
@ PATHFIND_FARFROMPOLY
Definition PathGenerator.h:55
@ PATHFIND_SHORTCUT
Definition PathGenerator.h:48
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_STATE_FLEEING_MOVE
Definition UnitDefines.h:194
void GetPoint(T *, Position &position)
Definition FleeingMovementGenerator.cpp:174
Definition MoveSplineInit.h:71
Definition Position.h:27
float GetPositionZ() const
Definition Position.h:123
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
void Reset(time_t interval)
Definition Timer.h:217

References Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Movement::MoveSplineInit::Launch(), MIN_PATH_LENGTH, Movement::MoveSplineInit::MovebyPath(), PATHFIND_FARFROMPOLY, PATHFIND_NOPATH, PATHFIND_NOT_USING_PATH, PATHFIND_SHORTCUT, Movement::MoveSplineInit::SetWalk(), UNIT_STATE_FLEEING_MOVE, UNIT_STATE_NOT_MOVE, and urand().

Member Data Documentation

◆ _fleeTargetGUID

template<class T >
ObjectGuid FleeingMovementGenerator< T >::_fleeTargetGUID
private

◆ _interrupt

template<class T >
bool FleeingMovementGenerator< T >::_interrupt
private

◆ _invalidPathsCount

template<class T >
uint8 FleeingMovementGenerator< T >::_invalidPathsCount
private

◆ _path

template<class T >
std::unique_ptr<PathGenerator> FleeingMovementGenerator< T >::_path
private

◆ _timer

template<class T >
TimeTracker FleeingMovementGenerator< T >::_timer
private

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