Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_gruul.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_Gruul
8
SD%Complete: 60
9
SDComment: Ground Slam need further development (knock back effect must be added to the core)
10
SDCategory: Gruul's Lair
11
EndScriptData */
12
13
#include "
ScriptMgr.h
"
14
#include "
ScriptedCreature.h
"
15
#include "
SpellScript.h
"
16
#include "
gruuls_lair.h
"
17
18
enum
Yells
19
{
20
SAY_AGGRO
= 0,
21
SAY_SLAM
= 1,
22
SAY_SHATTER
= 2,
23
SAY_SLAY
= 3,
24
SAY_DEATH
= 4,
25
26
EMOTE_GROW
= 5
27
};
28
29
enum
Spells
30
{
31
SPELL_GROWTH
= 36300,
32
SPELL_CAVE_IN
= 36240,
33
SPELL_GROUND_SLAM
= 33525,
// AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
34
SPELL_REVERBERATION
= 36297,
35
SPELL_SHATTER
= 33654,
36
37
SPELL_SHATTER_EFFECT
= 33671,
38
SPELL_HURTFUL_STRIKE
= 33813,
39
SPELL_STONED
= 33652,
// Spell is self cast by target
40
41
SPELL_MAGNETIC_PULL
= 28337,
42
SPELL_KNOCK_BACK
= 24199,
// Knockback spell until correct implementation is made
43
};
44
45
enum
Events
46
{
47
EVENT_GROWTH
= 1,
48
EVENT_CAVE_IN
,
49
EVENT_CAVE_IN_STATIC
,
50
EVENT_GROUND_SLAM
,
51
EVENT_HURTFUL_STRIKE
,
52
EVENT_REVERBERATION
53
};
54
55
class
boss_gruul
:
public
CreatureScript
56
{
57
public
:
58
boss_gruul
() :
CreatureScript
(
"boss_gruul"
) { }
59
60
struct
boss_gruulAI
:
public
BossAI
61
{
62
boss_gruulAI
(
Creature
* creature) :
BossAI
(creature,
DATA_GRUUL
) { }
63
64
uint32
m_uiGrowth_Timer
;
65
uint32
m_uiCaveIn_Timer
;
66
uint32
m_uiCaveIn_StaticTimer
;
67
uint32
m_uiGroundSlamTimer
;
68
uint32
m_uiHurtfulStrike_Timer
;
69
uint32
m_uiReverberation_Timer
;
70
71
bool
m_bPerformingGroundSlam
;
72
73
void
Reset
()
OVERRIDE
74
{
75
_Reset
();
76
m_uiGrowth_Timer
= 30000;
77
m_uiCaveIn_Timer
= 27000;
78
m_uiCaveIn_StaticTimer
= 30000;
79
m_uiGroundSlamTimer
= 35000;
80
m_bPerformingGroundSlam
=
false
;
81
m_uiHurtfulStrike_Timer
= 8000;
82
m_uiReverberation_Timer
= 60000+45000;
83
}
84
85
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
86
{
87
_EnterCombat
();
88
Talk
(
SAY_AGGRO
);
89
}
90
91
void
KilledUnit
(
Unit
* who)
OVERRIDE
92
{
93
if
(who->GetTypeId() ==
TypeID::TYPEID_PLAYER
)
94
Talk
(
SAY_SLAY
);
95
}
96
97
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
98
{
99
_JustDied
();
100
Talk
(
SAY_DEATH
);
101
}
102
103
void
SpellHitTarget
(
Unit
* target,
const
SpellInfo
* pSpell)
OVERRIDE
104
{
105
//This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction
106
//It's initially wrong, since this will cause fall damage, which is by comments, not intended.
107
if
(pSpell->Id ==
SPELL_GROUND_SLAM
)
108
{
109
if
(target->GetTypeId() ==
TypeID::TYPEID_PLAYER
)
110
{
111
switch
(std::rand() % 1)
112
{
113
case
0:
114
target->CastSpell(target,
SPELL_MAGNETIC_PULL
,
true
, NULL, NULL,
me
->GetGUID());
115
break
;
116
117
case
1:
118
target->CastSpell(target,
SPELL_KNOCK_BACK
,
true
, NULL, NULL,
me
->GetGUID());
119
break
;
120
}
121
}
122
}
123
124
//this part should be in the core
125
if
(pSpell->Id ==
SPELL_SHATTER
)
126
{
128
//clear this, if we are still performing
129
if
(
m_bPerformingGroundSlam
)
130
{
131
m_bPerformingGroundSlam
=
false
;
132
133
//and correct movement, if not already
134
if
(
me
->GetMotionMaster()->GetCurrentMovementGeneratorType() !=
CHASE_MOTION_TYPE
)
135
{
136
if
(
me
->GetVictim())
137
me
->GetMotionMaster()->MoveChase(
me
->GetVictim());
138
}
139
}
140
}
141
}
142
143
void
UpdateAI
(
uint32
diff)
OVERRIDE
144
{
145
if
(!
UpdateVictim
())
146
return
;
147
148
events
.Update(diff);
149
150
if
(
me
->HasUnitState(
UNIT_STATE_CASTING
))
151
return
;
152
154
155
// Growth
156
// Gruul can cast this spell up to 30 times
157
if
(
m_uiGrowth_Timer
<= diff)
158
{
159
Talk
(
EMOTE_GROW
);
160
DoCast
(
me
,
SPELL_GROWTH
);
161
m_uiGrowth_Timer
= 30000;
162
}
163
else
164
m_uiGrowth_Timer
-= diff;
165
166
if
(
m_bPerformingGroundSlam
)
167
{
168
if
(
m_uiGroundSlamTimer
<= diff)
169
{
170
m_uiGroundSlamTimer
=120000;
171
m_uiHurtfulStrike_Timer
= 8000;
172
173
if
(
m_uiReverberation_Timer
< 10000)
//Give a little time to the players to undo the damage from shatter
174
m_uiReverberation_Timer
+= 10000;
175
176
DoCast
(
me
,
SPELL_SHATTER
);
177
}
178
else
179
m_uiGroundSlamTimer
-= diff;
180
}
181
else
182
{
183
// Hurtful Strike
184
if
(
m_uiHurtfulStrike_Timer
<= diff)
185
{
186
Unit
* target =
SelectTarget
(
SELECT_TARGET_TOPAGGRO
, 1);
187
188
if
(target &&
me
->IsWithinMeleeRange(
me
->GetVictim()))
189
DoCast
(target,
SPELL_HURTFUL_STRIKE
);
190
else
191
DoCastVictim
(
SPELL_HURTFUL_STRIKE
);
192
193
m_uiHurtfulStrike_Timer
= 8000;
194
}
195
else
196
m_uiHurtfulStrike_Timer
-= diff;
197
198
// Reverberation
199
if
(
m_uiReverberation_Timer
<= diff)
200
{
201
DoCastVictim
(
SPELL_REVERBERATION
,
true
);
202
m_uiReverberation_Timer
= std::rand() % 25000 + 15000;
203
}
204
else
205
m_uiReverberation_Timer
-= diff;
206
207
// Cave In
208
if
(
m_uiCaveIn_Timer
<= diff)
209
{
210
if
(
Unit
* target =
SelectTarget
(
SELECT_TARGET_RANDOM
, 0))
211
DoCast
(target,
SPELL_CAVE_IN
);
212
213
if
(
m_uiCaveIn_StaticTimer
>= 4000)
214
m_uiCaveIn_StaticTimer
-= 2000;
215
m_uiCaveIn_Timer
=
m_uiCaveIn_StaticTimer
;
216
}
217
else
218
m_uiCaveIn_Timer
-= diff;
219
220
// Ground Slam, Gronn Lord's Grasp, Stoned, Shatter
221
if
(
m_uiGroundSlamTimer
<= diff)
222
{
223
me
->GetMotionMaster()->Clear();
224
me
->GetMotionMaster()->MoveIdle();
225
226
m_bPerformingGroundSlam
=
true
;
227
m_uiGroundSlamTimer
= 10000;
228
229
DoCast
(
me
,
SPELL_GROUND_SLAM
);
230
}
231
else
232
m_uiGroundSlamTimer
-= diff;
233
234
DoMeleeAttackIfReady
();
235
}
236
}
237
};
238
239
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
240
{
241
return
GetGruulsLairAI<boss_gruulAI>
(creature);
242
}
243
};
244
245
class
spell_gruul_shatter
:
public
SpellScriptLoader
246
{
247
public
:
248
spell_gruul_shatter
() :
SpellScriptLoader
(
"spell_gruul_shatter"
) { }
249
250
class
spell_gruul_shatter_SpellScript
:
public
SpellScript
251
{
252
PrepareSpellScript
(
spell_gruul_shatter_SpellScript
);
253
254
bool
Validate
(
SpellInfo
const
*
/*spell*/
)
OVERRIDE
255
{
256
if
(!
sSpellMgr
->GetSpellInfo(
SPELL_STONED
))
257
return
false
;
258
if
(!
sSpellMgr
->GetSpellInfo(
SPELL_SHATTER_EFFECT
))
259
return
false
;
260
return
true
;
261
}
262
263
void
HandleScript
(
SpellEffIndex
/*effIndex*/
)
264
{
265
if
(
Unit
* target =
GetHitUnit
())
266
{
267
target->RemoveAurasDueToSpell(
SPELL_STONED
);
268
target->CastSpell((
Unit
*)NULL,
SPELL_SHATTER_EFFECT
,
true
);
269
}
270
}
271
272
void
Register
()
OVERRIDE
273
{
274
OnEffectHitTarget
+=
SpellEffectFn
(
spell_gruul_shatter_SpellScript::HandleScript
,
EFFECT_0
,
SPELL_EFFECT_SCRIPT_EFFECT
);
275
}
276
};
277
278
SpellScript
*
GetSpellScript
() const
OVERRIDE
279
{
280
return
new
spell_gruul_shatter_SpellScript
();
281
}
282
};
283
284
class
spell_gruul_shatter_effect
:
public
SpellScriptLoader
285
{
286
public
:
287
spell_gruul_shatter_effect
() :
SpellScriptLoader
(
"spell_gruul_shatter_effect"
) { }
288
289
class
spell_gruul_shatter_effect_SpellScript
:
public
SpellScript
290
{
291
PrepareSpellScript
(
spell_gruul_shatter_effect_SpellScript
);
292
293
void
CalculateDamage
()
294
{
295
if
(!
GetHitUnit
())
296
return
;
297
298
float
radius =
GetSpellInfo
()->
Effects
[
EFFECT_0
].
CalcRadius
(
GetCaster
());
299
if
(!radius)
300
return
;
301
302
float
distance =
GetCaster
()->
GetDistance2d
(
GetHitUnit
());
303
if
(distance > 1.0f)
304
SetHitDamage
(
int32
(
GetHitDamage
() * ((radius - distance) / radius)));
305
}
306
307
void
Register
()
OVERRIDE
308
{
309
OnHit
+=
SpellHitFn
(
spell_gruul_shatter_effect_SpellScript::CalculateDamage
);
310
}
311
};
312
313
SpellScript
*
GetSpellScript
() const
OVERRIDE
314
{
315
return
new
spell_gruul_shatter_effect_SpellScript
();
316
}
317
};
318
319
void
AddSC_boss_gruul
()
320
{
321
new
boss_gruul
();
322
new
spell_gruul_shatter
();
323
new
spell_gruul_shatter_effect
();
324
}
Spells
Spells
Definition
BattlegroundIC.h:645
int32
std::int32_t int32
Definition
Define.h:73
uint32
std::uint32_t uint32
Definition
Define.h:77
OVERRIDE
#define OVERRIDE
Definition
Define.h:60
CHASE_MOTION_TYPE
@ CHASE_MOTION_TYPE
Definition
MotionMaster.h:30
TypeID::TYPEID_PLAYER
@ TYPEID_PLAYER
Definition
Object.h:55
ScriptMgr.h
ScriptedCreature.h
SpellEffIndex
SpellEffIndex
Definition
SharedDefines.h:17
EFFECT_0
@ EFFECT_0
Definition
SharedDefines.h:18
SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition
SharedDefines.h:965
sSpellMgr
#define sSpellMgr
Definition
SpellMgr.h:744
SpellScript.h
SpellEffectFn
#define SpellEffectFn(F, I, N)
Definition
SpellScript.h:269
SpellHitFn
#define SpellHitFn(F)
Definition
SpellScript.h:278
UNIT_STATE_CASTING
@ UNIT_STATE_CASTING
Definition
Unit.h:527
SELECT_TARGET_TOPAGGRO
@ SELECT_TARGET_TOPAGGRO
Definition
UnitAI.h:24
SELECT_TARGET_RANDOM
@ SELECT_TARGET_RANDOM
Definition
UnitAI.h:23
Events
Events
Definition
alterac_valley.cpp:40
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_DEATH
@ SAY_DEATH
Definition
boss_gruul.cpp:24
EMOTE_GROW
@ EMOTE_GROW
Definition
boss_gruul.cpp:26
SAY_AGGRO
@ SAY_AGGRO
Definition
boss_gruul.cpp:20
SAY_SLAM
@ SAY_SLAM
Definition
boss_gruul.cpp:21
SAY_SLAY
@ SAY_SLAY
Definition
boss_gruul.cpp:23
AddSC_boss_gruul
void AddSC_boss_gruul()
Definition
boss_gruul.cpp:319
SPELL_REVERBERATION
@ SPELL_REVERBERATION
Definition
boss_gruul.cpp:34
SPELL_SHATTER_EFFECT
@ SPELL_SHATTER_EFFECT
Definition
boss_gruul.cpp:37
SPELL_KNOCK_BACK
@ SPELL_KNOCK_BACK
Definition
boss_gruul.cpp:42
SPELL_MAGNETIC_PULL
@ SPELL_MAGNETIC_PULL
Definition
boss_gruul.cpp:41
SPELL_CAVE_IN
@ SPELL_CAVE_IN
Definition
boss_gruul.cpp:32
SPELL_GROUND_SLAM
@ SPELL_GROUND_SLAM
Definition
boss_gruul.cpp:33
SPELL_GROWTH
@ SPELL_GROWTH
Definition
boss_gruul.cpp:31
SPELL_SHATTER
@ SPELL_SHATTER
Definition
boss_gruul.cpp:35
SPELL_HURTFUL_STRIKE
@ SPELL_HURTFUL_STRIKE
Definition
boss_gruul.cpp:38
SPELL_STONED
@ SPELL_STONED
Definition
boss_gruul.cpp:39
EVENT_REVERBERATION
@ EVENT_REVERBERATION
Definition
boss_gruul.cpp:52
EVENT_GROWTH
@ EVENT_GROWTH
Definition
boss_gruul.cpp:47
EVENT_GROUND_SLAM
@ EVENT_GROUND_SLAM
Definition
boss_gruul.cpp:50
EVENT_CAVE_IN_STATIC
@ EVENT_CAVE_IN_STATIC
Definition
boss_gruul.cpp:49
EVENT_HURTFUL_STRIKE
@ EVENT_HURTFUL_STRIKE
Definition
boss_gruul.cpp:51
EVENT_CAVE_IN
@ EVENT_CAVE_IN
Definition
boss_gruul.cpp:48
SAY_SHATTER
@ SAY_SHATTER
Definition
boss_krystallus.cpp:39
SPELL_SHATTER_EFFECT
@ SPELL_SHATTER_EFFECT
Definition
boss_krystallus.cpp:27
SPELL_GROUND_SLAM
@ SPELL_GROUND_SLAM
Definition
boss_krystallus.cpp:24
SPELL_SHATTER
@ SPELL_SHATTER
Definition
boss_krystallus.cpp:25
SPELL_STONED
@ SPELL_STONED
Definition
boss_krystallus.cpp:29
SPELL_MAGNETIC_PULL
@ SPELL_MAGNETIC_PULL
Definition
boss_thaddius.cpp:24
BossAI::events
EventMap events
Definition
ScriptedCreature.h:439
BossAI::BossAI
BossAI(Creature *creature, uint32 bossId)
Definition
ScriptedCreature.cpp:456
BossAI::_JustDied
void _JustDied()
Definition
ScriptedCreature.cpp:474
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
Creature
Definition
Creature.h:427
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
SpellEffectInfo::CalcRadius
float CalcRadius(Unit *caster=NULL, Spell *=NULL) const
Definition
SpellInfo.cpp:300
SpellInfo
Definition
SpellInfo.h:158
SpellInfo::Effects
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition
SpellInfo.h:255
SpellScript
Definition
SpellScript.h:139
SpellScript::GetSpellInfo
SpellInfo const * GetSpellInfo()
Definition
SpellScript.cpp:362
SpellScript::OnHit
HookList< HitHandler > OnHit
Definition
SpellScript.h:274
SpellScript::OnEffectHitTarget
HookList< EffectHandler > OnEffectHitTarget
Definition
SpellScript.h:268
SpellScript::GetHitUnit
Unit * GetHitUnit()
Definition
SpellScript.cpp:399
SpellScript::SetHitDamage
void SetHitDamage(int32 damage)
Definition
SpellScript.cpp:475
SpellScript::GetCaster
Unit * GetCaster()
Definition
SpellScript.cpp:352
SpellScript::GetHitDamage
int32 GetHitDamage()
Definition
SpellScript.cpp:465
SpellScriptLoader::SpellScriptLoader
SpellScriptLoader(const char *name)
Definition
ScriptMgr.cpp:1372
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
WorldObject::GetDistance2d
float GetDistance2d(WorldObject const *obj) const
Definition
Object.cpp:1684
boss_gruul
Definition
boss_gruul.cpp:56
boss_gruul::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_gruul.cpp:239
boss_gruul::boss_gruul
boss_gruul()
Definition
boss_gruul.cpp:58
spell_gruul_shatter::spell_gruul_shatter_SpellScript
Definition
boss_gruul.cpp:251
spell_gruul_shatter::spell_gruul_shatter_SpellScript::HandleScript
void HandleScript(SpellEffIndex)
Definition
boss_gruul.cpp:263
spell_gruul_shatter::spell_gruul_shatter_SpellScript::PrepareSpellScript
PrepareSpellScript(spell_gruul_shatter_SpellScript)
spell_gruul_shatter::spell_gruul_shatter_SpellScript::Register
void Register() OVERRIDE
Definition
boss_gruul.cpp:272
spell_gruul_shatter::spell_gruul_shatter_SpellScript::Validate
bool Validate(SpellInfo const *) OVERRIDE
Definition
boss_gruul.cpp:254
spell_gruul_shatter_effect::spell_gruul_shatter_effect_SpellScript
Definition
boss_gruul.cpp:290
spell_gruul_shatter_effect::spell_gruul_shatter_effect_SpellScript::PrepareSpellScript
PrepareSpellScript(spell_gruul_shatter_effect_SpellScript)
spell_gruul_shatter_effect::spell_gruul_shatter_effect_SpellScript::Register
void Register() OVERRIDE
Definition
boss_gruul.cpp:307
spell_gruul_shatter_effect::spell_gruul_shatter_effect_SpellScript::CalculateDamage
void CalculateDamage()
Definition
boss_gruul.cpp:293
spell_gruul_shatter_effect
Definition
boss_gruul.cpp:285
spell_gruul_shatter_effect::spell_gruul_shatter_effect
spell_gruul_shatter_effect()
Definition
boss_gruul.cpp:287
spell_gruul_shatter_effect::GetSpellScript
SpellScript * GetSpellScript() const OVERRIDE
Definition
boss_gruul.cpp:313
spell_gruul_shatter
Definition
boss_gruul.cpp:246
spell_gruul_shatter::GetSpellScript
SpellScript * GetSpellScript() const OVERRIDE
Definition
boss_gruul.cpp:278
spell_gruul_shatter::spell_gruul_shatter
spell_gruul_shatter()
Definition
boss_gruul.cpp:248
gruuls_lair.h
GetGruulsLairAI
AI * GetGruulsLairAI(Creature *creature)
Definition
gruuls_lair.h:36
DATA_GRUUL
@ DATA_GRUUL
Definition
gruuls_lair.h:17
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
Yells
Definition
boss_illidan.cpp:256
boss_gruul::boss_gruulAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_gruul.cpp:85
boss_gruul::boss_gruulAI::m_uiGroundSlamTimer
uint32 m_uiGroundSlamTimer
Definition
boss_gruul.cpp:67
boss_gruul::boss_gruulAI::m_bPerformingGroundSlam
bool m_bPerformingGroundSlam
Definition
boss_gruul.cpp:71
boss_gruul::boss_gruulAI::m_uiCaveIn_Timer
uint32 m_uiCaveIn_Timer
Definition
boss_gruul.cpp:65
boss_gruul::boss_gruulAI::m_uiHurtfulStrike_Timer
uint32 m_uiHurtfulStrike_Timer
Definition
boss_gruul.cpp:68
boss_gruul::boss_gruulAI::m_uiReverberation_Timer
uint32 m_uiReverberation_Timer
Definition
boss_gruul.cpp:69
boss_gruul::boss_gruulAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_gruul.cpp:143
boss_gruul::boss_gruulAI::boss_gruulAI
boss_gruulAI(Creature *creature)
Definition
boss_gruul.cpp:62
boss_gruul::boss_gruulAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_gruul.cpp:97
boss_gruul::boss_gruulAI::m_uiGrowth_Timer
uint32 m_uiGrowth_Timer
Definition
boss_gruul.cpp:64
boss_gruul::boss_gruulAI::KilledUnit
void KilledUnit(Unit *who) OVERRIDE
Definition
boss_gruul.cpp:91
boss_gruul::boss_gruulAI::Reset
void Reset() OVERRIDE
Definition
boss_gruul.cpp:73
boss_gruul::boss_gruulAI::SpellHitTarget
void SpellHitTarget(Unit *target, const SpellInfo *pSpell) OVERRIDE
Definition
boss_gruul.cpp:103
boss_gruul::boss_gruulAI::m_uiCaveIn_StaticTimer
uint32 m_uiCaveIn_StaticTimer
Definition
boss_gruul.cpp:66
src
server
scripts
Outland
GruulsLair
boss_gruul.cpp
Generated on
for Project SkyFire Core by
1.17.0