TrinityCore
violet_hold.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#include "ScriptMgr.h"
19#include "GameObject.h"
20#include "InstanceScript.h"
21#include "Map.h"
22#include "MotionMaster.h"
23#include "Player.h"
24#include "GameObjectAI.h"
25#include "ScriptedEscortAI.h"
26#include "ScriptedGossip.h"
27#include "SpellAuraEffects.h"
28#include "SpellScript.h"
29#include "TemporarySummon.h"
30#include "violet_hold.h"
31
32/*
33 * TODO:
34 * - add missing trash emotes
35 */
36
38{
47
58};
59
61{
62 SPELL_CLEAVE = 15496,
63 SPELL_IMPALE = 58459,
65 SPELL_SUNDER_ARMOR = 58461
66};
67
69{
71 SPELL_SLOW = 25603,
74};
75
77{
82};
83
85{
87 SPELL_SPELL_LOCK = 30849
88};
89
91{
94};
95
97{
100};
101
103{
107
109{
113
115{
119
121{
122 SPELL_DESTROY_DOOR_SEAL = 58040, // > 31326 Corrupt Medivh
123 SPELL_PRISON_DOOR_SEAL_WEAKEN = 58041, // NYI, no effect, maybe > 32613 Medivh's Shield -5%
124 SPELL_DOOR_BROKEN = 58043 // NYI, no effect, maybe > 31327 Medivh Dies!
126
128{
133
135{
137
138 SPELL_ATTACK_VIOLET_HOLD_GUARD = 57936, // NYI, no effect
139
140 // Turned out almost all spells from BM were copied to create Violet Hold. Not only serverside spells and
141 // not only their effects but also attributes and icons. The scripts were also copied, possibly unchanged
142 SPELL_PORTAL_1_READY = 57995, // NYI, effect copied from 'Time Rift 1 Ready'
143 SPELL_PORTAL_2_READY = 57996, // NYI, effect copied from 'Time Rift 2 Ready'
144 SPELL_PORTAL_3_READY = 57997, // NYI, effect copied from 'Time Rift 3 Ready'
145 SPELL_PORTAL_4_READY = 57998, // NYI, effect copied from 'Time Rift 4 Ready'
146 SPELL_PORTAL_5_READY = 57999, // NYI, effect copied from 'Time Rift 1 Ready', only 4 portals in BM
147
148 SPELL_SUMMON_PORTAL = 58002, // NYI, effect copied from 'Summon Time Rift'
149 SPELL_SUMMON_PORTAL_EFFECT_1 = 58003, // NYI, no effect, > Summon Time Rift Effect
150 SPELL_SUMMON_PORTAL_EFFECT_2 = 58004, // NYI, no effect, > Summon Time Rift Effect
151 SPELL_SUMMON_PORTAL_EFFECT_3 = 58005, // NYI, no effect, > Summon Time Rift Effect
152 SPELL_SUMMON_PORTAL_EFFECT_4 = 58006, // NYI, no effect, > Summon Time Rift Effect
153 SPELL_SUMMON_PORTAL_EFFECT_5 = 58007, // NYI, no effect, > Summon Time Rift Effect
154 SPELL_PORTAL_PERIODIC = 58008, // > Time Rift Periodic
155 SPELL_PORTAL_CHANNEL_TRIGGER = 58011, // NYI, effect copied from 'Time Rift Channel Trigger'
156 SPELL_PORTAL_CHANNEL = 58012, // > Time Rift Channel
157 SPELL_CLOSE_PORTAL_TRIGGER = 58014, // NYI, effect copied from 'Close Time Rift Trigger'
158 SPELL_CLOSE_PORTAL_EFFECT = 58018, // NYI, effect copied from 'Close Time Rift Effect'
159 SPELL_PORTAL_READY_PRIMER = 58019, // NYI, effect copied from 'Time Rift Ready Primer'
160
161 SPELL_SUMMON_PORTAL_GUARDIAN = 58028, // NYI, summons 30660
162 SPELL_SUMMON_PORTAL_GUARDIAN_2 = 58029, // NYI, summons 30892
163 SPELL_SUMMON_PORTAL_KEEPER = 58030, // NYI, summons 30695
164 SPELL_SUMMON_PORTAL_KEEPER_2 = 58031, // NYI, summons 30893
165 SPELL_SUMMON_AZURE_BINDER = 58034, // NYI, summons 30663
166 SPELL_SUMMON_AZURE_BINDER_2 = 58086, // NYI, summons 30918
167 SPELL_SUMMON_AZURE_INVADER = 58087, // NYI, summons 30661
168 SPELL_SUMMON_AZURE_INVADER_2 = 58088, // NYI, summons 30961
169 SPELL_SUMMON_AZURE_SPELLBREAKER = 58089, // NYI, summons 30662
170 SPELL_SUMMON_AZURE_SPELLBREAKER_2 = 58090, // NYI, summons 30962
171 SPELL_SUMMON_AZURE_MAGE_SLAYER = 58091, // NYI, summons 30664
172 SPELL_SUMMON_AZURE_MAGE_SLAYER_2 = 58092, // NYI, summons 30963
173 SPELL_SUMMON_VETERAN_MAGE_HUNTER = 58093, // NYI, summons 30665
174
175 SPELL_SUMMON_AZURE_CAPTAIN = 60048, // NYI, summons 30666
176 SPELL_SUMMON_AZURE_STALKER = 60086, // NYI, summons 32191
177 SPELL_SUMMON_AZURE_RAIDER = 60049, // NYI, summons 30668
178 SPELL_SUMMON_AZURE_RAIDER_2 = 60092, // NYI, summons 30668
179 SPELL_SUMMON_AZURE_SORCEROR = 60050, // NYI, summons 30667
180 SPELL_SUMMON_AZURE_SORCEROR_2 = 60093, // NYI, summons 30667
181
185
187{
190
192{
193 // Sinclari
197
200
201 // Sinclari Trigger
206
208{
209 {1877.670288f, 842.280273f, 43.333591f},
210 {1877.338867f, 834.615356f, 38.762287f},
211 {1872.161011f, 823.854309f, 38.645401f},
212 {1864.860474f, 815.787170f, 38.784843f},
213 {1858.953735f, 810.048950f, 44.008759f},
214 {1843.707153f, 805.807739f, 44.135197f}
215 //{1825.736084f, 807.305847f, 44.363785f}
216};
217
219{
220 {1902.561401f, 853.334656f, 47.106117f},
221 {1895.486084f, 855.376404f, 44.334591f},
222 {1882.805176f, 854.993286f, 43.333591f},
223 {1877.670288f, 842.280273f, 43.333591f},
224 {1877.338867f, 834.615356f, 38.762287f},
225 {1872.161011f, 823.854309f, 38.645401f},
226 {1864.860474f, 815.787170f, 38.784843f},
227 {1858.953735f, 810.048950f, 44.008759f},
228 {1843.707153f, 805.807739f, 44.135197f}
229 //{1825.736084f, 807.305847f, 44.363785f}
230};
231
233{
234 {1929.392212f, 837.614990f, 47.136166f},
235 {1928.290649f, 824.750427f, 45.474411f},
236 {1915.544922f, 826.919373f, 38.642811f},
237 {1900.933960f, 818.855652f, 38.801647f},
238 {1886.810547f, 813.536621f, 38.490490f},
239 {1869.079712f, 808.701538f, 38.689003f},
240 {1860.843384f, 806.645020f, 44.008789f},
241 {1843.707153f, 805.807739f, 44.135197f}
242 //{1825.736084f, 807.305847f, 44.363785f}
243};
244
246{
247 {1934.049438f, 815.778503f, 52.408699f},
248 {1928.290649f, 824.750427f, 45.474411f},
249 {1915.544922f, 826.919373f, 38.642811f},
250 {1900.933960f, 818.855652f, 38.801647f},
251 {1886.810547f, 813.536621f, 38.490490f},
252 {1869.079712f, 808.701538f, 38.689003f},
253 {1860.843384f, 806.645020f, 44.008789f},
254 {1843.707153f, 805.807739f, 44.135197f}
255 //{1825.736084f, 807.305847f, 44.363785f}
256};
257
259{
260 {1921.658447f, 761.657043f, 50.866741f},
261 {1910.559814f, 755.780457f, 47.701447f},
262 {1896.664673f, 752.920898f, 47.667004f},
263 {1887.398804f, 763.633240f, 47.666851f},
264 {1879.020386f, 775.396973f, 38.705990f},
265 {1872.439087f, 782.568604f, 38.808292f},
266 {1863.573364f, 791.173584f, 38.743660f},
267 {1857.811890f, 796.765564f, 43.950329f},
268 {1845.577759f, 800.681152f, 44.104248f}
269 //{1827.100342f, 801.605957f, 44.363358f}
270};
271
273{
274 {1887.398804f, 763.633240f, 47.666851f},
275 {1879.020386f, 775.396973f, 38.705990f},
276 {1872.439087f, 782.568604f, 38.808292f},
277 {1863.573364f, 791.173584f, 38.743660f},
278 {1857.811890f, 796.765564f, 43.950329f},
279 {1845.577759f, 800.681152f, 44.104248f}
280 //{1827.100342f, 801.605957f, 44.363358f}
281};
282
284{
285 {1888.861084f, 805.074768f, 38.375790f},
286 {1869.793823f, 804.135804f, 38.647018f},
287 {1861.541504f, 804.149780f, 43.968292f},
288 {1843.567017f, 804.288208f, 44.139091f}
289 //{1826.889648f, 803.929993f, 44.363239f}
290};
291
293{
294 { 1843.567017f, 804.288208f, 44.139091f }
295};
296
297Position const SaboteurMoraggPath[] = // sniff
298{
299 { 1886.251f, 803.0743f, 38.42326f },
300 { 1885.71f, 799.8929f, 38.37241f },
301 { 1889.505f, 762.3288f, 47.66684f },
302 { 1894.542f, 742.1829f, 47.66684f },
303 { 1894.603f, 739.9231f, 47.66684f },
304};
305
306Position const SaboteurErekemPath[] = // sniff
307{
308 { 1886.251f, 803.0743f, 38.42326f },
309 { 1881.047f, 829.6866f, 38.64856f },
310 { 1877.585f, 844.6685f, 38.49014f },
311 { 1876.085f, 851.6685f, 42.99014f },
312 { 1873.747f, 864.1373f, 43.33349f }
313};
314
316{
317 { 1886.251f, 803.0743f, 38.42326f },
318 { 1888.672f, 801.2348f, 38.42305f },
319 { 1901.987f, 793.3254f, 38.65126f }
320};
321
323{
324 { 1886.251f, 803.0743f, 38.42326f },
325 { 1867.925f, 778.8035f, 38.64702f },
326 { 1853.304f, 759.0161f, 38.65761f }
327};
328
329Position const SaboteurXevozzPath[] = // sniff
330{
331 { 1886.251f, 803.0743f, 38.42326f },
332 { 1889.096f, 810.0487f, 38.43871f },
333 { 1896.547f, 823.5473f, 38.72863f },
334 { 1906.666f, 842.3111f, 38.63351f }
335};
336
338{
339 { 1886.251f, 803.0743f, 38.42326f },
340 { 1889.69f, 807.0032f, 38.39914f },
341 { 1906.91f, 818.2574f, 38.86596f },
342 { 1929.03f, 824.2713f, 46.09165f },
343 { 1928.441f, 842.8891f, 47.15078f },
344 { 1927.454f, 851.6091f, 47.19094f },
345 { 1927.947f, 852.2986f, 47.19637f }
346};
347
348Position const SinclariPositions[] = // sniff
349{
350 { 1829.142f, 798.219f, 44.36212f, 0.122173f }, // 0 - Crystal
351 { 1820.12f, 803.916f, 44.36466f, 0.0f }, // 1 - Outside
352 { 1816.185f, 804.0629f, 44.44799f, 3.176499f }, // 2 - Second Spawn Point
353 { 1827.886f, 804.0555f, 44.36467f, 0.0f } // 3 - Outro
354};
355
356Position const GuardsMovePosition = { 1802.099f, 803.7724f, 44.36466f, 0.0f }; // sniff
357
359{
360 npc_sinclari_vh(Creature* creature) : ScriptedAI(creature), _summons(creature)
361 {
362 _instance = creature->GetInstanceScript();
363 }
364
365 void Reset() override
366 {
368 for (uint8 i = 0; i < PortalIntroCount; ++i)
370 summon->AI()->SetData(DATA_PORTAL_LOCATION, i);
371
373
374 std::list<Creature*> guardList;
376 for (Creature* guard : guardList)
377 {
378 guard->Respawn(true);
379 guard->SetVisible(true);
380 guard->SetReactState(REACT_AGGRESSIVE);
381 guard->AI()->EnterEvadeMode();
382 }
383 }
384
385 bool OnGossipHello(Player* player) override
386 {
387 // override default gossip
389 {
390 case IN_PROGRESS:
392 player->SendPreparedGossip(me);
393 return true;
394 case DONE:
395 return true; // NYI
396 case NOT_STARTED:
397 case FAIL:
398 default:
399 break;
400 }
401
402 // load default gossip
403 return false;
404 }
405
406 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
407 {
408 if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0)
409 {
413 player->PlayerTalkClass->SendCloseGossip();
414 }
415 else if (menuId == GOSSIP_MENU_SEND_ME_IN && gossipListId == 0)
416 {
417 me->CastSpell(player, SPELL_TELEPORT_PLAYER, true);
418 player->PlayerTalkClass->SendCloseGossip();
419 }
420 return false;
421 }
422
423 void DoAction(int32 actionId) override
424 {
425 if (actionId == ACTION_SINCLARI_OUTRO)
427 }
428
429 void UpdateAI(uint32 diff) override
430 {
431 _scheduler.Update(diff);
432
433 if (!UpdateVictim())
434 return;
435 }
436
438 {
439 _scheduler.Schedule(Seconds(1), [this](TaskContext task)
440 {
441 switch (task.GetRepeatCounter())
442 {
443 case 0:
444 me->SetWalk(true);
445 me->GetMotionMaster()->MovePoint(0, SinclariPositions[0]);
446 task.Repeat(Seconds(1));
447 break;
448 case 1:
449 me->HandleEmoteCommand(EMOTE_ONESHOT_USE_STANDING);
450 me->GetMap()->SummonCreature(NPC_DEFENSE_SYSTEM, DefenseSystemLocation);
451 task.Repeat(Seconds(3));
452 break;
453 case 2:
454 me->SetFacingTo(SinclariPositions[0].GetOrientation());
455 Talk(SAY_SINCLARI_INTRO_1);
456
457 task.Schedule(Seconds(1), [this](TaskContext /*task*/)
458 {
459 std::list<Creature*> guardList;
460 me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f);
461 for (Creature* guard : guardList)
462 {
463 if (!guard->IsAlive())
464 continue;
465 guard->SetReactState(REACT_PASSIVE);
466 guard->SetWalk(false);
467 guard->GetMotionMaster()->MovePoint(0, GuardsMovePosition);
468 }
469 });
470
471 task.Repeat(Seconds(2));
472 break;
473 case 3:
476 task.Repeat(Seconds(5));
477 break;
478 case 4:
479 me->SetFacingTo(SinclariPositions[1].GetOrientation());
480
481 task.Schedule(Seconds(1), [this](TaskContext /*task*/)
482 {
483 std::list<Creature*> guardList;
485 for (Creature* guard : guardList)
486 guard->SetVisible(false);
487 });
488
489 task.Repeat(Seconds(6));
490 break;
491 case 5:
493 task.Repeat(Seconds(4));
494 break;
495 case 6:
497 task.Repeat(Seconds(1));
498 break;
499 case 7:
501 {
502 mainDoor->SetGoState(GO_STATE_READY);
503 mainDoor->SetFlag(GO_FLAG_LOCKED);
504 }
505 task.Repeat(Seconds(5));
506 break;
507 case 8:
509 task.Repeat(Seconds(1));
510 break;
511 case 9:
512 // We should teleport inside if event is in progress with GOSSIP_MENU_SEND_ME_IN
514 break;
515 default:
516 break;
517 }
518 });
519 }
520
522 {
523 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
524 {
526 me->GetMotionMaster()->MovePoint(0, SinclariPositions[3]);
527
528 task.Schedule(Seconds(10), [this](TaskContext /*task*/)
529 {
530 me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
531 });
532 });
533 }
534
535 void JustSummoned(Creature* summon) override
536 {
538 _summons.Summon(summon);
539 }
540
541 void SummonedCreatureDespawn(Creature* summon) override
542 {
543 _summons.Despawn(summon);
545 }
546
547private:
550
552};
553
555{
557 {
558 _instance = creature->GetInstanceScript();
559
562 else
564 }
565
566 template <size_t N>
567 void StartSmoothPath(Position const (&path)[N])
568 {
569 me->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, &path[0], N, false);
570 }
571
573 {
574 switch (_bossId)
575 {
576 case DATA_MORAGG:
578 break;
579 case DATA_EREKEM:
581 break;
582 case DATA_ICHORON:
584 break;
585 case DATA_LAVANTHOR:
587 break;
588 case DATA_XEVOZZ:
590 break;
591 case DATA_ZURAMAT:
593 break;
594 }
595 }
596
597 void Reset() override
598 {
600 _scheduler.Schedule(Seconds(2), [this](TaskContext /*task*/)
601 {
603 });
604 }
605
606 void MovementInform(uint32 type, uint32 pointId) override
607 {
608 if (type == EFFECT_MOTION_TYPE && pointId == POINT_INTRO)
609 {
610 _scheduler.Schedule(0s, [this](TaskContext task)
611 {
613
614 if (task.GetRepeatCounter() < 2)
615 task.Repeat(Seconds(1));
616 else
617 {
618 task.Schedule(Seconds(2), [this](TaskContext /*task*/)
619 {
623 });
624 }
625 });
626 }
627 }
628
629 void UpdateAI(uint32 diff) override
630 {
631 _scheduler.Update(diff);
632 }
633
634private:
637
639};
640
642{
644 {
645 _instance = creature->GetInstanceScript();
646 _portalLocation = 0;
647 }
648
649 void InitializeAI() override
650 {
653 }
654
655 void SetData(uint32 type, uint32 data) override
656 {
657 if (type == DATA_PORTAL_LOCATION)
658 _portalLocation = uint8(data);
659 }
660
661 void MoveInLineOfSight(Unit* /*who*/) override { }
662
663 void JustEngagedWith(Unit* /*who*/) override { }
664
665 void JustSummoned(Creature* summon) override
666 {
667 _summons.Summon(summon);
669 }
670
671 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
672 {
673 _summons.Despawn(summon);
674 }
675
676 virtual void ScheduleTasks() { }
677
678 void UpdateAI(uint32 diff) override
679 {
680 _scheduler.Update(diff);
681 }
682
683protected:
688};
689
691{
693 {
694 }
695
696 void InitializeAI() override
697 {
700 }
701
702 void SetData(uint32 type, uint32 data) override
703 {
705
706 if (type == DATA_PORTAL_PERIODIC_TICK)
707 {
708 if (data == 1)
709 {
711 if (Creature* portalKeeper = DoSummon(entry, me, 2.0f, 0s, TEMPSUMMON_DEAD_DESPAWN))
712 me->CastSpell(portalKeeper, SPELL_PORTAL_CHANNEL, false);
713
714 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
715 {
716 if (entry == NPC_PORTAL_GUARDIAN)
717 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_GUARDIAN);
718 else if (entry == NPC_PORTAL_KEEPER)
719 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_KEEPER);
720 }
721 }
722 else
723 {
724 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
725 while (k--)
726 {
728 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
729 }
730 }
731 }
732 }
733
734 void SummonedCreatureDies(Creature* summon, Unit* killer) override
735 {
737
738 if (summon->GetEntry() == NPC_PORTAL_GUARDIAN || summon->GetEntry() == NPC_PORTAL_KEEPER)
739 {
742 }
743 }
744};
745
747{
749 {
750 }
751
752 void ScheduleTasks() override
753 {
754 _scheduler.Schedule(Seconds(15), [this](TaskContext task)
755 {
756 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
757 while (k--)
758 {
760 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
761 }
762
763 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
764 sinclariTrigger->AI()->Talk(SAY_SINCLARI_ELITE_SQUAD);
765
766 task.Schedule(Seconds(1), [this](TaskContext /*task*/)
767 {
768 me->SetVisible(false);
769 });
770 });
771 }
772
773 void SummonedCreatureDies(Creature* summon, Unit* killer) override
774 {
776
777 if (_summons.empty())
778 {
781 }
782 }
783};
784
786{
788 {
789 }
790
791 void ScheduleTasks() override
792 {
794 return;
795
796 _scheduler.Schedule(Seconds(15), [this](TaskContext task)
797 {
798 // Limit the number of current summons
799 if (_summons.size() < 3)
800 {
801 uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1);
802 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
803 }
804
805 task.Repeat();
806 });
807 }
808};
809
811{
812 violet_hold_trashAI(Creature* creature) : EscortAI(creature)
813 {
814 _instance = creature->GetInstanceScript();
815
816 _lastWaypointId = 0;
817
818 SetDespawnAtEnd(false);
819
821 {
823 });
824 }
825
826 void Reset() override
827 {
830 }
831
832 template <size_t N>
834 {
835 _lastWaypointId = N - 1;
836 return &path[0];
837 }
838
839 void SetData(uint32 type, uint32 data) override
840 {
841 if (type == DATA_PORTAL_LOCATION)
842 {
843 Position const* path = nullptr;
844
845 switch (data)
846 {
847 case 0:
849 break;
850 case 7:
851 switch (urand(0, 1))
852 {
853 case 0:
855 break;
856 case 1:
858 break;
859 }
860 break;
861 case 2:
863 break;
864 case 6:
866 break;
867 case 1:
869 break;
870 case 5:
872 break;
873 default:
875 break;
876 }
877
878 if (path)
879 {
880 for (uint32 i = 0; i <= _lastWaypointId; i++)
881 AddWaypoint(i, path[i].GetPositionX() + irand(-1, 1), path[i].GetPositionY() + irand(-1, 1), path[i].GetPositionZ(), 0, 0s, true);
882 me->SetHomePosition(path[_lastWaypointId].GetPositionX(), path[_lastWaypointId].GetPositionY(), path[_lastWaypointId].GetPositionZ(), float(M_PI));
883 }
884
885 Start(true);
886 }
887 }
888
889 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
890 {
891 if (waypointId == _lastWaypointId)
892 {
895 _scheduler.Schedule(Seconds(2), [this](TaskContext destroyDoorCheck)
896 {
899 destroyDoorCheck.Repeat();
900 });
901 }
902 }
903
904 void JustEngagedWith(Unit* who) override
905 {
907 return;
908
911 }
912
913 void UpdateEscortAI(uint32 diff) override
914 {
916 me->CastStop();
917
918 if (!UpdateVictim())
919 return;
920
921 _scheduler.Update(diff);
922 }
923
924 virtual void ScheduledTasks() { }
925
926protected:
929
931};
932
934{
936
937 void ScheduledTasks() override
938 {
940 {
941 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
942 {
944 task.Repeat();
945 });
946
947 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
948 {
950 task.Repeat();
951 });
952 }
953 else if (me->GetEntry() == NPC_AZURE_INVADER_2)
954 {
955 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
956 {
958 task.Repeat();
959 });
960
961 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
962 {
964 task.Repeat(Seconds(8), Seconds(10));
965 });
966 }
967 }
968};
969
971{
973
974 void ScheduledTasks() override
975 {
977 {
978 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
979 {
981 task.Repeat();
982 });
983
984 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
985 {
986 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
988 task.Repeat(Seconds(6));
989 });
990 }
991 else if (me->GetEntry() == NPC_AZURE_BINDER_2)
992 {
993 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
994 {
996 task.Repeat();
997 });
998
999 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
1000 {
1001 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1002 DoCast(target, SPELL_FROSTBOLT);
1003 task.Repeat(Seconds(6));
1004 });
1005 }
1006 }
1007};
1008
1010{
1012
1013 void ScheduledTasks() override
1014 {
1016 {
1017 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1018 {
1020 task.Repeat(Seconds(14));
1021 });
1022 }
1023 else if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2)
1024 {
1025 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1026 {
1027 // wrong spellid?
1028 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1029 DoCast(target, SPELL_SPELL_LOCK);
1030 task.Repeat(Seconds(9));
1031 });
1032 }
1033 }
1034};
1035
1037{
1039
1040 void ScheduledTasks() override
1041 {
1042 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1043 {
1045 task.Repeat();
1046 });
1047
1048 _scheduler.Schedule(Seconds(8), [this](TaskContext task)
1049 {
1051 task.Repeat(Seconds(10), Seconds(15));
1052 });
1053 }
1054};
1055
1057{
1059
1060 void ScheduledTasks() override
1061 {
1062 _scheduler.Schedule(Seconds(8), [this](TaskContext task)
1063 {
1064 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1066
1067 task.Schedule(Milliseconds(1300), [this](TaskContext /*task*/)
1068 {
1069 if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 5.0f))
1070 DoCast(target, SPELL_BACKSTAB);
1071 });
1072
1073 task.Repeat();
1074 });
1075 }
1076};
1077
1079{
1081
1082 void ScheduledTasks() override
1083 {
1085 {
1086 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1087 {
1088 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1089 DoCast(target, SPELL_ARCANE_BLAST);
1090 task.Repeat(Seconds(6));
1091 });
1092
1093 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
1094 {
1095 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1096 DoCast(target, SPELL_SLOW);
1097 task.Repeat(Seconds(5));
1098 });
1099 }
1100 else if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2)
1101 {
1102 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1103 {
1104 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1105 DoCast(target, SPELL_CHAINS_OF_ICE);
1106 task.Repeat(Seconds(7));
1107 });
1108
1109 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
1110 {
1112 task.Repeat(Seconds(5));
1113 });
1114 }
1115 }
1116};
1117
1119{
1121
1122 void ScheduledTasks() override
1123 {
1124 _scheduler.Schedule(Seconds(5), [this](TaskContext task)
1125 {
1127 task.Repeat();
1128 });
1129
1130 _scheduler.Schedule(Seconds(8), [this](TaskContext task)
1131 {
1133 task.Repeat();
1134 });
1135 }
1136};
1137
1139{
1141
1142 void ScheduledTasks() override
1143 {
1144 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
1145 {
1146 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f))
1147 DoCast(target, SPELL_ARCANE_STREAM);
1148 task.Repeat(Seconds(5), Seconds(10));
1149 });
1150
1151 _scheduler.Schedule(Seconds(), Seconds(), [this](TaskContext task)
1152 {
1154 task.Repeat(Seconds(2), Seconds(6));
1155 });
1156 }
1157};
1158
1160{
1162
1163 void Reset() override
1164 {
1166 me->DespawnOrUnsummon(7s);
1167 }
1168
1170 {
1171 _scheduler.Schedule(Seconds(4), [this](TaskContext task)
1172 {
1175 if (task.GetRepeatCounter() == 2)
1177 else
1178 task.Repeat(Seconds(1));
1179 });
1180 }
1181
1182 void UpdateAI(uint32 diff) override
1183 {
1184 _scheduler.Update(diff);
1185 }
1186
1187private:
1189};
1190
1192{
1194
1195 bool OnGossipHello(Player* player) override
1196 {
1197 player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true);
1198 return false;
1199 }
1200};
1201
1202// 58040 - Destroy Door Seal
1204{
1205 bool Load() override
1206 {
1208 return _instance != nullptr;
1209 }
1210
1211 void PeriodicTick(AuraEffect const* /*aurEff*/)
1212 {
1214 if (uint32 integrity = _instance->GetData(DATA_DOOR_INTEGRITY))
1215 _instance->SetData(DATA_DOOR_INTEGRITY, integrity - 1);
1216 }
1217
1218 void Register() override
1219 {
1221 }
1222
1223private:
1225};
1226
1227// 58008 - Portal Periodic
1229{
1230 void PeriodicTick(AuraEffect const* aurEff)
1231 {
1233 if (UnitAI* targetAI = GetTarget()->GetAI())
1234 targetAI->SetData(DATA_PORTAL_PERIODIC_TICK, aurEff->GetTickNumber());
1235 }
1236
1237 void Register() override
1238 {
1240 }
1241};
1242
1243// 62138 - Teleport to Inside Violet Hold
1245{
1246 bool Validate(SpellInfo const* /*spellInfo*/) override
1247 {
1249 }
1250
1251 void HandleScript(SpellEffIndex /*effIndex*/)
1252 {
1253 if (Unit* target = GetHitUnit())
1254 target->CastSpell(target, SPELL_TELEPORT_PLAYER_EFFECT, true);
1255 }
1256
1257 void Register() override
1258 {
1260 }
1261};
1262
1264{
1283}
#define M_PI
Definition: Common.h:115
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
int32 irand(int32 min, int32 max)
Definition: Random.cpp:35
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ EMOTE_ONESHOT_TALK_NO_SHEATHE
@ SPELL_EFFECT_SCRIPT_EFFECT
@ GO_FLAG_LOCKED
@ GO_STATE_READY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_STATE_CASTING
Definition: Unit.h:270
MiscData
uint32 GetTickNumber() const
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
Unit * GetTarget() const
Unit * GetUnitOwner() const
virtual void JustEngagedWith(Unit *)
Definition: CreatureAI.h:99
virtual void JustSummoned(Creature *)
Definition: CreatureAI.h:111
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
virtual void SummonedCreatureDespawn(Creature *)
Definition: CreatureAI.h:114
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
Definition: CreatureAI.cpp:464
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
bool HasReactState(ReactStates state) const
Definition: Creature.h:162
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
CreatureAI * AI() const
Definition: Creature.h:214
Creature * GetCreature(uint32 type)
GameObject * GetGameObject(uint32 type)
void MoveSmoothPath(uint32 pointId, Position const *pathPoints, size_t pathSize, bool walk=false, bool fly=false)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
uint32 GetEntry() const
Definition: Object.h:161
void SendPreparedGossip(WorldObject *source)
Definition: Player.cpp:14137
void PrepareGossipMenu(WorldObject *source, uint32 menuId, bool showQuests=false)
Definition: Player.cpp:14036
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition: Player.h:2380
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
bool empty() const
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
size_type size() const
TaskContext & Schedule(std::chrono::duration< Rep, Period > time, TaskScheduler::task_handler_t task)
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler::repeated_t GetRepeatCounter() const
Returns the repeat counter which increases every time the task is repeated.
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
Definition: UnitAI.h:50
virtual void SetData(uint32, uint32)
Definition: UnitAI.h:74
virtual void InitializeAI()
Definition: UnitAI.cpp:43
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void CastStop(uint32 except_spellid=0)
Definition: Unit.cpp:1135
void SetVisible(bool x)
Definition: Unit.cpp:8351
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
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:2025
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
void PeriodicTick(AuraEffect const *)
void PeriodicTick(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
@ DATA_WAVE_COUNT
Position const PortalIntroPositions[PortalIntroPositionsSize]
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
void AddWaypoint(uint32 id, float x, float y, float z, bool run)
void SetDespawnAtEnd(bool despawn)
go_activation_crystal(GameObject *go)
bool OnGossipHello(Player *player) override
npc_azure_binder(Creature *creature)
void ScheduledTasks() override
void ScheduledTasks() override
npc_azure_captain(Creature *creature)
npc_azure_invader(Creature *creature)
void ScheduledTasks() override
void ScheduledTasks() override
npc_azure_mage_slayer(Creature *creature)
npc_azure_raider(Creature *creature)
void ScheduledTasks() override
npc_azure_saboteur(Creature *creature)
void StartSmoothPath(Position const (&path)[N])
InstanceScript * _instance
void Reset() override
void MovementInform(uint32 type, uint32 pointId) override
TaskScheduler _scheduler
void UpdateAI(uint32 diff) override
void ScheduledTasks() override
npc_azure_sorceror(Creature *creature)
npc_azure_spellbreaker(Creature *creature)
void ScheduledTasks() override
void ScheduledTasks() override
npc_azure_stalker(Creature *creature)
SummonList _summons
bool OnGossipHello(Player *player) override
void JustSummoned(Creature *summon) override
bool OnGossipSelect(Player *player, uint32 menuId, uint32 gossipListId) override
TaskScheduler _scheduler
InstanceScript * _instance
void DoAction(int32 actionId) override
npc_sinclari_vh(Creature *creature)
void Reset() override
void UpdateAI(uint32 diff) override
void SummonedCreatureDespawn(Creature *summon) override
void UpdateAI(uint32 diff) override
npc_violet_hold_defense_system(Creature *creature)
void SummonedCreatureDies(Creature *summon, Unit *) override
npc_violet_hold_teleportation_portal_commonAI(Creature *creature)
void JustSummoned(Creature *summon) override
void SetData(uint32 type, uint32 data) override
npc_violet_hold_teleportation_portal_elite(Creature *creature)
void SummonedCreatureDies(Creature *summon, Unit *killer) override
npc_violet_hold_teleportation_portal_intro(Creature *creature)
void SummonedCreatureDies(Creature *summon, Unit *killer) override
npc_violet_hold_teleportation_portal(Creature *creature)
void SetData(uint32 type, uint32 data) override
void WaypointReached(uint32 waypointId, uint32) override
void UpdateEscortAI(uint32 diff) override
Position const * GetPathAndInitLastWaypointFrom(Position const (&path)[N])
void JustEngagedWith(Unit *who) override
virtual void ScheduledTasks()
violet_hold_trashAI(Creature *creature)
void Reset() override
InstanceScript * _instance
TaskScheduler _scheduler
void SetData(uint32 type, uint32 data) override
DefenseSystemSpells
@ SPELL_ARCANE_LIGHTNING_DUMMY
@ SPELL_ARCANE_LIGHTNING_DAMAGE
@ SPELL_ARCANE_LIGHTNING_INSTAKILL
void AddSC_violet_hold()
Position const SaboteurLavanthorPath[]
@ DATA_PORTAL_PERIODIC_TICK
AzureSorcerorSpells
Definition: violet_hold.cpp:97
@ SPELL_ARCANE_STREAM
Definition: violet_hold.cpp:98
@ SPELL_MANA_DETONATION
Definition: violet_hold.cpp:99
AzureSellbreakerSpells
Definition: violet_hold.cpp:69
@ SPELL_SLOW
Definition: violet_hold.cpp:71
@ SPELL_CONE_OF_COLD
Definition: violet_hold.cpp:73
@ SPELL_CHAINS_OF_ICE
Definition: violet_hold.cpp:72
@ SPELL_ARCANE_BLAST
Definition: violet_hold.cpp:70
Sinclari
@ SAY_SINCLARI_OUTRO
@ SAY_SINCLARI_INTRO_2
@ SAY_SINCLARI_ELITE_SQUAD
@ SAY_SINCLARI_PORTAL_KEEPER
@ GOSSIP_MENU_SEND_ME_IN
@ SAY_SINCLARI_PORTAL_GUARDIAN
@ SAY_SINCLARI_INTRO_1
@ GOSSIP_MENU_START_ENCOUNTER
Position const FourthPortalWPs[]
Position const SaboteurErekemPath[]
MiscSpells
@ SPELL_PORTAL_CHANNEL_TRIGGER
@ SPELL_SUMMON_AZURE_CAPTAIN
@ SPELL_SUMMON_PORTAL_EFFECT_2
@ SPELL_SUMMON_AZURE_INVADER
@ SPELL_SUMMON_AZURE_SORCEROR_2
@ SPELL_SUMMON_PORTAL_KEEPER
@ SPELL_TELEPORT_PLAYER_EFFECT
@ SPELL_SUMMON_PORTAL_GUARDIAN_2
@ SPELL_SUMMON_AZURE_INVADER_2
@ SPELL_SUMMON_AZURE_SPELLBREAKER_2
@ SPELL_SUMMON_AZURE_MAGE_SLAYER_2
@ SPELL_SUMMON_PORTAL_KEEPER_2
@ SPELL_PORTAL_READY_PRIMER
@ SPELL_SUMMON_AZURE_SPELLBREAKER
@ SPELL_SUMMON_VETERAN_MAGE_HUNTER
@ SPELL_SUMMON_AZURE_MAGE_SLAYER
@ SPELL_SUMMON_PORTAL_EFFECT_1
@ SPELL_PORTAL_CHANNEL
@ SPELL_CRYSTAL_ACTIVATION
@ SPELL_SUMMON_PORTAL
@ SPELL_PORTAL_4_READY
@ SPELL_SUMMON_AZURE_BINDER_2
@ SPELL_TELEPORT_PLAYER
@ SPELL_PORTAL_1_READY
@ SPELL_SUMMON_PORTAL_GUARDIAN
@ SPELL_SUMMON_PORTAL_EFFECT_4
@ SPELL_SUMMON_AZURE_STALKER
@ SPELL_PORTAL_PERIODIC
@ SPELL_CLOSE_PORTAL_TRIGGER
@ SPELL_SUMMON_PORTAL_EFFECT_5
@ SPELL_PORTAL_5_READY
@ SPELL_PORTAL_2_READY
@ SPELL_SUMMON_AZURE_SORCEROR
@ SPELL_SUMMON_AZURE_RAIDER_2
@ SPELL_SUMMON_AZURE_BINDER
@ SPELL_SUMMON_AZURE_RAIDER
@ SPELL_PORTAL_3_READY
@ SPELL_ATTACK_VIOLET_HOLD_GUARD
@ SPELL_CLOSE_PORTAL_EFFECT
@ SPELL_SUMMON_PORTAL_EFFECT_3
Position const SecondPortalSecondWPs[]
Position const SecondPortalFirstWPs[]
AzureRaiderSpells
@ SPELL_CONCUSSION_BLOW
@ SPELL_MAGIC_REFLECTION
PortalCreatureIds
Definition: violet_hold.cpp:38
@ NPC_AZURE_STALKER_1
Definition: violet_hold.cpp:57
@ NPC_AZURE_SPELLBREAKER_2
Definition: violet_hold.cpp:50
@ NPC_AZURE_BINDER_2
Definition: violet_hold.cpp:48
@ NPC_VETERAN_MAGE_HUNTER
Definition: violet_hold.cpp:43
@ NPC_AZURE_BINDER_1
Definition: violet_hold.cpp:41
@ NPC_AZURE_MAGE_SLAYER_2
Definition: violet_hold.cpp:51
@ NPC_AZURE_RAIDER_1
Definition: violet_hold.cpp:46
@ NPC_AZURE_MAGE_SLAYER_1
Definition: violet_hold.cpp:42
@ NPC_AZURE_INVADER_3
Definition: violet_hold.cpp:53
@ NPC_AZURE_SORCEROR_1
Definition: violet_hold.cpp:45
@ NPC_AZURE_INVADER_2
Definition: violet_hold.cpp:49
@ NPC_AZURE_SPELLBREAKER_1
Definition: violet_hold.cpp:40
@ NPC_AZURE_SPELLBREAKER_3
Definition: violet_hold.cpp:54
@ NPC_AZURE_BINDER_3
Definition: violet_hold.cpp:52
@ NPC_AZURE_RAIDER_2
Definition: violet_hold.cpp:56
@ NPC_AZURE_MAGE_SLAYER_3
Definition: violet_hold.cpp:55
@ NPC_AZURE_INVADER_1
Definition: violet_hold.cpp:39
@ NPC_AZURE_CAPTAIN_1
Definition: violet_hold.cpp:44
AzureSaboteurSpells
@ SPELL_TELEPORT_VISUAL
@ SPELL_SHIELD_DISRUPTION
AzureStalkerSpells
@ SPELL_BACKSTAB
@ SPELL_TACTICAL_BLINK
TrashDoorSpell
@ SPELL_PRISON_DOOR_SEAL_WEAKEN
@ SPELL_DESTROY_DOOR_SEAL
@ SPELL_DOOR_BROKEN
Position const SaboteurIchoronPath[]
Position const SixthPortalWPs[]
Position const SinclariPositions[]
Position const SaboteurMoraggPath[]
Position const FirstPortalWPs[]
Position const DefaultPortalWPs[]
AzureMageSlayerSpells
Definition: violet_hold.cpp:85
@ SPELL_SPELL_LOCK
Definition: violet_hold.cpp:87
@ SPELL_ARCANE_EMPOWERMENT
Definition: violet_hold.cpp:86
AzureBinderSpells
Definition: violet_hold.cpp:77
@ SPELL_FROSTBOLT
Definition: violet_hold.cpp:81
@ SPELL_ARCANE_BARRAGE
Definition: violet_hold.cpp:78
@ SPELL_ARCANE_EXPLOSION
Definition: violet_hold.cpp:79
@ SPELL_FROST_NOVA
Definition: violet_hold.cpp:80
Position const FifthPortalWPs[]
Position const ThirdPortalWPs[]
Position const SaboteurZuramatPath[]
AzureInvaderSpells
Definition: violet_hold.cpp:61
@ SPELL_CLEAVE
Definition: violet_hold.cpp:62
@ SPELL_SUNDER_ARMOR
Definition: violet_hold.cpp:65
@ SPELL_BRUTAL_STRIKE
Definition: violet_hold.cpp:64
@ SPELL_IMPALE
Definition: violet_hold.cpp:63
Position const GuardsMovePosition
AzureCaptainSpells
Definition: violet_hold.cpp:91
@ SPELL_MORTAL_STRIKE
Definition: violet_hold.cpp:92
@ SPELL_WHIRLWIND_OF_STEEL
Definition: violet_hold.cpp:93
Position const SaboteurXevozzPath[]
@ DATA_ICHORON
Definition: violet_hold.h:56
@ DATA_MAIN_EVENT_STATE
Definition: violet_hold.h:62
@ DATA_ZURAMAT
Definition: violet_hold.h:59
@ DATA_XEVOZZ
Definition: violet_hold.h:58
@ DATA_2ND_BOSS
Definition: violet_hold.h:51
@ DATA_1ST_BOSS
Definition: violet_hold.h:50
@ DATA_SINCLARI_TRIGGER
Definition: violet_hold.h:86
@ DATA_MAIN_DOOR
Definition: violet_hold.h:84
@ DATA_EREKEM
Definition: violet_hold.h:55
@ DATA_LAVANTHOR
Definition: violet_hold.h:57
@ DATA_PORTAL_LOCATION
Definition: violet_hold.h:65
@ DATA_DOOR_INTEGRITY
Definition: violet_hold.h:64
@ DATA_START_BOSS_ENCOUNTER
Definition: violet_hold.h:66
@ DATA_MORAGG
Definition: violet_hold.h:54
#define RegisterVioletHoldCreatureAI(ai_name)
Definition: violet_hold.h:164
uint8 constexpr PortalIntroCount
Definition: violet_hold.h:32
@ ACTION_SINCLARI_OUTRO
Definition: violet_hold.h:154
#define RegisterVioletHoldGameObjectAI(ai_name)
Definition: violet_hold.h:165
@ NPC_TELEPORTATION_PORTAL_INTRO
Definition: violet_hold.h:94
@ NPC_VIOLET_HOLD_GUARD
Definition: violet_hold.h:121
@ NPC_PORTAL_KEEPER
Definition: violet_hold.h:96
@ NPC_PORTAL_GUARDIAN
Definition: violet_hold.h:95
@ POINT_INTRO
Definition: zulaman.cpp:64