Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_warchief_kargath_bladefist.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
/* ScriptData
7
SDName: Boss_Warchief_Kargath_Bladefist
8
SD%Complete: 90
9
SDComment:
10
SDCategory: Hellfire Citadel, Shattered Halls
11
EndScriptData */
12
13
/* ContentData
14
boss_warchief_kargath_bladefist
15
EndContentData */
16
17
#include "
ScriptMgr.h
"
18
#include "
ScriptedCreature.h
"
19
#include "
shattered_halls.h
"
20
21
enum
Says
22
{
23
SAY_AGGRO
= 0,
24
SAY_SLAY
= 1,
25
SAY_DEATH
= 2
26
};
27
28
enum
Spells
29
{
30
SPELL_BLADE_DANCE
= 30739,
31
H_SPELL_CHARGE
= 25821
32
};
33
34
enum
Creatures
35
{
36
NPC_SHATTERED_ASSASSIN
= 17695,
37
NPC_HEARTHEN_GUARD
= 17621,
38
NPC_SHARPSHOOTER_GUARD
= 17622,
39
NPC_REAVER_GUARD
= 17623
40
};
41
42
#define TARGET_NUM 5
43
44
float
AssassEntrance
[3] = { 275.136f, -84.29f, 2.3f };
// y -8
45
float
AssassExit
[3] = { 184.233f, -84.29f, 2.3f };
// y -8
46
float
AddsEntrance
[3] = { 306.036f, -84.29f, 1.93f };
47
48
class
boss_warchief_kargath_bladefist
:
public
CreatureScript
49
{
50
public
:
51
boss_warchief_kargath_bladefist
() :
CreatureScript
(
"boss_warchief_kargath_bladefist"
) { }
52
53
struct
boss_warchief_kargath_bladefistAI
:
public
BossAI
54
{
55
boss_warchief_kargath_bladefistAI
(
Creature
* creature) :
BossAI
(creature,
DATA_KARGATH
) { }
56
57
void
Reset
()
OVERRIDE
58
{
59
removeAdds
();
60
61
me
->SetSpeed(
MOVE_RUN
, 2);
62
me
->SetWalk(
false
);
63
64
summoned
= 2;
65
InBlade
=
false
;
66
Wait_Timer
= 0;
67
68
Charge_timer
= 0;
69
Blade_Dance_Timer
= 45000;
70
Summon_Assistant_Timer
= 30000;
71
Assassins_Timer
= 5000;
72
resetcheck_timer
= 5000;
73
}
74
75
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
76
{
77
Talk
(
SAY_DEATH
);
78
removeAdds
();
79
80
if
(
instance
)
81
instance
->SetBossState(
DATA_KARGATH
,
DONE
);
82
}
83
84
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
85
{
86
Talk
(
SAY_AGGRO
);
87
}
88
89
void
JustSummoned
(
Creature
*
summoned
)
OVERRIDE
90
{
91
switch
(
summoned
->GetEntry())
92
{
93
case
NPC_HEARTHEN_GUARD
:
94
case
NPC_SHARPSHOOTER_GUARD
:
95
case
NPC_REAVER_GUARD
:
96
summoned
->AI()->AttackStart(
SelectTarget
(
SELECT_TARGET_RANDOM
, 0));
97
adds
.push_back(
summoned
->GetGUID());
98
break
;
99
case
NPC_SHATTERED_ASSASSIN
:
100
assassins
.push_back(
summoned
->GetGUID());
101
break
;
102
}
103
}
104
105
void
KilledUnit
(
Unit
* victim)
OVERRIDE
106
{
107
if
(victim->GetTypeId() ==
TypeID::TYPEID_PLAYER
)
108
{
109
Talk
(
SAY_SLAY
);
110
}
111
}
112
113
void
MovementInform
(
uint32
type,
uint32
id
)
OVERRIDE
114
{
115
if
(
InBlade
)
116
{
117
if
(type !=
POINT_MOTION_TYPE
)
118
return
;
119
120
if
(
id
!= 1)
121
return
;
122
123
if
(
target_num
> 0)
// to prevent loops
124
{
125
Wait_Timer
= 1;
126
DoCast
(
me
,
SPELL_BLADE_DANCE
,
true
);
127
target_num
--;
128
}
129
}
130
}
131
132
void
removeAdds
()
133
{
134
for
(std::vector<uint64>::const_iterator itr =
adds
.begin(); itr!=
adds
.end(); ++itr)
135
{
136
Creature
* creature =
Unit::GetCreature
(*
me
, *itr);
137
if
(creature && creature->
IsAlive
())
138
{
139
creature->
GetMotionMaster
()->
Clear
(
true
);
140
me
->DealDamage(creature, creature->
GetHealth
(), NULL,
DIRECT_DAMAGE
,
SPELL_SCHOOL_MASK_NORMAL
, NULL,
false
);
141
creature->
RemoveCorpse
();
142
}
143
}
144
adds
.clear();
145
146
for
(std::vector<uint64>::const_iterator itr =
assassins
.begin(); itr!=
assassins
.end(); ++itr)
147
{
148
Creature
* creature =
Unit::GetCreature
(*
me
, *itr);
149
if
(creature && creature->
IsAlive
())
150
{
151
creature->
GetMotionMaster
()->
Clear
(
true
);
152
me
->DealDamage(creature, creature->
GetHealth
(), NULL,
DIRECT_DAMAGE
,
SPELL_SCHOOL_MASK_NORMAL
, NULL,
false
);
153
creature->
RemoveCorpse
();
154
}
155
}
156
assassins
.clear();
157
}
158
void
SpawnAssassin
()
159
{
160
me
->SummonCreature(
NPC_SHATTERED_ASSASSIN
,
AssassEntrance
[0],
AssassEntrance
[1]+8,
AssassEntrance
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
161
me
->SummonCreature(
NPC_SHATTERED_ASSASSIN
,
AssassEntrance
[0],
AssassEntrance
[1]-8,
AssassEntrance
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
162
me
->SummonCreature(
NPC_SHATTERED_ASSASSIN
,
AssassExit
[0],
AssassExit
[1]+8,
AssassExit
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
163
me
->SummonCreature(
NPC_SHATTERED_ASSASSIN
,
AssassExit
[0],
AssassExit
[1]-8,
AssassExit
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
164
}
165
166
void
UpdateAI
(
uint32
diff)
OVERRIDE
167
{
168
//Return since we have no target
169
if
(!
UpdateVictim
())
170
return
;
171
172
if
(
Assassins_Timer
)
173
{
174
if
(
Assassins_Timer
<= diff)
175
{
176
SpawnAssassin
();
177
Assassins_Timer
= 0;
178
}
179
else
180
Assassins_Timer
-= diff;
181
}
182
183
if
(
InBlade
)
184
{
185
if
(
Wait_Timer
)
186
{
187
if
(
Wait_Timer
<= diff)
188
{
189
if
(
target_num
<= 0)
190
{
191
// stop bladedance
192
InBlade
=
false
;
193
me
->SetSpeed(
MOVE_RUN
, 2);
194
me
->GetMotionMaster()->MoveChase(
me
->GetVictim());
195
Blade_Dance_Timer
= 30000;
196
Wait_Timer
= 0;
197
if
(
IsHeroic
())
198
Charge_timer
= 5000;
199
}
200
else
201
{
202
//move in bladedance
203
float
x, y, randx, randy;
204
randx = 0.0f + rand()%40;
205
randy = 0.0f + rand()%40;
206
x = 210+ randx;
207
y = -60- randy;
208
me
->GetMotionMaster()->MovePoint(1, x, y,
me
->GetPositionZ());
209
Wait_Timer
= 0;
210
}
211
}
212
else
213
Wait_Timer
-= diff;
214
}
215
}
216
else
217
{
218
if
(
Blade_Dance_Timer
)
219
{
220
if
(
Blade_Dance_Timer
<= diff)
221
{
222
target_num
=
TARGET_NUM
;
223
Wait_Timer
= 1;
224
InBlade
=
true
;
225
Blade_Dance_Timer
= 0;
226
me
->SetSpeed(
MOVE_RUN
, 4);
227
return
;
228
}
229
else
230
Blade_Dance_Timer
-= diff;
231
}
232
233
if
(
Charge_timer
)
234
{
235
if
(
Charge_timer
<= diff)
236
{
237
DoCast
(
SelectTarget
(
SELECT_TARGET_RANDOM
, 0),
H_SPELL_CHARGE
);
238
Charge_timer
= 0;
239
}
240
else
241
Charge_timer
-= diff;
242
}
243
244
if
(
Summon_Assistant_Timer
<= diff)
245
{
246
for
(
uint8
i = 0; i <
summoned
; ++i)
247
{
248
switch
(std::rand() % 2)
249
{
250
case
0:
251
me
->SummonCreature(
NPC_HEARTHEN_GUARD
,
AddsEntrance
[0],
AddsEntrance
[1],
AddsEntrance
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
252
break
;
253
case
1:
254
me
->SummonCreature(
NPC_SHARPSHOOTER_GUARD
,
AddsEntrance
[0],
AddsEntrance
[1],
AddsEntrance
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
255
break
;
256
case
2:
257
me
->SummonCreature(
NPC_REAVER_GUARD
,
AddsEntrance
[0],
AddsEntrance
[1],
AddsEntrance
[2], 0,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
, 30000);
258
break
;
259
}
260
}
261
if
((std::rand() % 9) < 2)
262
++
summoned
;
263
Summon_Assistant_Timer
= std::rand() % 35000 + 25000;
264
}
265
else
266
Summon_Assistant_Timer
-= diff;
267
268
DoMeleeAttackIfReady
();
269
}
270
271
if
(
resetcheck_timer
<= diff)
272
{
273
uint32
tempx =
uint32
(
me
->GetPositionX());
274
if
(tempx > 255 || tempx < 205)
275
{
276
EnterEvadeMode
();
277
return
;
278
}
279
resetcheck_timer
= 5000;
280
}
281
else
282
resetcheck_timer
-= diff;
283
}
284
285
private
:
286
std::vector<uint64>
adds
;
287
std::vector<uint64>
assassins
;
288
uint32
Charge_timer
;
289
uint32
Blade_Dance_Timer
;
290
uint32
Summon_Assistant_Timer
;
291
uint32
resetcheck_timer
;
292
uint32
Wait_Timer
;
293
uint32
Assassins_Timer
;
294
uint32
summoned
;
295
uint32
target_num
;
296
bool
InBlade
;
297
};
298
299
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
300
{
301
return
new
boss_warchief_kargath_bladefistAI
(creature);
302
}
303
};
304
305
void
AddSC_boss_warchief_kargath_bladefist
()
306
{
307
new
boss_warchief_kargath_bladefist
();
308
}
Spells
Spells
Definition
BattlegroundIC.h:645
uint8
std::uint8_t uint8
Definition
Define.h:79
uint32
std::uint32_t uint32
Definition
Define.h:77
OVERRIDE
#define OVERRIDE
Definition
Define.h:60
DONE
@ DONE
Definition
InstanceScript.h:49
POINT_MOTION_TYPE
@ POINT_MOTION_TYPE
Definition
MotionMaster.h:33
TypeID::TYPEID_PLAYER
@ TYPEID_PLAYER
Definition
Object.h:55
TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition
Object.h:71
ScriptMgr.h
ScriptedCreature.h
SPELL_SCHOOL_MASK_NORMAL
@ SPELL_SCHOOL_MASK_NORMAL
Definition
SharedDefines.h:270
MOVE_RUN
@ MOVE_RUN
Definition
Unit.h:556
DIRECT_DAMAGE
@ DIRECT_DAMAGE
Definition
Unit.h:614
SELECT_TARGET_RANDOM
@ SELECT_TARGET_RANDOM
Definition
UnitAI.h:23
Creatures
Creatures
Definition
alterac_valley.cpp:28
SPELL_BLADE_DANCE
@ SPELL_BLADE_DANCE
Definition
boss_alizabal.cpp:26
SAY_SLAY
@ SAY_SLAY
Definition
boss_alizabal.cpp:20
SAY_DEATH
#define SAY_DEATH
Definition
boss_commander_kolurg.cpp:30
SAY_AGGRO
#define SAY_AGGRO
Definition
boss_commander_kolurg.cpp:28
Says
Says
Definition
boss_halycon.cpp:17
AddsEntrance
float AddsEntrance[3]
Definition
boss_warchief_kargath_bladefist.cpp:46
SAY_DEATH
@ SAY_DEATH
Definition
boss_warchief_kargath_bladefist.cpp:25
SAY_AGGRO
@ SAY_AGGRO
Definition
boss_warchief_kargath_bladefist.cpp:23
SAY_SLAY
@ SAY_SLAY
Definition
boss_warchief_kargath_bladefist.cpp:24
NPC_HEARTHEN_GUARD
@ NPC_HEARTHEN_GUARD
Definition
boss_warchief_kargath_bladefist.cpp:37
NPC_SHATTERED_ASSASSIN
@ NPC_SHATTERED_ASSASSIN
Definition
boss_warchief_kargath_bladefist.cpp:36
NPC_SHARPSHOOTER_GUARD
@ NPC_SHARPSHOOTER_GUARD
Definition
boss_warchief_kargath_bladefist.cpp:38
NPC_REAVER_GUARD
@ NPC_REAVER_GUARD
Definition
boss_warchief_kargath_bladefist.cpp:39
AssassEntrance
float AssassEntrance[3]
Definition
boss_warchief_kargath_bladefist.cpp:44
SPELL_BLADE_DANCE
@ SPELL_BLADE_DANCE
Definition
boss_warchief_kargath_bladefist.cpp:30
H_SPELL_CHARGE
@ H_SPELL_CHARGE
Definition
boss_warchief_kargath_bladefist.cpp:31
AddSC_boss_warchief_kargath_bladefist
void AddSC_boss_warchief_kargath_bladefist()
Definition
boss_warchief_kargath_bladefist.cpp:305
TARGET_NUM
#define TARGET_NUM
Definition
boss_warchief_kargath_bladefist.cpp:42
AssassExit
float AssassExit[3]
Definition
boss_warchief_kargath_bladefist.cpp:45
BossAI::instance
InstanceScript *const instance
Definition
ScriptedCreature.h:383
BossAI::BossAI
BossAI(Creature *creature, uint32 bossId)
Definition
ScriptedCreature.cpp:456
CreatureAI
Definition
CreatureAI.h:54
CreatureAI::Talk
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
Definition
CreatureAI.cpp:28
CreatureAI::UpdateVictim
bool UpdateVictim()
Definition
CreatureAI.cpp:192
CreatureAI::EnterEvadeMode
virtual void EnterEvadeMode()
Definition
CreatureAI.cpp:130
Creature
Definition
Creature.h:427
Creature::RemoveCorpse
void RemoveCorpse(bool setSpawnTime=true)
Definition
Creature.cpp:230
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
MotionMaster::Clear
void Clear(bool reset=true)
Definition
MotionMaster.h:102
UnitAI::DoMeleeAttackIfReady
void DoMeleeAttackIfReady()
Definition
UnitAI.cpp:28
UnitAI::DoCast
void DoCast(uint32 spellId)
Definition
UnitAI.cpp:110
UnitAI::SelectTarget
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition
UnitAI.cpp:66
Unit
Definition
Unit.h:1367
Unit::GetMotionMaster
MotionMaster * GetMotionMaster()
Definition
Unit.h:2605
Unit::IsAlive
bool IsAlive() const
Definition
Unit.h:2032
Unit::GetCreature
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4905
Unit::GetHealth
uint32 GetHealth() const
Definition
Unit.h:1600
boss_warchief_kargath_bladefist
Definition
boss_warchief_kargath_bladefist.cpp:49
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist
boss_warchief_kargath_bladefist()
Definition
boss_warchief_kargath_bladefist.cpp:51
boss_warchief_kargath_bladefist::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:299
shattered_halls.h
DATA_KARGATH
@ DATA_KARGATH
Definition
shattered_halls.h:15
ScriptedAI::IsHeroic
bool IsHeroic() const
Definition
ScriptedCreature.h:279
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI
Definition
boss_warchief_kargath_bladefist.cpp:54
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::SpawnAssassin
void SpawnAssassin()
Definition
boss_warchief_kargath_bladefist.cpp:158
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Wait_Timer
uint32 Wait_Timer
Definition
boss_warchief_kargath_bladefist.cpp:292
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::KilledUnit
void KilledUnit(Unit *victim) OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:105
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Assassins_Timer
uint32 Assassins_Timer
Definition
boss_warchief_kargath_bladefist.cpp:293
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::JustSummoned
void JustSummoned(Creature *summoned) OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:89
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::boss_warchief_kargath_bladefistAI
boss_warchief_kargath_bladefistAI(Creature *creature)
Definition
boss_warchief_kargath_bladefist.cpp:55
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Blade_Dance_Timer
uint32 Blade_Dance_Timer
Definition
boss_warchief_kargath_bladefist.cpp:289
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:84
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_warchief_kargath_bladefist.cpp:166
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::removeAdds
void removeAdds()
Definition
boss_warchief_kargath_bladefist.cpp:132
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::assassins
std::vector< uint64 > assassins
Definition
boss_warchief_kargath_bladefist.cpp:287
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::adds
std::vector< uint64 > adds
Definition
boss_warchief_kargath_bladefist.cpp:286
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Charge_timer
uint32 Charge_timer
Definition
boss_warchief_kargath_bladefist.cpp:288
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:75
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::InBlade
bool InBlade
Definition
boss_warchief_kargath_bladefist.cpp:296
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::target_num
uint32 target_num
Definition
boss_warchief_kargath_bladefist.cpp:295
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Reset
void Reset() OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:57
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::Summon_Assistant_Timer
uint32 Summon_Assistant_Timer
Definition
boss_warchief_kargath_bladefist.cpp:290
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::summoned
uint32 summoned
Definition
boss_warchief_kargath_bladefist.cpp:294
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::MovementInform
void MovementInform(uint32 type, uint32 id) OVERRIDE
Definition
boss_warchief_kargath_bladefist.cpp:113
boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefistAI::resetcheck_timer
uint32 resetcheck_timer
Definition
boss_warchief_kargath_bladefist.cpp:291
src
server
scripts
Outland
HellfireCitadel
ShatteredHalls
boss_warchief_kargath_bladefist.cpp
Generated on
for Project SkyFire Core by
1.17.0