Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_emalon.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 "
ScriptMgr.h
"
7
#include "
ScriptedCreature.h
"
8
#include "
SpellAuras.h
"
9
#include "
vault_of_archavon.h
"
10
11
enum
Spells
12
{
13
SPELL_OVERCHARGE
= 64218,
// Cast every 45 sec on a random Tempest Minion
14
SPELL_BERSERK
= 26662,
15
16
SPELL_SHOCK
= 64363,
17
SPELL_OVERCHARGED
= 64217,
18
SPELL_OVERCHARGED_BLAST
= 64219,
// Cast when Overcharged reaches 10 stacks. Mob dies after that
19
SPELL_CHAIN_LIGHTNING
= 64213,
20
SPELL_LIGHTNING_NOVA
= 64216
21
};
22
23
enum
Emotes
24
{
25
EMOTE_OVERCHARGE
= 0,
26
EMOTE_MINION_RESPAWN
= 1,
27
EMOTE_BERSERK
= 2
28
};
29
30
enum
Events
31
{
32
EVENT_CHAIN_LIGHTNING
= 1,
33
EVENT_LIGHTNING_NOVA
= 2,
34
EVENT_OVERCHARGE
= 3,
35
EVENT_BERSERK
= 4,
36
EVENT_SHOCK
= 5,
37
};
38
39
enum
Npcs
40
{
41
NPC_TEMPEST_MINION
= 33998
42
};
43
44
enum
Misc
45
{
46
MAX_TEMPEST_MINIONS
= 4
47
};
48
49
struct
Position
TempestMinions
[
MAX_TEMPEST_MINIONS
] =
50
{
51
{-203.980103f, -281.287720f, 91.650223f, 1.598807f},
52
{-233.489410f, -281.139282f, 91.652412f, 1.598807f},
53
{-233.267578f, -297.104645f, 91.681915f, 1.598807f},
54
{-203.842529f, -297.097015f, 91.745163f, 1.598807f}
55
};
56
57
/*######
58
## Emalon the Storm Watcher
59
######*/
60
class
boss_emalon
:
public
CreatureScript
61
{
62
public
:
63
boss_emalon
() :
CreatureScript
(
"boss_emalon"
) { }
64
65
struct
boss_emalonAI
:
public
BossAI
66
{
67
boss_emalonAI
(
Creature
* creature) :
BossAI
(creature,
DATA_EMALON
)
68
{
69
}
70
71
void
Reset
()
OVERRIDE
72
{
73
_Reset
();
74
75
for
(
uint8
i = 0; i <
MAX_TEMPEST_MINIONS
; ++i)
76
me
->SummonCreature(
NPC_TEMPEST_MINION
,
TempestMinions
[i],
TempSummonType::TEMPSUMMON_CORPSE_DESPAWN
, 0);
77
}
78
79
void
JustSummoned
(
Creature
* summoned)
OVERRIDE
80
{
81
BossAI::JustSummoned
(summoned);
82
83
// AttackStart has NULL-check for victim
84
if
(summoned->AI())
85
summoned->AI()->AttackStart(
me
->GetVictim());
86
}
87
88
void
EnterCombat
(
Unit
* who)
OVERRIDE
89
{
90
if
(!
summons
.empty())
91
{
92
for
(std::list<uint64>::const_iterator itr =
summons
.begin(); itr !=
summons
.end(); ++itr)
93
{
94
Creature
* minion =
Unit::GetCreature
(*
me
, *itr);
95
if
(minion && minion->
IsAlive
() && !minion->
GetVictim
() && minion->
AI
())
96
minion->
AI
()->
AttackStart
(who);
97
}
98
}
99
100
events
.ScheduleEvent(
EVENT_CHAIN_LIGHTNING
, 5000);
101
events
.ScheduleEvent(
EVENT_LIGHTNING_NOVA
, 40000);
102
events
.ScheduleEvent(
EVENT_BERSERK
, 360000);
103
events
.ScheduleEvent(
EVENT_OVERCHARGE
, 45000);
104
105
_EnterCombat
();
106
}
107
108
void
UpdateAI
(
uint32
diff)
OVERRIDE
109
{
110
if
(!
UpdateVictim
())
111
return
;
112
113
events
.Update(diff);
114
115
if
(
me
->HasUnitState(
UNIT_STATE_CASTING
))
116
return
;
117
118
while
(
uint32
eventId =
events
.ExecuteEvent())
119
{
120
switch
(eventId)
121
{
122
case
EVENT_CHAIN_LIGHTNING
:
123
if
(
Unit
* target =
SelectTarget
(
SELECT_TARGET_RANDOM
, 0))
124
DoCast
(target,
SPELL_CHAIN_LIGHTNING
);
125
events
.ScheduleEvent(
EVENT_CHAIN_LIGHTNING
, 25000);
126
break
;
127
case
EVENT_LIGHTNING_NOVA
:
128
DoCastAOE
(
SPELL_LIGHTNING_NOVA
);
129
events
.ScheduleEvent(
EVENT_LIGHTNING_NOVA
, 40000);
130
break
;
131
case
EVENT_OVERCHARGE
:
132
if
(!
summons
.empty())
133
{
134
Creature
* minion =
Unit::GetCreature
(*
me
,
Skyfire::Containers::SelectRandomContainerElement
(
summons
));
135
if
(minion && minion->
IsAlive
())
136
{
137
minion->
CastSpell
(
me
,
SPELL_OVERCHARGED
,
true
);
138
minion->
SetFullHealth
();
139
Talk
(
EMOTE_OVERCHARGE
);
140
events
.ScheduleEvent(
EVENT_OVERCHARGE
, 45000);
141
}
142
}
143
break
;
144
case
EVENT_BERSERK
:
145
DoCast
(
me
,
SPELL_BERSERK
);
146
Talk
(
EMOTE_BERSERK
);
147
break
;
148
default
:
149
break
;
150
}
151
}
152
153
DoMeleeAttackIfReady
();
154
}
155
};
156
157
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
158
{
159
return
new
boss_emalonAI
(creature);
160
}
161
};
162
163
/*######
164
## Tempest Minion
165
######*/
166
class
npc_tempest_minion
:
public
CreatureScript
167
{
168
public
:
169
npc_tempest_minion
() :
CreatureScript
(
"npc_tempest_minion"
) { }
170
171
struct
npc_tempest_minionAI
:
public
ScriptedAI
172
{
173
npc_tempest_minionAI
(
Creature
* creature) :
ScriptedAI
(creature)
174
{
175
instance
= creature->
GetInstanceScript
();
176
}
177
178
void
Reset
()
OVERRIDE
179
{
180
events
.Reset();
181
OverchargedTimer
= 0;
182
}
183
184
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
185
{
186
if
(
Creature
* emalon =
Unit::GetCreature
(*
me
,
instance
?
instance
->GetData64(
DATA_EMALON
) : 0))
187
{
188
if
(emalon->IsAlive())
189
{
190
emalon->SummonCreature(
NPC_TEMPEST_MINION
, 0, 0, 0, 0,
TempSummonType::TEMPSUMMON_CORPSE_DESPAWN
, 0);
191
Talk
(
EMOTE_MINION_RESPAWN
);
192
}
193
}
194
}
195
196
void
EnterCombat
(
Unit
* who)
OVERRIDE
197
{
198
DoZoneInCombat
();
199
events
.ScheduleEvent(
EVENT_SHOCK
, 20000);
200
201
if
(
Creature
* pEmalon =
Unit::GetCreature
(*
me
,
instance
?
instance
->GetData64(
DATA_EMALON
) : 0))
202
{
203
if
(!pEmalon->GetVictim() && pEmalon->AI())
204
pEmalon->AI()->AttackStart(who);
205
}
206
}
207
208
void
UpdateAI
(
uint32
diff)
OVERRIDE
209
{
210
//Return since we have no target
211
if
(!
UpdateVictim
())
212
return
;
213
214
events
.Update(diff);
215
216
if
(
me
->HasUnitState(
UNIT_STATE_CASTING
))
217
return
;
218
219
if
(
Aura
const
* overchargedAura =
me
->GetAura(
SPELL_OVERCHARGED
))
220
{
221
if
(overchargedAura->GetStackAmount() < 10)
222
{
223
if
(
OverchargedTimer
<= diff)
224
{
225
DoCast
(
me
,
SPELL_OVERCHARGED
);
226
OverchargedTimer
= 2000;
227
}
228
else
229
OverchargedTimer
-= diff;
230
}
231
else
232
{
233
if
(overchargedAura->GetStackAmount() == 10)
234
{
235
DoCast
(
me
,
SPELL_OVERCHARGED_BLAST
);
236
me
->DespawnOrUnsummon();
237
Talk
(
EMOTE_MINION_RESPAWN
);
238
}
239
}
240
}
241
242
if
(
events
.ExecuteEvent() ==
EVENT_SHOCK
)
243
{
244
DoCastVictim
(
SPELL_SHOCK
);
245
events
.ScheduleEvent(
EVENT_SHOCK
, 20000);
246
}
247
248
DoMeleeAttackIfReady
();
249
}
250
251
private
:
252
InstanceScript
*
instance
;
253
EventMap
events
;
254
uint32
OverchargedTimer
;
255
};
256
257
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
258
{
259
return
new
npc_tempest_minionAI
(creature);
260
}
261
};
262
263
void
AddSC_boss_emalon
()
264
{
265
new
boss_emalon
();
266
new
npc_tempest_minion
();
267
}
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
TempSummonType::TEMPSUMMON_CORPSE_DESPAWN
@ TEMPSUMMON_CORPSE_DESPAWN
Definition
Object.h:72
ScriptMgr.h
ScriptedCreature.h
SpellAuras.h
UNIT_STATE_CASTING
@ UNIT_STATE_CASTING
Definition
Unit.h:527
SELECT_TARGET_RANDOM
@ SELECT_TARGET_RANDOM
Definition
UnitAI.h:23
Events
Events
Definition
alterac_valley.cpp:40
Emotes
Emotes
Definition
boss_chromaggus.cpp:12
NPC_TEMPEST_MINION
@ NPC_TEMPEST_MINION
Definition
boss_emalon.cpp:41
EMOTE_OVERCHARGE
@ EMOTE_OVERCHARGE
Definition
boss_emalon.cpp:25
EMOTE_MINION_RESPAWN
@ EMOTE_MINION_RESPAWN
Definition
boss_emalon.cpp:26
EMOTE_BERSERK
@ EMOTE_BERSERK
Definition
boss_emalon.cpp:27
MAX_TEMPEST_MINIONS
@ MAX_TEMPEST_MINIONS
Definition
boss_emalon.cpp:46
SPELL_OVERCHARGED_BLAST
@ SPELL_OVERCHARGED_BLAST
Definition
boss_emalon.cpp:18
SPELL_SHOCK
@ SPELL_SHOCK
Definition
boss_emalon.cpp:16
SPELL_LIGHTNING_NOVA
@ SPELL_LIGHTNING_NOVA
Definition
boss_emalon.cpp:20
SPELL_CHAIN_LIGHTNING
@ SPELL_CHAIN_LIGHTNING
Definition
boss_emalon.cpp:19
SPELL_BERSERK
@ SPELL_BERSERK
Definition
boss_emalon.cpp:14
SPELL_OVERCHARGE
@ SPELL_OVERCHARGE
Definition
boss_emalon.cpp:13
SPELL_OVERCHARGED
@ SPELL_OVERCHARGED
Definition
boss_emalon.cpp:17
AddSC_boss_emalon
void AddSC_boss_emalon()
Definition
boss_emalon.cpp:263
TempestMinions
struct Position TempestMinions[MAX_TEMPEST_MINIONS]
Definition
boss_emalon.cpp:49
EVENT_CHAIN_LIGHTNING
@ EVENT_CHAIN_LIGHTNING
Definition
boss_emalon.cpp:32
EVENT_SHOCK
@ EVENT_SHOCK
Definition
boss_emalon.cpp:36
EVENT_LIGHTNING_NOVA
@ EVENT_LIGHTNING_NOVA
Definition
boss_emalon.cpp:33
EVENT_OVERCHARGE
@ EVENT_OVERCHARGE
Definition
boss_emalon.cpp:34
EVENT_BERSERK
@ EVENT_BERSERK
Definition
boss_emalon.cpp:35
Npcs
Npcs
Definition
boss_eregos.cpp:46
SPELL_BERSERK
#define SPELL_BERSERK
Definition
boss_four_horsemen.cpp:62
EMOTE_BERSERK
@ EMOTE_BERSERK
Definition
boss_huhuran.cpp:19
EVENT_SHOCK
@ EVENT_SHOCK
Definition
boss_maexxna.cpp:42
Misc
Misc
Definition
boss_occuthar.cpp:37
EVENT_BERSERK
@ EVENT_BERSERK
Definition
boss_occuthar.cpp:31
EVENT_CHAIN_LIGHTNING
@ EVENT_CHAIN_LIGHTNING
Definition
boss_sjonnir.cpp:44
SPELL_SHOCK
@ SPELL_SHOCK
Definition
boss_xt002.cpp:63
SPELL_CHAIN_LIGHTNING
@ SPELL_CHAIN_LIGHTNING
Definition
bosses_opera.cpp:73
Aura
Definition
SpellAuras.h:74
BossAI::JustSummoned
void JustSummoned(Creature *summon) OVERRIDE
Definition
ScriptedCreature.cpp:562
BossAI::summons
SummonList summons
Definition
ScriptedCreature.h:440
BossAI::events
EventMap events
Definition
ScriptedCreature.h:439
BossAI::BossAI
BossAI(Creature *creature, uint32 bossId)
Definition
ScriptedCreature.cpp:456
BossAI::_Reset
void _Reset()
Definition
ScriptedCreature.cpp:462
BossAI::_EnterCombat
void _EnterCombat()
Definition
ScriptedCreature.cpp:485
CreatureAI
Definition
CreatureAI.h:54
CreatureAI::DoZoneInCombat
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
Definition
CreatureAI.cpp:33
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
Creature::AI
CreatureAI * AI() const
Definition
Creature.h:483
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
EventMap
Definition
CreatureAIImpl.h:304
InstanceScript
Definition
InstanceScript.h:123
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
UnitAI::DoCastAOE
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition
UnitAI.cpp:176
UnitAI::AttackStart
virtual void AttackStart(Unit *)
Definition
UnitAI.cpp:16
Unit
Definition
Unit.h:1367
Unit::SetFullHealth
void SetFullHealth()
Definition
Unit.h:1644
Unit::CastSpell
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
Definition
UnitCombat.cpp:324
Unit::IsAlive
bool IsAlive() const
Definition
Unit.h:2032
Unit::GetCreature
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4905
Unit::GetVictim
Unit * GetVictim() const
Definition
Unit.h:1468
WorldObject::GetInstanceScript
InstanceScript * GetInstanceScript()
Definition
Object.cpp:1612
boss_emalon
Definition
boss_emalon.cpp:61
boss_emalon::boss_emalon
boss_emalon()
Definition
boss_emalon.cpp:63
boss_emalon::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_emalon.cpp:157
npc_tempest_minion
Definition
boss_emalon.cpp:167
npc_tempest_minion::npc_tempest_minion
npc_tempest_minion()
Definition
boss_emalon.cpp:169
npc_tempest_minion::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_emalon.cpp:257
Skyfire::Containers::SelectRandomContainerElement
C::value_type const & SelectRandomContainerElement(C const &container)
Definition
Containers.h:48
Position
Definition
Object.h:274
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
ScriptedAI::ScriptedAI
ScriptedAI(Creature *creature)
Definition
ScriptedCreature.cpp:85
boss_emalon::boss_emalonAI
Definition
boss_emalon.cpp:66
boss_emalon::boss_emalonAI::JustSummoned
void JustSummoned(Creature *summoned) OVERRIDE
Definition
boss_emalon.cpp:79
boss_emalon::boss_emalonAI::EnterCombat
void EnterCombat(Unit *who) OVERRIDE
Definition
boss_emalon.cpp:88
boss_emalon::boss_emalonAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_emalon.cpp:108
boss_emalon::boss_emalonAI::boss_emalonAI
boss_emalonAI(Creature *creature)
Definition
boss_emalon.cpp:67
boss_emalon::boss_emalonAI::Reset
void Reset() OVERRIDE
Definition
boss_emalon.cpp:71
npc_tempest_minion::npc_tempest_minionAI
Definition
boss_emalon.cpp:172
npc_tempest_minion::npc_tempest_minionAI::npc_tempest_minionAI
npc_tempest_minionAI(Creature *creature)
Definition
boss_emalon.cpp:173
npc_tempest_minion::npc_tempest_minionAI::EnterCombat
void EnterCombat(Unit *who) OVERRIDE
Definition
boss_emalon.cpp:196
npc_tempest_minion::npc_tempest_minionAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_emalon.cpp:184
npc_tempest_minion::npc_tempest_minionAI::events
EventMap events
Definition
boss_emalon.cpp:253
npc_tempest_minion::npc_tempest_minionAI::Reset
void Reset() OVERRIDE
Definition
boss_emalon.cpp:178
npc_tempest_minion::npc_tempest_minionAI::instance
InstanceScript * instance
Definition
boss_emalon.cpp:252
npc_tempest_minion::npc_tempest_minionAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_emalon.cpp:208
npc_tempest_minion::npc_tempest_minionAI::OverchargedTimer
uint32 OverchargedTimer
Definition
boss_emalon.cpp:254
vault_of_archavon.h
DATA_EMALON
@ DATA_EMALON
Definition
vault_of_archavon.h:14
src
server
scripts
Northrend
VaultOfArchavon
boss_emalon.cpp
Generated on
for Project SkyFire Core by
1.17.0