Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
FleeingMovementGenerator.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
Creature.h
"
7
#include "
CreatureAI.h
"
8
#include "
FleeingMovementGenerator.h
"
9
#include "
MapManager.h
"
10
#include "
MoveSpline.h
"
11
#include "
MoveSplineInit.h
"
12
#include "
ObjectAccessor.h
"
13
#include "
PathGenerator.h
"
14
#include "
Player.h
"
15
16
#define MIN_QUIET_DISTANCE 28.0f
17
#define MAX_QUIET_DISTANCE 43.0f
18
19
template
<
class
T>
20
void
FleeingMovementGenerator<T>::_setTargetLocation
(T* owner)
21
{
22
if
(!owner)
23
return
;
24
25
if
(owner->HasUnitState(
UNIT_STATE_ROOT
|
UNIT_STATE_STUNNED
))
26
return
;
27
28
owner->AddUnitState(
UNIT_STATE_FLEEING_MOVE
);
29
30
float
x, y, z;
31
_getPoint
(owner, x, y, z);
32
33
PathGenerator
path(owner);
34
path.SetPathLengthLimit(30.0f);
35
bool
result = path.CalculatePath(x, y, z);
36
if
(!result || (path.GetPathType() &
PATHFIND_NOPATH
))
37
{
38
i_nextCheckTime
.Reset(100);
39
return
;
40
}
41
42
Movement::MoveSplineInit
init(owner);
43
init.MovebyPath(path.GetPath());
44
init.SetWalk(
false
);
45
int32
traveltime = init.Launch();
46
i_nextCheckTime.Reset(traveltime + (std::rand() % 1500 + 800));
47
}
48
49
template
<
class
T>
50
void
FleeingMovementGenerator<T>::_getPoint
(T* owner,
float
& x,
float
& y,
float
& z)
51
{
52
float
dist_from_caster, angle_to_caster;
53
if
(
Unit
* fright =
ObjectAccessor::GetUnit
(*owner,
i_frightGUID
))
54
{
55
dist_from_caster = fright->GetDistance(owner);
56
if
(dist_from_caster > 0.2f)
57
angle_to_caster = fright->GetAngle(owner);
58
else
59
angle_to_caster =
frand
(0, 2 *
static_cast<
float
>
(
M_PI
));
60
}
61
else
62
{
63
dist_from_caster = 0.0f;
64
angle_to_caster =
frand
(0, 2 *
static_cast<
float
>
(
M_PI
));
65
}
66
67
float
dist, angle;
68
if
(dist_from_caster <
MIN_QUIET_DISTANCE
)
69
{
70
dist =
frand
(0.4f, 1.3f) * (
MIN_QUIET_DISTANCE
- dist_from_caster);
71
angle = angle_to_caster +
frand
(-
static_cast<
float
>
(
M_PI
) / 8,
static_cast<
float
>
(
M_PI
) / 8);
72
}
73
else
if
(dist_from_caster >
MAX_QUIET_DISTANCE
)
74
{
75
dist =
frand
(0.4f, 1.0f) * (
MAX_QUIET_DISTANCE
-
MIN_QUIET_DISTANCE
);
76
angle = -angle_to_caster +
frand
(-
static_cast<
float
>
(
M_PI
) / 4,
static_cast<
float
>
(
M_PI
) / 4);
77
}
78
else
// we are inside quiet range
79
{
80
dist =
frand
(0.6f, 1.2f) * (
MAX_QUIET_DISTANCE
-
MIN_QUIET_DISTANCE
);
81
angle =
frand
(0, 2 *
static_cast<
float
>
(
M_PI
));
82
}
83
84
Position
pos;
85
owner->GetFirstCollisionPosition(pos, dist, angle);
86
x = pos.
m_positionX
;
87
y = pos.
m_positionY
;
88
z = pos.
m_positionZ
;
89
}
90
91
template
<
class
T>
92
void
FleeingMovementGenerator<T>::DoInitialize
(T* owner)
93
{
94
if
(!owner)
95
return
;
96
97
owner->SetFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_FLEEING
);
98
owner->AddUnitState(
UNIT_STATE_FLEEING
|
UNIT_STATE_FLEEING_MOVE
);
99
_setTargetLocation
(owner);
100
}
101
102
template
<>
103
void
FleeingMovementGenerator<Player>::DoFinalize
(
Player
* owner)
104
{
105
owner->
RemoveFlag
(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_FLEEING
);
106
owner->
ClearUnitState
(
UNIT_STATE_FLEEING
|
UNIT_STATE_FLEEING_MOVE
);
107
owner->
StopMoving
();
108
}
109
110
template
<>
111
void
FleeingMovementGenerator<Creature>::DoFinalize
(
Creature
* owner)
112
{
113
owner->
RemoveFlag
(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_FLEEING
);
114
owner->
ClearUnitState
(
UNIT_STATE_FLEEING
|
UNIT_STATE_FLEEING_MOVE
);
115
if
(owner->
GetVictim
())
116
owner->
SetTarget
(owner->
GetVictim
()->
GetGUID
());
117
}
118
119
template
<
class
T>
120
void
FleeingMovementGenerator<T>::DoReset
(T* owner)
121
{
122
DoInitialize
(owner);
123
}
124
125
template
<
class
T>
126
bool
FleeingMovementGenerator<T>::DoUpdate
(T* owner,
uint32
time_diff)
127
{
128
if
(!owner || !owner->IsAlive())
129
return
false
;
130
131
if
(owner->HasUnitState(
UNIT_STATE_ROOT
|
UNIT_STATE_STUNNED
))
132
{
133
owner->ClearUnitState(
UNIT_STATE_FLEEING_MOVE
);
134
return
true
;
135
}
136
137
i_nextCheckTime
.Update(time_diff);
138
if
(
i_nextCheckTime
.Passed() && owner->movespline->Finalized())
139
_setTargetLocation
(owner);
140
141
return
true
;
142
}
143
144
template
void
FleeingMovementGenerator<Player>::DoInitialize
(
Player
*);
145
template
void
FleeingMovementGenerator<Creature>::DoInitialize
(
Creature
*);
146
template
void
FleeingMovementGenerator<Player>::_getPoint
(
Player
*,
float
&,
float
&,
float
&);
147
template
void
FleeingMovementGenerator<Creature>::_getPoint
(
Creature
*,
float
&,
float
&,
float
&);
148
template
void
FleeingMovementGenerator<Player>::_setTargetLocation
(
Player
*);
149
template
void
FleeingMovementGenerator<Creature>::_setTargetLocation
(
Creature
*);
150
template
void
FleeingMovementGenerator<Player>::DoReset
(
Player
*);
151
template
void
FleeingMovementGenerator<Creature>::DoReset
(
Creature
*);
152
template
bool
FleeingMovementGenerator<Player>::DoUpdate
(
Player
*,
uint32
);
153
template
bool
FleeingMovementGenerator<Creature>::DoUpdate
(
Creature
*,
uint32
);
154
155
void
TimedFleeingMovementGenerator::Finalize
(
Unit
* owner)
156
{
157
owner->
RemoveFlag
(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_FLEEING
);
158
owner->
ClearUnitState
(
UNIT_STATE_FLEEING
|
UNIT_STATE_FLEEING_MOVE
);
159
if
(
Unit
* victim = owner->
GetVictim
())
160
{
161
if
(owner->
IsAlive
())
162
{
163
owner->
AttackStop
();
164
owner->
ToCreature
()->
AI
()->
AttackStart
(victim);
165
}
166
}
167
}
168
169
bool
TimedFleeingMovementGenerator::Update
(
Unit
* owner,
uint32
time_diff)
170
{
171
if
(!owner->
IsAlive
())
172
return
false
;
173
174
if
(owner->
HasUnitState
(
UNIT_STATE_ROOT
|
UNIT_STATE_STUNNED
))
175
{
176
owner->
ClearUnitState
(
UNIT_STATE_FLEEING_MOVE
);
177
return
true
;
178
}
179
180
i_totalFleeTime
.Update(time_diff);
181
if
(
i_totalFleeTime
.Passed())
182
return
false
;
183
184
// This calls grant-parent Update method hiden by FleeingMovementGenerator::Update(Creature &, uint32) version
185
// This is done instead of casting Unit& to Creature& and call parent method, then we can use Unit directly
186
return
MovementGeneratorMedium< Creature, FleeingMovementGenerator<Creature>
>
::Update
(owner, time_diff);
187
}
M_PI
#define M_PI
Definition
Common.h:192
Creature.h
CreatureAI.h
int32
std::int32_t int32
Definition
Define.h:73
uint32
std::uint32_t uint32
Definition
Define.h:77
MAX_QUIET_DISTANCE
#define MAX_QUIET_DISTANCE
Definition
FleeingMovementGenerator.cpp:17
MIN_QUIET_DISTANCE
#define MIN_QUIET_DISTANCE
Definition
FleeingMovementGenerator.cpp:16
FleeingMovementGenerator.h
MapManager.h
MoveSpline.h
MoveSplineInit.h
ObjectAccessor.h
PathGenerator.h
PATHFIND_NOPATH
@ PATHFIND_NOPATH
Definition
PathGenerator.h:34
Player.h
UNIT_STATE_FLEEING_MOVE
@ UNIT_STATE_FLEEING_MOVE
Definition
Unit.h:536
UNIT_STATE_ROOT
@ UNIT_STATE_ROOT
Definition
Unit.h:522
UNIT_STATE_FLEEING
@ UNIT_STATE_FLEEING
Definition
Unit.h:519
UNIT_STATE_STUNNED
@ UNIT_STATE_STUNNED
Definition
Unit.h:515
UNIT_FLAG_FLEEING
@ UNIT_FLAG_FLEEING
Definition
Unit.h:648
UNIT_FIELD_FLAGS
@ UNIT_FIELD_FLAGS
Definition
UpdateFields.h:82
frand
float frand(float min, float max)
Definition
Util.cpp:39
Creature
Definition
Creature.h:427
Creature::SetTarget
void SetTarget(uint64 guid) OVERRIDE
Definition
Creature.cpp:2626
Creature::AI
CreatureAI * AI() const
Definition
Creature.h:483
FleeingMovementGenerator< Creature >::i_nextCheckTime
TimeTracker i_nextCheckTime
Definition
FleeingMovementGenerator.h:29
FleeingMovementGenerator::DoReset
void DoReset(T *)
Definition
FleeingMovementGenerator.cpp:120
FleeingMovementGenerator< Creature >::_getPoint
void _getPoint(Creature *, float &x, float &y, float &z)
Definition
FleeingMovementGenerator.cpp:50
FleeingMovementGenerator::DoFinalize
void DoFinalize(T *)
FleeingMovementGenerator::i_frightGUID
uint64 i_frightGUID
Definition
FleeingMovementGenerator.h:28
FleeingMovementGenerator::DoUpdate
bool DoUpdate(T *, uint32)
Definition
FleeingMovementGenerator.cpp:126
FleeingMovementGenerator::DoInitialize
void DoInitialize(T *)
Definition
FleeingMovementGenerator.cpp:92
FleeingMovementGenerator::_setTargetLocation
void _setTargetLocation(T *)
Definition
FleeingMovementGenerator.cpp:20
Movement::MoveSplineInit
Definition
MoveSplineInit.h:40
MovementGeneratorMedium
Definition
MovementGenerator.h:39
ObjectAccessor::GetUnit
static Unit * GetUnit(WorldObject const &, uint64 guid)
Definition
ObjectAccessor.cpp:204
Object::GetGUID
uint64 GetGUID() const
Definition
Object.h:119
Object::RemoveFlag
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition
Object.cpp:1280
Object::ToCreature
Creature * ToCreature()
Definition
Object.h:207
PathGenerator
Definition
PathGenerator.h:40
Player
Definition
Player.h:1289
TimedFleeingMovementGenerator::Finalize
void Finalize(Unit *)
Definition
FleeingMovementGenerator.cpp:155
TimedFleeingMovementGenerator::i_totalFleeTime
TimeTracker i_totalFleeTime
Definition
FleeingMovementGenerator.h:44
TimedFleeingMovementGenerator::Update
bool Update(Unit *, uint32)
Definition
FleeingMovementGenerator.cpp:169
UnitAI::AttackStart
virtual void AttackStart(Unit *)
Definition
UnitAI.cpp:16
Unit
Definition
Unit.h:1367
Unit::ClearUnitState
void ClearUnitState(uint32 f)
Definition
Unit.h:1489
Unit::IsAlive
bool IsAlive() const
Definition
Unit.h:2032
Unit::StopMoving
void StopMoving()
-------—End of Pet responses methods-------—
Definition
Unit.cpp:5877
Unit::GetVictim
Unit * GetVictim() const
Definition
Unit.h:1468
Unit::HasUnitState
bool HasUnitState(const uint32 f) const
Definition
Unit.h:1485
Unit::AttackStop
bool AttackStop()
Definition
UnitCombatState.cpp:183
Position
Definition
Object.h:274
Position::m_positionZ
float m_positionZ
Definition
Object.h:289
Position::m_positionX
float m_positionX
Definition
Object.h:287
Position::m_positionY
float m_positionY
Definition
Object.h:288
src
server
game
Movement
MovementGenerators
FleeingMovementGenerator.cpp
Generated on
for Project SkyFire Core by
1.17.0