Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_viscidus.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 "
SpellInfo.h
"
9
#include "
temple_of_ahnqiraj.h
"
10
11
enum
Spells
12
{
13
SPELL_POISON_SHOCK
= 25993,
14
SPELL_POISONBOLT_VOLLEY
= 25991,
15
SPELL_TOXIN
= 26575,
16
SPELL_VISCIDUS_SLOWED
= 26034,
17
SPELL_VISCIDUS_SLOWED_MORE
= 26036,
18
SPELL_VISCIDUS_FREEZE
= 25937,
19
SPELL_REJOIN_VISCIDUS
= 25896,
20
SPELL_VISCIDUS_EXPLODE
= 25938,
21
SPELL_VISCIDUS_SUICIDE
= 26003,
22
SPELL_VISCIDUS_SHRINKS
= 25893,
// Removed from client, in world.spell_dbc
23
24
SPELL_MEMBRANE_VISCIDUS
= 25994,
// damage reduction spell - removed from DBC
25
SPELL_VISCIDUS_WEAKNESS
= 25926,
// aura which procs at damage - should trigger the slow spells - removed from DBC
26
SPELL_VISCIDUS_GROWS
= 25897,
// removed from DBC
27
SPELL_SUMMON_GLOBS
= 25885,
// summons npc 15667 using spells from 25865 to 25884; All spells have target coords - removed from DBC
28
SPELL_VISCIDUS_TELEPORT
= 25904,
// removed from DBC
29
};
30
31
enum
Events
32
{
33
EVENT_POISONBOLT_VOLLEY
= 1,
34
EVENT_POISON_SHOCK
= 2,
35
EVENT_RESET_PHASE
= 3
36
};
37
38
enum
Phases
39
{
40
PHASE_FROST
= 1,
41
PHASE_MELEE
= 2,
42
PHASE_GLOB
= 3
43
};
44
45
enum
Emotes
46
{
47
EMOTE_SLOW
= 0,
48
EMOTE_FREEZE
= 1,
49
EMOTE_FROZEN
= 2,
50
51
EMOTE_CRACK
= 3,
52
EMOTE_SHATTER
= 4,
53
EMOTE_EXPLODE
= 5
54
};
55
56
enum
HitCounter
57
{
58
HITCOUNTER_SLOW
= 100,
59
HITCOUNTER_SLOW_MORE
= 150,
60
HITCOUNTER_FREEZE
= 200,
61
62
HITCOUNTER_CRACK
= 50,
63
HITCOUNTER_SHATTER
= 100,
64
HITCOUNTER_EXPLODE
= 150,
65
};
66
67
enum
MovePoints
68
{
69
ROOM_CENTER
= 1
70
};
71
72
Position
const
ViscidusCoord
= { -7992.36f, 908.19f, -52.62f, 1.68f };
73
float
const
RoomRadius
= 40.0f;
74
75
class
boss_viscidus
:
public
CreatureScript
76
{
77
public
:
78
boss_viscidus
() :
CreatureScript
(
"boss_viscidus"
) { }
79
80
struct
boss_viscidusAI
:
public
BossAI
81
{
82
boss_viscidusAI
(
Creature
* creature) :
BossAI
(creature,
DATA_VISCIDUS
) { }
83
84
void
Reset
()
OVERRIDE
85
{
86
_Reset
();
87
_hitcounter
= 0;
88
_phase
=
PHASE_FROST
;
89
}
90
91
void
DamageTaken
(
Unit
* attacker,
uint32
&
/*damage*/
)
OVERRIDE
92
{
93
if
(
_phase
!=
PHASE_MELEE
)
94
return
;
95
96
++
_hitcounter
;
97
98
if
(attacker->HasUnitState(
UNIT_STATE_MELEE_ATTACKING
) &&
_hitcounter
>=
HITCOUNTER_EXPLODE
)
99
{
100
Talk
(
EMOTE_EXPLODE
);
101
events
.Reset();
102
_phase
=
PHASE_GLOB
;
103
DoCast
(
me
,
SPELL_VISCIDUS_EXPLODE
);
104
me
->SetVisible(
false
);
105
me
->RemoveAura(
SPELL_TOXIN
);
106
me
->RemoveAura(
SPELL_VISCIDUS_FREEZE
);
107
108
uint8
NumGlobes =
me
->GetHealthPct() / 5.0f;
109
for
(
uint8
i = 0; i < NumGlobes; ++i)
110
{
111
float
Angle = i * 2 *
M_PI
/ NumGlobes;
112
float
X =
ViscidusCoord
.GetPositionX() + std::cos(Angle) *
RoomRadius
;
113
float
Y =
ViscidusCoord
.GetPositionY() + std::sin(Angle) *
RoomRadius
;
114
float
Z = -35.0f;
115
116
if
(
TempSummon
* Glob =
me
->SummonCreature(
NPC_GLOB_OF_VISCIDUS
, X, Y, Z))
117
{
118
Glob->UpdateAllowedPositionZ(X, Y, Z);
119
Glob->NearTeleportTo(X, Y, Z, 0.0f);
120
Glob->GetMotionMaster()->MovePoint(
ROOM_CENTER
,
ViscidusCoord
);
121
}
122
}
123
}
124
else
if
(
_hitcounter
==
HITCOUNTER_SHATTER
)
125
Talk
(
EMOTE_SHATTER
);
126
else
if
(
_hitcounter
==
HITCOUNTER_CRACK
)
127
Talk
(
EMOTE_CRACK
);
128
}
129
130
void
SpellHit
(
Unit
*
/*caster*/
,
SpellInfo
const
* spell)
OVERRIDE
131
{
132
if
((spell->GetSchoolMask() &
SPELL_SCHOOL_MASK_FROST
) &&
_phase
==
PHASE_FROST
&&
me
->GetHealthPct() > 5.0f)
133
{
134
++
_hitcounter
;
135
136
if
(
_hitcounter
>=
HITCOUNTER_FREEZE
)
137
{
138
_hitcounter
= 0;
139
Talk
(
EMOTE_FROZEN
);
140
_phase
=
PHASE_MELEE
;
141
DoCast
(
me
,
SPELL_VISCIDUS_FREEZE
);
142
me
->RemoveAura(
SPELL_VISCIDUS_SLOWED_MORE
);
143
events
.ScheduleEvent(
EVENT_RESET_PHASE
, 15000);
144
}
145
else
if
(
_hitcounter
>=
HITCOUNTER_SLOW_MORE
)
146
{
147
Talk
(
EMOTE_FREEZE
);
148
me
->RemoveAura(
SPELL_VISCIDUS_SLOWED
);
149
DoCast
(
me
,
SPELL_VISCIDUS_SLOWED_MORE
);
150
}
151
else
if
(
_hitcounter
>=
HITCOUNTER_SLOW
)
152
{
153
Talk
(
EMOTE_SLOW
);
154
DoCast
(
me
,
SPELL_VISCIDUS_SLOWED
);
155
}
156
}
157
}
158
159
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
160
{
161
_EnterCombat
();
162
events
.Reset();
163
InitSpells
();
164
}
165
166
void
InitSpells
()
167
{
168
DoCast
(
me
,
SPELL_TOXIN
);
169
events
.ScheduleEvent(
EVENT_POISONBOLT_VOLLEY
, std::rand() % 15000 + 10000);
170
events
.ScheduleEvent(
EVENT_POISON_SHOCK
, std::rand() % 12000 + 7000);
171
}
172
173
void
EnterEvadeMode
()
OVERRIDE
174
{
175
summons
.DespawnAll();
176
ScriptedAI::EnterEvadeMode
();
177
}
178
179
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
180
{
181
DoCast
(
me
,
SPELL_VISCIDUS_SUICIDE
);
182
summons
.DespawnAll();
183
}
184
185
void
UpdateAI
(
uint32
diff)
OVERRIDE
186
{
187
if
(!
UpdateVictim
())
188
return
;
189
190
if
(
_phase
==
PHASE_GLOB
&&
summons
.empty())
191
{
192
DoResetThreat
();
193
me
->NearTeleportTo(
ViscidusCoord
.GetPositionX(),
194
ViscidusCoord
.GetPositionY(),
195
ViscidusCoord
.GetPositionZ(),
196
ViscidusCoord
.GetOrientation());
197
198
_hitcounter
= 0;
199
_phase
=
PHASE_FROST
;
200
InitSpells
();
201
me
->SetVisible(
true
);
202
}
203
204
events
.Update(diff);
205
206
while
(
uint32
eventId =
events
.ExecuteEvent())
207
{
208
switch
(eventId)
209
{
210
case
EVENT_POISONBOLT_VOLLEY
:
211
DoCast
(
me
,
SPELL_POISONBOLT_VOLLEY
);
212
events
.ScheduleEvent(
EVENT_POISONBOLT_VOLLEY
, std::rand() % 15000 + 10000);
213
break
;
214
case
EVENT_POISON_SHOCK
:
215
DoCast
(
me
,
SPELL_POISON_SHOCK
);
216
events
.ScheduleEvent(
EVENT_POISON_SHOCK
, std::rand() % 12000 + 7000);
217
break
;
218
case
EVENT_RESET_PHASE
:
219
_hitcounter
= 0;
220
_phase
=
PHASE_FROST
;
221
break
;
222
default
:
223
break
;
224
}
225
}
226
227
if
(
_phase
!=
PHASE_GLOB
)
228
DoMeleeAttackIfReady
();
229
}
230
231
private
:
232
uint8
_hitcounter
;
233
Phases
_phase
;
234
};
235
236
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
237
{
238
return
new
boss_viscidusAI
(creature);
239
}
240
};
241
242
class
npc_glob_of_viscidus
:
public
CreatureScript
243
{
244
public
:
245
npc_glob_of_viscidus
() :
CreatureScript
(
"boss_glob_of_viscidus"
) { }
246
247
struct
npc_glob_of_viscidusAI
:
public
ScriptedAI
248
{
249
npc_glob_of_viscidusAI
(
Creature
* creature) :
ScriptedAI
(creature) { }
250
251
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
252
{
253
InstanceScript
* Instance =
me
->GetInstanceScript();
254
if
(!Instance)
255
return
;
256
257
if
(
Creature
* Viscidus =
me
->GetMap()->GetCreature(Instance->
GetData64
(
DATA_VISCIDUS
)))
258
{
259
if
(
BossAI
* ViscidusAI =
dynamic_cast<
BossAI
*
>
(Viscidus->GetAI()))
260
ViscidusAI->SummonedCreatureDespawn(
me
);
261
262
if
(Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f)
263
{
264
Viscidus->SetVisible(
true
);
265
Viscidus->GetVictim()->Kill(Viscidus);
266
}
267
else
268
{
269
Viscidus->SetHealth(Viscidus->GetHealth() - Viscidus->GetMaxHealth() / 20);
270
Viscidus->CastSpell(Viscidus,
SPELL_VISCIDUS_SHRINKS
);
271
}
272
}
273
}
274
275
void
MovementInform
(
uint32
/*type*/
,
uint32
id
)
OVERRIDE
276
{
277
if
(
id
==
ROOM_CENTER
)
278
{
279
DoCast
(
me
,
SPELL_REJOIN_VISCIDUS
);
280
((
TempSummon
*)
me
)->UnSummon();
281
}
282
}
283
};
284
285
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
286
{
287
return
new
npc_glob_of_viscidusAI
(creature);
288
}
289
};
290
291
void
AddSC_boss_viscidus
()
292
{
293
new
boss_viscidus
();
294
new
npc_glob_of_viscidus
();
295
}
Spells
Spells
Definition
BattlegroundIC.h:645
M_PI
#define M_PI
Definition
Common.h:192
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
ScriptMgr.h
ScriptedCreature.h
SPELL_SCHOOL_MASK_FROST
@ SPELL_SCHOOL_MASK_FROST
Definition
SharedDefines.h:274
SpellInfo.h
UNIT_STATE_MELEE_ATTACKING
@ UNIT_STATE_MELEE_ATTACKING
Definition
Unit.h:513
Events
Events
Definition
alterac_valley.cpp:40
Phases
Phases
Definition
boss_anraphet.cpp:80
Emotes
Emotes
Definition
boss_chromaggus.cpp:12
RoomRadius
float RoomRadius
Definition
boss_ossirian.cpp:64
AddSC_boss_viscidus
void AddSC_boss_viscidus()
Definition
boss_viscidus.cpp:291
EMOTE_SLOW
@ EMOTE_SLOW
Definition
boss_viscidus.cpp:47
EMOTE_CRACK
@ EMOTE_CRACK
Definition
boss_viscidus.cpp:51
EMOTE_FREEZE
@ EMOTE_FREEZE
Definition
boss_viscidus.cpp:48
EMOTE_FROZEN
@ EMOTE_FROZEN
Definition
boss_viscidus.cpp:49
EMOTE_EXPLODE
@ EMOTE_EXPLODE
Definition
boss_viscidus.cpp:53
EMOTE_SHATTER
@ EMOTE_SHATTER
Definition
boss_viscidus.cpp:52
ViscidusCoord
Position const ViscidusCoord
Definition
boss_viscidus.cpp:72
SPELL_POISON_SHOCK
@ SPELL_POISON_SHOCK
Definition
boss_viscidus.cpp:13
SPELL_VISCIDUS_TELEPORT
@ SPELL_VISCIDUS_TELEPORT
Definition
boss_viscidus.cpp:28
SPELL_VISCIDUS_SLOWED_MORE
@ SPELL_VISCIDUS_SLOWED_MORE
Definition
boss_viscidus.cpp:17
SPELL_POISONBOLT_VOLLEY
@ SPELL_POISONBOLT_VOLLEY
Definition
boss_viscidus.cpp:14
SPELL_VISCIDUS_GROWS
@ SPELL_VISCIDUS_GROWS
Definition
boss_viscidus.cpp:26
SPELL_VISCIDUS_SHRINKS
@ SPELL_VISCIDUS_SHRINKS
Definition
boss_viscidus.cpp:22
SPELL_VISCIDUS_FREEZE
@ SPELL_VISCIDUS_FREEZE
Definition
boss_viscidus.cpp:18
SPELL_TOXIN
@ SPELL_TOXIN
Definition
boss_viscidus.cpp:15
SPELL_VISCIDUS_SUICIDE
@ SPELL_VISCIDUS_SUICIDE
Definition
boss_viscidus.cpp:21
SPELL_VISCIDUS_WEAKNESS
@ SPELL_VISCIDUS_WEAKNESS
Definition
boss_viscidus.cpp:25
SPELL_VISCIDUS_SLOWED
@ SPELL_VISCIDUS_SLOWED
Definition
boss_viscidus.cpp:16
SPELL_MEMBRANE_VISCIDUS
@ SPELL_MEMBRANE_VISCIDUS
Definition
boss_viscidus.cpp:24
SPELL_REJOIN_VISCIDUS
@ SPELL_REJOIN_VISCIDUS
Definition
boss_viscidus.cpp:19
SPELL_VISCIDUS_EXPLODE
@ SPELL_VISCIDUS_EXPLODE
Definition
boss_viscidus.cpp:20
SPELL_SUMMON_GLOBS
@ SPELL_SUMMON_GLOBS
Definition
boss_viscidus.cpp:27
Phases
Phases
Definition
boss_viscidus.cpp:39
PHASE_GLOB
@ PHASE_GLOB
Definition
boss_viscidus.cpp:42
PHASE_MELEE
@ PHASE_MELEE
Definition
boss_viscidus.cpp:41
PHASE_FROST
@ PHASE_FROST
Definition
boss_viscidus.cpp:40
RoomRadius
float const RoomRadius
Definition
boss_viscidus.cpp:73
MovePoints
MovePoints
Definition
boss_viscidus.cpp:68
ROOM_CENTER
@ ROOM_CENTER
Definition
boss_viscidus.cpp:69
HitCounter
HitCounter
Definition
boss_viscidus.cpp:57
HITCOUNTER_CRACK
@ HITCOUNTER_CRACK
Definition
boss_viscidus.cpp:62
HITCOUNTER_SLOW
@ HITCOUNTER_SLOW
Definition
boss_viscidus.cpp:58
HITCOUNTER_EXPLODE
@ HITCOUNTER_EXPLODE
Definition
boss_viscidus.cpp:64
HITCOUNTER_SLOW_MORE
@ HITCOUNTER_SLOW_MORE
Definition
boss_viscidus.cpp:59
HITCOUNTER_SHATTER
@ HITCOUNTER_SHATTER
Definition
boss_viscidus.cpp:63
HITCOUNTER_FREEZE
@ HITCOUNTER_FREEZE
Definition
boss_viscidus.cpp:60
EVENT_POISONBOLT_VOLLEY
@ EVENT_POISONBOLT_VOLLEY
Definition
boss_viscidus.cpp:33
EVENT_POISON_SHOCK
@ EVENT_POISON_SHOCK
Definition
boss_viscidus.cpp:34
EVENT_RESET_PHASE
@ EVENT_RESET_PHASE
Definition
boss_viscidus.cpp:35
BossAI
Definition
ScriptedCreature.h:377
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::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
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
InstanceScript
Definition
InstanceScript.h:123
SpellInfo
Definition
SpellInfo.h:158
TempSummon
Definition
TemporarySummon.h:27
UnitAI::DoMeleeAttackIfReady
void DoMeleeAttackIfReady()
Definition
UnitAI.cpp:28
UnitAI::DoCast
void DoCast(uint32 spellId)
Definition
UnitAI.cpp:110
Unit
Definition
Unit.h:1367
ZoneScript::GetData64
virtual uint64 GetData64(uint32) const
Definition
ZoneScript.h:32
boss_viscidus
Definition
boss_viscidus.cpp:76
boss_viscidus::boss_viscidus
boss_viscidus()
Definition
boss_viscidus.cpp:78
boss_viscidus::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_viscidus.cpp:236
npc_glob_of_viscidus
Definition
boss_viscidus.cpp:243
npc_glob_of_viscidus::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_viscidus.cpp:285
npc_glob_of_viscidus::npc_glob_of_viscidus
npc_glob_of_viscidus()
Definition
boss_viscidus.cpp:245
Position
Definition
Object.h:274
ScriptedAI::DoResetThreat
void DoResetThreat()
Definition
ScriptedCreature.cpp:260
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
ScriptedAI::ScriptedAI
ScriptedAI(Creature *creature)
Definition
ScriptedCreature.cpp:85
boss_viscidus::boss_viscidusAI
Definition
boss_viscidus.cpp:81
boss_viscidus::boss_viscidusAI::DamageTaken
void DamageTaken(Unit *attacker, uint32 &) OVERRIDE
Definition
boss_viscidus.cpp:91
boss_viscidus::boss_viscidusAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_viscidus.cpp:159
boss_viscidus::boss_viscidusAI::boss_viscidusAI
boss_viscidusAI(Creature *creature)
Definition
boss_viscidus.cpp:82
boss_viscidus::boss_viscidusAI::SpellHit
void SpellHit(Unit *, SpellInfo const *spell) OVERRIDE
Definition
boss_viscidus.cpp:130
boss_viscidus::boss_viscidusAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_viscidus.cpp:185
boss_viscidus::boss_viscidusAI::EnterEvadeMode
void EnterEvadeMode() OVERRIDE
Definition
boss_viscidus.cpp:173
boss_viscidus::boss_viscidusAI::Reset
void Reset() OVERRIDE
Definition
boss_viscidus.cpp:84
boss_viscidus::boss_viscidusAI::_phase
Phases _phase
Definition
boss_viscidus.cpp:233
boss_viscidus::boss_viscidusAI::_hitcounter
uint8 _hitcounter
Definition
boss_viscidus.cpp:232
boss_viscidus::boss_viscidusAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_viscidus.cpp:179
boss_viscidus::boss_viscidusAI::InitSpells
void InitSpells()
Definition
boss_viscidus.cpp:166
npc_glob_of_viscidus::npc_glob_of_viscidusAI
Definition
boss_viscidus.cpp:248
npc_glob_of_viscidus::npc_glob_of_viscidusAI::MovementInform
void MovementInform(uint32, uint32 id) OVERRIDE
Definition
boss_viscidus.cpp:275
npc_glob_of_viscidus::npc_glob_of_viscidusAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_viscidus.cpp:251
npc_glob_of_viscidus::npc_glob_of_viscidusAI::npc_glob_of_viscidusAI
npc_glob_of_viscidusAI(Creature *creature)
Definition
boss_viscidus.cpp:249
temple_of_ahnqiraj.h
NPC_GLOB_OF_VISCIDUS
@ NPC_GLOB_OF_VISCIDUS
Definition
temple_of_ahnqiraj.h:41
DATA_VISCIDUS
@ DATA_VISCIDUS
Definition
temple_of_ahnqiraj.h:24
src
server
scripts
Kalimdor
TempleOfAhnQiraj
boss_viscidus.cpp
Generated on
for Project SkyFire Core by
1.17.0