TrinityCore
Loading...
Searching...
No Matches
zone_silithus.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: Silithus
20SD%Complete: 100
21SDCategory: Silithus
22EndScriptData */
23
24/* ContentData
25A Pawn on the Eternal Board - creatures, gameobjects and defines
26quest_a_pawn_on_the_eternal_board
27npc_qiraj_war_spawn : Adds that are summoned in the Qiraj gates battle.
28npc_anachronos_the_ancient : Creature that controls the event.
29npc_anachronos_quest_trigger: controls the spawning of the BG War mobs.
30go_crystalline_tear : GameObject that begins the event and hands out quest
31TO DO: get correct spell IDs and timings for spells cast upon dragon transformations
32TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation,
33 but for some unknown reason it doesn't work.
34go_wind_stone
35EndContentData */
36
37#include "ScriptMgr.h"
38#include "CreatureAIImpl.h"
39#include "GameObject.h"
40#include "GameObjectAI.h"
41#include "Group.h"
42#include "MotionMaster.h"
43#include "ObjectAccessor.h"
44#include "Player.h"
45#include "ScriptedCreature.h"
46#include "ScriptedGossip.h"
47#include "TemporarySummon.h"
48
49/*#####
50# Quest: A Pawn on the Eternal Board
51#####*/
52
106
112
113// Creature 0 - Anachronos, 1 - Fandral, 2 - Arygos, 3 - Merithra, 4 - Caelestrasz
115{
116 {ANACHRONOS_SAY_1, 0, 2000},
117 {FANDRAL_SAY_1, 1, 4000},
118 {MERITHRA_EMOTE_1, 3, 500},
119 {MERITHRA_SAY_1, 3, 500},
120 {ARYGOS_EMOTE_1, 2, 2000},
121 {CAELESTRASZ_SAY_1, 4, 8000},
122 {MERITHRA_SAY_2, 3, 6000},
123 {0, 3, 2000},
124 {MERITHRA_YELL_1, 3, 2500},
125 {0, 3, 3000}, //Morph
126 {0, 3, 4000}, //EmoteLiftoff
127 {0, 3, 4000}, // spell
128 {0, 3, 1250}, //fly
129 {0, 3, 250}, //remove flags
130 {ARYGOS_SAY_1, 2, 3000},
131 {0, 3, 2000},
132 {ARYGOS_YELL_1, 2, 3000},
133 {0, 3, 3000}, //Morph
134 {0, 3, 4000}, //EmoteLiftoff
135 {0, 3, 4000}, // spell
136 {0, 3, 1000}, //fly
137 {0, 3, 1000}, //remove flags
138 {CAELESTRASZ_SAY_2, 4, 5000},
139 {0, 3, 3000},
140 {CAELESTRASZ_YELL_1, 4, 3000},
141 {0, 3, 3000}, //Morph
142 {0, 3, 4000}, //EmoteLiftoff
143 {0, 3, 2500}, // spell
144 {ANACHRONOS_SAY_2, 0, 2000},
145 {0, 3, 250}, //fly
146 {0, 3, 25}, //remove flags
147 {FANDRAL_SAY_2, 1, 3000},
148 {ANACHRONOS_SAY_3, 0, 10000}, //Both run through the armies
149 {0, 3, 2000}, // Sands will stop
150 {0, 3, 8000}, // Summon Gate
151 {ANACHRONOS_SAY_4, 0, 4000},
152 {0, 0, 2000}, //spell 1-> Arcane cosmetic (Mobs freeze)
153 {0, 0, 5000}, //Spell 2-> Arcane long cosmetic (barrier appears) (Barrier -> Glyphs)
154 {0, 0, 7000}, //BarrieR
155 {0, 0, 4000}, //Glyphs
156 {ANACHRONOS_SAY_5, 0, 2000},
157 {0, 0, 4000}, // Roots
158 {FANDRAL_SAY_3, 1, 3000}, //Root Text
159 {FANDRAL_EMOTE_1, 1, 3000}, //falls knee
160 {ANACHRONOS_SAY_6, 0, 3000},
161 {ANACHRONOS_SAY_7, 0, 3000},
162 {ANACHRONOS_SAY_8, 0, 8000},
163 {ANACHRONOS_EMOTE_1, 0, 1000}, //Give Scepter
164 {FANDRAL_SAY_4, 1, 3000},
165 {FANDRAL_SAY_5, 1, 3000}, //->Equip hammer~Scepter, throw it at door
166 {FANDRAL_EMOTE_2, 1, 3000}, //Throw hammer at door.
167 {ANACHRONOS_SAY_9, 0, 3000},
168 {FANDRAL_SAY_6, 1, 3000}, //fandral goes away
169 {ANACHRONOS_EMOTE_2, 0, 3000},
170 {ANACHRONOS_EMOTE_3, 0, 3000},
171 {0, 0, 2000},
172 {0, 0, 2000},
173 {0, 0, 4000},
174 {ANACHRONOS_SAY_10, 0, 3000},
175 {0, 0, 2000},
176 {0, 0, 3000},
177 {0, 0, 15000},
178 {0, 0, 5000},
179 {0, 0, 3500},
180 {0, 0, 5000},
181 {0, 0, 3500},
182 {0, 0, 5000},
183 {0, 0, 0}
184};
185
186//Cordinates for Spawns
188{
189 {-8085.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
190 {-8080.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
191 {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
192 {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
193 {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
194
195 {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
196 {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
197 {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
198 {-8080.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
199 {-8085.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
200
201 {-8085.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
202 {-8080.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
203 {-8080.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
204 {-8080.0f, 1424.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
205 {-8085.0f, 1422.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
206 // 2 waves of warriors
207 {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
208 {-8078.0f, 1525.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
209 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
210 {-8078.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
211 {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
212
213 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
214 {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
215 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
216 {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
217 {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
218
219 {-8082.0f, 1523.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
220 {-8078.0f, 1521.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
221 {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
222 {-8078.0f, 1519.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
223 {-8082.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
224
225 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
226 {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
227 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
228 {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
229 {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
230
231 {-8088.0f, 1510.0f, 2.61f, 0.0f}, //Anubisath Conqueror
232 {-8084.0f, 1520.0f, 2.61f, 0.0f}, //Anubisath Conqueror
233 {-8088.0f, 1530.0f, 2.61f, 0.0f}, //Anubisath Conqueror
234
235 {-8080.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp
236 {-8082.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp
237 {-8085.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp
238 {-8082.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp
239 {-8085.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp
240 {-8080.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Wasp
241
242 {-8082.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp
243 {-8079.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp
244 {-8080.0f, 1531.0f, 2.61f, 0.0f}, //Qiraj Wasp
245 {-8079.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp
246 {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp
247 {-8080.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp
248
249 {-8081.0f, 1514.0f, 2.61f, 0.0f}, //Qiraj Tank
250 {-8081.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank
251 {-8081.0f, 1526.0f, 2.61f, 0.0f}, //Qiraj Tank
252 {-8081.0f, 1512.0f, 2.61f, 0.0f}, //Qiraj Tank
253 {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank
254 {-8081.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Tank
255
256 {-8082.0f, 1513.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
257 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
258 {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
259};
260
271
273{
274 {30, 0, 15423, 0, 0, 24s, 0}, // Kaldorei Soldier
275 { 3, 35, 15424, 0, 0, 24s, 0}, // Anubisath Conqueror
276 {12, 38, 15414, 0, 0, 24s, 0}, // Qiraji Wasps
277 { 6, 50, 15422, 0, 0, 24s, 0}, // Qiraji Tanks
278 {15, 15, 15423, 0, 0, 24s, 0} // Kaldorei Soldier
279
280};
281
286
288{
289 {100000, 2000, 33652}, // Stoned
290 {38500, 300000, 28528}, // Poison Cloud
291 {58000, 300000, 35871}, // Frost Debuff (need correct spell)
292 {80950, 300000, 42075}, // Fire Explosion (need correct spell however this one looks cool)
293};
294
295/*#####
296# npc_anachronos_the_ancient
297######*/
298
318
320{
321public:
322 npc_anachronos_the_ancient() : CreatureScript("npc_anachronos_the_ancient") { }
323
324 CreatureAI* GetAI(Creature* creature) const override
325 {
326 return new npc_anachronos_the_ancientAI(creature);
327 }
328
330 {
332 {
333 Initialize();
334 }
335
337 {
338 AnimationTimer = 1500;
339 AnimationCount = 0;
346 eventEnd = false;
347 }
348
351
359
360 void Reset() override
361 {
362 Initialize();
363
365 }
366
368 {
370 if (!player)
371 return;
372
373 Creature* Fandral = player->FindNearestCreature(NPC_FANDRAL_STAGHELM, 100.0f);
374 Creature* Arygos = player->FindNearestCreature(NPC_ARYGOS, 100.0f);
375 Creature* Caelestrasz = player->FindNearestCreature(NPC_CAELESTRASZ, 100.0f);
376 Creature* Merithra = player->FindNearestCreature(NPC_MERITHRA_OF_THE_DREAM, 100.0f);
377
378 if (!Fandral || !Arygos || !Caelestrasz || !Merithra)
379 return;
380
382 if (eventEnd == false)
383 {
384 switch (AnimationCount)
385 {
386 case 0:
387 Talk(ANACHRONOS_SAY_1, Fandral);
388 break;
389 case 1:
390 Fandral->SetTarget(me->GetGUID());
391 Fandral->AI()->Talk(FANDRAL_SAY_1, me);
392 break;
393 case 2:
395 Merithra->AI()->Talk(MERITHRA_EMOTE_1);
396 break;
397 case 3:
398 Merithra->AI()->Talk(MERITHRA_SAY_1);
399 break;
400 case 4:
401 Arygos->AI()->Talk(ARYGOS_EMOTE_1);
402 break;
403 case 5:
404 Caelestrasz->SetTarget(Fandral->GetGUID());
405 Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_1);
406 break;
407 case 6:
408 Merithra->AI()->Talk(MERITHRA_SAY_2);
409 break;
410 case 7:
411 Caelestrasz->SetTarget(ObjectGuid::Empty);
412 Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
413 break;
414 case 8:
415 Merithra->AI()->Talk(MERITHRA_YELL_1);
416 break;
417 case 9:
418 Merithra->CastSpell(Merithra, SPELL_GREEN_DRAGON_TRANSFORM_DND, true);
419 break;
420 case 10:
422 Merithra->SetDisableGravity(true);
423 Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3);
424 break;
425 case 11:
426 Merithra->CastSpell(Merithra, SPELL_NOXIOUS_BREATH, false);
427 break;
428 case 12:
429 Merithra->GetMotionMaster()->MoveCharge(-8100, 1530, 50, 42);
430 break;
431 case 13:
432 break;
433 case 14:
434 Arygos->AI()->Talk(ARYGOS_SAY_1);
435 Merithra->SetVisible(false);
436 break;
437 case 15:
438 Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
439 Merithra->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42);
440 break;
441 case 16:
442 Arygos->AI()->Talk(ARYGOS_YELL_1);
443 break;
444 case 17:
445 Arygos->CastSpell(Arygos, SPELL_BLUE_DRAGON_TRANSFORM_DND, true);
446 break;
447 case 18:
449 Arygos->SetDisableGravity(true);
450 Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42);
451 break;
452 case 19:
453 Arygos->CastSpell(Arygos, SPELL_FROST_BREATH, false);
454 break;
455 case 20:
456 Arygos->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42);
457 break;
458 case 21:
459 break;
460 case 22:
461 Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_2, Fandral);
462 break;
463 case 23:
464 Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
465 Arygos->SetVisible(false);
466 Arygos->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 10);
467 break;
468 case 24:
469 Caelestrasz->AI()->Talk(CAELESTRASZ_YELL_1);
470 break;
471 case 25:
472 Caelestrasz->CastSpell(Caelestrasz, SPELL_RED_DRAGON_TRANSFORM_DND, true);
473 break;
474 case 26:
476 Caelestrasz->SetDisableGravity(true);
477 Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4);
478 break;
479 case 27:
480 Caelestrasz->CastSpell(Caelestrasz, SPELL_FLAME_BREATH, false);
481 break;
482 case 28:
483 Talk(ANACHRONOS_SAY_2, Fandral);
484 break;
485 case 29:
486 Caelestrasz->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42);
487 Fandral->AI()->Talk(FANDRAL_SAY_2);
488 break;
489 case 30:
490 break;
491 case 31:
492 Talk(ANACHRONOS_SAY_3, Fandral);
493 break;
494 case 32:
495 Caelestrasz->SetVisible(false);
496 Caelestrasz->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42);
497 Fandral->GetMotionMaster()->MoveCharge(-8108, 1529, 2.77f, 8);
498 me->GetMotionMaster()->MoveCharge(-8113, 1525, 2.77f, 8);
499 break;//both run to the gate
500 case 33:
502 Caelestrasz->GetMotionMaster()->MoveCharge(-8050, 1473, 65, 15);
503 break; //Text: sands will stop
504 case 34:
505 DoCast(player, SPELL_ARCANE_CHANNELING, true);//Arcane Channeling
506 break;
507 case 35:
508 me->CastSpell(Position(-8088, 1520.43f, 2.67f), SPELL_TIME_STOP, true);
509 break;
510 case 36:
512 break;
513 case 37:
514 me->SummonGameObject(GO_GATE_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
515 break;
516 case 38:
518 me->SummonGameObject(GO_GLYPH_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
519 break;
520 case 39:
521 Talk(ANACHRONOS_SAY_5, Fandral);
522 break;
523 case 40:
524 Fandral->CastSpell(me, SPELL_CALL_ANCIENTS, true);
525 break;
526 case 41:
527 Fandral->SummonGameObject(GO_ROOTS_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
528 Fandral->AI()->Talk(FANDRAL_SAY_3);
529 break;
530 case 42:
531 me->CastStop();
532 Fandral->AI()->Talk(FANDRAL_EMOTE_1);
533 break;
534 case 43:
535 Fandral->CastStop();
536 break;
537 case 44:
539 break;
540 case 45:
542 break;
543 case 46:
545 me->GetMotionMaster()->MoveCharge(-8110, 1527, 2.77f, 4);
546 break;
547 case 47:
549 break;
550 case 48:
551 Fandral->AI()->Talk(FANDRAL_SAY_4, me);
552 break;
553 case 49:
554 Fandral->AI()->Talk(FANDRAL_SAY_5, me);
555 break;
556 case 50:
557 Fandral->AI()->Talk(FANDRAL_EMOTE_2);
558 Fandral->CastSpell(Position(-8127, 1525, 17.5f), SPELL_THROW_HAMMER, true);
559 break;
560 case 51:
561 {
563 Unit* mob = nullptr;
564 for (uint8 i = 0; i < 4; ++i)
565 {
566 mob = player->FindNearestCreature(entries[i], 50);
567 while (mob)
568 {
569 mob->RemoveFromWorld();
571 }
572 }
573 break;
574 }
575 case 52:
576 Fandral->GetMotionMaster()->MoveCharge(-8028.75f, 1538.795f, 2.61f, 4);
577 Fandral->AI()->Talk(ANACHRONOS_SAY_9, me);
578 break;
579 case 53:
580 Fandral->AI()->Talk(FANDRAL_SAY_6);
581 break;
582 case 54:
584 break;
585 case 55:
586 Fandral->SetVisible(false);
587 break;
588 case 56:
590 me->GetMotionMaster()->MoveCharge(-8116, 1522, 3.65f, 4);
591 break;
592 case 57:
593 me->GetMotionMaster()->MoveCharge(-8116.7f, 1527, 3.7f, 4);
594 break;
595 case 58:
596 me->GetMotionMaster()->MoveCharge(-8112.67f, 1529.9f, 2.86f, 4);
597 break;
598 case 59:
599 me->GetMotionMaster()->MoveCharge(-8117.99f, 1532.24f, 3.94f, 4);
600 break;
601 case 60:
602 Talk(ANACHRONOS_SAY_10, player);
603 me->GetMotionMaster()->MoveCharge(-8113.46f, 1524.16f, 2.89f, 4);
604 break;
605 case 61:
606 me->GetMotionMaster()->MoveCharge(-8057.1f, 1470.32f, 2.61f, 6);
607 if (player->IsInRange(me, 0, 15))
609 break;
610 case 62:
611 me->SetDisplayId(15500);
612 break;
613 case 63:
615 me->SetDisableGravity(true);
616 break;
617 case 64:
618 me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9);
619 break;
620 case 65:
621 me->SetVisible(false);
622 if (Creature* AnachronosQuestTrigger = (ObjectAccessor::GetCreature(*me, AnachronosQuestTriggerGUID)))
623 {
625 AnachronosQuestTrigger->AI()->EnterEvadeMode();
626 eventEnd = true;
627 }
628 break;
629 }
630 }
632 }
633 void UpdateAI(uint32 diff) override
634 {
635 if (AnimationTimer)
636 {
637 if (AnimationTimer <= diff)
639 else AnimationTimer -= diff;
640 }
641 if (AnimationCount < 65)
642 me->CombatStop();
643 if (AnimationCount == 65 || eventEnd)
645 }
646 };
647
648};
649
650/*######
651# npc_qiraj_war_spawn
652######*/
653
660
662{
663public:
664 npc_qiraj_war_spawn() : CreatureScript("npc_qiraj_war_spawn") { }
665
666 CreatureAI* GetAI(Creature* creature) const override
667 {
668 return new npc_qiraj_war_spawnAI(creature);
669 }
670
672 {
674 {
675 Initialize();
676 SpellTimer1 = 0;
677 SpellTimer2 = 0;
678 SpellTimer3 = 0;
679 SpellTimer4 = 0;
680 }
681
683 {
684 MobGUID.Clear();
686 Timers = false;
687 hasTarget = false;
688 }
689
693 bool Timers;
695
696 void Reset() override
697 {
698 Initialize();
699 }
700
701 void JustEngagedWith(Unit* /*who*/) override { }
702 void JustDied(Unit* /*killer*/) override;
703
704 void UpdateAI(uint32 diff) override
705 {
706 if (!Timers)
707 {
708 if (me->GetEntry() == NPC_ANUBISATH_CONQUEROR || me->GetEntry() == NPC_QIRAJI_TANK || me->GetEntry() == NPC_QIRAJI_WASP) //all but Kaldorei Soldiers
709 {
713 }
716 Timers = true;
717 }
719 {
720 if (SpellTimer1 <= diff)
721 {
722 DoCast(me, SpawnCast[1].SpellId);
725 } else SpellTimer1 -= diff;
726 if (SpellTimer2 <= diff)
727 {
728 DoCast(me, SpawnCast[2].SpellId);
730 } else SpellTimer2 -= diff;
731 if (SpellTimer3 <= diff)
732 {
733 DoCast(me, SpawnCast[3].SpellId);
735 } else SpellTimer3 -= diff;
736 }
738 {
739 if (SpellTimer4 <= diff)
740 {
742 me->AttackStop();
745 } else SpellTimer4 -= diff;
746 }
747 if (!hasTarget)
748 {
749 Unit* target = nullptr;
751 target = me->FindNearestCreature(NPC_KALDOREI_INFANTRY, 20, true);
753 {
754 uint8 tar = urand(0, 2);
755
756 if (tar == 0)
757 target = me->FindNearestCreature(NPC_QIRAJI_TANK, 20, true);
758 else if (tar == 1)
760 else if (tar == 2)
761 target = me->FindNearestCreature(NPC_QIRAJI_WASP, 20, true);
762 }
763 hasTarget = true;
764 if (target)
765 AttackStart(target);
766 }
769
770 if (!UpdateVictim())
771 {
772 hasTarget = false;
773 return;
774 }
775 }
776 };
777
778};
779
780/*#####
781# npc_anachronos_quest_trigger
782#####*/
783
785{
786public:
787 npc_anachronos_quest_trigger() : CreatureScript("npc_anachronos_quest_trigger") { }
788
789 CreatureAI* GetAI(Creature* creature) const override
790 {
791 return new npc_anachronos_quest_triggerAI(creature);
792 }
793
795 {
797 {
798 Initialize();
799 }
800
802 {
804
805 WaveTimer = 2000;
806 AnnounceTimer = 1000;
807 LiveCount = 0;
808 WaveCount = 0;
809
810 EventStarted = false;
811 Announced = false;
812 Failed = false;
813 }
814
816
819
822
825 bool Failed;
826
827 void Reset() override
828 {
829 Initialize();
830
831 me->SetVisible(false);
832 }
833
835 {
837 uint8 count = locIndex + WavesInfo[WaveCount].SpawnCount;
838
839 for (uint8 i = locIndex; i <= count; ++i)
840 {
842
844 {
845 if (spawn->GetEntry() == NPC_KALDOREI_INFANTRY)
846 spawn->SetDisplayId(15427 + rand32() % 4);
847 if (i >= 30) WaveCount = 1;
848 if (i >= 33) WaveCount = 2;
849 if (i >= 45) WaveCount = 3;
850 if (i >= 51) WaveCount = 4;
851
852 if (WaveCount < 5) //1-4 Wave
853 {
855 {
856 spawnAI->MobGUID = me->GetGUID();
857 spawnAI->PlayerGUID = PlayerGUID;
858 }
859 }
860 }
861 }
862
865 }
866
868 {
870 if (!player)
871 return;
872
873 if (Group* EventGroup = player->GetGroup())
874 {
875 Player* groupMember = nullptr;
876
877 uint8 GroupMemberCount = 0;
878 //uint8 DeadMemberCount = 0;
879 uint8 FailedMemberCount = 0;
880
881 Group::MemberSlotList const& members = EventGroup->GetMemberSlots();
882
883 for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr)
884 {
885 groupMember = ObjectAccessor::GetPlayer(*me, itr->guid);
886 if (!groupMember)
887 continue;
889 {
891 ++FailedMemberCount;
892 }
893 ++GroupMemberCount;
894
895 //if (groupMember->isDead())
896 // ++DeadMemberCount;
897 }
898
899 if (GroupMemberCount == FailedMemberCount || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS))
900 Failed = true; //only so event can restart
901 }
902 }
903
905 {
906 --LiveCount;
907 if (!LiveCount)
908 Announced = false;
909 }
910
911 void UpdateAI(uint32 diff) override
912 {
913 if (!PlayerGUID || !EventStarted)
914 return;
915
916 if (WaveCount < 4)
917 {
918 if (!Announced && AnnounceTimer <= diff)
919 {
920 Talk(WavesInfo[WaveCount].WaveTextId);
921 Announced = true;
922 } else AnnounceTimer -= diff;
923
924 if (WaveTimer <= diff)
926 else WaveTimer -= diff;
927 }
929 if (WaveCount == 4 || Failed)
931 }
932 };
933
934};
935
948
949/*#####
950# go_crystalline_tear
951######*/
952
960
962{
963public:
964 go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { }
965
967 {
969
970 void OnQuestAccept(Player* player, Quest const* quest) override
971 {
973 {
975 {
976 Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
977 Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
978 Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
979 /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
980 Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
981
982 if (Merithra)
983 {
987 Merithra->SetFaction(FACTION_FRIENDLY);
988 }
989
990 if (Caelestrasz)
991 {
995 Caelestrasz->SetFaction(FACTION_FRIENDLY);
996 }
997
998 if (Arygos)
999 {
1004 }
1005
1006 if (Anachronos)
1007 {
1009 anachronosAI->PlayerGUID = player->GetGUID();
1010
1012 {
1013 triggerAI->Failed = false;
1014 triggerAI->PlayerGUID = player->GetGUID();
1015 triggerAI->EventStarted = true;
1016 triggerAI->Announced = true;
1017 }
1018 }
1019 }
1020 }
1021 }
1022 };
1023
1024 GameObjectAI* GetAI(GameObject* go) const override
1025 {
1026 return new go_crystalline_tearAI(go);
1027 }
1028};
1029
1030/*###
1031## go_wind_stone
1032###*/
1033
1060
1080
1098
1116
1117enum WS
1118{
1120 DUKE = 1,
1122
1123 FIRE = 0x1,
1124 WATER = 0x2,
1125 EARTH = 0x4,
1126 AIR = 0x8
1128
1130{
1131 public:
1132 go_wind_stone() : GameObjectScript("go_wind_stone") { }
1133
1135 {
1137
1138 private:
1139 bool isSummoning = false;
1140
1141 uint8 GetPlayerTwilightSetRank(Player* player) // For random summoning
1142 {
1143 bool setAura = player->HasAura(AURA_TWILIGHT_SET);
1144 bool medallionAura = player->HasAura(AURA_MEDALLION);
1145 bool ringAura = player->HasAura(AURA_RING);
1146
1147 if (setAura && medallionAura && ringAura)
1148 return 3;
1149 else if (setAura && medallionAura)
1150 return 2;
1151 else if (setAura)
1152 return 1;
1153 else
1154 return 0;
1155 }
1156
1158 {
1159 uint8 result = 0x0;
1160
1161 switch (type)
1162 {
1163 case TEMPLAR:
1164 {
1165 if (player->HasItemCount(ITEM_TEMPLAR_FIRE))
1166 result |= FIRE;
1167 if (player->HasItemCount(ITEM_TEMPLAR_WATER))
1168 result |= WATER;
1169 if (player->HasItemCount(ITEM_TEMPLAR_EARTH))
1170 result |= EARTH;
1171 if (player->HasItemCount(ITEM_TEMPLAR_AIR))
1172 result |= AIR;
1173 break;
1174 }
1175 case DUKE:
1176 {
1177 if (player->HasItemCount(ITEM_DUKE_FIRE))
1178 result |= FIRE;
1179 if (player->HasItemCount(ITEM_DUKE_WATER))
1180 result |= WATER;
1181 if (player->HasItemCount(ITEM_DUKE_EARTH))
1182 result |= EARTH;
1183 if (player->HasItemCount(ITEM_DUKE_AIR))
1184 result |= AIR;
1185 break;
1186 }
1187 case ROYAL:
1188 {
1189 if (player->HasItemCount(ITEM_ROYAL_FIRE))
1190 result |= FIRE;
1191 if (player->HasItemCount(ITEM_ROYAL_WATER))
1192 result |= WATER;
1193 if (player->HasItemCount(ITEM_ROYAL_EARTH))
1194 result |= EARTH;
1195 if (player->HasItemCount(ITEM_ROYAL_AIR))
1196 result |= AIR;
1197 break;
1198 }
1199 default:
1200 break;
1201 }
1202 return result;
1203 }
1204
1205 void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell)
1206 {
1207 isSummoning = true;
1208
1209 player->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5min);
1210 me->CastSpell(player, spell);
1211 me->DespawnOrUnsummon(1100ms);
1212 }
1213
1214 public:
1215 bool OnGossipHello(Player* player) override
1216 {
1217 // fix possible exploit
1218 if (isSummoning)
1219 {
1220 return true;
1221 }
1222 uint8 rank = GetPlayerTwilightSetRank(player);
1223
1224 uint32 gossipId = me->GetGOInfo()->GetGossipMenuId();
1225
1226 switch (gossipId)
1227 {
1229 {
1231 if (rank >= 1) // 1 or 2 or 3
1233 else
1234 {
1235 player->CastSpell(player, SPELL_PUNISHMENT, true);
1236 break;
1237 }
1238
1239 uint8 item = GetSummonItems(player, TEMPLAR);
1240 if (item & FIRE)
1242 if (item & WATER)
1244 if (item & EARTH)
1246 if (item & AIR)
1248 break;
1249 }
1251 {
1253 if (rank >= 2) // 2 or 3
1255 else
1256 {
1257 player->CastSpell(player, SPELL_PUNISHMENT, true);
1258 break;
1259 }
1260
1261 uint8 item = GetSummonItems(player, DUKE);
1262 if (item & FIRE)
1264 if (item & WATER)
1266 if (item & EARTH)
1268 if (item & AIR)
1270 break;
1271 }
1273 {
1275 if (rank == 3) // 3
1277 else
1278 {
1279 player->CastSpell(player, SPELL_PUNISHMENT, true);
1280 break;
1281 }
1282
1283 uint8 item = GetSummonItems(player, ROYAL);
1284 if (item & FIRE)
1286 if (item & WATER)
1288 if (item & EARTH)
1290 if (item & AIR)
1292 break;
1293 }
1294 default:
1295 break;
1296 }
1297
1298 SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID());
1299 return true;
1300 }
1301
1302 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
1303 {
1304 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
1305 ClearGossipMenuFor(player);
1306 player->PlayerTalkClass->SendCloseGossip();
1307
1308 // fix possible exploit
1309 if (isSummoning)
1310 {
1311 return true;
1312 }
1313
1314 uint8 rank = GetPlayerTwilightSetRank(player);
1315
1316 switch (action)
1317 {
1318 case GOSSIP_ACTION_INFO_DEF + 1:
1319 if (rank >= 1)
1320 {
1322 }
1323 break;
1324 case GOSSIP_ACTION_INFO_DEF + 2:
1325 if (rank >= 1)
1326 {
1327 SummonNPC(me, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE);
1328 }
1329 break;
1330 case GOSSIP_ACTION_INFO_DEF + 3:
1331 if (rank >= 1)
1332 {
1333 SummonNPC(me, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER);
1334 }
1335 break;
1336 case GOSSIP_ACTION_INFO_DEF + 4:
1337 if (rank >= 1)
1338 {
1339 SummonNPC(me, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH);
1340 }
1341 break;
1342 case GOSSIP_ACTION_INFO_DEF + 5:
1343 if (rank >= 1)
1344 {
1345 SummonNPC(me, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR);
1346 }
1347 break;
1348
1349 case GOSSIP_ACTION_INFO_DEF + 6:
1350 if (rank >= 2)
1351 {
1353 }
1354 break;
1355 case GOSSIP_ACTION_INFO_DEF + 7:
1356 if (rank >= 2)
1357 {
1358 SummonNPC(me, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE);
1359 }
1360 break;
1361 case GOSSIP_ACTION_INFO_DEF + 8:
1362 if (rank >= 2)
1363 {
1364 SummonNPC(me, player, NPC_DUKE_WATER, SPELL_DUKE_WATER);
1365 }
1366 break;
1367 case GOSSIP_ACTION_INFO_DEF + 9:
1368 if (rank >= 2)
1369 {
1370 SummonNPC(me, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH);
1371 }
1372 break;
1373 case GOSSIP_ACTION_INFO_DEF + 10:
1374 if (rank >= 2)
1375 {
1376 SummonNPC(me, player, NPC_DUKE_AIR, SPELL_DUKE_AIR);
1377 }
1378 break;
1379
1380 case GOSSIP_ACTION_INFO_DEF + 11:
1381 if (rank == 3)
1382 {
1384 }
1385 break;
1386 case GOSSIP_ACTION_INFO_DEF + 12:
1387 if (rank == 3)
1388 {
1389 SummonNPC(me, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE);
1390 }
1391 break;
1392 case GOSSIP_ACTION_INFO_DEF + 13:
1393 if (rank == 3)
1394 {
1395 SummonNPC(me, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER);
1396 }
1397 break;
1398 case GOSSIP_ACTION_INFO_DEF + 14:
1399 if (rank == 3)
1400 {
1401 SummonNPC(me, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH);
1402 }
1403 break;
1404 case GOSSIP_ACTION_INFO_DEF + 15:
1405 if (rank == 3)
1406 {
1407 SummonNPC(me, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR);
1408 }
1409 break;
1410
1411 default:
1412 break;
1413 }
1414 return true;
1415 }
1416
1417 void Reset() override
1418 {
1419 // Allow despawning
1420 me->RemoveFlag(GO_FLAG_NODESPAWN);
1421 isSummoning = false;
1422 }
1423 };
1424
1425 GameObjectAI* GetAI(GameObject* go) const override
1426 {
1427 return new go_wind_stoneAI(go);
1428 }
1429};
1430
1432{
1433 new go_crystalline_tear();
1436 new npc_qiraj_war_spawn();
1437 new go_wind_stone();
1438}
#define M_PI
Definition Common.h:118
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
uint32 rand32()
Definition Random.cpp:70
void AddGossipItemFor(Player *player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
void InitGossipMenuFor(Player *player, uint32 menuId)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ EMOTE_ONESHOT_LIFTOFF
@ GO_FLAG_NODESPAWN
@ FACTION_FRIENDLY
#define CAST_AI(a, b)
Definition UnitAI.h:29
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:42
@ UNIT_NPC_FLAG_NONE
@ UNIT_FLAG_NON_ATTACKABLE
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetTarget(ObjectGuid const &guid) override
void SetDisplayId(uint32 displayId, bool setNative=false) override
CreatureAI * AI() const
Definition Creature.h:228
Definition Group.h:205
std::list< MemberSlot > MemberSlotList
Definition Group.h:218
MemberSlotList::const_iterator member_citerator
Definition Group.h:219
void MoveCharge(float x, float y, float z, float speed=SPEED_CHARGE, uint32 id=EVENT_CHARGE, bool generatePath=false, Unit const *target=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr)
static ObjectGuid const Empty
Definition ObjectGuid.h:314
void Clear()
Definition ObjectGuid.h:329
uint32 GetEntry() const
Definition Object.h:89
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition Player.cpp:9904
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition Player.cpp:16573
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
void FailQuest(uint32 quest_id)
Definition Player.cpp:15347
Group * GetGroup(Optional< uint8 > partyIndex)
Definition Player.h:2796
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition Player.cpp:14269
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition Player.h:2570
uint32 GetQuestId() const
Definition QuestDef.h:637
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void CastStop(uint32 except_spellid=0)
Definition Unit.cpp:1186
void SetVisible(bool x)
Definition Unit.cpp:8768
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition Unit.cpp:6012
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10731
void SetFaction(uint32 faction) override
Definition Unit.h:872
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13361
void RemoveAllAttackers()
Definition Unit.cpp:6066
void RemoveFromWorld() override
Definition Unit.cpp:10241
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1657
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:846
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:999
bool AttackStop()
Definition Unit.cpp:5965
virtual void SetDisplayId(uint32 displayId, bool setNative=false)
Definition Unit.cpp:10779
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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:1398
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:1441
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:501
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition Object.cpp:592
GameObjectAI * GetAI(GameObject *go) const override
GameObjectAI * GetAI(GameObject *go) 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)
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
uint32 CreatureId
uint8 UsedSpawnPoint
Milliseconds DespTimer
uint32 SpawnTimer
uint32 YellTimer
void OnQuestAccept(Player *player, Quest const *quest) override
uint8 GetPlayerTwilightSetRank(Player *player)
bool OnGossipHello(Player *player) override
void SummonNPC(GameObject *go, Player *player, uint32 npc, uint32 spell)
uint8 GetSummonItems(Player *player, WS type)
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void AddSC_silithus()
AnachronosTheAncient
@ SPELL_CALL_ANCIENTS
@ SPELL_BLUE_DRAGON_TRANSFORM_DND
@ SPELL_FROST_BREATH
@ NPC_QIRAJI_WASP
@ SPELL_CALL_PRISMATIC_BARRIER
@ SPELL_TIME_STOP
@ SPELL_CALL_GLYPHS_OF_WARDING
@ SPELL_FLAME_BREATH
@ SPELL_ARCANE_CHANNELING
@ NPC_QIRAJI_TANK
@ SPELL_GREEN_DRAGON_TRANSFORM_DND
@ SPELL_RED_DRAGON_TRANSFORM_DND
@ NPC_KALDOREI_INFANTRY
@ SPELL_THROW_HAMMER
@ NPC_ANUBISATH_CONQUEROR
@ SPELL_NOXIOUS_BREATH
@ AURA_MEDALLION
@ SPELL_TEMPLAR_FIRE
@ SPELL_DUKE_WATER
@ AURA_RING
@ SPELL_ROYAL_WATER
@ SPELL_ROYAL_AIR
@ SPELL_ROYAL_RANDOM
@ SPELL_DUKE_AIR
@ SPELL_ROYAL_FIRE
@ SPELL_PUNISHMENT
@ SPELL_DUKE_FIRE
@ SPELL_DUKE_RANDOM
@ SPELL_DUKE_EARTH
@ SPELL_ROYAL_EARTH
@ SPELL_TEMPLAR_AIR
@ SPELL_TEMPLAR_WATER
@ AURA_TWILIGHT_SET
@ SPELL_TEMPLAR_EARTH
@ SPELL_TEMPLAR_RANDOM
@ TEMPLAR
@ EARTH
@ ROYAL
@ WATER
CrystallineTear
@ ARYGOS_GNOME_FORM
@ ANACHRONOS_QUEST_TRIGGER_INVISIBLE
@ MERITHRA_NIGHT_ELF_FORM
@ CAELESTRASZ_NIGHT_ELF_FORM
WSCreatures
@ NPC_TEMPLAR_AIR
@ NPC_TEMPLAR_WATER
@ NPC_ROYAL_FIRE
@ NPC_DUKE_AIR
@ NPC_ROYAL_EARTH
@ NPC_TEMPLAR_EARTH
@ NPC_TEMPLAR_FIRE
@ NPC_DUKE_WATER
@ NPC_ROYAL_WATER
@ NPC_ROYAL_AIR
@ NPC_DUKE_FIRE
@ NPC_DUKE_EARTH
static QuestCinematic EventAnim[]
QirajWarSpawn
@ SPELL_STONED_CHANNEL_CAST_VISUAL
@ SPELL_SUMMON_POISON_CLOUD
@ SPELL_STONED
@ OPTION_ID_3_KAZUM
@ OPTION_ID_3_SHARDS
@ OPTION_ID_4_ZEPHYRS
@ GOSSIP_ID_LESSER_WS
@ OPTION_ID_2_AZURE
@ GOSSIP_ID_WIND_STONE
@ OPTION_ID_2_FATHOMS
@ OPTION_ID_2_SKWOL
@ OPTION_ID_1_SKALDRENOX
@ OPTION_ID_4_HOARY
@ GOSSIP_ID_GREATER_WS
@ OPTION_ID_WS_RANDOM
@ OPTION_ID_1_CYNDERS
@ OPTION_ID_3_EARTHEN
@ OPTION_ID_4_WHIRLAXIS
@ OPTION_ID_1_CRIMSON
static WaveData WavesInfo[5]
EternalBoard
@ ANACHRONOS_EMOTE_3
@ ANACHRONOS_SAY_3
@ GO_GATE_OF_AHN_QIRAJ
@ FANDRAL_SAY_6
@ EVENT_COOLDOWN
@ ANACHRONOS_EMOTE_2
@ ANACHRONOS_SAY_6
@ NPC_ARYGOS
@ ANACHRONOS_SAY_9
@ ANACHRONOS_SAY_7
@ CAELESTRASZ_YELL_1
@ ANACHRONOS_SAY_5
@ NPC_FANDRAL_STAGHELM
@ MERITHRA_SAY_2
@ ANACHRONOS_EMOTE_1
@ NPC_MERITHRA_OF_THE_DREAM
@ ANACHRONOS_SAY_8
@ FANDRAL_EMOTE_2
@ ARYGOS_YELL_1
@ FANDRAL_SAY_3
@ ARYGOS_SAY_1
@ FANDRAL_SAY_1
@ MERITHRA_SAY_1
@ EVENT_AREA_RADIUS
@ NPC_CAELESTRASZ
@ GO_ROOTS_OF_AHN_QIRAJ
@ ANACHRONOS_SAY_1
@ QUEST_A_PAWN_ON_THE_ETERNAL_BOARD
@ ANACHRONOS_SAY_4
@ FANDRAL_SAY_5
@ FANDRAL_SAY_2
@ ANACHRONOS_SAY_2
@ ARYGOS_EMOTE_1
@ CAELESTRASZ_SAY_1
@ FANDRAL_SAY_4
@ FANDRAL_EMOTE_1
@ GO_GLYPH_OF_AHN_QIRAJ
@ NPC_ANACHRONOS
@ MERITHRA_EMOTE_1
@ ANACHRONOS_SAY_10
@ CAELESTRASZ_SAY_2
@ MERITHRA_YELL_1
Position const SpawnLocation[]
static SpawnSpells SpawnCast[4]
@ ITEM_TEMPLAR_FIRE
@ ITEM_TEMPLAR_AIR
@ ITEM_ROYAL_EARTH
@ ITEM_DUKE_AIR
@ ITEM_DUKE_EARTH
@ ITEM_ROYAL_AIR
@ ITEM_TEMPLAR_WATER
@ ITEM_DUKE_WATER
@ ITEM_ROYAL_WATER
@ ITEM_DUKE_FIRE
@ ITEM_TEMPLAR_EARTH
@ ITEM_ROYAL_FIRE