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
383// 30658 - Lieutenant Sinclari
385{
386 npc_sinclari_vh(Creature* creature) : ScriptedAI(creature), _summons(creature)
387 {
388 _instance = creature->GetInstanceScript();
389 }
390
391 void Reset() override
392 {
394 for (uint8 i = 0; i < PortalIntroCount; ++i)
396 summon->AI()->SetData(DATA_PORTAL_LOCATION, i);
397
399
400 std::list<Creature*> guardList;
402 for (Creature* guard : guardList)
403 {
404 guard->Respawn(true);
405 guard->SetVisible(true);
406 guard->SetReactState(REACT_AGGRESSIVE);
407 guard->AI()->EnterEvadeMode();
408 }
409 }
410
411 bool OnGossipHello(Player* player) override
412 {
413 // override default gossip
415 {
416 case IN_PROGRESS:
418 player->SendPreparedGossip(me);
419 return true;
420 case DONE:
421 return true; // NYI
422 case NOT_STARTED:
423 case FAIL:
424 default:
425 break;
426 }
427
428 // load default gossip
429 return false;
430 }
431
432 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
433 {
434 if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0)
435 {
439 player->PlayerTalkClass->SendCloseGossip();
440 }
441 else if (menuId == GOSSIP_MENU_SEND_ME_IN && gossipListId == 0)
442 {
443 me->CastSpell(player, SPELL_TELEPORT_PLAYER, true);
444 player->PlayerTalkClass->SendCloseGossip();
445 }
446 return false;
447 }
448
449 void DoAction(int32 actionId) override
450 {
451 if (actionId == ACTION_SINCLARI_OUTRO)
453 }
454
455 void UpdateAI(uint32 diff) override
456 {
457 _scheduler.Update(diff);
458
459 if (!UpdateVictim())
460 return;
461 }
462
464 {
465 _scheduler.Schedule(1s, [this](TaskContext& task)
466 {
467 switch (task.GetRepeatCounter())
468 {
469 case 0:
470 me->SetWalk(true);
471 me->GetMotionMaster()->MovePoint(0, SinclariPositions[0]);
472 task.Repeat(1s);
473 break;
474 case 1:
475 me->HandleEmoteCommand(EMOTE_ONESHOT_USE_STANDING);
476 me->GetMap()->SummonCreature(NPC_DEFENSE_SYSTEM, DefenseSystemLocation);
477 task.Repeat(3s);
478 break;
479 case 2:
480 me->SetFacingTo(SinclariPositions[0].GetOrientation());
481 Talk(SAY_SINCLARI_INTRO_1);
482
483 task.Schedule(1s, [this](TaskContext const& /*task*/)
484 {
485 std::list<Creature*> guardList;
486 me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f);
487 for (Creature* guard : guardList)
488 {
489 if (!guard->IsAlive())
490 continue;
491 guard->SetReactState(REACT_PASSIVE);
492 guard->SetWalk(false);
493 guard->GetMotionMaster()->MovePoint(0, GuardsMovePosition);
494 }
495 });
496
497 task.Repeat(2s);
498 break;
499 case 3:
502 task.Repeat(5s);
503 break;
504 case 4:
505 me->SetFacingTo(SinclariPositions[1].GetOrientation());
506
507 task.Schedule(1s, [this](TaskContext const& /*task*/)
508 {
509 std::list<Creature*> guardList;
511 for (Creature* guard : guardList)
512 guard->SetVisible(false);
513 });
514
515 task.Repeat(6s);
516 break;
517 case 5:
519 task.Repeat(4s);
520 break;
521 case 6:
523 task.Repeat(1s);
524 break;
525 case 7:
527 {
528 mainDoor->SetGoState(GO_STATE_READY);
529 mainDoor->SetFlag(GO_FLAG_LOCKED);
530 }
531 task.Repeat(5s);
532 break;
533 case 8:
535 task.Repeat(1s);
536 break;
537 case 9:
538 // We should teleport inside if event is in progress with GOSSIP_MENU_SEND_ME_IN
540 break;
541 default:
542 break;
543 }
544 });
545 }
546
548 {
549 _scheduler.Schedule(4s, [this](TaskContext& task)
550 {
552 me->GetMotionMaster()->MovePoint(0, SinclariPositions[3]);
553
554 task.Schedule(10s, [this](TaskContext const& /*task*/)
555 {
556 me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
557 });
558 });
559 }
560
561 void JustSummoned(Creature* summon) override
562 {
564 _summons.Summon(summon);
565 }
566
567 void SummonedCreatureDespawn(Creature* summon) override
568 {
569 _summons.Despawn(summon);
571 }
572
573private:
576
578};
579
580// 31079 - Azure Saboteur
582{
584 {
585 _instance = creature->GetInstanceScript();
586
589 else
591 }
592
594 {
595 switch (_bossId)
596 {
597 case DATA_MORAGG:
599 break;
600 case DATA_EREKEM:
602 break;
603 case DATA_ICHORON:
605 break;
606 case DATA_LAVANTHOR:
608 break;
609 case DATA_XEVOZZ:
611 break;
612 case DATA_ZURAMAT:
614 break;
615 }
616 }
617
618 void Reset() override
619 {
621 _scheduler.Schedule(2s, [this](TaskContext const& /*task*/)
622 {
624 });
625 }
626
627 void WaypointPathEnded(uint32 /*waypointId*/, uint32 pathId) override
628 {
629 if (pathId == POINT_INTRO)
630 {
631 _scheduler.Schedule(0s, [this](TaskContext& task)
632 {
634
635 if (task.GetRepeatCounter() < 2)
636 task.Repeat(1s);
637 else
638 {
639 task.Schedule(2s, [this](TaskContext const& /*task*/)
640 {
644 });
645 }
646 });
647 }
648 }
649
650 void UpdateAI(uint32 diff) override
651 {
652 _scheduler.Update(diff);
653 }
654
655private:
658
660};
661
663{
669
670 void InitializeAI() override
671 {
674 }
675
676 void SetData(uint32 type, uint32 data) override
677 {
678 if (type == DATA_PORTAL_LOCATION)
679 _portalLocation = uint8(data);
680 }
681
682 void MoveInLineOfSight(Unit* /*who*/) override { }
683
684 void JustEngagedWith(Unit* /*who*/) override { }
685
686 void JustSummoned(Creature* summon) override
687 {
688 _summons.Summon(summon);
690 }
691
692 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
693 {
694 _summons.Despawn(summon);
695 }
696
697 virtual void ScheduleTasks() { }
698
699 void UpdateAI(uint32 diff) override
700 {
701 _scheduler.Update(diff);
702 }
703
704protected:
709};
710
711// 30679 - Teleportation Portal
713{
717
723
724 void SetData(uint32 type, uint32 data) override
725 {
727
728 if (type == DATA_PORTAL_PERIODIC_TICK)
729 {
730 if (data == 1)
731 {
733 if (Creature* portalKeeper = DoSummon(entry, me, 2.0f, 0s, TEMPSUMMON_DEAD_DESPAWN))
734 me->CastSpell(portalKeeper, SPELL_PORTAL_CHANNEL, false);
735
736 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
737 {
738 if (entry == NPC_PORTAL_GUARDIAN)
739 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_GUARDIAN);
740 else if (entry == NPC_PORTAL_KEEPER)
741 sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_KEEPER);
742 }
743 }
744 else
745 {
746 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
747 while (k--)
748 {
750 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
751 }
752 }
753 }
754 }
755
756 void SummonedCreatureDies(Creature* summon, Unit* killer) override
757 {
759
760 if (summon->GetEntry() == NPC_PORTAL_GUARDIAN || summon->GetEntry() == NPC_PORTAL_KEEPER)
761 {
764 }
765 }
766};
767
768// 32174 - Teleportation Portal (Elite)
770{
774
775 void ScheduleTasks() override
776 {
777 _scheduler.Schedule(Seconds(15), [this](TaskContext& task)
778 {
779 uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
780 while (k--)
781 {
783 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
784 }
785
786 if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER))
787 sinclariTrigger->AI()->Talk(SAY_SINCLARI_ELITE_SQUAD);
788
789 task.Schedule(1s, [this](TaskContext const& /*task*/)
790 {
791 me->SetVisible(false);
792 });
793 });
794 }
795
806};
807
808// 31011 - Teleportation Portal (Intro)
810{
814
815 void ScheduleTasks() override
816 {
818 return;
819
820 _scheduler.Schedule(15s, [this](TaskContext& task)
821 {
822 // Limit the number of current summons
823 if (_summons.size() < 3)
824 {
825 uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1);
826 DoSummon(entry, me, 2.0f, 20s, TEMPSUMMON_DEAD_DESPAWN);
827 }
828
829 task.Repeat();
830 });
831 }
832};
833
835{
836 violet_hold_trashAI(Creature* creature) : EscortAI(creature)
837 {
838 _instance = creature->GetInstanceScript();
839
840 _lastWaypointId = 0;
841
842 SetDespawnAtEnd(false);
843
845 {
847 });
848 }
849
850 void Reset() override
851 {
854 }
855
856 template <size_t N>
858 {
859 _lastWaypointId = N - 1;
860 return &path[0];
861 }
862
863 void SetData(uint32 type, uint32 data) override
864 {
865 if (type == DATA_PORTAL_LOCATION)
866 {
867 Position const* path = nullptr;
868
869 switch (data)
870 {
871 case 0:
873 break;
874 case 7:
875 switch (urand(0, 1))
876 {
877 case 0:
879 break;
880 case 1:
882 break;
883 }
884 break;
885 case 2:
887 break;
888 case 6:
890 break;
891 case 1:
893 break;
894 case 5:
896 break;
897 default:
899 break;
900 }
901
902 if (path)
903 {
904 for (uint32 i = 0; i <= _lastWaypointId; i++)
905 AddWaypoint(i, path[i].GetPositionX() + irand(-1, 1), path[i].GetPositionY() + irand(-1, 1), path[i].GetPositionZ(), 0, {}, true);
906 me->SetHomePosition(path[_lastWaypointId].GetPositionX(), path[_lastWaypointId].GetPositionY(), path[_lastWaypointId].GetPositionZ(), float(M_PI));
907 }
908
909 Start(true);
910 }
911 }
912
913 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
914 {
915 if (waypointId == _lastWaypointId)
916 {
919 _scheduler.Schedule(2s, [this](TaskContext& destroyDoorCheck)
920 {
923 destroyDoorCheck.Repeat();
924 });
925 }
926 }
927
928 void JustEngagedWith(Unit* who) override
929 {
931 return;
932
935 }
936
937 void UpdateEscortAI(uint32 diff) override
938 {
940 me->CastStop();
941
942 if (!UpdateVictim())
943 return;
944
945 _scheduler.Update(diff);
946 }
947
948 virtual void ScheduledTasks() { }
949
950protected:
953
955};
956
957// 30661 - Azure Invader
958// 30961 - Azure Invader
960{
962
963 void ScheduledTasks() override
964 {
966 {
967 _scheduler.Schedule(5s, [this](TaskContext& task)
968 {
970 task.Repeat();
971 });
972
973 _scheduler.Schedule(4s, [this](TaskContext& task)
974 {
976 task.Repeat();
977 });
978 }
979 else if (me->GetEntry() == NPC_AZURE_INVADER_2)
980 {
981 _scheduler.Schedule(5s, [this](TaskContext& task)
982 {
984 task.Repeat();
985 });
986
987 _scheduler.Schedule(4s, [this](TaskContext& task)
988 {
990 task.Repeat(8s, 10s);
991 });
992 }
993 }
994};
995
996// 30663 - Azure Binder
997// 30918 - Azure Binder
999{
1001
1002 void ScheduledTasks() override
1003 {
1004 if (me->GetEntry() == NPC_AZURE_BINDER_1)
1005 {
1006 _scheduler.Schedule(5s, [this](TaskContext& task)
1007 {
1009 task.Repeat();
1010 });
1011
1012 _scheduler.Schedule(4s, [this](TaskContext& task)
1013 {
1014 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1016 task.Repeat(6s);
1017 });
1018 }
1019 else if (me->GetEntry() == NPC_AZURE_BINDER_2)
1020 {
1021 _scheduler.Schedule(5s, [this](TaskContext& task)
1022 {
1024 task.Repeat();
1025 });
1026
1027 _scheduler.Schedule(4s, [this](TaskContext& task)
1028 {
1029 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1030 DoCast(target, SPELL_FROSTBOLT);
1031 task.Repeat(6s);
1032 });
1033 }
1034 }
1035};
1036
1037// 30664 - Azure Mage Slayer
1038// 30963 - Azure Mage Slayer
1040{
1042
1043 void ScheduledTasks() override
1044 {
1046 {
1047 _scheduler.Schedule(5s, [this](TaskContext& task)
1048 {
1050 task.Repeat(14s);
1051 });
1052 }
1053 else if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2)
1054 {
1055 _scheduler.Schedule(5s, [this](TaskContext& task)
1056 {
1057 // wrong spellid?
1058 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1059 DoCast(target, SPELL_SPELL_LOCK);
1060 task.Repeat(9s);
1061 });
1062 }
1063 }
1064};
1065
1066// 30668 - Azure Raider
1068{
1070
1071 void ScheduledTasks() override
1072 {
1073 _scheduler.Schedule(5s, [this](TaskContext& task)
1074 {
1076 task.Repeat();
1077 });
1078
1079 _scheduler.Schedule(8s, [this](TaskContext& task)
1080 {
1082 task.Repeat(10s, 15s);
1083 });
1084 }
1085};
1086
1087// 32191 - Azure Stalker
1089{
1091
1092 void ScheduledTasks() override
1093 {
1094 _scheduler.Schedule(8s, [this](TaskContext& task)
1095 {
1096 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
1098
1099 task.Schedule(1300ms, [this](TaskContext const& /*task*/)
1100 {
1101 if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 5.0f))
1102 DoCast(target, SPELL_BACKSTAB);
1103 });
1104
1105 task.Repeat();
1106 });
1107 }
1108};
1109
1110// 30662 - Azure Spellbreaker
1111// 30962 - Azure Spellbreaker
1113{
1115
1116 void ScheduledTasks() override
1117 {
1119 {
1120 _scheduler.Schedule(5s, [this](TaskContext& task)
1121 {
1122 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1123 DoCast(target, SPELL_ARCANE_BLAST);
1124 task.Repeat(6s);
1125 });
1126
1127 _scheduler.Schedule(4s, [this](TaskContext& task)
1128 {
1129 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1130 DoCast(target, SPELL_SLOW);
1131 task.Repeat(5s);
1132 });
1133 }
1134 else if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2)
1135 {
1136 _scheduler.Schedule(5s, [this](TaskContext& task)
1137 {
1138 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f))
1139 DoCast(target, SPELL_CHAINS_OF_ICE);
1140 task.Repeat(7s);
1141 });
1142
1143 _scheduler.Schedule(4s, [this](TaskContext& task)
1144 {
1146 task.Repeat(5s);
1147 });
1148 }
1149 }
1150};
1151
1152// 30666 - Azure Captain
1154{
1156
1157 void ScheduledTasks() override
1158 {
1159 _scheduler.Schedule(5s, [this](TaskContext& task)
1160 {
1162 task.Repeat();
1163 });
1164
1165 _scheduler.Schedule(8s, [this](TaskContext& task)
1166 {
1168 task.Repeat();
1169 });
1170 }
1171};
1172
1173// 30667 - Azure Sorceror
1175{
1177
1178 void ScheduledTasks() override
1179 {
1180 _scheduler.Schedule(4s, [this](TaskContext& task)
1181 {
1182 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f))
1183 DoCast(target, SPELL_ARCANE_STREAM);
1184 task.Repeat(5s, 10s);
1185 });
1186
1187 _scheduler.Schedule(0s, [this](TaskContext& task)
1188 {
1190 task.Repeat(2s, 6s);
1191 });
1192 }
1193};
1194
1195// 30837 - Defense System
1197{
1199
1200 void Reset() override
1201 {
1203 me->DespawnOrUnsummon(7s);
1204 }
1205
1207 {
1208 _scheduler.Schedule(4s, [this](TaskContext& task)
1209 {
1212 if (task.GetRepeatCounter() == 2)
1214 else
1215 task.Repeat(1s);
1216 });
1217 }
1218
1219 void UpdateAI(uint32 diff) override
1220 {
1221 _scheduler.Update(diff);
1222 }
1223
1224private:
1226};
1227
1228// 193611 - Activation Crystal
1230{
1232
1233 bool OnGossipHello(Player* player) override
1234 {
1235 player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true);
1236 return false;
1237 }
1238};
1239
1240// 58040 - Destroy Door Seal
1242{
1243 bool Load() override
1244 {
1246 return _instance != nullptr;
1247 }
1248
1249 void PeriodicTick(AuraEffect const* /*aurEff*/)
1250 {
1252 if (uint32 integrity = _instance->GetData(DATA_DOOR_INTEGRITY))
1253 _instance->SetData(DATA_DOOR_INTEGRITY, integrity - 1);
1254 }
1255
1260
1261private:
1263};
1264
1265// 58008 - Portal Periodic
1267{
1268 void PeriodicTick(AuraEffect const* aurEff)
1269 {
1271 if (UnitAI* targetAI = GetTarget()->GetAI())
1272 targetAI->SetData(DATA_PORTAL_PERIODIC_TICK, aurEff->GetTickNumber());
1273 }
1274
1279};
1280
1281// 62138 - Teleport to Inside Violet Hold
1283{
1284 bool Validate(SpellInfo const* /*spellInfo*/) override
1285 {
1287 }
1288
1289 void HandleScript(SpellEffIndex /*effIndex*/)
1290 {
1291 if (Unit* target = GetHitUnit())
1292 target->CastSpell(target, SPELL_TELEPORT_PLAYER_EFFECT, true);
1293 }
1294
1299};
1300
#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::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:36
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ EMOTE_ONESHOT_TALK_NO_SHEATHE
@ 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:290
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:394
bool HasReactState(ReactStates state) const
Definition Creature.h:182
void SetReactState(ReactStates st)
Definition Creature.h:180
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:235
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:13985
void PrepareGossipMenu(WorldObject *source, uint32 menuId, bool showQuests=false)
Definition Player.cpp:13884
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition Player.h:2556
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:35
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
void CastStop(uint32 except_spellid=0)
Definition Unit.cpp:1191
void SetVisible(bool x)
Definition Unit.cpp:8787
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1013
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1012
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13385
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1662
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:2663
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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:1403
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