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 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 &)
 

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 _shortPathsCount
 

Detailed Description

template<class T>
class FleeingMovementGenerator< T >

Constructor & Destructor Documentation

◆ FleeingMovementGenerator()

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

Member Function Documentation

◆ DoFinalize() [1/2]

void FleeingMovementGenerator< Player >::DoFinalize ( Player owner)
52{
55 owner->StopMoving();
56}
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ UNIT_FLAG_FLEEING
Definition: UnitDefines.h:252
void ClearUnitState(uint32 f)
Definition: Unit.h:674
void StopMoving()
Definition: Unit.cpp:16634
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:684

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:197
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.

29{ return FLEEING_MOTION_TYPE; }
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:47

References FLEEING_MOTION_TYPE.

◆ GetPoint()

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

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 _path->SetPathLengthLimit(30.0f);
141 bool result = _path->CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
142 if (!result || (_path->GetPathType() & PathType(PATHFIND_NOPATH | PATHFIND_SHORTCUT | PATHFIND_FARFROMPOLY)))
143 {
144 _timer.Reset(100);
145 return;
146 }
147
148 // Same position - recheck
149 if (_path->getPathLength() < MIN_PATH_LENGTH)
150 {
151 if (_fleeTargetGUID)
152 {
154 }
155
156 _timer.Reset(100);
157 return;
158 }
159
161
162 Movement::MoveSplineInit init(owner);
163 init.MovebyPath(_path->GetPath());
164 init.SetWalk(false);
165 int32 traveltime = init.Launch();
166 _timer.Reset(traveltime + urand(800, 1500));
167}
std::int32_t int32
Definition: Define.h:103
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
@ UNIT_STATE_FLEEING_MOVE
Definition: UnitDefines.h:173
PathType
Definition: PathGenerator.h:46
@ PATHFIND_NOPATH
Definition: PathGenerator.h:51
@ PATHFIND_FARFROMPOLY
Definition: PathGenerator.h:56
@ PATHFIND_SHORTCUT
Definition: PathGenerator.h:49
#define MIN_PATH_LENGTH
Definition: FleeingMovementGenerator.cpp:28
void Reset(time_t interval)
Definition: Timer.h:217
Definition: Position.h:28
float GetPositionZ() const
Definition: Position.h:119
float GetPositionX() const
Definition: Position.h:117
void GetPosition(float &x, float &y) const
Definition: Position.h:122
float GetPositionY() const
Definition: Position.h:118
void GetPoint(T *, Position &position)
Definition: FleeingMovementGenerator.cpp:170
Definition: MoveSplineInit.h:71

References Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Movement::MoveSplineInit::Launch(), MIN_PATH_LENGTH, Movement::MoveSplineInit::MovebyPath(), PATHFIND_FARFROMPOLY, PATHFIND_NOPATH, 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

◆ _path

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

◆ _shortPathsCount

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

◆ _timer

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