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
21SDComment: Quest support: 8348,8352,8361,8519
22SDCategory: Silithus
23EndScriptData */
24
25/* ContentData
26A Pawn on the Eternal Board - creatures, gameobjects and defines
27quest_a_pawn_on_the_eternal_board
28npc_qiraj_war_spawn : Adds that are summoned in the Qiraj gates battle.
29npc_anachronos_the_ancient : Creature that controls the event.
30npc_anachronos_quest_trigger: controls the spawning of the BG War mobs.
31go_crystalline_tear : GameObject that begins the event and hands out quest
32TO DO: get correct spell IDs and timings for spells cast upon dragon transformations
33TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation,
34 but for some unknown reason it doesn't work.
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 "SpellAuraEffects.h"
48#include "SpellScript.h"
49#include "TemporarySummon.h"
50
51/*#####
52# Quest: A Pawn on the Eternal Board
53#####*/
54
108
114
115// Creature 0 - Anachronos, 1 - Fandral, 2 - Arygos, 3 - Merithra, 4 - Caelestrasz
117{
118 {ANACHRONOS_SAY_1, 0, 2000},
119 {FANDRAL_SAY_1, 1, 4000},
120 {MERITHRA_EMOTE_1, 3, 500},
121 {MERITHRA_SAY_1, 3, 500},
122 {ARYGOS_EMOTE_1, 2, 2000},
123 {CAELESTRASZ_SAY_1, 4, 8000},
124 {MERITHRA_SAY_2, 3, 6000},
125 {0, 3, 2000},
126 {MERITHRA_YELL_1, 3, 2500},
127 {0, 3, 3000}, //Morph
128 {0, 3, 4000}, //EmoteLiftoff
129 {0, 3, 4000}, // spell
130 {0, 3, 1250}, //fly
131 {0, 3, 250}, //remove flags
132 {ARYGOS_SAY_1, 2, 3000},
133 {0, 3, 2000},
134 {ARYGOS_YELL_1, 2, 3000},
135 {0, 3, 3000}, //Morph
136 {0, 3, 4000}, //EmoteLiftoff
137 {0, 3, 4000}, // spell
138 {0, 3, 1000}, //fly
139 {0, 3, 1000}, //remove flags
140 {CAELESTRASZ_SAY_2, 4, 5000},
141 {0, 3, 3000},
142 {CAELESTRASZ_YELL_1, 4, 3000},
143 {0, 3, 3000}, //Morph
144 {0, 3, 4000}, //EmoteLiftoff
145 {0, 3, 2500}, // spell
146 {ANACHRONOS_SAY_2, 0, 2000},
147 {0, 3, 250}, //fly
148 {0, 3, 25}, //remove flags
149 {FANDRAL_SAY_2, 1, 3000},
150 {ANACHRONOS_SAY_3, 0, 10000}, //Both run through the armies
151 {0, 3, 2000}, // Sands will stop
152 {0, 3, 8000}, // Summon Gate
153 {ANACHRONOS_SAY_4, 0, 4000},
154 {0, 0, 2000}, //spell 1-> Arcane cosmetic (Mobs freeze)
155 {0, 0, 5000}, //Spell 2-> Arcane long cosmetic (barrier appears) (Barrier -> Glyphs)
156 {0, 0, 7000}, //BarrieR
157 {0, 0, 4000}, //Glyphs
158 {ANACHRONOS_SAY_5, 0, 2000},
159 {0, 0, 4000}, // Roots
160 {FANDRAL_SAY_3, 1, 3000}, //Root Text
161 {FANDRAL_EMOTE_1, 1, 3000}, //falls knee
162 {ANACHRONOS_SAY_6, 0, 3000},
163 {ANACHRONOS_SAY_7, 0, 3000},
164 {ANACHRONOS_SAY_8, 0, 8000},
165 {ANACHRONOS_EMOTE_1, 0, 1000}, //Give Scepter
166 {FANDRAL_SAY_4, 1, 3000},
167 {FANDRAL_SAY_5, 1, 3000}, //->Equip hammer~Scepter, throw it at door
168 {FANDRAL_EMOTE_2, 1, 3000}, //Throw hammer at door.
169 {ANACHRONOS_SAY_9, 0, 3000},
170 {FANDRAL_SAY_6, 1, 3000}, //fandral goes away
171 {ANACHRONOS_EMOTE_2, 0, 3000},
172 {ANACHRONOS_EMOTE_3, 0, 3000},
173 {0, 0, 2000},
174 {0, 0, 2000},
175 {0, 0, 4000},
176 {ANACHRONOS_SAY_10, 0, 3000},
177 {0, 0, 2000},
178 {0, 0, 3000},
179 {0, 0, 15000},
180 {0, 0, 5000},
181 {0, 0, 3500},
182 {0, 0, 5000},
183 {0, 0, 3500},
184 {0, 0, 5000},
185 {0, 0, 0}
186};
187
188//Cordinates for Spawns
190{
191 {-8085.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
192 {-8080.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
193 {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
194 {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
195 {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
196
197 {-8085.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
198 {-8080.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
199 {-8085.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
200 {-8080.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
201 {-8085.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
202
203 {-8085.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
204 {-8080.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
205 {-8080.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
206 {-8080.0f, 1424.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
207 {-8085.0f, 1422.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
208 // 2 waves of warriors
209 {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
210 {-8078.0f, 1525.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
211 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
212 {-8078.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
213 {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
214
215 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
216 {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
217 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
218 {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
219 {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
220
221 {-8082.0f, 1523.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
222 {-8078.0f, 1521.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
223 {-8082.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
224 {-8078.0f, 1519.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
225 {-8082.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
226
227 {-8082.0f, 1524.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
228 {-8078.0f, 1522.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
229 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
230 {-8078.0f, 1518.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
231 {-8082.0f, 1516.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
232
233 {-8088.0f, 1510.0f, 2.61f, 0.0f}, //Anubisath Conqueror
234 {-8084.0f, 1520.0f, 2.61f, 0.0f}, //Anubisath Conqueror
235 {-8088.0f, 1530.0f, 2.61f, 0.0f}, //Anubisath Conqueror
236
237 {-8080.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp
238 {-8082.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp
239 {-8085.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp
240 {-8082.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp
241 {-8085.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp
242 {-8080.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Wasp
243
244 {-8082.0f, 1513.0f, 2.61f, 0.0f}, //Qiraj Wasp
245 {-8079.0f, 1523.0f, 2.61f, 0.0f}, //Qiraj Wasp
246 {-8080.0f, 1531.0f, 2.61f, 0.0f}, //Qiraj Wasp
247 {-8079.0f, 1516.0f, 2.61f, 0.0f}, //Qiraj Wasp
248 {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Wasp
249 {-8080.0f, 1518.0f, 2.61f, 0.0f}, //Qiraj Wasp
250
251 {-8081.0f, 1514.0f, 2.61f, 0.0f}, //Qiraj Tank
252 {-8081.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank
253 {-8081.0f, 1526.0f, 2.61f, 0.0f}, //Qiraj Tank
254 {-8081.0f, 1512.0f, 2.61f, 0.0f}, //Qiraj Tank
255 {-8082.0f, 1520.0f, 2.61f, 0.0f}, //Qiraj Tank
256 {-8081.0f, 1528.0f, 2.61f, 0.0f}, //Qiraj Tank
257
258 {-8082.0f, 1513.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
259 {-8082.0f, 1520.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
260 {-8082.0f, 1527.0f, 2.61f, 3.141592f}, //Anubisath Conqueror
261};
262
273
275{
276 {30, 0, 15423, 0, 0, 24s, 0}, // Kaldorei Soldier
277 { 3, 35, 15424, 0, 0, 24s, 0}, // Anubisath Conqueror
278 {12, 38, 15414, 0, 0, 24s, 0}, // Qiraji Wasps
279 { 6, 50, 15422, 0, 0, 24s, 0}, // Qiraji Tanks
280 {15, 15, 15423, 0, 0, 24s, 0} // Kaldorei Soldier
281
282};
283
288
290{
291 {100000, 2000, 33652}, // Stoned
292 {38500, 300000, 28528}, // Poison Cloud
293 {58000, 300000, 35871}, // Frost Debuff (need correct spell)
294 {80950, 300000, 42075}, // Fire Explosion (need correct spell however this one looks cool)
295};
296
297/*#####
298# npc_anachronos_the_ancient
299######*/
300
320
322{
323public:
324 npc_anachronos_the_ancient() : CreatureScript("npc_anachronos_the_ancient") { }
325
326 CreatureAI* GetAI(Creature* creature) const override
327 {
328 return new npc_anachronos_the_ancientAI(creature);
329 }
330
332 {
334 {
335 Initialize();
336 }
337
339 {
340 AnimationTimer = 1500;
341 AnimationCount = 0;
348 eventEnd = false;
349 }
350
353
361
362 void Reset() override
363 {
364 Initialize();
365
367 }
368
370 {
372 if (!player)
373 return;
374
375 Creature* Fandral = player->FindNearestCreature(NPC_FANDRAL_STAGHELM, 100.0f);
376 Creature* Arygos = player->FindNearestCreature(NPC_ARYGOS, 100.0f);
377 Creature* Caelestrasz = player->FindNearestCreature(NPC_CAELESTRASZ, 100.0f);
378 Creature* Merithra = player->FindNearestCreature(NPC_MERITHRA_OF_THE_DREAM, 100.0f);
379
380 if (!Fandral || !Arygos || !Caelestrasz || !Merithra)
381 return;
382
384 if (eventEnd == false)
385 {
386 switch (AnimationCount)
387 {
388 case 0:
389 Talk(ANACHRONOS_SAY_1, Fandral);
390 break;
391 case 1:
392 Fandral->SetTarget(me->GetGUID());
393 Fandral->AI()->Talk(FANDRAL_SAY_1, me);
394 break;
395 case 2:
397 Merithra->AI()->Talk(MERITHRA_EMOTE_1);
398 break;
399 case 3:
400 Merithra->AI()->Talk(MERITHRA_SAY_1);
401 break;
402 case 4:
403 Arygos->AI()->Talk(ARYGOS_EMOTE_1);
404 break;
405 case 5:
406 Caelestrasz->SetTarget(Fandral->GetGUID());
407 Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_1);
408 break;
409 case 6:
410 Merithra->AI()->Talk(MERITHRA_SAY_2);
411 break;
412 case 7:
413 Caelestrasz->SetTarget(ObjectGuid::Empty);
414 Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
415 break;
416 case 8:
417 Merithra->AI()->Talk(MERITHRA_YELL_1);
418 break;
419 case 9:
420 Merithra->CastSpell(Merithra, SPELL_GREEN_DRAGON_TRANSFORM_DND, true);
421 break;
422 case 10:
424 Merithra->SetDisableGravity(true);
425 Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3);
426 break;
427 case 11:
428 Merithra->CastSpell(Merithra, SPELL_NOXIOUS_BREATH, false);
429 break;
430 case 12:
431 Merithra->GetMotionMaster()->MoveCharge(-8100, 1530, 50, 42);
432 break;
433 case 13:
434 break;
435 case 14:
436 Arygos->AI()->Talk(ARYGOS_SAY_1);
437 Merithra->SetVisible(false);
438 break;
439 case 15:
440 Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
441 Merithra->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42);
442 break;
443 case 16:
444 Arygos->AI()->Talk(ARYGOS_YELL_1);
445 break;
446 case 17:
447 Arygos->CastSpell(Arygos, SPELL_BLUE_DRAGON_TRANSFORM_DND, true);
448 break;
449 case 18:
451 Arygos->SetDisableGravity(true);
452 Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42);
453 break;
454 case 19:
455 Arygos->CastSpell(Arygos, SPELL_FROST_BREATH, false);
456 break;
457 case 20:
458 Arygos->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42);
459 break;
460 case 21:
461 break;
462 case 22:
463 Caelestrasz->AI()->Talk(CAELESTRASZ_SAY_2, Fandral);
464 break;
465 case 23:
466 Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 2.61f, 10);
467 Arygos->SetVisible(false);
468 Arygos->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 10);
469 break;
470 case 24:
471 Caelestrasz->AI()->Talk(CAELESTRASZ_YELL_1);
472 break;
473 case 25:
474 Caelestrasz->CastSpell(Caelestrasz, SPELL_RED_DRAGON_TRANSFORM_DND, true);
475 break;
476 case 26:
478 Caelestrasz->SetDisableGravity(true);
479 Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4);
480 break;
481 case 27:
482 Caelestrasz->CastSpell(Caelestrasz, SPELL_FLAME_BREATH, false);
483 break;
484 case 28:
485 Talk(ANACHRONOS_SAY_2, Fandral);
486 break;
487 case 29:
488 Caelestrasz->GetMotionMaster()->MoveCharge(-8095, 1530, 50, 42);
489 Fandral->AI()->Talk(FANDRAL_SAY_2);
490 break;
491 case 30:
492 break;
493 case 31:
494 Talk(ANACHRONOS_SAY_3, Fandral);
495 break;
496 case 32:
497 Caelestrasz->SetVisible(false);
498 Caelestrasz->GetMotionMaster()->MoveCharge(-8034.535f, 1535.14f, 2.61f, 42);
499 Fandral->GetMotionMaster()->MoveCharge(-8108, 1529, 2.77f, 8);
500 me->GetMotionMaster()->MoveCharge(-8113, 1525, 2.77f, 8);
501 break;//both run to the gate
502 case 33:
504 Caelestrasz->GetMotionMaster()->MoveCharge(-8050, 1473, 65, 15);
505 break; //Text: sands will stop
506 case 34:
507 DoCast(player, SPELL_ARCANE_CHANNELING, true);//Arcane Channeling
508 break;
509 case 35:
510 me->CastSpell(Position(-8088, 1520.43f, 2.67f), SPELL_TIME_STOP, true);
511 break;
512 case 36:
514 break;
515 case 37:
516 me->SummonGameObject(GO_GATE_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
517 break;
518 case 38:
520 me->SummonGameObject(GO_GLYPH_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
521 break;
522 case 39:
523 Talk(ANACHRONOS_SAY_5, Fandral);
524 break;
525 case 40:
526 Fandral->CastSpell(me, SPELL_CALL_ANCIENTS, true);
527 break;
528 case 41:
529 Fandral->SummonGameObject(GO_ROOTS_OF_AHN_QIRAJ, Position(-8130.f, 1525.f, 17.5f, 0.f), QuaternionData(), 0s);
530 Fandral->AI()->Talk(FANDRAL_SAY_3);
531 break;
532 case 42:
533 me->CastStop();
534 Fandral->AI()->Talk(FANDRAL_EMOTE_1);
535 break;
536 case 43:
537 Fandral->CastStop();
538 break;
539 case 44:
541 break;
542 case 45:
544 break;
545 case 46:
547 me->GetMotionMaster()->MoveCharge(-8110, 1527, 2.77f, 4);
548 break;
549 case 47:
551 break;
552 case 48:
553 Fandral->AI()->Talk(FANDRAL_SAY_4, me);
554 break;
555 case 49:
556 Fandral->AI()->Talk(FANDRAL_SAY_5, me);
557 break;
558 case 50:
559 Fandral->AI()->Talk(FANDRAL_EMOTE_2);
560 Fandral->CastSpell(Position(-8127, 1525, 17.5f), SPELL_THROW_HAMMER, true);
561 break;
562 case 51:
563 {
565 Unit* mob = nullptr;
566 for (uint8 i = 0; i < 4; ++i)
567 {
568 mob = player->FindNearestCreature(entries[i], 50);
569 while (mob)
570 {
571 mob->RemoveFromWorld();
573 }
574 }
575 break;
576 }
577 case 52:
578 Fandral->GetMotionMaster()->MoveCharge(-8028.75f, 1538.795f, 2.61f, 4);
579 Fandral->AI()->Talk(ANACHRONOS_SAY_9, me);
580 break;
581 case 53:
582 Fandral->AI()->Talk(FANDRAL_SAY_6);
583 break;
584 case 54:
586 break;
587 case 55:
588 Fandral->SetVisible(false);
589 break;
590 case 56:
592 me->GetMotionMaster()->MoveCharge(-8116, 1522, 3.65f, 4);
593 break;
594 case 57:
595 me->GetMotionMaster()->MoveCharge(-8116.7f, 1527, 3.7f, 4);
596 break;
597 case 58:
598 me->GetMotionMaster()->MoveCharge(-8112.67f, 1529.9f, 2.86f, 4);
599 break;
600 case 59:
601 me->GetMotionMaster()->MoveCharge(-8117.99f, 1532.24f, 3.94f, 4);
602 break;
603 case 60:
604 Talk(ANACHRONOS_SAY_10, player);
605 me->GetMotionMaster()->MoveCharge(-8113.46f, 1524.16f, 2.89f, 4);
606 break;
607 case 61:
608 me->GetMotionMaster()->MoveCharge(-8057.1f, 1470.32f, 2.61f, 6);
609 if (player->IsInRange(me, 0, 15))
611 break;
612 case 62:
613 me->SetDisplayId(15500);
614 break;
615 case 63:
617 me->SetDisableGravity(true);
618 break;
619 case 64:
620 me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9);
621 break;
622 case 65:
623 me->SetVisible(false);
624 if (Creature* AnachronosQuestTrigger = (ObjectAccessor::GetCreature(*me, AnachronosQuestTriggerGUID)))
625 {
627 AnachronosQuestTrigger->AI()->EnterEvadeMode();
628 eventEnd = true;
629 }
630 break;
631 }
632 }
634 }
635 void UpdateAI(uint32 diff) override
636 {
637 if (AnimationTimer)
638 {
639 if (AnimationTimer <= diff)
641 else AnimationTimer -= diff;
642 }
643 if (AnimationCount < 65)
644 me->CombatStop();
645 if (AnimationCount == 65 || eventEnd)
647 }
648 };
649
650};
651
652/*######
653# npc_qiraj_war_spawn
654######*/
655
662
664{
665public:
666 npc_qiraj_war_spawn() : CreatureScript("npc_qiraj_war_spawn") { }
667
668 CreatureAI* GetAI(Creature* creature) const override
669 {
670 return new npc_qiraj_war_spawnAI(creature);
671 }
672
674 {
676 {
677 Initialize();
678 SpellTimer1 = 0;
679 SpellTimer2 = 0;
680 SpellTimer3 = 0;
681 SpellTimer4 = 0;
682 }
683
685 {
686 MobGUID.Clear();
688 Timers = false;
689 hasTarget = false;
690 }
691
695 bool Timers;
697
698 void Reset() override
699 {
700 Initialize();
701 }
702
703 void JustEngagedWith(Unit* /*who*/) override { }
704 void JustDied(Unit* /*killer*/) override;
705
706 void UpdateAI(uint32 diff) override
707 {
708 if (!Timers)
709 {
710 if (me->GetEntry() == NPC_ANUBISATH_CONQUEROR || me->GetEntry() == NPC_QIRAJI_TANK || me->GetEntry() == NPC_QIRAJI_WASP) //all but Kaldorei Soldiers
711 {
715 }
718 Timers = true;
719 }
721 {
722 if (SpellTimer1 <= diff)
723 {
724 DoCast(me, SpawnCast[1].SpellId);
727 } else SpellTimer1 -= diff;
728 if (SpellTimer2 <= diff)
729 {
730 DoCast(me, SpawnCast[2].SpellId);
732 } else SpellTimer2 -= diff;
733 if (SpellTimer3 <= diff)
734 {
735 DoCast(me, SpawnCast[3].SpellId);
737 } else SpellTimer3 -= diff;
738 }
740 {
741 if (SpellTimer4 <= diff)
742 {
744 me->AttackStop();
747 } else SpellTimer4 -= diff;
748 }
749 if (!hasTarget)
750 {
751 Unit* target = nullptr;
753 target = me->FindNearestCreature(NPC_KALDOREI_INFANTRY, 20, true);
755 {
756 uint8 tar = urand(0, 2);
757
758 if (tar == 0)
759 target = me->FindNearestCreature(NPC_QIRAJI_TANK, 20, true);
760 else if (tar == 1)
762 else if (tar == 2)
763 target = me->FindNearestCreature(NPC_QIRAJI_WASP, 20, true);
764 }
765 hasTarget = true;
766 if (target)
767 AttackStart(target);
768 }
771
772 if (!UpdateVictim())
773 {
774 hasTarget = false;
775 return;
776 }
777
779 }
780 };
781
782};
783
784/*#####
785# npc_anachronos_quest_trigger
786#####*/
787
789{
790public:
791 npc_anachronos_quest_trigger() : CreatureScript("npc_anachronos_quest_trigger") { }
792
793 CreatureAI* GetAI(Creature* creature) const override
794 {
795 return new npc_anachronos_quest_triggerAI(creature);
796 }
797
799 {
801 {
802 Initialize();
803 }
804
806 {
808
809 WaveTimer = 2000;
810 AnnounceTimer = 1000;
811 LiveCount = 0;
812 WaveCount = 0;
813
814 EventStarted = false;
815 Announced = false;
816 Failed = false;
817 }
818
820
823
826
829 bool Failed;
830
831 void Reset() override
832 {
833 Initialize();
834
835 me->SetVisible(false);
836 }
837
839 {
841 uint8 count = locIndex + WavesInfo[WaveCount].SpawnCount;
842
843 for (uint8 i = locIndex; i <= count; ++i)
844 {
846
848 {
849 if (spawn->GetEntry() == NPC_KALDOREI_INFANTRY)
850 spawn->SetDisplayId(15427 + rand32() % 4);
851 if (i >= 30) WaveCount = 1;
852 if (i >= 33) WaveCount = 2;
853 if (i >= 45) WaveCount = 3;
854 if (i >= 51) WaveCount = 4;
855
856 if (WaveCount < 5) //1-4 Wave
857 {
859 {
860 spawnAI->MobGUID = me->GetGUID();
861 spawnAI->PlayerGUID = PlayerGUID;
862 }
863 }
864 }
865 }
866
869 }
870
872 {
874 if (!player)
875 return;
876
877 if (Group* EventGroup = player->GetGroup())
878 {
879 Player* groupMember = nullptr;
880
881 uint8 GroupMemberCount = 0;
882 //uint8 DeadMemberCount = 0;
883 uint8 FailedMemberCount = 0;
884
885 Group::MemberSlotList const& members = EventGroup->GetMemberSlots();
886
887 for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr)
888 {
889 groupMember = ObjectAccessor::GetPlayer(*me, itr->guid);
890 if (!groupMember)
891 continue;
893 {
895 ++FailedMemberCount;
896 }
897 ++GroupMemberCount;
898
899 //if (groupMember->isDead())
900 // ++DeadMemberCount;
901 }
902
903 if (GroupMemberCount == FailedMemberCount || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS))
904 Failed = true; //only so event can restart
905 }
906 }
907
909 {
910 --LiveCount;
911 if (!LiveCount)
912 Announced = false;
913 }
914
915 void UpdateAI(uint32 diff) override
916 {
917 if (!PlayerGUID || !EventStarted)
918 return;
919
920 if (WaveCount < 4)
921 {
922 if (!Announced && AnnounceTimer <= diff)
923 {
924 Talk(WavesInfo[WaveCount].WaveTextId);
925 Announced = true;
926 } else AnnounceTimer -= diff;
927
928 if (WaveTimer <= diff)
930 else WaveTimer -= diff;
931 }
933 if (WaveCount == 4 || Failed)
935 };
936 };
937
938};
939
952
953/*#####
954# go_crystalline_tear
955######*/
956
964
966{
967public:
968 go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { }
969
971 {
973
974 void OnQuestAccept(Player* player, Quest const* quest) override
975 {
977 {
979 {
980 Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
981 Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
982 Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
983 /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
984 Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220s);
985
986 if (Merithra)
987 {
991 Merithra->SetFaction(FACTION_FRIENDLY);
992 }
993
994 if (Caelestrasz)
995 {
999 Caelestrasz->SetFaction(FACTION_FRIENDLY);
1000 }
1001
1002 if (Arygos)
1003 {
1008 }
1009
1010 if (Anachronos)
1011 {
1013 anachronosAI->PlayerGUID = player->GetGUID();
1014
1016 {
1017 triggerAI->Failed = false;
1018 triggerAI->PlayerGUID = player->GetGUID();
1019 triggerAI->EventStarted = true;
1020 triggerAI->Announced = true;
1021 }
1022 }
1023 }
1024 }
1025 }
1026 };
1027
1028 GameObjectAI* GetAI(GameObject* go) const override
1029 {
1030 return new go_crystalline_tearAI(go);
1031 }
1032};
1033
1034/*###
1035## go_wind_stone
1036###*/
1037
1064
1084
1102
1120
1121enum WS
1122{
1124 DUKE = 1,
1126
1127 FIRE = 0x1,
1128 WATER = 0x2,
1129 EARTH = 0x4,
1130 AIR = 0x8
1132
1134{
1135 public:
1136 go_wind_stone() : GameObjectScript("go_wind_stone") { }
1137
1139 {
1141
1142 private:
1143 bool isSummoning = false;
1144
1145 uint8 GetPlayerTwilightSetRank(Player* player) // For random summoning
1146 {
1147 bool setAura = player->HasAura(AURA_TWILIGHT_SET);
1148 bool medallionAura = player->HasAura(AURA_MEDALLION);
1149 bool ringAura = player->HasAura(AURA_RING);
1150
1151 if (setAura && medallionAura && ringAura)
1152 return 3;
1153 else if (setAura && medallionAura)
1154 return 2;
1155 else if (setAura)
1156 return 1;
1157 else
1158 return 0;
1159 }
1160
1162 {
1163 uint8 result = 0x0;
1164
1165 switch (type)
1166 {
1167 case TEMPLAR:
1168 {
1169 if (player->HasItemCount(ITEM_TEMPLAR_FIRE))
1170 result |= FIRE;
1171 if (player->HasItemCount(ITEM_TEMPLAR_WATER))
1172 result |= WATER;
1173 if (player->HasItemCount(ITEM_TEMPLAR_EARTH))
1174 result |= EARTH;
1175 if (player->HasItemCount(ITEM_TEMPLAR_AIR))
1176 result |= AIR;
1177 break;
1178 }
1179 case DUKE:
1180 {
1181 if (player->HasItemCount(ITEM_DUKE_FIRE))
1182 result |= FIRE;
1183 if (player->HasItemCount(ITEM_DUKE_WATER))
1184 result |= WATER;
1185 if (player->HasItemCount(ITEM_DUKE_EARTH))
1186 result |= EARTH;
1187 if (player->HasItemCount(ITEM_DUKE_AIR))
1188 result |= AIR;
1189 break;
1190 }
1191 case ROYAL:
1192 {
1193 if (player->HasItemCount(ITEM_ROYAL_FIRE))
1194 result |= FIRE;
1195 if (player->HasItemCount(ITEM_ROYAL_WATER))
1196 result |= WATER;
1197 if (player->HasItemCount(ITEM_ROYAL_EARTH))
1198 result |= EARTH;
1199 if (player->HasItemCount(ITEM_ROYAL_AIR))
1200 result |= AIR;
1201 break;
1202 }
1203 default:
1204 break;
1205 }
1206 return result;
1207 }
1208
1209 void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell)
1210 {
1211 isSummoning = true;
1212
1213 player->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5min);
1214 me->CastSpell(player, spell);
1215 me->DespawnOrUnsummon(1100ms);
1216 }
1217
1218 public:
1219 bool OnGossipHello(Player* player) override
1220 {
1221 // fix possible exploit
1222 if (isSummoning)
1223 {
1224 return true;
1225 }
1226 uint8 rank = GetPlayerTwilightSetRank(player);
1227
1228 uint32 gossipId = me->GetGOInfo()->GetGossipMenuId();
1229
1230 switch (gossipId)
1231 {
1233 {
1235 if (rank >= 1) // 1 or 2 or 3
1237 else
1238 {
1239 player->CastSpell(player, SPELL_PUNISHMENT, true);
1240 break;
1241 }
1242
1243 uint8 item = GetSummonItems(player, TEMPLAR);
1244 if (item & FIRE)
1246 if (item & WATER)
1248 if (item & EARTH)
1250 if (item & AIR)
1252 break;
1253 }
1255 {
1257 if (rank >= 2) // 2 or 3
1259 else
1260 {
1261 player->CastSpell(player, SPELL_PUNISHMENT, true);
1262 break;
1263 }
1264
1265 uint8 item = GetSummonItems(player, DUKE);
1266 if (item & FIRE)
1268 if (item & WATER)
1270 if (item & EARTH)
1272 if (item & AIR)
1274 break;
1275 }
1277 {
1279 if (rank == 3) // 3
1281 else
1282 {
1283 player->CastSpell(player, SPELL_PUNISHMENT, true);
1284 break;
1285 }
1286
1287 uint8 item = GetSummonItems(player, ROYAL);
1288 if (item & FIRE)
1290 if (item & WATER)
1292 if (item & EARTH)
1294 if (item & AIR)
1296 break;
1297 }
1298 default:
1299 break;
1300 }
1301
1302 SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID());
1303 return true;
1304 }
1305
1306 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
1307 {
1308 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
1309 ClearGossipMenuFor(player);
1311
1312 // fix possible exploit
1313 if (isSummoning)
1314 {
1315 return true;
1316 }
1317
1318 uint8 rank = GetPlayerTwilightSetRank(player);
1319
1320 switch (action)
1321 {
1322 case GOSSIP_ACTION_INFO_DEF + 1:
1323 if (rank >= 1)
1324 {
1326 }
1327 break;
1328 case GOSSIP_ACTION_INFO_DEF + 2:
1329 if (rank >= 1)
1330 {
1331 SummonNPC(me, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE);
1332 }
1333 break;
1334 case GOSSIP_ACTION_INFO_DEF + 3:
1335 if (rank >= 1)
1336 {
1337 SummonNPC(me, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER);
1338 }
1339 break;
1340 case GOSSIP_ACTION_INFO_DEF + 4:
1341 if (rank >= 1)
1342 {
1343 SummonNPC(me, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH);
1344 }
1345 break;
1346 case GOSSIP_ACTION_INFO_DEF + 5:
1347 if (rank >= 1)
1348 {
1349 SummonNPC(me, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR);
1350 }
1351 break;
1352
1353 case GOSSIP_ACTION_INFO_DEF + 6:
1354 if (rank >= 2)
1355 {
1357 }
1358 break;
1359 case GOSSIP_ACTION_INFO_DEF + 7:
1360 if (rank >= 2)
1361 {
1362 SummonNPC(me, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE);
1363 }
1364 break;
1365 case GOSSIP_ACTION_INFO_DEF + 8:
1366 if (rank >= 2)
1367 {
1368 SummonNPC(me, player, NPC_DUKE_WATER, SPELL_DUKE_WATER);
1369 }
1370 break;
1371 case GOSSIP_ACTION_INFO_DEF + 9:
1372 if (rank >= 2)
1373 {
1374 SummonNPC(me, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH);
1375 }
1376 break;
1377 case GOSSIP_ACTION_INFO_DEF + 10:
1378 if (rank >= 2)
1379 {
1380 SummonNPC(me, player, NPC_DUKE_AIR, SPELL_DUKE_AIR);
1381 }
1382 break;
1383
1384 case GOSSIP_ACTION_INFO_DEF + 11:
1385 if (rank == 3)
1386 {
1388 }
1389 break;
1390 case GOSSIP_ACTION_INFO_DEF + 12:
1391 if (rank == 3)
1392 {
1393 SummonNPC(me, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE);
1394 }
1395 break;
1396 case GOSSIP_ACTION_INFO_DEF + 13:
1397 if (rank == 3)
1398 {
1399 SummonNPC(me, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER);
1400 }
1401 break;
1402 case GOSSIP_ACTION_INFO_DEF + 14:
1403 if (rank == 3)
1404 {
1405 SummonNPC(me, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH);
1406 }
1407 break;
1408 case GOSSIP_ACTION_INFO_DEF + 15:
1409 if (rank == 3)
1410 {
1411 SummonNPC(me, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR);
1412 }
1413 break;
1414
1415 default:
1416 break;
1417 }
1418 return true;
1419 }
1420
1421 void Reset() override
1422 {
1423 // Allow despawning
1424 me->RemoveFlag(GO_FLAG_NODESPAWN);
1425 isSummoning = false;
1426 }
1427 };
1428
1429 GameObjectAI* GetAI(GameObject* go) const override
1430 {
1431 return new go_wind_stoneAI(go);
1432 }
1433};
1434
1435// 24745 - Summon Templar, Trigger
1436// 24747 - Summon Templar Fire, Trigger
1437// 24757 - Summon Templar Air, Trigger
1438// 24759 - Summon Templar Earth, Trigger
1439// 24761 - Summon Templar Water, Trigger
1440// 24762 - Summon Duke, Trigger
1441// 24766 - Summon Duke Fire, Trigger
1442// 24769 - Summon Duke Air, Trigger
1443// 24771 - Summon Duke Earth, Trigger
1444// 24773 - Summon Duke Water, Trigger
1445// 24785 - Summon Royal, Trigger
1446// 24787 - Summon Royal Fire, Trigger
1447// 24791 - Summon Royal Air, Trigger
1448// 24792 - Summon Royal Earth, Trigger
1449// 24793 - Summon Royal Water, Trigger
1450// 46595 - Summon Ice Stone Lieutenant, Trigger
1452{
1454
1455 bool Validate(SpellInfo const* spellInfo) override
1456 {
1457 return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
1458 }
1459
1460 void PeriodicTick(AuraEffect const* aurEff)
1461 {
1462 PreventDefaultAction();
1463
1464 // All these spells trigger a spell that requires reagents; if the
1465 // triggered spell is cast as "triggered", reagents are not consumed
1466 GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo().TriggerSpell, CastSpellExtraArgs(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST).SetTriggeringAura(aurEff));
1467 }
1468
1473};
1474
#define M_PI
Definition Common.h:72
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
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:107
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
uint32 rand32()
Definition Random.cpp:70
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
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)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ EFFECT_0
@ EMOTE_ONESHOT_LIFTOFF
@ GO_FLAG_NODESPAWN
@ FACTION_FRIENDLY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore Spell and Category cooldowns.
#define AuraEffectPeriodicFn(F, I, N)
#define CAST_AI(a, b)
Definition UnitAI.h:27
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:34
@ UNIT_NPC_FLAG_NONE
@ UNIT_FLAG_NON_ATTACKABLE
SpellEffectInfo const & GetSpellEffectInfo() const
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetDisplayId(uint32 modelId) override
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetTarget(ObjectGuid guid) override
CreatureAI * AI() const
Definition Creature.h:154
Definition Group.h:165
std::list< MemberSlot > MemberSlotList
Definition Group.h:175
MemberSlotList::const_iterator member_citerator
Definition Group.h:176
void MoveCharge(float x, float y, float z, float speed=SPEED_CHARGE, uint32 id=EVENT_CHARGE, bool generatePath=false)
static ObjectGuid const Empty
Definition ObjectGuid.h:140
void Clear()
Definition ObjectGuid.h:150
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SendCloseGossip()
uint32 GetGossipOptionAction(uint32 selection) const
Definition GossipDef.h:269
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition Player.cpp:9763
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition Player.cpp:16032
Group * GetGroup()
Definition Player.h:2171
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15642
void FailQuest(uint32 quest_id)
Definition Player.cpp:15040
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition Player.cpp:14233
PlayerMenu * PlayerTalkClass
Definition Player.h:1969
uint32 GetQuestId() const
Definition QuestDef.h:229
uint32 TriggerSpell
Definition SpellInfo.h:228
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void CastStop(uint32 except_spellid=0)
Definition Unit.cpp:988
void SetVisible(bool x)
Definition Unit.cpp:8513
void SetFaction(uint32 faction) override
Definition Unit.h:974
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
virtual void SetDisplayId(uint32 modelId)
Definition Unit.cpp:10407
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void RemoveAllAttackers()
Definition Unit.cpp:5736
void RemoveFromWorld() override
Definition Unit.cpp:9601
void SetStandState(UnitStandStateType state)
Definition Unit.cpp:10363
void CombatStop(bool includingCast=false, bool mutualPvP=true)
Definition Unit.cpp:5691
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:1099
bool AttackStop()
Definition Unit.cpp:5645
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:2015
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1192
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition Object.cpp:1283
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
bool Validate(SpellInfo const *spellInfo) override
void PeriodicTick(AuraEffect const *aurEff)
PrepareAuraScript(spell_silithus_summon_cultist_periodic)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void AttackStart(Unit *) override
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