TrinityCore
boss_grand_champions.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19SDName: boss_grand_champions
20SD%Complete: 50 %
21SDComment: Is missing the ai to make the npcs look for a new mount and use it.
22SDCategory: Trial Of the Champion
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "InstanceScript.h"
27#include "Map.h"
28#include "ObjectAccessor.h"
29#include "Player.h"
30#include "ScriptedEscortAI.h"
32#include "Vehicle.h"
33
35{
36 //Vehicle
37 SPELL_CHARGE = 63010,
39 SPELL_SHIELD = 66482,
40
41 // Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
46 SPELL_ROLLING_THROW = 47115, //not implemented in the AI yet...
47
48 // Ambrose Boltspark && Eressea Dawnsinger || Mage
53 SPELL_HASTE = 66045,
56
57 // Colosos && Runok Wildmane || Shaman
64
65 // Jaelyne Evensong && Zul'tore || Hunter
66 SPELL_DISENGAGE = 68340, //not implemented in the AI yet...
69 SPELL_SHOOT = 65868,
71
72 // Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
77};
78
80{
81 SEAT_ID_0 = 0
82};
83
84/*
85struct Point
86{
87 float x, y, z;
88};
89
90const Point MovementPoint[] =
91{
92 {746.84f, 623.15f, 411.41f},
93 {747.96f, 620.29f, 411.09f},
94 {750.23f, 618.35f, 411.09f}
95};
96*/
98{
99 Map::PlayerList const& PlList = temp->GetMap()->GetPlayers();
100
101 if (PlList.isEmpty())
102 return;
103
104 for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
105 {
106 if (Player* player = i->GetSource())
107 {
108 if (player->IsGameMaster())
109 continue;
110
111 if (player->IsAlive())
112 {
114 temp->SetImmuneToPC(true);
116 temp->EngageWithTarget(player);
117 }
118 }
119 }
120}
121
123{
124 InstanceScript* instance = me->GetInstanceScript();
125
126 if (!instance)
127 return false;
128
129 Creature* pGrandChampion1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GRAND_CHAMPION_1));
130 Creature* pGrandChampion2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GRAND_CHAMPION_2));
131 Creature* pGrandChampion3 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GRAND_CHAMPION_3));
132
133 if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
134 {
135 if (!pGrandChampion1->m_movementInfo.transport.guid &&
136 !pGrandChampion2->m_movementInfo.transport.guid &&
137 !pGrandChampion3->m_movementInfo.transport.guid)
138 return true;
139 }
140
141 return false;
142}
143
144/*
145* Generic AI for vehicles used by npcs in ToC, it needs more improvements. *
146* Script Complete: 25%. *
147*/
148
150{
151public:
152 generic_vehicleAI_toc5() : CreatureScript("generic_vehicleAI_toc5") { }
153
155 {
157 {
158 Initialize();
159 SetDespawnAtEnd(false);
160 uiWaypointPath = 0;
161
162 instance = creature->GetInstanceScript();
163 }
164
166 {
167 uiChargeTimer = 5000;
169 uiBuffTimer = urand(30000, 60000);
170 }
171
173
177
179
180 void Reset() override
181 {
182 Initialize();
183 }
184
185 void SetData(uint32 uiType, uint32 /*uiData*/) override
186 {
187 switch (uiType)
188 {
189 case 1:
190 AddWaypoint(0, 747.36f, 634.07f, 411.572f, true);
191 AddWaypoint(1, 780.43f, 607.15f, 411.82f, true);
192 AddWaypoint(2, 785.99f, 599.41f, 411.92f, true);
193 AddWaypoint(3, 778.44f, 601.64f, 411.79f, true);
194 uiWaypointPath = 1;
195 break;
196 case 2:
197 AddWaypoint(0, 747.35f, 634.07f, 411.57f, true);
198 AddWaypoint(1, 768.72f, 581.01f, 411.92f, true);
199 AddWaypoint(2, 763.55f, 590.52f, 411.71f, true);
200 uiWaypointPath = 2;
201 break;
202 case 3:
203 AddWaypoint(0, 747.35f, 634.07f, 411.57f, true);
204 AddWaypoint(1, 784.02f, 645.33f, 412.39f, true);
205 AddWaypoint(2, 775.67f, 641.91f, 411.91f, true);
206 uiWaypointPath = 3;
207 break;
208 }
209
210 if (uiType <= 3)
211 Start(false);
212 }
213
214 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
215 {
216 switch (waypointId)
217 {
218 case 2:
219 if (uiWaypointPath == 3 || uiWaypointPath == 2)
221 break;
222 case 3:
224 break;
225 }
226 }
227
228 void JustEngagedWith(Unit* /*who*/) override
229 {
231 }
232
234 {
235 for (uint8 i = 0; i < 3; ++i)
236 DoCast(me, SPELL_SHIELD, true);
237 }
238
239 void UpdateAI(uint32 uiDiff) override
240 {
241 EscortAI::UpdateAI(uiDiff);
242
243 if (!UpdateVictim())
244 return;
245
246 if (uiBuffTimer <= uiDiff)
247 {
248 if (!me->HasAura(SPELL_SHIELD))
250
251 uiBuffTimer = urand(30000, 45000);
252 }else uiBuffTimer -= uiDiff;
253
254 if (uiChargeTimer <= uiDiff)
255 {
256 Map::PlayerList const& players = me->GetMap()->GetPlayers();
257 if (!players.isEmpty())
258 {
259 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
260 {
261 Player* player = itr->GetSource();
262 if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false))
263 {
265 AddThreat(player, 1.0f);
266 DoCast(player, SPELL_CHARGE);
267 break;
268 }
269 }
270 }
271 uiChargeTimer = 5000;
272 }else uiChargeTimer -= uiDiff;
273
274 //dosen't work at all
275 if (uiShieldBreakerTimer <= uiDiff)
276 {
277 Vehicle* pVehicle = me->GetVehicleKit();
278 if (!pVehicle)
279 return;
280
281 if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0))
282 {
283 Map::PlayerList const& players = me->GetMap()->GetPlayers();
284 if (!players.isEmpty())
285 {
286 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
287 {
288 Player* player = itr->GetSource();
289 if (player && !player->IsGameMaster() && me->IsInRange(player, 10.0f, 30.0f, false))
290 {
291 pPassenger->CastSpell(player, SPELL_SHIELD_BREAKER, true);
292 break;
293 }
294 }
295 }
296 }
298 }else uiShieldBreakerTimer -= uiDiff;
299 }
300 };
301
302 CreatureAI* GetAI(Creature* creature) const override
303 {
304 return GetTrialOfTheChampionAI<generic_vehicleAI_toc5AI>(creature);
305 }
306};
307
309{
310public:
311 boss_warrior_toc5() : CreatureScript("boss_warrior_toc5") { }
312
313 // Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
315 {
317 {
318 Initialize();
319 instance = creature->GetInstanceScript();
320
321 bDone = false;
322 bHome = false;
323
324 uiPhase = 0;
325 uiPhaseTimer = 0;
326
328 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
330 me->SetImmuneToPC(true);
331 }
332
334 {
335 uiBladeStormTimer = urand(15000, 20000);
336 uiInterceptTimer = 7000;
337 uiMortalStrikeTimer = urand(8000, 12000);
338 }
339
341
344
348
349 bool bDone;
350 bool bHome;
351
352 void Reset() override
353 {
354 Initialize();
355 }
356
357 void JustReachedHome() override
358 {
360
361 if (!bHome)
362 return;
363
364 uiPhaseTimer = 15000;
365 uiPhase = 1;
366
367 bHome = false;
368 }
369
370 void UpdateAI(uint32 uiDiff) override
371 {
373 {
374 bDone = true;
375
377 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
379 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
381 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
382
384 bHome = true;
385 }
386
387 if (uiPhaseTimer <= uiDiff)
388 {
389 if (uiPhase == 1)
390 {
392 uiPhase = 0;
393 }
394 }else uiPhaseTimer -= uiDiff;
395
397 return;
398
399 if (uiInterceptTimer <= uiDiff)
400 {
401 Map::PlayerList const& players = me->GetMap()->GetPlayers();
402 if (!players.isEmpty())
403 {
404 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
405 {
406 Player* player = itr->GetSource();
407 if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false))
408 {
410 AddThreat(player, 5.0f);
411 DoCast(player, SPELL_INTERCEPT);
412 break;
413 }
414 }
415 }
416 uiInterceptTimer = 7000;
417 } else uiInterceptTimer -= uiDiff;
418
419 if (uiBladeStormTimer <= uiDiff)
420 {
422 uiBladeStormTimer = urand(15000, 20000);
423 } else uiBladeStormTimer -= uiDiff;
424
425 if (uiMortalStrikeTimer <= uiDiff)
426 {
428 uiMortalStrikeTimer = urand(8000, 12000);
429 } else uiMortalStrikeTimer -= uiDiff;
430 }
431
432 void JustDied(Unit* /*killer*/) override
433 {
435 }
436 };
437
438 CreatureAI* GetAI(Creature* creature) const override
439 {
440 return GetTrialOfTheChampionAI<boss_warrior_toc5AI>(creature);
441 }
442};
443
445{
446public:
447 boss_mage_toc5() : CreatureScript("boss_mage_toc5") { }
448
449 // Ambrose Boltspark && Eressea Dawnsinger || Mage
451 {
452 boss_mage_toc5AI(Creature* creature) : ScriptedAI(creature)
453 {
454 Initialize();
455 instance = creature->GetInstanceScript();
456
457 bDone = false;
458 bHome = false;
459
460 uiPhase = 0;
461 uiPhaseTimer = 0;
462
464 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
466 me->SetImmuneToPC(true);
467 }
468
470 {
471 uiFireBallTimer = 5000;
472 uiPolymorphTimer = 8000;
473 uiBlastWaveTimer = 12000;
474 uiHasteTimer = 22000;
475 }
476
478
481
486
487 bool bDone;
488 bool bHome;
489
490 void Reset() override
491 {
492 Initialize();
493 }
494
495 void JustReachedHome() override
496 {
498
499 if (!bHome)
500 return;
501
502 uiPhaseTimer = 15000;
503 uiPhase = 1;
504
505 bHome = false;
506 }
507
508 void UpdateAI(uint32 uiDiff) override
509 {
511 {
512 bDone = true;
513
515 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
517 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
519 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
520
522
524 bHome = true;
525 }
526
527 if (uiPhaseTimer <= uiDiff)
528 {
529 if (uiPhase == 1)
530 {
532 uiPhase = 0;
533 }
534 }else uiPhaseTimer -= uiDiff;
535
536 if (uiFireBallTimer <= uiDiff)
537 {
538 if (me->GetVictim())
540 uiFireBallTimer = 5000;
541 } else uiFireBallTimer -= uiDiff;
542
544 return;
545
546 if (uiFireBallTimer <= uiDiff)
547 {
549 uiFireBallTimer = 5000;
550 } else uiFireBallTimer -= uiDiff;
551
552 if (uiPolymorphTimer <= uiDiff)
553 {
555 DoCast(target, SPELL_POLYMORPH);
556 uiPolymorphTimer = 8000;
557 } else uiPolymorphTimer -= uiDiff;
558
559 if (uiBlastWaveTimer <= uiDiff)
560 {
562 uiBlastWaveTimer = 13000;
563 } else uiBlastWaveTimer -= uiDiff;
564
565 if (uiHasteTimer <= uiDiff)
566 {
568
570 uiHasteTimer = 22000;
571 } else uiHasteTimer -= uiDiff;
572 }
573
574 void JustDied(Unit* /*killer*/) override
575 {
577 }
578 };
579
580 CreatureAI* GetAI(Creature* creature) const override
581 {
582 return GetTrialOfTheChampionAI<boss_mage_toc5AI>(creature);
583 }
584};
585
587{
588public:
589 boss_shaman_toc5() : CreatureScript("boss_shaman_toc5") { }
590
591 // Colosos && Runok Wildmane || Shaman
593 {
595 {
596 Initialize();
597 instance = creature->GetInstanceScript();
598
599 bDone = false;
600 bHome = false;
601
602 uiPhase = 0;
603 uiPhaseTimer = 0;
604
606 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
608 me->SetImmuneToPC(true);
609 }
610
612 {
613 uiChainLightningTimer = 16000;
614 uiHealingWaveTimer = 12000;
615 uiEartShieldTimer = urand(30000, 35000);
616 uiHexMendingTimer = urand(20000, 25000);
617 }
618
620
623
628
629 bool bDone;
630 bool bHome;
631
632 void Reset() override
633 {
634 Initialize();
635 }
636
637 void JustEngagedWith(Unit* who) override
638 {
641 };
642
643 void JustReachedHome() override
644 {
646
647 if (!bHome)
648 return;
649
650 uiPhaseTimer = 15000;
651 uiPhase = 1;
652
653 bHome = false;
654 }
655
656 void UpdateAI(uint32 uiDiff) override
657 {
659 {
660 bDone = true;
661
663 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
665 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
667 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
668
670
672 bHome = true;
673 }
674
675 if (uiPhaseTimer <= uiDiff)
676 {
677 if (uiPhase == 1)
678 {
680 uiPhase = 0;
681 }
682 }else uiPhaseTimer -= uiDiff;
683
685 return;
686
687 if (uiChainLightningTimer <= uiDiff)
688 {
691
692 uiChainLightningTimer = 16000;
693 } else uiChainLightningTimer -= uiDiff;
694
695 if (uiHealingWaveTimer <= uiDiff)
696 {
697 bool bChance = roll_chance_i(50);
698
699 if (!bChance)
700 {
701 if (Unit* pFriend = DoSelectLowestHpFriendly(40))
702 DoCast(pFriend, SPELL_HEALING_WAVE);
703 } else
705
706 uiHealingWaveTimer = 12000;
707 } else uiHealingWaveTimer -= uiDiff;
708
709 if (uiEartShieldTimer <= uiDiff)
710 {
712
713 uiEartShieldTimer = urand(30000, 35000);
714 } else uiEartShieldTimer -= uiDiff;
715
716 if (uiHexMendingTimer <= uiDiff)
717 {
719
720 uiHexMendingTimer = urand(20000, 25000);
721 } else uiHexMendingTimer -= uiDiff;
722 }
723
724 void JustDied(Unit* /*killer*/) override
725 {
727 }
728 };
729
730 CreatureAI* GetAI(Creature* creature) const override
731 {
732 return GetTrialOfTheChampionAI<boss_shaman_toc5AI>(creature);
733 }
734};
735
737{
738public:
739 boss_hunter_toc5() : CreatureScript("boss_hunter_toc5") { }
740
741 // Jaelyne Evensong && Zul'tore || Hunter
743 {
745 {
746 Initialize();
747 instance = creature->GetInstanceScript();
748
749 bDone = false;
750 bHome = false;
751
752 uiPhase = 0;
753 uiPhaseTimer = 0;
754
756 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
758 me->SetImmuneToPC(true);
759 }
760
762 {
763 uiShootTimer = 12000;
766
768
769 bShoot = false;
770 }
771
773
776
780
782
783 bool bShoot;
784 bool bDone;
785 bool bHome;
786
787 void Reset() override
788 {
789 Initialize();
790 }
791
792 void JustReachedHome() override
793 {
795
796 if (!bHome)
797 return;
798
799 uiPhaseTimer = 15000;
800 uiPhase = 1;
801
802 bHome = false;
803 }
804
805 void UpdateAI(uint32 uiDiff) override
806 {
808 {
809 bDone = true;
810
812 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
814 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
816 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
817
819
821 bHome = true;
822 }
823
824 if (uiPhaseTimer <= uiDiff)
825 {
826 if (uiPhase == 1)
827 {
829 uiPhase = 0;
830 }
831 }else uiPhaseTimer -= uiDiff;
832
834 return;
835
836 if (uiLightningArrowsTimer <= uiDiff)
837 {
840 } else uiLightningArrowsTimer -= uiDiff;
841
842 if (uiShootTimer <= uiDiff)
843 {
844 if (Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 30.0f))
845 {
846 uiTargetGUID = target->GetGUID();
847 DoCast(target, SPELL_SHOOT);
848 }
849 uiShootTimer = 12000;
850 uiMultiShotTimer = 3000;
851 bShoot = true;
852 } else uiShootTimer -= uiDiff;
853
854 if (bShoot && uiMultiShotTimer <= uiDiff)
855 {
858
859 if (target && me->IsInRange(target, 5.0f, 30.0f, false))
860 {
861 DoCast(target, SPELL_MULTI_SHOT);
862 }
863 else
864 {
865 Map::PlayerList const& players = me->GetMap()->GetPlayers();
866 if (!players.isEmpty())
867 {
868 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
869 {
870 Player* player = itr->GetSource();
871 if (player && !player->IsGameMaster() && me->IsInRange(player, 5.0f, 30.0f, false))
872 {
873 DoCast(player, SPELL_MULTI_SHOT);
874 break;
875 }
876 }
877 }
878 }
879 bShoot = false;
880 } else uiMultiShotTimer -= uiDiff;
881 }
882
883 void JustDied(Unit* /*killer*/) override
884 {
886 }
887 };
888
889 CreatureAI* GetAI(Creature* creature) const override
890 {
891 return GetTrialOfTheChampionAI<boss_hunter_toc5AI>(creature);
892 }
893};
894
896{
897public:
898 boss_rouge_toc5() : CreatureScript("boss_rouge_toc5") { }
899
900 // Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
902 {
903 boss_rouge_toc5AI(Creature* creature) : ScriptedAI(creature)
904 {
905 Initialize();
906 instance = creature->GetInstanceScript();
907
908 bDone = false;
909 bHome = false;
910
911 uiPhase = 0;
912 uiPhaseTimer = 0;
913
915 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
917 me->SetImmuneToPC(true);
918 }
919
921 {
922 uiEviscerateTimer = 8000;
923 uiFanKivesTimer = 14000;
924 uiPosionBottleTimer = 19000;
925 }
926
928
934
935 bool bDone;
936 bool bHome;
937
938 void Reset() override
939 {
940 Initialize();
941 }
942
943 void JustReachedHome() override
944 {
946
947 if (!bHome)
948 return;
949
950 uiPhaseTimer = 15000;
951 uiPhase = 1;
952
953 bHome = false;
954 }
955
956 void UpdateAI(uint32 uiDiff) override
957 {
959 {
960 bDone = true;
961
963 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
965 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
967 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
968
970
972 bHome = true;
973 }
974
975 if (uiPhaseTimer <= uiDiff)
976 {
977 if (uiPhase == 1)
978 {
980 uiPhase = 0;
981 }
982 } else uiPhaseTimer -= uiDiff;
983
985 return;
986
987 if (uiEviscerateTimer <= uiDiff)
988 {
990 uiEviscerateTimer = 8000;
991 } else uiEviscerateTimer -= uiDiff;
992
993 if (uiFanKivesTimer <= uiDiff)
994 {
996 uiFanKivesTimer = 14000;
997 } else uiFanKivesTimer -= uiDiff;
998
999 if (uiPosionBottleTimer <= uiDiff)
1000 {
1002 DoCast(target, SPELL_POISON_BOTTLE);
1003 uiPosionBottleTimer = 19000;
1004 } else uiPosionBottleTimer -= uiDiff;
1005 }
1006
1007 void JustDied(Unit* /*killer*/) override
1008 {
1010 }
1011 };
1012
1013 CreatureAI* GetAI(Creature* creature) const override
1014 {
1015 return GetTrialOfTheChampionAI<boss_rouge_toc5AI>(creature);
1016 }
1017};
1018
1020{
1022 new boss_warrior_toc5();
1023 new boss_mage_toc5();
1024 new boss_shaman_toc5();
1025 new boss_hunter_toc5();
1026 new boss_rouge_toc5();
1027}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ DONE
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
void AggroAllPlayers(Creature *temp)
@ SPELL_MORTAL_STRIKE_H
@ SPELL_HEALING_WAVE_H
@ SPELL_EVISCERATE_H
@ SPELL_CHARGE
@ SPELL_EVISCERATE
@ SPELL_SHIELD_BREAKER
@ SPELL_FAN_OF_KNIVES
@ SPELL_BLAST_WAVE
@ SPELL_MORTAL_STRIKE
@ SPELL_EARTH_SHIELD
@ SPELL_INTERCEPT
@ SPELL_FIREBALL
@ SPELL_ROLLING_THROW
@ SPELL_SHOOT_H
@ SPELL_DISENGAGE
@ SPELL_HEALING_WAVE
@ SPELL_POISON_BOTTLE
@ SPELL_BLADESTORM
@ SPELL_CHAIN_LIGHTNING
@ SPELL_POLYMORPH_H
@ SPELL_LIGHTNING_ARROWS
@ SPELL_FIREBALL_H
@ SPELL_MULTI_SHOT
@ SPELL_HEX_OF_MENDING
@ SPELL_BLAST_WAVE_H
@ SPELL_POLYMORPH
@ SPELL_SHIELD
@ SPELL_CHAIN_LIGHTNING_H
bool GrandChampionsOutVehicle(Creature *me)
void AddSC_boss_grand_champions()
virtual void JustReachedHome()
Definition: CreatureAI.h:159
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetReactState(ReactStates st)
Definition: Creature.h:160
virtual bool SetBossState(uint32 id, EncounterState state)
virtual ObjectGuid GetGuidData(uint32 type) const override
bool isEmpty() const
Definition: LinkedList.h:110
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
PlayerList const & GetPlayers() const
Definition: Map.h:367
bool IsEmpty() const
Definition: ObjectGuid.h:319
void Clear()
Definition: ObjectGuid.h:286
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool IsGameMaster() const
Definition: Player.h:1178
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 InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
void EngageWithTarget(Unit *who)
Definition: Unit.cpp:8077
Unit * GetVictim() const
Definition: Unit.h:715
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
Vehicle * GetVehicleKit() const
Definition: Unit.h:1711
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition: Vehicle.cpp:291
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition: Object.cpp:1238
MovementInfo m_movementInfo
Definition: Object.h:761
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
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)
void UpdateAI(uint32 diff) override
struct MovementInfo::TransportInfo transport
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
void ResetThreatList(Unit *who=nullptr)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void UpdateAI(uint32 uiDiff) override
void UpdateAI(uint32 uiDiff) override
void WaypointReached(uint32 waypointId, uint32) override
@ DATA_GRAND_CHAMPION_2
@ DATA_GRAND_CHAMPION_1
@ DATA_GRAND_CHAMPION_3
@ BOSS_GRAND_CHAMPIONS
@ DATA_MOVEMENT_DONE