TrinityCore
Loading...
Searching...
No Matches
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 "violet_hold.h"
19#include "GameObject.h"
20#include "GameObjectAI.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "MotionMaster.h"
24#include "Player.h"
25#include "ScriptMgr.h"
26#include "ScriptedEscortAI.h"
27#include "ScriptedGossip.h"
28#include "SpellAuraEffects.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31#include "WaypointDefines.h"
32
33/*
34 * TODO:
35 * - add missing trash emotes
36 */
37
60
68
76
84
90
96
102
108
114
120
122{
123 SPELL_DESTROY_DOOR_SEAL = 58040, // > 31326 Corrupt Medivh
124 SPELL_PRISON_DOOR_SEAL_WEAKEN = 58041, // NYI, no effect, maybe > 32613 Medivh's Shield -5%
125 SPELL_DOOR_BROKEN = 58043 // NYI, no effect, maybe > 31327 Medivh Dies!
127
134
136{
138
139 SPELL_ATTACK_VIOLET_HOLD_GUARD = 57936, // NYI, no effect
140
141 // Turned out almost all spells from BM were copied to create Violet Hold. Not only serverside spells and
142 // not only their effects but also attributes and icons. The scripts were also copied, possibly unchanged
143 SPELL_PORTAL_1_READY = 57995, // NYI, effect copied from 'Time Rift 1 Ready'
144 SPELL_PORTAL_2_READY = 57996, // NYI, effect copied from 'Time Rift 2 Ready'
145 SPELL_PORTAL_3_READY = 57997, // NYI, effect copied from 'Time Rift 3 Ready'
146 SPELL_PORTAL_4_READY = 57998, // NYI, effect copied from 'Time Rift 4 Ready'
147 SPELL_PORTAL_5_READY = 57999, // NYI, effect copied from 'Time Rift 1 Ready', only 4 portals in BM
148
149 SPELL_SUMMON_PORTAL = 58002, // NYI, effect copied from 'Summon Time Rift'
150 SPELL_SUMMON_PORTAL_EFFECT_1 = 58003, // NYI, no effect, > Summon Time Rift Effect
151 SPELL_SUMMON_PORTAL_EFFECT_2 = 58004, // NYI, no effect, > Summon Time Rift Effect
152 SPELL_SUMMON_PORTAL_EFFECT_3 = 58005, // NYI, no effect, > Summon Time Rift Effect
153 SPELL_SUMMON_PORTAL_EFFECT_4 = 58006, // NYI, no effect, > Summon Time Rift Effect
154 SPELL_SUMMON_PORTAL_EFFECT_5 = 58007, // NYI, no effect, > Summon Time Rift Effect
155 SPELL_PORTAL_PERIODIC = 58008, // > Time Rift Periodic
156 SPELL_PORTAL_CHANNEL_TRIGGER = 58011, // NYI, effect copied from 'Time Rift Channel Trigger'
157 SPELL_PORTAL_CHANNEL = 58012, // > Time Rift Channel
158 SPELL_CLOSE_PORTAL_TRIGGER = 58014, // NYI, effect copied from 'Close Time Rift Trigger'
159 SPELL_CLOSE_PORTAL_EFFECT = 58018, // NYI, effect copied from 'Close Time Rift Effect'
160 SPELL_PORTAL_READY_PRIMER = 58019, // NYI, effect copied from 'Time Rift Ready Primer'
161
162 SPELL_SUMMON_PORTAL_GUARDIAN = 58028, // NYI, summons 30660
163 SPELL_SUMMON_PORTAL_GUARDIAN_2 = 58029, // NYI, summons 30892
164 SPELL_SUMMON_PORTAL_KEEPER = 58030, // NYI, summons 30695
165 SPELL_SUMMON_PORTAL_KEEPER_2 = 58031, // NYI, summons 30893
166 SPELL_SUMMON_AZURE_BINDER = 58034, // NYI, summons 30663
167 SPELL_SUMMON_AZURE_BINDER_2 = 58086, // NYI, summons 30918
168 SPELL_SUMMON_AZURE_INVADER = 58087, // NYI, summons 30661
169 SPELL_SUMMON_AZURE_INVADER_2 = 58088, // NYI, summons 30961
170 SPELL_SUMMON_AZURE_SPELLBREAKER = 58089, // NYI, summons 30662
171 SPELL_SUMMON_AZURE_SPELLBREAKER_2 = 58090, // NYI, summons 30962
172 SPELL_SUMMON_AZURE_MAGE_SLAYER = 58091, // NYI, summons 30664
173 SPELL_SUMMON_AZURE_MAGE_SLAYER_2 = 58092, // NYI, summons 30963
174 SPELL_SUMMON_VETERAN_MAGE_HUNTER = 58093, // NYI, summons 30665
175
176 SPELL_SUMMON_AZURE_CAPTAIN = 60048, // NYI, summons 30666
177 SPELL_SUMMON_AZURE_STALKER = 60086, // NYI, summons 32191
178 SPELL_SUMMON_AZURE_RAIDER = 60049, // NYI, summons 30668
179 SPELL_SUMMON_AZURE_RAIDER_2 = 60092, // NYI, summons 30668
180 SPELL_SUMMON_AZURE_SORCEROR = 60050, // NYI, summons 30667
181 SPELL_SUMMON_AZURE_SORCEROR_2 = 60093, // NYI, summons 30667
182
186
191
207
209{
210 {1877.670288f, 842.280273f, 43.333591f},
211 {1877.338867f, 834.615356f, 38.762287f},
212 {1872.161011f, 823.854309f, 38.645401f},
213 {1864.860474f, 815.787170f, 38.784843f},
214 {1858.953735f, 810.048950f, 44.008759f},
215 {1843.707153f, 805.807739f, 44.135197f}
216 //{1825.736084f, 807.305847f, 44.363785f}
217};
218
220{
221 {1902.561401f, 853.334656f, 47.106117f},
222 {1895.486084f, 855.376404f, 44.334591f},
223 {1882.805176f, 854.993286f, 43.333591f},
224 {1877.670288f, 842.280273f, 43.333591f},
225 {1877.338867f, 834.615356f, 38.762287f},
226 {1872.161011f, 823.854309f, 38.645401f},
227 {1864.860474f, 815.787170f, 38.784843f},
228 {1858.953735f, 810.048950f, 44.008759f},
229 {1843.707153f, 805.807739f, 44.135197f}
230 //{1825.736084f, 807.305847f, 44.363785f}
231};
232
234{
235 {1929.392212f, 837.614990f, 47.136166f},
236 {1928.290649f, 824.750427f, 45.474411f},
237 {1915.544922f, 826.919373f, 38.642811f},
238 {1900.933960f, 818.855652f, 38.801647f},
239 {1886.810547f, 813.536621f, 38.490490f},
240 {1869.079712f, 808.701538f, 38.689003f},
241 {1860.843384f, 806.645020f, 44.008789f},
242 {1843.707153f, 805.807739f, 44.135197f}
243 //{1825.736084f, 807.305847f, 44.363785f}
244};
245
247{
248 {1934.049438f, 815.778503f, 52.408699f},
249 {1928.290649f, 824.750427f, 45.474411f},
250 {1915.544922f, 826.919373f, 38.642811f},
251 {1900.933960f, 818.855652f, 38.801647f},
252 {1886.810547f, 813.536621f, 38.490490f},
253 {1869.079712f, 808.701538f, 38.689003f},
254 {1860.843384f, 806.645020f, 44.008789f},
255 {1843.707153f, 805.807739f, 44.135197f}
256 //{1825.736084f, 807.305847f, 44.363785f}
257};
258
260{
261 {1921.658447f, 761.657043f, 50.866741f},
262 {1910.559814f, 755.780457f, 47.701447f},
263 {1896.664673f, 752.920898f, 47.667004f},
264 {1887.398804f, 763.633240f, 47.666851f},
265 {1879.020386f, 775.396973f, 38.705990f},
266 {1872.439087f, 782.568604f, 38.808292f},
267 {1863.573364f, 791.173584f, 38.743660f},
268 {1857.811890f, 796.765564f, 43.950329f},
269 {1845.577759f, 800.681152f, 44.104248f}
270 //{1827.100342f, 801.605957f, 44.363358f}
271};
272
274{
275 {1887.398804f, 763.633240f, 47.666851f},
276 {1879.020386f, 775.396973f, 38.705990f},
277 {1872.439087f, 782.568604f, 38.808292f},
278 {1863.573364f, 791.173584f, 38.743660f},
279 {1857.811890f, 796.765564f, 43.950329f},
280 {1845.577759f, 800.681152f, 44.104248f}
281 //{1827.100342f, 801.605957f, 44.363358f}
282};
283
285{
286 {1888.861084f, 805.074768f, 38.375790f},
287 {1869.793823f, 804.135804f, 38.647018f},
288 {1861.541504f, 804.149780f, 43.968292f},
289 {1843.567017f, 804.288208f, 44.139091f}
290 //{1826.889648f, 803.929993f, 44.363239f}
291};
292
294{
295 { 1843.567017f, 804.288208f, 44.139091f }
296};
297
298static WaypointPath const SaboteurMoraggPath = // sniff
299{
301 {
302 { 0, 1886.251f, 803.0743f, 38.42326f },
303 { 1, 1885.71f, 799.8929f, 38.37241f },
304 { 2, 1889.505f, 762.3288f, 47.66684f },
305 { 3, 1894.542f, 742.1829f, 47.66684f },
306 { 4, 1894.603f, 739.9231f, 47.66684f }
307 },
309};
310
311static WaypointPath const SaboteurErekemPath = // sniff
312{
314 {
315 { 0, 1886.251f, 803.0743f, 38.42326f },
316 { 1, 1881.047f, 829.6866f, 38.64856f },
317 { 2, 1877.585f, 844.6685f, 43.33349f },
318 { 3, 1876.085f, 851.6685f, 42.99014f },
319 { 4, 1873.747f, 864.1373f, 43.33349f }
320 },
322};
323
324static WaypointPath const SaboteurIchoronPath = // sniff
325{
327 {
328 { 0, 1886.251f, 803.0743f, 38.42326f },
329 { 1, 1888.672f, 801.2348f, 38.42305f },
330 { 2, 1901.987f, 793.3254f, 38.65126f }
331 },
333};
334
335static WaypointPath const SaboteurLavanthorPath = // sniff
336{
338 {
339 { 0, 1886.251f, 803.0743f, 38.42326f },
340 { 1, 1867.925f, 778.8035f, 38.64702f },
341 { 2, 1853.304f, 759.0161f, 38.65761f }
342 },
344};
345
346static WaypointPath const SaboteurXevozzPath = // sniff
347{
349 {
350 { 0, 1886.251f, 803.0743f, 38.42326f },
351 { 1, 1889.096f, 810.0487f, 38.43871f },
352 { 2, 1896.547f, 823.5473f, 38.72863f },
353 { 3, 1906.666f, 842.3111f, 38.63351f }
354 },
356};
357
358static WaypointPath const SaboteurZuramatPath = // sniff
359{
361 {
362 { 0, 1886.251f, 803.0743f, 38.42326f },
363 { 1, 1889.69f, 807.0032f, 38.39914f },
364 { 2, 1906.91f, 818.2574f, 38.86596f },
365 { 3, 1929.03f, 824.2713f, 46.09165f },
366 { 4, 1928.441f, 842.8891f, 47.15078f },
367 { 5, 1927.454f, 851.6091f, 47.19094f },
368 { 6, 1927.947f, 852.2986f, 47.19637f }
369 },
371};
372
373Position const SinclariPositions[] = // sniff
374{
375 { 1829.142f, 798.219f, 44.36212f, 0.122173f }, // 0 - Crystal
376 { 1820.12f, 803.916f, 44.36466f, 0.0f }, // 1 - Outside
377 { 1816.185f, 804.0629f, 44.44799f, 3.176499f }, // 2 - Second Spawn Point
378 { 1827.886f, 804.0555f, 44.36467f, 0.0f } // 3 - Outro
379};
380
381Position const GuardsMovePosition = { 1802.099f, 803.7724f, 44.36466f, 0.0f }; // sniff
382
384{
385 npc_sinclari_vh(Creature* creature) : ScriptedAI(creature), _summons(creature)
386 {
387 _instance = creature->GetInstanceScript();
388 }
389
390 void Reset() override
391 {
393 for (uint8 i = 0; i < PortalIntroCount; ++i)
395 summon->AI()->SetData(DATA_PORTAL_LOCATION, i);
396
398
399 std::list<Creature*> guardList;
401 for (Creature* guard : guardList)
402 {
403 guard->Respawn(true);
404 guard->SetVisible(true);
405 guard->SetReactState(REACT_AGGRESSIVE);
406 guard->AI()->EnterEvadeMode();
407 }
408 }
409
410 bool OnGossipHello(Player* player) override
411 {
412 // override default gossip
414 {
415 case IN_PROGRESS:
417 player->SendPreparedGossip(me);
418 return true;
419 case DONE:
420 return true; // NYI
421 case NOT_STARTED:
422 case FAIL:
423 default:
424 break;
425 }
426
427 // load default gossip
428 return false;
429 }
430
431 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
432 {
433 if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0)
434 {
438 player->PlayerTalkClass->SendCloseGossip();
439 }
440 else if (menuId == GOSSIP_MENU_SEND_ME_IN && gossipListId == 0)
441 {
442 me->CastSpell(player, SPELL_TELEPORT_PLAYER, true);
443 player->PlayerTalkClass->SendCloseGossip();
444 }
445 return false;
446 }
447
448 void DoAction(int32 actionId) override
449 {
450 if (actionId == ACTION_SINCLARI_OUTRO)
452 }
453
454 void UpdateAI(uint32 diff) override
455 {
456 _scheduler.Update(diff);
457
458 if (!UpdateVictim())
459 return;
460 }
461
463 {
464 _scheduler.Schedule(Seconds(1), [this](TaskContext& task)
465 {
466 switch (task.GetRepeatCounter())
467 {
468 case 0:
469 me->SetWalk(true);
470 me->GetMotionMaster()->MovePoint(0, SinclariPositions[0]);
471 task.Repeat(Seconds(1));
472 break;
473 case 1:
474 me->HandleEmoteCommand(EMOTE_ONESHOT_USE_STANDING);
475 me->GetMap()->SummonCreature(NPC_DEFENSE_SYSTEM, DefenseSystemLocation);
476 task.Repeat(Seconds(3));
477 break;
478 case 2:
479 me->SetFacingTo(SinclariPositions[0].GetOrientation());
480 Talk(SAY_SINCLARI_INTRO_1);
481
482 task.Schedule(Seconds(1), [this](TaskContext const& /*task*/)
483 {
484 std::list<Creature*> guardList;
485 me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f);
486 for (Creature* guard : guardList)
487 {
488 if (!guard->IsAlive())
489 continue;
490 guard->SetReactState(REACT_PASSIVE);
491 guard->SetWalk(false);
492 guard->GetMotionMaster()->MovePoint(0, GuardsMovePosition);
493 }
494 });
495
496 task.Repeat(Seconds(2));
497 break;
498 case 3:
501 task.Repeat(Seconds(5));
502 break;
503 case 4:
504 me->SetFacingTo(SinclariPositions[1].GetOrientation());
505
506 task.Schedule(Seconds(1), [this](TaskContext const& /*task*/)
507 {
508 std::list<Creature*> guardList;
510 for (Creature* guard : guardList)
511 guard->SetVisible(false);
512 });
513
514 task.Repeat(Seconds(6));
515 break;
516 case 5:
518 task.Repeat(Seconds(4));
519 break;
520 case 6:
522 task.Repeat(Seconds(1));
523 break;
524 case 7:
526 {
527 mainDoor->SetGoState(GO_STATE_READY);
528 mainDoor->SetFlag(GO_FLAG_LOCKED);
529 }
530 task.Repeat(Seconds(5));
531 break;
532 case 8:
534 task.Repeat(Seconds(1));
535 break;
536 case 9:
537 // We should teleport inside if event is in progress with GOSSIP_MENU_SEND_ME_IN
539 break;
540 default:
541 break;
542 }
543 });
544 }
545
547 {
548 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
549 {
551 me->GetMotionMaster()->MovePoint(0, SinclariPositions[3]);
552
553 task.Schedule(Seconds(10), [this](TaskContext const& /*task*/)
554 {
555 me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
556 });
557 });
558 }
559
560 void JustSummoned(Creature* summon) override
561 {
563 _summons.Summon(summon);
564 }
565
566 void SummonedCreatureDespawn(Creature* summon) override
567 {
568 _summons.Despawn(summon);
570 }
571
572private:
575
577};
578
580{
582 {
583 _instance = creature->GetInstanceScript();
584
587 else
589 }
590
592 {
593 switch (_bossId)
594 {
595 case DATA_MORAGG:
597 break;
598 case DATA_EREKEM:
600 break;
601 case DATA_ICHORON:
603 break;
604 case DATA_LAVANTHOR:
606 break;
607 case DATA_XEVOZZ:
609 break;
610 case DATA_ZURAMAT:
612 break;
613 }
614 }
615
616 void Reset() override
617 {
619 _scheduler.Schedule(Seconds(2), [this](TaskContext const& /*task*/)
620 {
622 });
623 }
624
625 void WaypointPathEnded(uint32 /*waypointId*/, uint32 pathId) override
626 {
627 if (pathId == POINT_INTRO)
628 {
629 _scheduler.Schedule(0s, [this](TaskContext& task)
630 {
632
633 if (task.GetRepeatCounter() < 2)
634 task.Repeat(Seconds(1));
635 else
636 {
637 task.Schedule(Seconds(2), [this](TaskContext const& /*task*/)
638 {
642 });
643 }
644 });
645 }
646 }
647
648 void UpdateAI(uint32 diff) override
649 {
650 _scheduler.Update(diff);
651 }
652
653private:
656
658};
659
661{
667
668 void InitializeAI() override
669 {
672 }
673
674 void SetData(uint32 type, uint32 data) override
675 {
676 if (type == DATA_PORTAL_LOCATION)
677 _portalLocation = uint8(data);
678 }
679
680 void MoveInLineOfSight(Unit* /*who*/) override { }
681
682 void JustEngagedWith(Unit* /*who*/) override { }
683
684 void JustSummoned(Creature* summon) override
685 {
686 _summons.Summon(summon);
688 }
689
690 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
691 {
692 _summons.Despawn(summon);
693 }
694
695 virtual void ScheduleTasks() { }
696
697 void UpdateAI(uint32 diff) override
698 {
699 _scheduler.Update(diff);
700 }
701
702protected:
707};
708
710{
714
720
721 void SetData(uint32 type, uint32 data) override
722 {
724
725 if (type == DATA_PORTAL_PERIODIC_TICK)
726 {
727 if (data == 1)
728 {
730 if (Creature* portalKeeper = DoSummon(entry, me, 2.0f, 0s, TEMPSUMMON_DEAD_DESPAWN))
731 me->CastSpell(portalKeeper, SPELL_PORTAL_CHANNEL, false);
732
733 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
734 {
735 if (entry == NPC_PORTAL_GUARDIAN)
736 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_GUARDIAN);
737 else if (entry == NPC_PORTAL_KEEPER)
738 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_KEEPER);
739 }
740 }
741 else
742 {
743 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
744 while (k--)
745 {
747 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
748 }
749 }
750 }
751 }
752
753 void SummonedCreatureDies(Creature* summon, Unit* killer) override
754 {
756
757 if (summon->GetEntry() == NPC_PORTAL_GUARDIAN || summon->GetEntry() == NPC_PORTAL_KEEPER)
758 {
761 }
762 }
763};
764
766{
770
771 void ScheduleTasks() override
772 {
773 _scheduler.Schedule(Seconds(15), [this](TaskContext& task)
774 {
775 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
776 while (k--)
777 {
779 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
780 }
781
782 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
783 sinclariTrigger->AI()->Talk(SAY_SINCLARI_ELITE_SQUAD);
784
785 task.Schedule(Seconds(1), [this](TaskContext const& /*task*/)
786 {
787 me->SetVisible(false);
788 });
789 });
790 }
791
802};
803
805{
809
810 void ScheduleTasks() override
811 {
813 return;
814
815 _scheduler.Schedule(Seconds(15), [this](TaskContext& task)
816 {
817 // Limit the number of current summons
818 if (_summons.size() < 3)
819 {
820 uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1);
821 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
822 }
823
824 task.Repeat();
825 });
826 }
827};
828
830{
831 violet_hold_trashAI(Creature* creature) : EscortAI(creature)
832 {
833 _instance = creature->GetInstanceScript();
834
835 _lastWaypointId = 0;
836
837 SetDespawnAtEnd(false);
838
840 {
842 });
843 }
844
845 void Reset() override
846 {
849 }
850
851 template <size_t N>
853 {
854 _lastWaypointId = N - 1;
855 return &path[0];
856 }
857
858 void SetData(uint32 type, uint32 data) override
859 {
860 if (type == DATA_PORTAL_LOCATION)
861 {
862 Position const* path = nullptr;
863
864 switch (data)
865 {
866 case 0:
868 break;
869 case 7:
870 switch (urand(0, 1))
871 {
872 case 0:
874 break;
875 case 1:
877 break;
878 }
879 break;
880 case 2:
882 break;
883 case 6:
885 break;
886 case 1:
888 break;
889 case 5:
891 break;
892 default:
894 break;
895 }
896
897 if (path)
898 {
899 for (uint32 i = 0; i <= _lastWaypointId; i++)
900 AddWaypoint(i, path[i].GetPositionX() + irand(-1, 1), path[i].GetPositionY() + irand(-1, 1), path[i].GetPositionZ(), 0, {}, true);
901 me->SetHomePosition(path[_lastWaypointId].GetPositionX(), path[_lastWaypointId].GetPositionY(), path[_lastWaypointId].GetPositionZ(), float(M_PI));
902 }
903
904 Start(true);
905 }
906 }
907
908 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
909 {
910 if (waypointId == _lastWaypointId)
911 {
914 _scheduler.Schedule(Seconds(2), [this](TaskContext& destroyDoorCheck)
915 {
918 destroyDoorCheck.Repeat();
919 });
920 }
921 }
922
923 void JustEngagedWith(Unit* who) override
924 {
926 return;
927
930 }
931
932 void UpdateEscortAI(uint32 diff) override
933 {
935 me->CastStop();
936
937 if (!UpdateVictim())
938 return;
939
940 _scheduler.Update(diff);
941 }
942
943 virtual void ScheduledTasks() { }
944
945protected:
948
950};
951
953{
955
956 void ScheduledTasks() override
957 {
959 {
960 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
961 {
963 task.Repeat();
964 });
965
966 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
967 {
969 task.Repeat();
970 });
971 }
972 else if (me->GetEntry() == NPC_AZURE_INVADER_2)
973 {
974 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
975 {
977 task.Repeat();
978 });
979
980 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
981 {
983 task.Repeat(Seconds(8), Seconds(10));
984 });
985 }
986 }
987};
988
990{
992
993 void ScheduledTasks() override
994 {
996 {
997 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
998 {
1000 task.Repeat();
1001 });
1002
1003 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1004 {
1005 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1007 task.Repeat(Seconds(6));
1008 });
1009 }
1010 else if (me->GetEntry() == NPC_AZURE_BINDER_2)
1011 {
1012 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1013 {
1015 task.Repeat();
1016 });
1017
1018 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1019 {
1020 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1021 DoCast(target, SPELL_FROSTBOLT);
1022 task.Repeat(Seconds(6));
1023 });
1024 }
1025 }
1026};
1027
1029{
1031
1032 void ScheduledTasks() override
1033 {
1035 {
1036 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1037 {
1039 task.Repeat(Seconds(14));
1040 });
1041 }
1042 else if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2)
1043 {
1044 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1045 {
1046 // wrong spellid?
1047 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1048 DoCast(target, SPELL_SPELL_LOCK);
1049 task.Repeat(Seconds(9));
1050 });
1051 }
1052 }
1053};
1054
1056{
1058
1059 void ScheduledTasks() override
1060 {
1061 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1062 {
1064 task.Repeat();
1065 });
1066
1067 _scheduler.Schedule(Seconds(8), [this](TaskContext& task)
1068 {
1070 task.Repeat(Seconds(10), Seconds(15));
1071 });
1072 }
1073};
1074
1076{
1078
1079 void ScheduledTasks() override
1080 {
1081 _scheduler.Schedule(Seconds(8), [this](TaskContext& task)
1082 {
1083 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1085
1086 task.Schedule(Milliseconds(1300), [this](TaskContext const& /*task*/)
1087 {
1088 if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 5.0f))
1089 DoCast(target, SPELL_BACKSTAB);
1090 });
1091
1092 task.Repeat();
1093 });
1094 }
1095};
1096
1098{
1100
1101 void ScheduledTasks() override
1102 {
1104 {
1105 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1106 {
1107 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1108 DoCast(target, SPELL_ARCANE_BLAST);
1109 task.Repeat(Seconds(6));
1110 });
1111
1112 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1113 {
1114 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1115 DoCast(target, SPELL_SLOW);
1116 task.Repeat(Seconds(5));
1117 });
1118 }
1119 else if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2)
1120 {
1121 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1122 {
1123 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1124 DoCast(target, SPELL_CHAINS_OF_ICE);
1125 task.Repeat(Seconds(7));
1126 });
1127
1128 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1129 {
1131 task.Repeat(Seconds(5));
1132 });
1133 }
1134 }
1135};
1136
1138{
1140
1141 void ScheduledTasks() override
1142 {
1143 _scheduler.Schedule(Seconds(5), [this](TaskContext& task)
1144 {
1146 task.Repeat();
1147 });
1148
1149 _scheduler.Schedule(Seconds(8), [this](TaskContext& task)
1150 {
1152 task.Repeat();
1153 });
1154 }
1155};
1156
1158{
1160
1161 void ScheduledTasks() override
1162 {
1163 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1164 {
1165 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f))
1166 DoCast(target, SPELL_ARCANE_STREAM);
1167 task.Repeat(Seconds(5), Seconds(10));
1168 });
1169
1170 _scheduler.Schedule(Seconds(), Seconds(), [this](TaskContext& task)
1171 {
1173 task.Repeat(Seconds(2), Seconds(6));
1174 });
1175 }
1176};
1177
1179{
1181
1182 void Reset() override
1183 {
1185 me->DespawnOrUnsummon(7s);
1186 }
1187
1189 {
1190 _scheduler.Schedule(Seconds(4), [this](TaskContext& task)
1191 {
1194 if (task.GetRepeatCounter() == 2)
1196 else
1197 task.Repeat(Seconds(1));
1198 });
1199 }
1200
1201 void UpdateAI(uint32 diff) override
1202 {
1203 _scheduler.Update(diff);
1204 }
1205
1206private:
1208};
1209
1211{
1213
1214 bool OnGossipHello(Player* player) override
1215 {
1216 player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true);
1217 return false;
1218 }
1219};
1220
1221// 58040 - Destroy Door Seal
1223{
1224 bool Load() override
1225 {
1227 return _instance != nullptr;
1228 }
1229
1230 void PeriodicTick(AuraEffect const* /*aurEff*/)
1231 {
1233 if (uint32 integrity = _instance->GetData(DATA_DOOR_INTEGRITY))
1234 _instance->SetData(DATA_DOOR_INTEGRITY, integrity - 1);
1235 }
1236
1241
1242private:
1244};
1245
1246// 58008 - Portal Periodic
1248{
1249 void PeriodicTick(AuraEffect const* aurEff)
1250 {
1252 if (UnitAI* targetAI = GetTarget()->GetAI())
1253 targetAI->SetData(DATA_PORTAL_PERIODIC_TICK, aurEff->GetTickNumber());
1254 }
1255
1260};
1261
1262// 62138 - Teleport to Inside Violet Hold
1264{
1265 bool Validate(SpellInfo const* /*spellInfo*/) override
1266 {
1268 }
1269
1270 void HandleScript(SpellEffIndex /*effIndex*/)
1271 {
1272 if (Unit* target = GetHitUnit())
1273 target->CastSpell(target, SPELL_TELEPORT_PLAYER_EFFECT, true);
1274 }
1275
1280};
1281
#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
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
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:28
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
@ TEMPSUMMON_DEAD_DESPAWN
@ TEMPSUMMON_MANUAL_DESPAWN
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:1383
SpellEffIndex
@ EFFECT_0
@ 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)
#define AuraEffectPeriodicFn(F, I, N)
@ REACT_DEFENSIVE
@ REACT_AGGRESSIVE
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_STATE_CASTING
Definition Unit.h:276
uint32 GetTickNumber() const
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
Unit * GetUnitOwner() const
virtual void JustEngagedWith(Unit *)
Definition CreatureAI.h:101
virtual void JustSummoned(Creature *)
Definition CreatureAI.h:113
virtual void SummonedCreatureDespawn(Creature *)
Definition CreatureAI.h:116
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:386
bool HasReactState(ReactStates state) const
Definition Creature.h:176
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:228
Creature * GetCreature(uint32 type)
GameObject * GetGameObject(uint32 type)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
uint32 GetEntry() const
Definition Object.h:89
void SendPreparedGossip(WorldObject *source)
Definition Player.cpp:14028
void PrepareGossipMenu(WorldObject *source, uint32 menuId, bool showQuests=false)
Definition Player.cpp:13927
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition Player.h:2570
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
bool empty() const
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
size_type size() const
TaskContext & Schedule(TaskScheduler::duration_t time, TaskScheduler::task_handler_t task)
TaskScheduler::repeated_t GetRepeatCounter() const
Returns the repeat counter which increases every time the task is repeated.
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
TaskScheduler & Update()
Update the scheduler to the current time.
virtual void SetData(uint32 id, uint32 value)
Definition UnitAI.h:75
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:162
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
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
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
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:2658
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
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:99
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
void PeriodicTick(AuraEffect const *)
void PeriodicTick(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
@ DATA_WAVE_COUNT
Position const PortalIntroPositions[]
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 WaypointPathEnded(uint32, uint32 pathId) override
InstanceScript * _instance
void Reset() 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()
@ DATA_PORTAL_PERIODIC_TICK
AzureSorcerorSpells
@ SPELL_ARCANE_STREAM
@ SPELL_MANA_DETONATION
AzureSellbreakerSpells
@ SPELL_SLOW
@ SPELL_CONE_OF_COLD
@ SPELL_CHAINS_OF_ICE
@ SPELL_ARCANE_BLAST
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[]
static WaypointPath const SaboteurXevozzPath
static WaypointPath 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
static WaypointPath const SaboteurZuramatPath
Position const SecondPortalSecondWPs[]
Position const SecondPortalFirstWPs[]
AzureRaiderSpells
@ SPELL_CONCUSSION_BLOW
@ SPELL_MAGIC_REFLECTION
PortalCreatureIds
@ NPC_AZURE_STALKER_1
@ NPC_AZURE_SPELLBREAKER_2
@ NPC_AZURE_BINDER_2
@ NPC_VETERAN_MAGE_HUNTER
@ NPC_AZURE_BINDER_1
@ NPC_AZURE_MAGE_SLAYER_2
@ NPC_AZURE_RAIDER_1
@ NPC_AZURE_MAGE_SLAYER_1
@ NPC_AZURE_INVADER_3
@ NPC_AZURE_SORCEROR_1
@ NPC_AZURE_INVADER_2
@ NPC_AZURE_SPELLBREAKER_1
@ NPC_AZURE_SPELLBREAKER_3
@ NPC_AZURE_BINDER_3
@ NPC_AZURE_RAIDER_2
@ NPC_AZURE_MAGE_SLAYER_3
@ NPC_AZURE_INVADER_1
@ NPC_AZURE_CAPTAIN_1
static WaypointPath const SaboteurMoraggPath
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 SixthPortalWPs[]
Position const SinclariPositions[]
Position const FirstPortalWPs[]
Position const DefaultPortalWPs[]
AzureMageSlayerSpells
@ SPELL_SPELL_LOCK
@ SPELL_ARCANE_EMPOWERMENT
AzureBinderSpells
@ SPELL_FROSTBOLT
@ SPELL_ARCANE_BARRAGE
@ SPELL_ARCANE_EXPLOSION
@ SPELL_FROST_NOVA
Position const FifthPortalWPs[]
Position const ThirdPortalWPs[]
static WaypointPath const SaboteurIchoronPath
AzureInvaderSpells
@ SPELL_CLEAVE
@ SPELL_SUNDER_ARMOR
@ SPELL_BRUTAL_STRIKE
@ SPELL_IMPALE
static WaypointPath const SaboteurLavanthorPath
Position const GuardsMovePosition
AzureCaptainSpells
@ SPELL_MORTAL_STRIKE
@ SPELL_WHIRLWIND_OF_STEEL
@ 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)
uint8 constexpr PortalIntroCount
Definition violet_hold.h:32
@ ACTION_SINCLARI_OUTRO
#define RegisterVioletHoldGameObjectAI(ai_name)
@ NPC_TELEPORTATION_PORTAL_INTRO
Definition violet_hold.h:94
@ NPC_VIOLET_HOLD_GUARD
@ NPC_PORTAL_KEEPER
Definition violet_hold.h:96
@ NPC_PORTAL_GUARDIAN
Definition violet_hold.h:95
@ POINT_INTRO
Definition zulaman.cpp:64