TrinityCore
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
zone_orgrimmar.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19SDName: Orgrimmar
20SD%Complete: 100
21SDComment: Quest support: 2460, 6566
22SDCategory: Orgrimmar
23EndScriptData */
24
25/* ContentData
26npc_shenthul
27npc_thrall_warchief
28EndContentData */
29
30#include "ScriptMgr.h"
31#include "CellImpl.h"
32#include "GridNotifiersImpl.h"
33#include "MotionMaster.h"
34#include "ObjectAccessor.h"
35#include "Player.h"
36#include "ScriptedCreature.h"
37#include "ScriptedGossip.h"
38#include "TemporarySummon.h"
39
40/*######
41## npc_shenthul
42######*/
43
45{
47};
48
50{
51public:
52 npc_shenthul() : CreatureScript("npc_shenthul") { }
53
54 struct npc_shenthulAI : public ScriptedAI
55 {
56 npc_shenthulAI(Creature* creature) : ScriptedAI(creature)
57 {
58 Initialize();
59 }
60
62 {
63 CanTalk = false;
64 CanEmote = false;
65 SaluteTimer = 6000;
66 ResetTimer = 0;
68 }
69
70 bool CanTalk;
75
76 void Reset() override
77 {
78 Initialize();
79 }
80
81 void JustEngagedWith(Unit* /*who*/) override { }
82
83 void UpdateAI(uint32 diff) override
84 {
85 if (CanEmote)
86 {
87 if (ResetTimer <= diff)
88 {
90 {
91 if (player->GetTypeId() == TYPEID_PLAYER && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE)
92 player->FailQuest(QUEST_SHATTERED_SALUTE);
93 }
94 Reset();
95 } else ResetTimer -= diff;
96 }
97
98 if (CanTalk && !CanEmote)
99 {
100 if (SaluteTimer <= diff)
101 {
103 CanEmote = true;
104 ResetTimer = 60000;
105 } else SaluteTimer -= diff;
106 }
107
108 if (!UpdateVictim())
109 return;
110
112 }
113
114 void ReceiveEmote(Player* player, uint32 emote) override
115 {
117 {
118 if (CanEmote)
119 {
121 Reset();
122 }
123 }
124 }
125
126 void OnQuestAccept(Player* player, Quest const* quest) override
127 {
128 if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE)
129 {
130 CanTalk = true;
131 PlayerGUID = player->GetGUID();
132 }
133 }
134 };
135
136 CreatureAI* GetAI(Creature* creature) const override
137 {
138 return new npc_shenthulAI(creature);
139 }
140};
141
142/*######
143## npc_thrall_warchief
144######*/
145
147{
149
157
165
167
169 SPELL_SHOCK = 16034
171
173{
174 SOUND_AGGRO = 5880
176
179{
180public:
181 npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { }
182
184 {
186 {
187 Initialize();
188 }
189
191 {
192 ChainLightningTimer = 2000;
193 ShockTimer = 8000;
194 }
195
198
199 void Reset() override
200 {
201 Initialize();
202 }
203
204 void JustEngagedWith(Unit* /*who*/) override
205 {
207 }
208
209 void UpdateAI(uint32 diff) override
210 {
211 if (!UpdateVictim())
212 return;
213
214 if (ChainLightningTimer <= diff)
215 {
217 ChainLightningTimer = 9000;
218 } else ChainLightningTimer -= diff;
219
220 if (ShockTimer <= diff)
221 {
223 ShockTimer = 15000;
224 } else ShockTimer -= diff;
225
227 }
228
229 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
230 {
231 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
232 ClearGossipMenuFor(player);
233 switch (action)
234 {
235 case GOSSIP_ACTION_INFO_DEF + 1:
239 break;
240 case GOSSIP_ACTION_INFO_DEF + 2:
244 break;
245 case GOSSIP_ACTION_INFO_DEF + 3:
249 break;
250 case GOSSIP_ACTION_INFO_DEF + 4:
254 break;
255 case GOSSIP_ACTION_INFO_DEF + 5:
259 break;
260 case GOSSIP_ACTION_INFO_DEF + 6:
264 break;
265 case GOSSIP_ACTION_INFO_DEF + 7:
266 CloseGossipMenuFor(player);
268 break;
269 }
270 return true;
271 }
272
273 bool OnGossipHello(Player* player) override
274 {
276 if (me->IsQuestGiver())
277 player->PrepareQuestMenu(me->GetGUID());
278
281
283 return true;
284 }
285 };
286
287 CreatureAI* GetAI(Creature* creature) const override
288 {
289 return new npc_thrall_warchiefAI(creature);
290 }
291};
292
293/* --------- Herald of War ------------- */
295{
296 NPC_GRYSHKA = 31433,
297 NPC_OLVIA = 31425,
298 NPC_SANA = 31429,
299 NPC_FELIKA = 31427,
301 NPC_KAJA = 31423
303
305{
319 EVENT_RESET = 14
321
323{
324 SAY_GRYSHKA_1 = 0, // When can we reopen our shops? I'm losing gold here!
325 SAY_GRYSHKA_2 = 1, // "This is an outrage!"
326 SAY_OLVIA_1 = 0, // Where is the Warchief?
327 SAY_OLVIA_2 = 1, // What are all these Forsaken doing here?
328 SAY_FELIKA_1 = 0, // What is going on?
329 SAY_FELIKA_2 = 1, // This is an outrage!
330 SAY_THATHUNG = 0, // What is going on?
331 SAY_KAJA = 0, // Why is Thrall allowing this to happen to our city?
332 SAY_SANA = 0, // We demand answers!
333 SAY_RUNTHAK_1 = 0, // SILENCE!
334 SAY_RUNTHAK_2 = 1, // We are on the brink of all out war with the Alliance!
335 SAY_RUNTHAK_3 = 2, // Tragic events have unfolded in Northrend. The Warchief is doing all that he can to keep us safe.
336 SAY_RUNTHAK_4 = 3 // All services and shops are to remain closed until further notice! That is all!
338
340{
341public:
342 npc_overlord_runthak_orgrimmar() : CreatureScript("npc_overlord_runthak_orgrimmar") { }
343
345 {
347 {
348 inProgress = false;
349 }
350
351 void Reset() override
352 {
353 inProgress = false;
354 me->GetMotionMaster()->MovePath(me->GetSpawnId() * 10, true);
355 events.Reset();
356 }
357
358 void MoveInLineOfSight(Unit* who) override
359 {
360 if (who->GetTypeId() == TYPEID_PLAYER && who->IsWithinDist(me, 20.0f) && !inProgress)
361 {
362 inProgress = true;
364 }
365 }
366
367 void UpdateAI(uint32 diff) override
368 {
369 events.Update(diff);
370
371 while (uint32 eventID = events.ExecuteEvent())
372 {
373 switch (eventID)
374 {
375 case EVENT_SCENE_1:
379 {
380 me->SetFacingToObject(gryshka);
381 gryshka->AI()->Talk(SAY_GRYSHKA_1);
382 }
384 break;
385 case EVENT_SCENE_2:
387 olvia->AI()->Talk(SAY_OLVIA_1);
389 break;
390 case EVENT_SCENE_3:
392 felika->AI()->Talk(SAY_FELIKA_1);
394 break;
395 case EVENT_SCENE_4:
397 thathung->AI()->Talk(SAY_THATHUNG);
399 break;
400 case EVENT_SCENE_5:
402 sana->AI()->Talk(SAY_SANA);
404 break;
405 case EVENT_SCENE_6:
407 gryshka->AI()->Talk(SAY_GRYSHKA_2);
409 break;
410 case EVENT_SCENE_7:
412 kaja->AI()->Talk(SAY_KAJA);
414 break;
415 case EVENT_SCENE_8:
417 felika->AI()->Talk(SAY_FELIKA_2);
419 break;
420 case EVENT_SCENE_9:
422 olvia->AI()->Talk(SAY_OLVIA_2);
424 break;
425 case EVENT_SCENE_10:
428 break;
429 case EVENT_SCENE_11:
432 break;
433 case EVENT_SCENE_12:
436 break;
437 case EVENT_SCENE_13:
440 break;
441 case EVENT_RESET:
442 Reset();
443 break;
444 default:
445 break;
446 }
447 }
448 }
449
451 {
452 // if one GUID is empty it means all the others are empty as well so we should store them
453 // otherwise do not call for grid search since someone else already activated event once before and guids are stored
454 if (gryshkaGUID.IsEmpty())
455 {
456 std::list<Unit*> citizenList;
459 Cell::VisitGridObjects(me, searcher, 20.0f);
460 for (Unit* target : citizenList)
461 {
462 switch (target->GetEntry())
463 {
464 case NPC_GRYSHKA:
465 gryshkaGUID = target->GetGUID();
466 break;
467 case NPC_OLVIA:
468 olviaGUID = target->GetGUID();
469 break;
470 case NPC_SANA:
471 sanaGUID = target->GetGUID();
472 break;
473 case NPC_FELIKA:
474 felikaGUID = target->GetGUID();
475 break;
476 case NPC_THATHUNG:
477 thungGUID = target->GetGUID();
478 break;
479 case NPC_KAJA:
480 kajaGUID = target->GetGUID();
481 break;
482 default:
483 break;
484 }
485 }
486 }
487 }
488
489 private:
498 };
499
500 CreatureAI* GetAI(Creature* creature) const override
501 {
502 return new npc_overlord_runthak_orgrimmarAI(creature);
503 }
504};
505
506// Phased out thrall during herald of war chain quest
508{
514
515 GO_PORTAL_UNDERCITY = 193425
517
519{
521 GUARDS_SIZE = 4
523
525{
528
530{
531 SPELL_JAINA_SPAWNIN = 55761
533
535{
536 SAY_THRALL_0 = 0, // Kor'kron, stand down!
537 SAY_THRALL_1 = 1, // Jaina...
538 SAY_THRALL_2 = 2, // Jaina, what happened at the Wrathgate. It was a betrayal from within...
539 SAY_THRALL_3 = 3, // The Horde has lost the Undercity.
540 SAY_THRALL_4 = 4, // We now prepare to lay siege to the city and bring the perpetrators of this unforgivable crime to justice.
541 SAY_THRALL_5 = 5, // If we are forced into a conflict, the Lich King will destroy our divided forces in Northrend.
542 SAY_THRALL_6 = 6, // We will make this right, Jaina. Tell your king all that you have learned here.
543 SAY_THRALL_7 = 7, // Kor'kron, prepare transport to the Undercity.
544
545 SAY_SYLVANAS_0 = 0, // Lady Proudmoore, the Warchief speaks the truth. This subterfuge was set in motion by Varimathras and Grand Apothecary Putress. It was not the Horde's doing.
546 SAY_SYLVANAS_1 = 1, // As the combined Horde and Alliance forces began their assault upon the Wrath Gate, an uprising broke out in the Undercity. Varimathras and hordes of his demonic brethren attacked. Hundreds of my people were slain in the coup. I barely managed to escape with my life.
547
548 SAY_JAINA_0 = 0, // Thrall, what has happened? The King is preparing for war...
549 SAY_JAINA_1 = 1, // I will deliver this information to King Wrynn, Thrall, but...
550 SAY_JAINA_2 = 2, // Bolvar was like a brother to him. In the King's absence, Bolvar kept the Alliance united. He found strength for our people in our darkest hours. He watched over Anduin, raising him as his own.
551 SAY_JAINA_3 = 3, // I fear that the rage will consume him, Thrall. I remain hopeful that reason will prevail, but we must prepare for the worst... for war.
552 SAY_JAINA_4 = 4 // Farewell, Warchief. I pray that the next time we meet it will be as allies.
554
556{
574
576{
577 { 1909.39f, -4144.21f, 40.6368f, 0.042239f },
578 { 1910.73f, -4155.26f, 40.6316f, 0.615577f },
579 { 1934.01f, -4141.40f, 40.6375f, 3.61109f },
580 { 1931.11f, -4156.38f, 40.6130f, 2.19737f }
581};
582
584{
585 { 1917.461670f, -4147.514160f, 40.636799f, 5.89346f },
586 { 1916.181274f, -4152.295898f, 40.629120f, 0.497757f },
587 { 1926.435425f, -4146.397461f, 40.618534f, 3.846709f },
588 { 1926.519165f, -4153.216797f, 40.614975f, 2.570434f }
589};
590
592{
593 { 1921.719604f, -4143.051270f, 40.623356f, 1.657789f }, // jaina move
594 { 1921.151855f, -4139.343750f, 40.583084f, 4.732627f }, // thrall move
595 { 1918.732422f, -4139.619629f, 40.607685f, 4.803311f } // sylvanas move
596};
597
598Position const PortalSpawnPosition = { 1921.752441f, -4151.148438f, 40.623848f, 1.714324f };
599
601{
602public:
603 npc_thrall_herald_of_war() : CreatureScript("npc_thrall_herald_of_war") { }
604
606 {
608 {
609 spawnedGuards = false;
610 sceneInProgress = false;
611 }
612
613 void Reset() override
614 {
615 events.Reset();
616 me->GetMotionMaster()->MovePath(me->GetSpawnId() * 10, true);
617 sceneInProgress = false;
618
619 if (!spawnedGuards)
620 {
621 spawnedGuards = true;
622 for (uint8 i = 0; i < GUARDS_SIZE; i++)
623 {
625 guardsGUIDs[i] = korkronGuard->GetGUID();
626 }
627 }
628 }
629
630 void MovementInform(uint32 type, uint32 pointId) override
631 {
632 if (type != POINT_MOTION_TYPE)
633 return;
634
635 if (pointId == 2)
636 me->GetMotionMaster()->MovePath(me->GetSpawnId() * 10, true);
637 }
638
639 void DoAction(int32 actionId) override
640 {
641 if (actionId == ACTION_START_SCENE && !sceneInProgress)
642 {
644 sceneInProgress = true;
645
647 {
648 me->SetFacingToObject(jaina);
649 jainaGUID = jaina->GetGUID();
650 jaina->CastSpell(jaina, SPELL_JAINA_SPAWNIN);
651 }
652
654 {
655 stormwindPortal->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
656 stormwindPortalGUID = stormwindPortal->GetGUID();
657 }
658
659 for (uint8 i = 0; i < GUARDS_SIZE; i++)
660 {
662 {
663 guards->SetWalk(false);
664 guards->SetEmoteState(EMOTE_STATE_READY2H);
665 guards->GetMotionMaster()->MovePoint(1, GuardsMovePosition[i]);
666 }
667 }
668
669 if (Creature* sylvanas = me->FindNearestCreature(NPC_BANSHEE_SYLVANAS, 25.0f))
670 sylvanasGUID = sylvanas->GetGUID();
671
673 }
674 }
675
676 void UpdateAI(uint32 diff) override
677 {
678 events.Update(diff);
679
680 while (uint32 eventID = events.ExecuteEvent())
681 {
682 switch (eventID)
683 {
688 {
689 jaina->SetWalk(true);
690 jaina->GetMotionMaster()->MovePoint(1, MiscMovePositions[0]);
691 }
692
693 for (uint8 i = 0; i < GUARDS_SIZE; i++)
694 {
696 {
697 guard->GetMotionMaster()->MoveTargetedHome();
698 guard->SetEmoteState(EMOTE_STATE_NONE);
699 }
700 }
702 break;
706 me->SetFacingToObject(jaina);
708 break;
711 jaina->AI()->Talk(SAY_JAINA_0);
713 break;
717 {
718 sylvanas->SetStandState(UNIT_STAND_STATE_STAND);
719 sylvanas->SetWalk(true);
720 sylvanas->GetMotionMaster()->MovePoint(1, MiscMovePositions[2]);
721 }
723 break;
726 sylvanas->AI()->Talk(SAY_SYLVANAS_0);
728 break;
731 sylvanas->AI()->Talk(SAY_SYLVANAS_1);
733 break;
737 break;
741 break;
745 break;
749 break;
752 jaina->AI()->Talk(SAY_JAINA_1);
754 break;
757 jaina->AI()->Talk(SAY_JAINA_2);
759 break;
762 jaina->AI()->Talk(SAY_JAINA_3);
764 break;
767 {
768 jaina->AI()->Talk(SAY_JAINA_4);
769 jaina->SetWalk(true);
770 jaina->GetMotionMaster()->MovePoint(2, jaina->GetHomePosition());
771 jaina->DespawnOrUnsummon(5s);
772 }
774 break;
776 {
777 me->SetWalk(true);
780
782 {
783 sylvanas->SetWalk(true);
784 sylvanas->GetMotionMaster()->MovePoint(2, sylvanas->GetHomePosition());
785 }
786
788 portal->DespawnOrUnsummon();
789
791 break;
792 }
794 Reset();
795 break;
796 default:
797 break;
798 }
799 }
800 }
801
802 private:
810 };
811
812 CreatureAI* GetAI(Creature* creature) const override
813 {
814 return new npc_thrall_herald_of_warAI(creature);
815 }
816};
817
819{
820public:
821 areatrigger_orgrimmar_herald_of_war() : AreaTriggerScript("areatrigger_orgrimmar_herald_of_war") { }
822
823 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
824 {
826 {
827 if (Creature* thrall = player->FindNearestCreature(NPC_THRALL_HERALD, 50.0f))
828 {
829 thrall->AI()->DoAction(ACTION_START_SCENE);
830 return true;
831 }
832 }
833 return false;
834 }
835};
836
838{
839 new npc_shenthul();
844}
uint8_t uint8
Definition: Define.h:135
int32_t int32
Definition: Define.h:129
uint32_t uint32
Definition: Define.h:133
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition: ObjectGuid.h:39
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:105
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void AddGossipItemFor(Player *player, GossipOptionIcon icon, std::string const &text, uint32 sender, uint32 action)
void ClearGossipMenuFor(Player *player)
void InitGossipMenuFor(Player *player, uint32 menuId)
void CloseGossipMenuFor(Player *player)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ EMOTE_ONESHOT_SALUTE
@ EMOTE_STATE_NONE
@ EMOTE_STATE_READY2H
@ TEXT_EMOTE_SALUTE
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:34
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:136
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:48
bool UpdateVictim()
Definition: CreatureAI.cpp:240
Creature *const me
Definition: CreatureAI.h:81
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:303
ObjectGuid::LowType GetSpawnId() const
Definition: Creature.h:83
bool SetWalk(bool enable) override
Definition: Creature.cpp:2941
void Update(uint32 time)
Definition: EventMap.h:67
EventId ExecuteEvent()
Definition: EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition: EventMap.cpp:36
void Reset()
Definition: EventMap.cpp:21
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MovePath(uint32 pathId, bool repeatable)
bool IsEmpty() const
Definition: ObjectGuid.h:174
void Clear()
Definition: ObjectGuid.h:151
TypeID GetTypeId() const
Definition: Object.h:92
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:77
uint32 GetGossipOptionAction(uint32 selection) const
Definition: GossipDef.h:269
Definition: Player.h:915
void PrepareQuestMenu(ObjectGuid guid)
Definition: Player.cpp:14403
void AreaExploredOrEventHappens(uint32 questId)
Definition: Player.cpp:16141
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:15775
PlayerMenu * PlayerTalkClass
Definition: Player.h:1948
uint32 GetQuestId() const
Definition: QuestDef.h:229
void DoMeleeAttackIfReady()
Definition: UnitAI.cpp:62
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:174
Definition: Unit.h:769
MotionMaster * GetMotionMaster()
Definition: Unit.h:1667
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:13300
bool IsAlive() const
Definition: Unit.h:1234
bool IsQuestGiver() const
Definition: Unit.h:1101
void HandleEmoteCommand(Emote emoteId)
Definition: Unit.cpp:1565
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:1992
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2099
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition: Object.cpp:1180
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:168
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void UpdateAI(uint32 diff) override
void OnQuestAccept(Player *player, Quest const *quest) override
void ReceiveEmote(Player *player, uint32 emote) override
void JustEngagedWith(Unit *) override
npc_shenthulAI(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
bool OnGossipHello(Player *player) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
CitizenEntries
@ NPC_KAJA
@ NPC_THATHUNG
@ NPC_SANA
@ NPC_OLVIA
@ NPC_GRYSHKA
@ NPC_FELIKA
Position const PortalSpawnPosition
HeraldMisc
@ QUEST_HERALD_OF_WAR
@ GUARDS_SIZE
Position const GuardsSpawnPosition[GUARDS_SIZE]
@ SOUND_AGGRO
SceneEvents
@ EVENT_SCENE_11
@ EVENT_SCENE_1
@ EVENT_SCENE_5
@ EVENT_SCENE_4
@ EVENT_SCENE_2
@ EVENT_SCENE_13
@ EVENT_SCENE_3
@ EVENT_RESET
@ EVENT_SCENE_7
@ EVENT_SCENE_9
@ EVENT_SCENE_12
@ EVENT_SCENE_10
@ EVENT_SCENE_6
@ EVENT_SCENE_8
HeraldSpell
@ SPELL_JAINA_SPAWNIN
Position const MiscMovePositions[3]
Position const GuardsMovePosition[GUARDS_SIZE]
HeraldEvents
@ EVENT_HERALD_SCENE12
@ EVENT_HERALD_SCENE11
@ EVENT_HERALD_SCENE8
@ EVENT_HERALD_SCENE4
@ EVENT_HERALD_SCENE5
@ EVENT_HERALD_SCENE6
@ EVENT_HERALD_SCENE1
@ EVENT_HERALD_SCENE10
@ EVENT_HERALD_RESET
@ EVENT_HERALD_SCENE9
@ EVENT_HERALD_SCENE7
@ EVENT_HERALD_SCENE13
@ EVENT_HERALD_SCENE15
@ EVENT_HERALD_SCENE14
@ EVENT_HERALD_SCENE2
@ EVENT_HERALD_SCENE3
HeraldTalk
@ SAY_SYLVANAS_1
@ SAY_THRALL_1
@ SAY_THRALL_2
@ SAY_THRALL_0
@ SAY_THRALL_5
@ SAY_JAINA_4
@ SAY_THRALL_7
@ SAY_JAINA_2
@ SAY_JAINA_0
@ SAY_SYLVANAS_0
@ SAY_THRALL_4
@ SAY_THRALL_3
@ SAY_JAINA_3
@ SAY_JAINA_1
@ SAY_THRALL_6
HeraldActions
@ ACTION_START_SCENE
CitizenTalk
@ SAY_KAJA
@ SAY_RUNTHAK_4
@ SAY_GRYSHKA_1
@ SAY_OLVIA_2
@ SAY_FELIKA_2
@ SAY_RUNTHAK_1
@ SAY_OLVIA_1
@ SAY_RUNTHAK_2
@ SAY_FELIKA_1
@ SAY_SANA
@ SAY_RUNTHAK_3
@ SAY_GRYSHKA_2
@ SAY_THATHUNG
Shenthul
@ QUEST_SHATTERED_SALUTE
HeraldEntries
@ NPC_BANSHEE_SYLVANAS
@ NPC_PORTAL_STORMWIND
@ NPC_THRALL_HERALD
@ NPC_KORKRON_GUARD
@ NPC_JAINA_PROUDMOORE
@ GO_PORTAL_UNDERCITY
void AddSC_orgrimmar()
ThrallWarchief
@ GOSSIP_MENU_OPTION_ID_ALL
@ GOSSIP_THE_BROOD_MOTHER
@ SPELL_SHOCK
@ OPTION_WHAT_DISCOVERIES
@ OPTION_I_LIVE_ONLY_TO_SERVE
@ GOSSIP_IT_WOULD_APPEAR_AS
@ QUEST_WHAT_THE_WIND_CARRIES
@ OPTION_OF_COURSE_WARCHIEF
@ GOSSIP_SO_MUCH_TO_LEARN
@ GOSSIP_I_DO_NOT_FAULT_YOU
@ GOSSIP_THE_SHATTERED_HAND
@ OPTION_PLEASE_SHARE_YOUR
@ SPELL_CHAIN_LIGHTNING
@ GOSSIP_MEMBERS_OF_THE_HORDE
@ OPTION_WITH_ALL_DUE_RESPECT
@ OPTION_I_I_DID_NOT_THINK_OF
@ GOSSIP_NOW_PAY_ATTENTION
@ OPTION_USURPER