Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_ionar.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
/*
7
* Comment: Timer check pending
8
*/
9
10
#include "
ScriptMgr.h
"
11
#include "
ScriptedCreature.h
"
12
#include "
halls_of_lightning.h
"
13
#include "
SpellInfo.h
"
14
15
enum
Spells
16
{
17
SPELL_BALL_LIGHTNING
= 52780,
18
H_SPELL_BALL_LIGHTNING
= 59800,
19
SPELL_STATIC_OVERLOAD
= 52658,
20
H_SPELL_STATIC_OVERLOAD
= 59795,
21
22
SPELL_DISPERSE
= 52770,
23
SPELL_SUMMON_SPARK
= 52746,
24
SPELL_SPARK_DESPAWN
= 52776,
25
26
//Spark of Ionar
27
SPELL_SPARK_VISUAL_TRIGGER
= 52667,
28
H_SPELL_SPARK_VISUAL_TRIGGER
= 59833
29
};
30
31
enum
Yells
32
{
33
SAY_AGGRO
= 0,
34
SAY_SPLIT
= 1,
35
SAY_SLAY
= 2,
36
SAY_DEATH
= 3
37
};
38
39
enum
Creatures
40
{
41
NPC_SPARK_OF_IONAR
= 28926
42
};
43
44
enum
Misc
45
{
46
DATA_MAX_SPARKS
= 5,
47
DATA_POINT_CALLBACK
= 0
48
};
49
50
/*######
51
## Boss Ionar
52
######*/
53
54
class
boss_ionar
:
public
CreatureScript
55
{
56
public
:
57
boss_ionar
() :
CreatureScript
(
"boss_ionar"
) { }
58
59
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
60
{
61
return
new
boss_ionarAI
(creature);
62
}
63
64
struct
boss_ionarAI
:
public
ScriptedAI
65
{
66
boss_ionarAI
(
Creature
* creature) :
ScriptedAI
(creature),
lSparkList
(creature)
67
{
68
instance
= creature->
GetInstanceScript
();
69
}
70
71
InstanceScript
*
instance
;
72
73
SummonList
lSparkList
;
74
75
bool
bIsSplitPhase
;
76
bool
bHasDispersed
;
77
78
uint32
uiSplitTimer
;
79
80
uint32
uiStaticOverloadTimer
;
81
uint32
uiBallLightningTimer
;
82
83
uint32
uiDisperseHealth
;
84
85
void
Reset
()
OVERRIDE
86
{
87
lSparkList
.DespawnAll();
88
89
bIsSplitPhase
=
true
;
90
bHasDispersed
=
false
;
91
92
uiSplitTimer
= 25*
IN_MILLISECONDS
;
93
94
uiStaticOverloadTimer
= std::rand() % (6 *
IN_MILLISECONDS
) + (5*
IN_MILLISECONDS
);
95
uiBallLightningTimer
= std::rand() % (11 *
IN_MILLISECONDS
) + (10*
IN_MILLISECONDS
);
96
97
uiDisperseHealth
= 45 + (std::rand() % 10);
98
99
me
->RemoveFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
|
UNIT_FLAG_NOT_SELECTABLE
|
UNIT_FLAG_DISABLE_MOVE
);
100
101
if
(!
me
->IsVisible())
102
me
->SetVisible(
true
);
103
104
if
(
instance
)
105
instance
->SetBossState(
DATA_IONAR
,
NOT_STARTED
);
106
}
107
108
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
109
{
110
Talk
(
SAY_AGGRO
);
111
112
if
(
instance
)
113
instance
->SetBossState(
DATA_IONAR
,
IN_PROGRESS
);
114
}
115
116
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
117
{
118
Talk
(
SAY_DEATH
);
119
120
lSparkList
.DespawnAll();
121
122
if
(
instance
)
123
instance
->SetBossState(
DATA_IONAR
,
DONE
);
124
}
125
126
void
KilledUnit
(
Unit
*
/*victim*/
)
OVERRIDE
127
{
128
Talk
(
SAY_SLAY
);
129
}
130
131
void
SpellHit
(
Unit
*
/*caster*/
,
const
SpellInfo
* spell)
OVERRIDE
132
{
133
if
(spell->Id ==
SPELL_DISPERSE
)
134
{
135
for
(
uint8
i = 0; i <
DATA_MAX_SPARKS
; ++i)
136
me
->CastSpell(
me
,
SPELL_SUMMON_SPARK
,
true
);
137
138
me
->AttackStop();
139
me
->SetVisible(
false
);
140
me
->SetFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
|
UNIT_FLAG_NOT_SELECTABLE
|
UNIT_FLAG_DISABLE_MOVE
);
141
142
me
->GetMotionMaster()->Clear();
143
me
->GetMotionMaster()->MoveIdle();
144
}
145
}
146
147
//make sparks come back
148
void
CallBackSparks
()
149
{
150
//should never be empty here, but check
151
if
(
lSparkList
.empty())
152
return
;
153
154
Position
pos;
155
me
->GetPosition(&pos);
156
157
for
(std::list<uint64>::const_iterator itr =
lSparkList
.begin(); itr !=
lSparkList
.end(); ++itr)
158
{
159
if
(
Creature
* pSpark =
Unit::GetCreature
(*
me
, *itr))
160
{
161
if
(pSpark->IsAlive())
162
{
163
pSpark->SetSpeed(
MOVE_RUN
, 2.0f);
164
pSpark->GetMotionMaster()->Clear();
165
pSpark->GetMotionMaster()->MovePoint(
DATA_POINT_CALLBACK
, pos);
166
}
167
else
168
pSpark->DespawnOrUnsummon();
169
}
170
}
171
}
172
173
void
DamageTaken
(
Unit
*
/*pDoneBy*/
,
uint32
&uiDamage)
OVERRIDE
174
{
175
if
(!
me
->IsVisible())
176
uiDamage = 0;
177
}
178
179
void
JustSummoned
(
Creature
* summoned)
OVERRIDE
180
{
181
if
(summoned->GetEntry() ==
NPC_SPARK_OF_IONAR
)
182
{
183
lSparkList
.Summon(summoned);
184
185
summoned->CastSpell(summoned,
DUNGEON_MODE
(
SPELL_SPARK_VISUAL_TRIGGER
,
H_SPELL_SPARK_VISUAL_TRIGGER
),
true
);
186
187
if
(
Unit
* target =
SelectTarget
(
SELECT_TARGET_RANDOM
, 0))
188
{
189
summoned->SetInCombatWith(target);
190
summoned->GetMotionMaster()->Clear();
191
summoned->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f);
192
}
193
}
194
}
195
196
void
SummonedCreatureDespawn
(
Creature
* summoned)
OVERRIDE
197
{
198
if
(summoned->GetEntry() ==
NPC_SPARK_OF_IONAR
)
199
lSparkList
.Despawn(summoned);
200
}
201
202
void
UpdateAI
(
uint32
uiDiff)
OVERRIDE
203
{
204
//Return since we have no target
205
if
(!
UpdateVictim
())
206
return
;
207
208
// Splitted
209
if
(!
me
->IsVisible())
210
{
211
if
(
uiSplitTimer
<= uiDiff)
212
{
213
uiSplitTimer
= 2500;
214
215
// Return sparks to where Ionar splitted
216
if
(
bIsSplitPhase
)
217
{
218
CallBackSparks
();
219
bIsSplitPhase
=
false
;
220
}
221
// Lightning effect and restore Ionar
222
else
if
(
lSparkList
.empty())
223
{
224
me
->SetVisible(
true
);
225
me
->RemoveFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
|
UNIT_FLAG_NOT_SELECTABLE
|
UNIT_FLAG_DISABLE_MOVE
);
226
227
DoCast
(
me
,
SPELL_SPARK_DESPAWN
,
false
);
228
229
uiSplitTimer
= 25*
IN_MILLISECONDS
;
230
bIsSplitPhase
=
true
;
231
232
if
(
me
->GetVictim())
233
me
->GetMotionMaster()->MoveChase(
me
->GetVictim());
234
}
235
}
236
else
237
uiSplitTimer
-= uiDiff;
238
239
return
;
240
}
241
242
if
(
uiStaticOverloadTimer
<= uiDiff)
243
{
244
if
(
Unit
* target =
SelectTarget
(
SELECT_TARGET_RANDOM
, 0))
245
DoCast
(target,
SPELL_STATIC_OVERLOAD
);
246
247
uiStaticOverloadTimer
= std::rand() % (6 *
IN_MILLISECONDS
) + (5*
IN_MILLISECONDS
);
248
}
249
else
250
uiStaticOverloadTimer
-= uiDiff;
251
252
if
(
uiBallLightningTimer
<= uiDiff)
253
{
254
DoCastVictim
(
SPELL_BALL_LIGHTNING
);
255
uiBallLightningTimer
= std::rand() % (11 *
IN_MILLISECONDS
) + (10*
IN_MILLISECONDS
);
256
}
257
else
258
uiBallLightningTimer
-= uiDiff;
259
260
// Health check
261
if
(!
bHasDispersed
&&
HealthBelowPct
(
uiDisperseHealth
))
262
{
263
bHasDispersed
=
true
;
264
265
Talk
(
SAY_SPLIT
);
266
267
if
(
me
->IsNonMeleeSpellCasted(
false
))
268
me
->InterruptNonMeleeSpells(
false
);
269
270
DoCast
(
me
,
SPELL_DISPERSE
,
false
);
271
}
272
273
DoMeleeAttackIfReady
();
274
}
275
};
276
};
277
278
/*######
279
## npc_spark_of_ionar
280
######*/
281
282
class
npc_spark_of_ionar
:
public
CreatureScript
283
{
284
public
:
285
npc_spark_of_ionar
() :
CreatureScript
(
"npc_spark_of_ionar"
) { }
286
287
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
288
{
289
return
new
npc_spark_of_ionarAI
(creature);
290
}
291
292
struct
npc_spark_of_ionarAI
:
public
ScriptedAI
293
{
294
npc_spark_of_ionarAI
(
Creature
* creature) :
ScriptedAI
(creature)
295
{
296
instance
= creature->
GetInstanceScript
();
297
}
298
299
InstanceScript
*
instance
;
300
301
uint32
uiCheckTimer
;
302
303
void
Reset
()
OVERRIDE
304
{
305
uiCheckTimer
= 2*
IN_MILLISECONDS
;
306
me
->SetReactState(
REACT_PASSIVE
);
307
}
308
309
void
MovementInform
(
uint32
uiType,
uint32
uiPointId)
OVERRIDE
310
{
311
if
(uiType !=
POINT_MOTION_TYPE
|| !
instance
)
312
return
;
313
314
if
(uiPointId ==
DATA_POINT_CALLBACK
)
315
me
->DespawnOrUnsummon();
316
}
317
318
void
DamageTaken
(
Unit
*
/*pDoneBy*/
,
uint32
&uiDamage)
OVERRIDE
319
{
320
uiDamage = 0;
321
}
322
323
void
UpdateAI
(
uint32
uiDiff)
OVERRIDE
324
{
325
// Despawn if the encounter is not running
326
if
(
instance
&&
instance
->GetBossState(
DATA_IONAR
) !=
IN_PROGRESS
)
327
{
328
me
->DespawnOrUnsummon();
329
return
;
330
}
331
332
// Prevent them to follow players through the whole instance
333
if
(
uiCheckTimer
<= uiDiff)
334
{
335
if
(
instance
)
336
{
337
Creature
* pIonar =
instance
->instance->GetCreature(
instance
->GetData64(
DATA_IONAR
));
338
if
(pIonar && pIonar->
IsAlive
())
339
{
340
if
(
me
->GetDistance(pIonar) > 90.0f)
341
{
342
Position
pos;
343
pIonar->
GetPosition
(&pos);
344
345
me
->SetSpeed(
MOVE_RUN
, 2.0f);
346
me
->GetMotionMaster()->Clear();
347
me
->GetMotionMaster()->MovePoint(
DATA_POINT_CALLBACK
, pos);
348
}
349
}
350
else
351
me
->DespawnOrUnsummon();
352
}
353
uiCheckTimer
= 2*
IN_MILLISECONDS
;
354
}
355
else
356
uiCheckTimer
-= uiDiff;
357
358
// No melee attack at all!
359
}
360
};
361
};
362
363
void
AddSC_boss_ionar
()
364
{
365
new
boss_ionar
();
366
new
npc_spark_of_ionar
();
367
}
Spells
Spells
Definition
BattlegroundIC.h:645
IN_MILLISECONDS
@ IN_MILLISECONDS
Definition
Common.h:125
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
IN_PROGRESS
@ IN_PROGRESS
Definition
InstanceScript.h:47
DONE
@ DONE
Definition
InstanceScript.h:49
NOT_STARTED
@ NOT_STARTED
Definition
InstanceScript.h:46
POINT_MOTION_TYPE
@ POINT_MOTION_TYPE
Definition
MotionMaster.h:33
ScriptMgr.h
ScriptedCreature.h
SpellInfo.h
MOVE_RUN
@ MOVE_RUN
Definition
Unit.h:556
REACT_PASSIVE
@ REACT_PASSIVE
Definition
Unit.h:1156
UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_NON_ATTACKABLE
Definition
Unit.h:626
UNIT_FLAG_DISABLE_MOVE
@ UNIT_FLAG_DISABLE_MOVE
Definition
Unit.h:627
UNIT_FLAG_NOT_SELECTABLE
@ UNIT_FLAG_NOT_SELECTABLE
Definition
Unit.h:650
SELECT_TARGET_RANDOM
@ SELECT_TARGET_RANDOM
Definition
UnitAI.h:23
UNIT_FIELD_FLAGS
@ UNIT_FIELD_FLAGS
Definition
UpdateFields.h:82
Creatures
Creatures
Definition
alterac_valley.cpp:28
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
SAY_SPLIT
@ SAY_SPLIT
Definition
boss_halazzi.cpp:15
NPC_SPARK_OF_IONAR
@ NPC_SPARK_OF_IONAR
Definition
boss_ionar.cpp:41
DATA_MAX_SPARKS
@ DATA_MAX_SPARKS
Definition
boss_ionar.cpp:46
DATA_POINT_CALLBACK
@ DATA_POINT_CALLBACK
Definition
boss_ionar.cpp:47
SAY_DEATH
@ SAY_DEATH
Definition
boss_ionar.cpp:36
SAY_AGGRO
@ SAY_AGGRO
Definition
boss_ionar.cpp:33
SAY_SPLIT
@ SAY_SPLIT
Definition
boss_ionar.cpp:34
SAY_SLAY
@ SAY_SLAY
Definition
boss_ionar.cpp:35
SPELL_SUMMON_SPARK
@ SPELL_SUMMON_SPARK
Definition
boss_ionar.cpp:23
H_SPELL_BALL_LIGHTNING
@ H_SPELL_BALL_LIGHTNING
Definition
boss_ionar.cpp:18
SPELL_BALL_LIGHTNING
@ SPELL_BALL_LIGHTNING
Definition
boss_ionar.cpp:17
SPELL_SPARK_DESPAWN
@ SPELL_SPARK_DESPAWN
Definition
boss_ionar.cpp:24
H_SPELL_SPARK_VISUAL_TRIGGER
@ H_SPELL_SPARK_VISUAL_TRIGGER
Definition
boss_ionar.cpp:28
H_SPELL_STATIC_OVERLOAD
@ H_SPELL_STATIC_OVERLOAD
Definition
boss_ionar.cpp:20
SPELL_STATIC_OVERLOAD
@ SPELL_STATIC_OVERLOAD
Definition
boss_ionar.cpp:19
SPELL_DISPERSE
@ SPELL_DISPERSE
Definition
boss_ionar.cpp:22
SPELL_SPARK_VISUAL_TRIGGER
@ SPELL_SPARK_VISUAL_TRIGGER
Definition
boss_ionar.cpp:27
AddSC_boss_ionar
void AddSC_boss_ionar()
Definition
boss_ionar.cpp:363
Misc
Misc
Definition
boss_occuthar.cpp:37
SPELL_BALL_LIGHTNING
@ SPELL_BALL_LIGHTNING
Definition
boss_thaddius.cpp:69
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
Creature
Definition
Creature.h:427
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
InstanceScript
Definition
InstanceScript.h:123
SpellInfo
Definition
SpellInfo.h:158
SummonList
Definition
ScriptedCreature.h:19
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
UnitAI::DoCastVictim
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition
UnitAI.cpp:168
Unit
Definition
Unit.h:1367
Unit::IsAlive
bool IsAlive() const
Definition
Unit.h:2032
Unit::GetCreature
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4905
WorldObject::GetInstanceScript
InstanceScript * GetInstanceScript()
Definition
Object.cpp:1612
boss_ionar
Definition
boss_ionar.cpp:55
boss_ionar::boss_ionar
boss_ionar()
Definition
boss_ionar.cpp:57
boss_ionar::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_ionar.cpp:59
npc_spark_of_ionar
Definition
boss_ionar.cpp:283
npc_spark_of_ionar::npc_spark_of_ionar
npc_spark_of_ionar()
Definition
boss_ionar.cpp:285
npc_spark_of_ionar::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_ionar.cpp:287
halls_of_lightning.h
DATA_IONAR
@ DATA_IONAR
Definition
halls_of_lightning.h:18
Position
Definition
Object.h:274
Position::GetPosition
void GetPosition(float &x, float &y) const
Definition
Object.h:333
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
ScriptedAI::HealthBelowPct
bool HealthBelowPct(uint32 pct) const
Definition
ScriptedCreature.h:247
ScriptedAI::ScriptedAI
ScriptedAI(Creature *creature)
Definition
ScriptedCreature.cpp:85
ScriptedAI::DUNGEON_MODE
const T & DUNGEON_MODE(const T &normal5, const T &heroic5) const
Definition
ScriptedCreature.h:294
Yells
Definition
boss_illidan.cpp:256
boss_ionar::boss_ionarAI
Definition
boss_ionar.cpp:65
boss_ionar::boss_ionarAI::uiDisperseHealth
uint32 uiDisperseHealth
Definition
boss_ionar.cpp:83
boss_ionar::boss_ionarAI::CallBackSparks
void CallBackSparks()
Definition
boss_ionar.cpp:148
boss_ionar::boss_ionarAI::bHasDispersed
bool bHasDispersed
Definition
boss_ionar.cpp:76
boss_ionar::boss_ionarAI::JustSummoned
void JustSummoned(Creature *summoned) OVERRIDE
Definition
boss_ionar.cpp:179
boss_ionar::boss_ionarAI::SummonedCreatureDespawn
void SummonedCreatureDespawn(Creature *summoned) OVERRIDE
Definition
boss_ionar.cpp:196
boss_ionar::boss_ionarAI::KilledUnit
void KilledUnit(Unit *) OVERRIDE
Definition
boss_ionar.cpp:126
boss_ionar::boss_ionarAI::SpellHit
void SpellHit(Unit *, const SpellInfo *spell) OVERRIDE
Definition
boss_ionar.cpp:131
boss_ionar::boss_ionarAI::uiBallLightningTimer
uint32 uiBallLightningTimer
Definition
boss_ionar.cpp:81
boss_ionar::boss_ionarAI::uiSplitTimer
uint32 uiSplitTimer
Definition
boss_ionar.cpp:78
boss_ionar::boss_ionarAI::bIsSplitPhase
bool bIsSplitPhase
Definition
boss_ionar.cpp:75
boss_ionar::boss_ionarAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_ionar.cpp:116
boss_ionar::boss_ionarAI::instance
InstanceScript * instance
Definition
boss_ionar.cpp:71
boss_ionar::boss_ionarAI::UpdateAI
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_ionar.cpp:202
boss_ionar::boss_ionarAI::DamageTaken
void DamageTaken(Unit *, uint32 &uiDamage) OVERRIDE
Definition
boss_ionar.cpp:173
boss_ionar::boss_ionarAI::uiStaticOverloadTimer
uint32 uiStaticOverloadTimer
Definition
boss_ionar.cpp:80
boss_ionar::boss_ionarAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_ionar.cpp:108
boss_ionar::boss_ionarAI::Reset
void Reset() OVERRIDE
Definition
boss_ionar.cpp:85
boss_ionar::boss_ionarAI::boss_ionarAI
boss_ionarAI(Creature *creature)
Definition
boss_ionar.cpp:66
boss_ionar::boss_ionarAI::lSparkList
SummonList lSparkList
Definition
boss_ionar.cpp:73
npc_spark_of_ionar::npc_spark_of_ionarAI
Definition
boss_ionar.cpp:293
npc_spark_of_ionar::npc_spark_of_ionarAI::uiCheckTimer
uint32 uiCheckTimer
Definition
boss_ionar.cpp:301
npc_spark_of_ionar::npc_spark_of_ionarAI::Reset
void Reset() OVERRIDE
Definition
boss_ionar.cpp:303
npc_spark_of_ionar::npc_spark_of_ionarAI::npc_spark_of_ionarAI
npc_spark_of_ionarAI(Creature *creature)
Definition
boss_ionar.cpp:294
npc_spark_of_ionar::npc_spark_of_ionarAI::MovementInform
void MovementInform(uint32 uiType, uint32 uiPointId) OVERRIDE
Definition
boss_ionar.cpp:309
npc_spark_of_ionar::npc_spark_of_ionarAI::UpdateAI
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_ionar.cpp:323
npc_spark_of_ionar::npc_spark_of_ionarAI::DamageTaken
void DamageTaken(Unit *, uint32 &uiDamage) OVERRIDE
Definition
boss_ionar.cpp:318
npc_spark_of_ionar::npc_spark_of_ionarAI::instance
InstanceScript * instance
Definition
boss_ionar.cpp:299
src
server
scripts
Northrend
Ulduar
HallsOfLightning
boss_ionar.cpp
Generated on
for Project SkyFire Core by
1.17.0