Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
zone_undercity.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: Undercity
8
SD%Complete: 95
9
SDComment: Quest support: 6628, 9180(post-event).
10
SDCategory: Undercity
11
EndScriptData */
12
13
/* ContentData
14
npc_lady_sylvanas_windrunner
15
npc_highborne_lamenter
16
npc_parqual_fintallas
17
EndContentData */
18
19
#include "
ScriptMgr.h
"
20
#include "
ScriptedCreature.h
"
21
#include "
ScriptedGossip.h
"
22
#include "
Player.h
"
23
24
/*######
25
## npc_lady_sylvanas_windrunner
26
######*/
27
28
enum
Sylvanas
29
{
30
QUEST_JOURNEY_TO_UNDERCITY
= 9180,
31
EMOTE_LAMENT_END
= 0,
32
SAY_LAMENT_END
= 1,
33
34
SOUND_CREDIT
= 10896,
35
ENTRY_HIGHBORNE_LAMENTER
= 21628,
36
ENTRY_HIGHBORNE_BUNNY
= 21641,
37
38
SPELL_HIGHBORNE_AURA
= 37090,
39
SPELL_SYLVANAS_CAST
= 36568,
40
SPELL_RIBBON_OF_SOULS
= 34432,
// the real one to use might be 37099
41
42
// Combat spells
43
SPELL_BLACK_ARROW
= 59712,
44
SPELL_FADE
= 20672,
45
SPELL_FADE_BLINK
= 29211,
46
SPELL_MULTI_SHOT
= 59713,
47
SPELL_SHOT
= 59710,
48
SPELL_SUMMON_SKELETON
= 59711
49
};
50
51
float
HighborneLoc
[4][3]=
52
{
53
{1285.41f, 312.47f, 0.51f},
54
{1286.96f, 310.40f, 1.00f},
55
{1289.66f, 309.66f, 1.52f},
56
{1292.51f, 310.50f, 1.99f},
57
};
58
59
#define HIGHBORNE_LOC_Y -61.00f
60
#define HIGHBORNE_LOC_Y_NEW -55.50f
61
62
class
npc_lady_sylvanas_windrunner
:
public
CreatureScript
63
{
64
public
:
65
npc_lady_sylvanas_windrunner
() :
CreatureScript
(
"npc_lady_sylvanas_windrunner"
) { }
66
67
bool
OnQuestReward
(
Player
*
/*player*/
,
Creature
* creature,
const
Quest
*_Quest,
uint32
/*slot*/
)
OVERRIDE
68
{
69
if
(_Quest->GetQuestId() ==
QUEST_JOURNEY_TO_UNDERCITY
)
70
{
71
CAST_AI
(
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI
, creature->AI())->LamentEvent =
true
;
72
CAST_AI
(
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI
, creature->AI())->DoPlaySoundToSet(creature,
SOUND_CREDIT
);
73
creature->CastSpell(creature,
SPELL_SYLVANAS_CAST
,
false
);
74
75
for
(
uint8
i = 0; i < 4; ++i)
76
creature->SummonCreature(
ENTRY_HIGHBORNE_LAMENTER
,
HighborneLoc
[i][0],
HighborneLoc
[i][1],
HIGHBORNE_LOC_Y
,
HighborneLoc
[i][2],
TempSummonType::TEMPSUMMON_TIMED_DESPAWN
, 160000);
77
}
78
79
return
true
;
80
}
81
82
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
83
{
84
return
new
npc_lady_sylvanas_windrunnerAI
(creature);
85
}
86
87
struct
npc_lady_sylvanas_windrunnerAI
:
public
ScriptedAI
88
{
89
npc_lady_sylvanas_windrunnerAI
(
Creature
* creature) :
ScriptedAI
(creature) { }
90
91
uint32
LamentEventTimer
;
92
bool
LamentEvent
;
93
uint64
targetGUID
;
94
95
uint32
FadeTimer
;
96
uint32
SummonSkeletonTimer
;
97
uint32
BlackArrowTimer
;
98
uint32
ShotTimer
;
99
uint32
MultiShotTimer
;
100
101
void
Reset
()
OVERRIDE
102
{
103
LamentEventTimer
= 5000;
104
LamentEvent
=
false
;
105
targetGUID
= 0;
106
107
FadeTimer
= 30000;
108
SummonSkeletonTimer
= 20000;
109
BlackArrowTimer
= 15000;
110
ShotTimer
= 8000;
111
MultiShotTimer
= 10000;
112
}
113
114
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
{ }
115
116
void
JustSummoned
(
Creature
* summoned)
OVERRIDE
117
{
118
if
(summoned->GetEntry() ==
ENTRY_HIGHBORNE_BUNNY
)
119
{
120
if
(
Creature
* target =
Unit::GetCreature
(*summoned,
targetGUID
))
121
{
122
target->MonsterMoveWithSpeed(target->GetPositionX(), target->GetPositionY(),
me
->GetPositionZ()+15.0f, 0);
123
target->SetPosition(target->GetPositionX(), target->GetPositionY(),
me
->GetPositionZ()+15.0f, 0.0f);
124
summoned->CastSpell(target,
SPELL_RIBBON_OF_SOULS
,
false
);
125
}
126
127
summoned->SetDisableGravity(
true
);
128
targetGUID
= summoned->GetGUID();
129
}
130
}
131
132
void
UpdateAI
(
uint32
diff)
OVERRIDE
133
{
134
if
(
LamentEvent
)
135
{
136
if
(
LamentEventTimer
<= diff)
137
{
138
DoSummon
(
ENTRY_HIGHBORNE_BUNNY
,
me
, 10.0f, 3000,
TempSummonType::TEMPSUMMON_TIMED_DESPAWN
);
139
140
LamentEventTimer
= 2000;
141
if
(!
me
->HasAura(
SPELL_SYLVANAS_CAST
))
142
{
143
Talk
(
SAY_LAMENT_END
);
144
Talk
(
EMOTE_LAMENT_END
);
145
LamentEvent
=
false
;
146
}
147
}
else
LamentEventTimer
-= diff;
148
}
149
150
if
(!
UpdateVictim
())
151
return
;
152
153
// Combat spells
154
155
if
(
FadeTimer
<= diff)
156
{
157
DoCast
(
me
,
SPELL_FADE
);
158
// add a blink to simulate a stealthed movement and reappearing elsewhere
159
DoCast
(
me
,
SPELL_FADE_BLINK
);
160
FadeTimer
= 30000 + rand()%5000;
161
// if the victim is out of melee range she cast multi shot
162
if
(
Unit
* victim =
me
->GetVictim())
163
if
(
me
->GetDistance(victim) > 10.0f)
164
DoCast
(victim,
SPELL_MULTI_SHOT
);
165
}
else
FadeTimer
-= diff;
166
167
if
(
SummonSkeletonTimer
<= diff)
168
{
169
DoCast
(
me
,
SPELL_SUMMON_SKELETON
);
170
SummonSkeletonTimer
= 20000 + rand()%10000;
171
}
else
SummonSkeletonTimer
-= diff;
172
173
if
(
BlackArrowTimer
<= diff)
174
{
175
if
(
Unit
* victim =
me
->GetVictim())
176
{
177
DoCast
(victim,
SPELL_BLACK_ARROW
);
178
BlackArrowTimer
= 15000 + rand()%5000;
179
}
180
}
else
BlackArrowTimer
-= diff;
181
182
if
(
ShotTimer
<= diff)
183
{
184
if
(
Unit
* victim =
me
->GetVictim())
185
{
186
DoCast
(victim,
SPELL_SHOT
);
187
ShotTimer
= 8000 + rand()%2000;
188
}
189
}
else
ShotTimer
-= diff;
190
191
if
(
MultiShotTimer
<= diff)
192
{
193
if
(
Unit
* victim =
me
->GetVictim())
194
{
195
DoCast
(victim,
SPELL_MULTI_SHOT
);
196
MultiShotTimer
= 10000 + rand()%3000;
197
}
198
}
else
MultiShotTimer
-= diff;
199
200
DoMeleeAttackIfReady
();
201
}
202
};
203
};
204
205
/*######
206
## npc_highborne_lamenter
207
######*/
208
209
class
npc_highborne_lamenter
:
public
CreatureScript
210
{
211
public
:
212
npc_highborne_lamenter
() :
CreatureScript
(
"npc_highborne_lamenter"
) { }
213
214
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
215
{
216
return
new
npc_highborne_lamenterAI
(creature);
217
}
218
219
struct
npc_highborne_lamenterAI
:
public
ScriptedAI
220
{
221
npc_highborne_lamenterAI
(
Creature
* creature) :
ScriptedAI
(creature) { }
222
223
uint32
EventMoveTimer
;
224
uint32
EventCastTimer
;
225
bool
EventMove
;
226
bool
EventCast
;
227
228
void
Reset
()
OVERRIDE
229
{
230
EventMoveTimer
= 10000;
231
EventCastTimer
= 17500;
232
EventMove
=
true
;
233
EventCast
=
true
;
234
}
235
236
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
{ }
237
238
void
UpdateAI
(
uint32
diff)
OVERRIDE
239
{
240
if
(
EventMove
)
241
{
242
if
(
EventMoveTimer
<= diff)
243
{
244
me
->SetDisableGravity(
true
);
245
me
->MonsterMoveWithSpeed(
me
->GetPositionX(),
me
->GetPositionY(),
HIGHBORNE_LOC_Y_NEW
,
me
->GetDistance(
me
->GetPositionX(),
me
->GetPositionY(),
HIGHBORNE_LOC_Y_NEW
) / (5000 * 0.001f));
246
me
->SetPosition(
me
->GetPositionX(),
me
->GetPositionY(),
HIGHBORNE_LOC_Y_NEW
,
me
->GetOrientation());
247
EventMove
=
false
;
248
}
else
EventMoveTimer
-= diff;
249
}
250
if
(
EventCast
)
251
{
252
if
(
EventCastTimer
<= diff)
253
{
254
DoCast
(
me
,
SPELL_HIGHBORNE_AURA
);
255
EventCast
=
false
;
256
}
else
EventCastTimer
-= diff;
257
}
258
}
259
};
260
};
261
262
/*######
263
## npc_parqual_fintallas
264
######*/
265
266
enum
ParqualFintallas
267
{
268
SPELL_MARK_OF_SHAME
= 6767
269
};
270
271
#define GOSSIP_HPF1 "Gul'dan"
272
#define GOSSIP_HPF2 "Kel'Thuzad"
273
#define GOSSIP_HPF3 "Ner'zhul"
274
275
class
npc_parqual_fintallas
:
public
CreatureScript
276
{
277
public
:
278
npc_parqual_fintallas
() :
CreatureScript
(
"npc_parqual_fintallas"
) { }
279
280
bool
OnGossipSelect
(
Player
* player,
Creature
* creature,
uint32
/*sender*/
,
uint32
action)
OVERRIDE
281
{
282
player->PlayerTalkClass->ClearMenus();
283
if
(action ==
GOSSIP_ACTION_INFO_DEF
+1)
284
{
285
player->CLOSE_GOSSIP_MENU();
286
creature->CastSpell(player,
SPELL_MARK_OF_SHAME
,
false
);
287
}
288
if
(action ==
GOSSIP_ACTION_INFO_DEF
+2)
289
{
290
player->CLOSE_GOSSIP_MENU();
291
player->AreaExploredOrEventHappens(6628);
292
}
293
return
true
;
294
}
295
296
bool
OnGossipHello
(
Player
* player,
Creature
* creature)
OVERRIDE
297
{
298
if
(creature->IsQuestGiver())
299
player->PrepareQuestMenu(creature->GetGUID());
300
301
if
(player->GetQuestStatus(6628) ==
QUEST_STATUS_INCOMPLETE
&& !player->HasAura(
SPELL_MARK_OF_SHAME
))
302
{
303
player->ADD_GOSSIP_ITEM(
GOSSIP_ICON_CHAT
,
GOSSIP_HPF1
,
GOSSIP_SENDER_MAIN
,
GOSSIP_ACTION_INFO_DEF
+1);
304
player->ADD_GOSSIP_ITEM(
GOSSIP_ICON_CHAT
,
GOSSIP_HPF2
,
GOSSIP_SENDER_MAIN
,
GOSSIP_ACTION_INFO_DEF
+1);
305
player->ADD_GOSSIP_ITEM(
GOSSIP_ICON_CHAT
,
GOSSIP_HPF3
,
GOSSIP_SENDER_MAIN
,
GOSSIP_ACTION_INFO_DEF
+2);
306
player->SEND_GOSSIP_MENU(5822, creature->GetGUID());
307
}
308
else
309
player->SEND_GOSSIP_MENU(5821, creature->GetGUID());
310
311
return
true
;
312
}
313
};
314
315
/*######
316
## AddSC
317
######*/
318
319
void
AddSC_undercity
()
320
{
321
new
npc_lady_sylvanas_windrunner
();
322
new
npc_highborne_lamenter
();
323
new
npc_parqual_fintallas
();
324
}
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
uint64
std::uint64_t uint64
Definition
Define.h:76
GOSSIP_ICON_CHAT
@ GOSSIP_ICON_CHAT
Definition
GossipDef.h:46
TempSummonType::TEMPSUMMON_TIMED_DESPAWN
@ TEMPSUMMON_TIMED_DESPAWN
Definition
Object.h:70
Player.h
QUEST_STATUS_INCOMPLETE
@ QUEST_STATUS_INCOMPLETE
Definition
QuestDef.h:89
ScriptMgr.h
ScriptedCreature.h
CAST_AI
#define CAST_AI(a, b)
Definition
ScriptedCreature.h:14
ScriptedGossip.h
GOSSIP_SENDER_MAIN
@ GOSSIP_SENDER_MAIN
Definition
ScriptedGossip.h:58
GOSSIP_ACTION_INFO_DEF
@ GOSSIP_ACTION_INFO_DEF
Definition
ScriptedGossip.h:56
SPELL_SUMMON_SKELETON
@ SPELL_SUMMON_SKELETON
Definition
boss_nightbane.cpp:30
SPELL_MULTI_SHOT
@ SPELL_MULTI_SHOT
Definition
boss_priestess_delrissa.cpp:986
CreatureAI
Definition
CreatureAI.h:54
CreatureAI::DoSummon
Creature * DoSummon(uint32 entry, Position const &pos, uint32 despawnTime=30000, TempSummonType summonType=TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN)
Definition
CreatureAI.cpp:235
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
Player
Definition
Player.h:1289
Quest
Definition
QuestDef.h:255
UnitAI::DoMeleeAttackIfReady
void DoMeleeAttackIfReady()
Definition
UnitAI.cpp:28
UnitAI::DoCast
void DoCast(uint32 spellId)
Definition
UnitAI.cpp:110
Unit
Definition
Unit.h:1367
Unit::GetCreature
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4905
npc_highborne_lamenter
Definition
zone_undercity.cpp:210
npc_highborne_lamenter::npc_highborne_lamenter
npc_highborne_lamenter()
Definition
zone_undercity.cpp:212
npc_highborne_lamenter::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
zone_undercity.cpp:214
npc_lady_sylvanas_windrunner
Definition
zone_undercity.cpp:63
npc_lady_sylvanas_windrunner::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
zone_undercity.cpp:82
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunner
npc_lady_sylvanas_windrunner()
Definition
zone_undercity.cpp:65
npc_lady_sylvanas_windrunner::OnQuestReward
bool OnQuestReward(Player *, Creature *creature, const Quest *_Quest, uint32) OVERRIDE
Definition
zone_undercity.cpp:67
npc_parqual_fintallas
Definition
zone_undercity.cpp:276
npc_parqual_fintallas::OnGossipSelect
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
Definition
zone_undercity.cpp:280
npc_parqual_fintallas::npc_parqual_fintallas
npc_parqual_fintallas()
Definition
zone_undercity.cpp:278
npc_parqual_fintallas::OnGossipHello
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
Definition
zone_undercity.cpp:296
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
ScriptedAI::ScriptedAI
ScriptedAI(Creature *creature)
Definition
ScriptedCreature.cpp:85
npc_highborne_lamenter::npc_highborne_lamenterAI
Definition
zone_undercity.cpp:220
npc_highborne_lamenter::npc_highborne_lamenterAI::EventCast
bool EventCast
Definition
zone_undercity.cpp:226
npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
zone_undercity.cpp:238
npc_highborne_lamenter::npc_highborne_lamenterAI::Reset
void Reset() OVERRIDE
Definition
zone_undercity.cpp:228
npc_highborne_lamenter::npc_highborne_lamenterAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
zone_undercity.cpp:236
npc_highborne_lamenter::npc_highborne_lamenterAI::EventMoveTimer
uint32 EventMoveTimer
Definition
zone_undercity.cpp:223
npc_highborne_lamenter::npc_highborne_lamenterAI::EventMove
bool EventMove
Definition
zone_undercity.cpp:225
npc_highborne_lamenter::npc_highborne_lamenterAI::npc_highborne_lamenterAI
npc_highborne_lamenterAI(Creature *creature)
Definition
zone_undercity.cpp:221
npc_highborne_lamenter::npc_highborne_lamenterAI::EventCastTimer
uint32 EventCastTimer
Definition
zone_undercity.cpp:224
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI
Definition
zone_undercity.cpp:88
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::Reset
void Reset() OVERRIDE
Definition
zone_undercity.cpp:101
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
zone_undercity.cpp:132
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::LamentEventTimer
uint32 LamentEventTimer
Definition
zone_undercity.cpp:91
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::FadeTimer
uint32 FadeTimer
Definition
zone_undercity.cpp:95
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::BlackArrowTimer
uint32 BlackArrowTimer
Definition
zone_undercity.cpp:97
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::SummonSkeletonTimer
uint32 SummonSkeletonTimer
Definition
zone_undercity.cpp:96
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::targetGUID
uint64 targetGUID
Definition
zone_undercity.cpp:93
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
zone_undercity.cpp:114
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::ShotTimer
uint32 ShotTimer
Definition
zone_undercity.cpp:98
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::LamentEvent
bool LamentEvent
Definition
zone_undercity.cpp:92
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::npc_lady_sylvanas_windrunnerAI
npc_lady_sylvanas_windrunnerAI(Creature *creature)
Definition
zone_undercity.cpp:89
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::MultiShotTimer
uint32 MultiShotTimer
Definition
zone_undercity.cpp:99
npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned
void JustSummoned(Creature *summoned) OVERRIDE
Definition
zone_undercity.cpp:116
GOSSIP_HPF3
#define GOSSIP_HPF3
Definition
zone_undercity.cpp:273
Sylvanas
Sylvanas
Definition
zone_undercity.cpp:29
SPELL_HIGHBORNE_AURA
@ SPELL_HIGHBORNE_AURA
Definition
zone_undercity.cpp:38
SPELL_FADE
@ SPELL_FADE
Definition
zone_undercity.cpp:44
SAY_LAMENT_END
@ SAY_LAMENT_END
Definition
zone_undercity.cpp:32
SOUND_CREDIT
@ SOUND_CREDIT
Definition
zone_undercity.cpp:34
SPELL_BLACK_ARROW
@ SPELL_BLACK_ARROW
Definition
zone_undercity.cpp:43
QUEST_JOURNEY_TO_UNDERCITY
@ QUEST_JOURNEY_TO_UNDERCITY
Definition
zone_undercity.cpp:30
SPELL_FADE_BLINK
@ SPELL_FADE_BLINK
Definition
zone_undercity.cpp:45
ENTRY_HIGHBORNE_LAMENTER
@ ENTRY_HIGHBORNE_LAMENTER
Definition
zone_undercity.cpp:35
SPELL_SYLVANAS_CAST
@ SPELL_SYLVANAS_CAST
Definition
zone_undercity.cpp:39
ENTRY_HIGHBORNE_BUNNY
@ ENTRY_HIGHBORNE_BUNNY
Definition
zone_undercity.cpp:36
SPELL_SHOT
@ SPELL_SHOT
Definition
zone_undercity.cpp:47
SPELL_MULTI_SHOT
@ SPELL_MULTI_SHOT
Definition
zone_undercity.cpp:46
EMOTE_LAMENT_END
@ EMOTE_LAMENT_END
Definition
zone_undercity.cpp:31
SPELL_RIBBON_OF_SOULS
@ SPELL_RIBBON_OF_SOULS
Definition
zone_undercity.cpp:40
SPELL_SUMMON_SKELETON
@ SPELL_SUMMON_SKELETON
Definition
zone_undercity.cpp:48
GOSSIP_HPF2
#define GOSSIP_HPF2
Definition
zone_undercity.cpp:272
HIGHBORNE_LOC_Y_NEW
#define HIGHBORNE_LOC_Y_NEW
Definition
zone_undercity.cpp:60
HIGHBORNE_LOC_Y
#define HIGHBORNE_LOC_Y
Definition
zone_undercity.cpp:59
HighborneLoc
float HighborneLoc[4][3]
Definition
zone_undercity.cpp:51
GOSSIP_HPF1
#define GOSSIP_HPF1
Definition
zone_undercity.cpp:271
ParqualFintallas
ParqualFintallas
Definition
zone_undercity.cpp:267
SPELL_MARK_OF_SHAME
@ SPELL_MARK_OF_SHAME
Definition
zone_undercity.cpp:268
AddSC_undercity
void AddSC_undercity()
Definition
zone_undercity.cpp:319
src
server
scripts
EasternKingdoms
zone_undercity.cpp
Generated on
for Project SkyFire Core by
1.17.0