TrinityCore
Loading...
Searching...
No Matches
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->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
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
301 }
302 };
303
304 CreatureAI* GetAI(Creature* creature) const override
305 {
306 return GetTrialOfTheChampionAI<generic_vehicleAI_toc5AI>(creature);
307 }
308};
309
311{
312public:
313 boss_warrior_toc5() : CreatureScript("boss_warrior_toc5") { }
314
315 // Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
317 {
319 {
320 Initialize();
321 instance = creature->GetInstanceScript();
322
323 bDone = false;
324 bHome = false;
325
326 uiPhase = 0;
327 uiPhaseTimer = 0;
328
330 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
332 me->SetImmuneToPC(true);
333 }
334
336 {
337 uiBladeStormTimer = urand(15000, 20000);
338 uiInterceptTimer = 7000;
339 uiMortalStrikeTimer = urand(8000, 12000);
340 }
341
343
346
350
351 bool bDone;
352 bool bHome;
353
354 void Reset() override
355 {
356 Initialize();
357 }
358
359 void JustReachedHome() override
360 {
362
363 if (!bHome)
364 return;
365
366 uiPhaseTimer = 15000;
367 uiPhase = 1;
368
369 bHome = false;
370 }
371
372 void UpdateAI(uint32 uiDiff) override
373 {
375 {
376 bDone = true;
377
379 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
381 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
383 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
384
386 bHome = true;
387 }
388
389 if (uiPhaseTimer <= uiDiff)
390 {
391 if (uiPhase == 1)
392 {
394 uiPhase = 0;
395 }
396 }else uiPhaseTimer -= uiDiff;
397
399 return;
400
401 if (uiInterceptTimer <= uiDiff)
402 {
403 Map::PlayerList const& players = me->GetMap()->GetPlayers();
404 if (!players.isEmpty())
405 {
406 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
407 {
408 Player* player = itr->GetSource();
409 if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false))
410 {
412 AddThreat(player, 5.0f);
413 DoCast(player, SPELL_INTERCEPT);
414 break;
415 }
416 }
417 }
418 uiInterceptTimer = 7000;
419 } else uiInterceptTimer -= uiDiff;
420
421 if (uiBladeStormTimer <= uiDiff)
422 {
424 uiBladeStormTimer = urand(15000, 20000);
425 } else uiBladeStormTimer -= uiDiff;
426
427 if (uiMortalStrikeTimer <= uiDiff)
428 {
430 uiMortalStrikeTimer = urand(8000, 12000);
431 } else uiMortalStrikeTimer -= uiDiff;
432
434 }
435
436 void JustDied(Unit* /*killer*/) override
437 {
439 }
440 };
441
442 CreatureAI* GetAI(Creature* creature) const override
443 {
444 return GetTrialOfTheChampionAI<boss_warrior_toc5AI>(creature);
445 }
446};
447
449{
450public:
451 boss_mage_toc5() : CreatureScript("boss_mage_toc5") { }
452
453 // Ambrose Boltspark && Eressea Dawnsinger || Mage
455 {
456 boss_mage_toc5AI(Creature* creature) : ScriptedAI(creature)
457 {
458 Initialize();
459 instance = creature->GetInstanceScript();
460
461 bDone = false;
462 bHome = false;
463
464 uiPhase = 0;
465 uiPhaseTimer = 0;
466
468 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
470 me->SetImmuneToPC(true);
471 }
472
474 {
475 uiFireBallTimer = 5000;
476 uiPolymorphTimer = 8000;
477 uiBlastWaveTimer = 12000;
478 uiHasteTimer = 22000;
479 }
480
482
485
490
491 bool bDone;
492 bool bHome;
493
494 void Reset() override
495 {
496 Initialize();
497 }
498
499 void JustReachedHome() override
500 {
502
503 if (!bHome)
504 return;
505
506 uiPhaseTimer = 15000;
507 uiPhase = 1;
508
509 bHome = false;
510 }
511
512 void UpdateAI(uint32 uiDiff) override
513 {
515 {
516 bDone = true;
517
519 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
521 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
523 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
524
526
528 bHome = true;
529 }
530
531 if (uiPhaseTimer <= uiDiff)
532 {
533 if (uiPhase == 1)
534 {
536 uiPhase = 0;
537 }
538 }else uiPhaseTimer -= uiDiff;
539
540 if (uiFireBallTimer <= uiDiff)
541 {
542 if (me->GetVictim())
544 uiFireBallTimer = 5000;
545 } else uiFireBallTimer -= uiDiff;
546
548 return;
549
550 if (uiFireBallTimer <= uiDiff)
551 {
553 uiFireBallTimer = 5000;
554 } else uiFireBallTimer -= uiDiff;
555
556 if (uiPolymorphTimer <= uiDiff)
557 {
559 DoCast(target, SPELL_POLYMORPH);
560 uiPolymorphTimer = 8000;
561 } else uiPolymorphTimer -= uiDiff;
562
563 if (uiBlastWaveTimer <= uiDiff)
564 {
566 uiBlastWaveTimer = 13000;
567 } else uiBlastWaveTimer -= uiDiff;
568
569 if (uiHasteTimer <= uiDiff)
570 {
572
574 uiHasteTimer = 22000;
575 } else uiHasteTimer -= uiDiff;
576
578 }
579
580 void JustDied(Unit* /*killer*/) override
581 {
583 }
584 };
585
586 CreatureAI* GetAI(Creature* creature) const override
587 {
588 return GetTrialOfTheChampionAI<boss_mage_toc5AI>(creature);
589 }
590};
591
593{
594public:
595 boss_shaman_toc5() : CreatureScript("boss_shaman_toc5") { }
596
597 // Colosos && Runok Wildmane || Shaman
599 {
601 {
602 Initialize();
603 instance = creature->GetInstanceScript();
604
605 bDone = false;
606 bHome = false;
607
608 uiPhase = 0;
609 uiPhaseTimer = 0;
610
612 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
614 me->SetImmuneToPC(true);
615 }
616
618 {
619 uiChainLightningTimer = 16000;
620 uiHealingWaveTimer = 12000;
621 uiEartShieldTimer = urand(30000, 35000);
622 uiHexMendingTimer = urand(20000, 25000);
623 }
624
626
629
634
635 bool bDone;
636 bool bHome;
637
638 void Reset() override
639 {
640 Initialize();
641 }
642
643 void JustEngagedWith(Unit* who) override
644 {
647 };
648
649 void JustReachedHome() override
650 {
652
653 if (!bHome)
654 return;
655
656 uiPhaseTimer = 15000;
657 uiPhase = 1;
658
659 bHome = false;
660 }
661
662 void UpdateAI(uint32 uiDiff) override
663 {
665 {
666 bDone = true;
667
669 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
671 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
673 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
674
676
678 bHome = true;
679 }
680
681 if (uiPhaseTimer <= uiDiff)
682 {
683 if (uiPhase == 1)
684 {
686 uiPhase = 0;
687 }
688 }else uiPhaseTimer -= uiDiff;
689
691 return;
692
693 if (uiChainLightningTimer <= uiDiff)
694 {
697
698 uiChainLightningTimer = 16000;
699 } else uiChainLightningTimer -= uiDiff;
700
701 if (uiHealingWaveTimer <= uiDiff)
702 {
703 bool bChance = roll_chance_i(50);
704
705 if (!bChance)
706 {
707 if (Unit* pFriend = DoSelectLowestHpFriendly(40))
708 DoCast(pFriend, SPELL_HEALING_WAVE);
709 } else
711
712 uiHealingWaveTimer = 12000;
713 } else uiHealingWaveTimer -= uiDiff;
714
715 if (uiEartShieldTimer <= uiDiff)
716 {
718
719 uiEartShieldTimer = urand(30000, 35000);
720 } else uiEartShieldTimer -= uiDiff;
721
722 if (uiHexMendingTimer <= uiDiff)
723 {
725
726 uiHexMendingTimer = urand(20000, 25000);
727 } else uiHexMendingTimer -= uiDiff;
728
730 }
731
732 void JustDied(Unit* /*killer*/) override
733 {
735 }
736 };
737
738 CreatureAI* GetAI(Creature* creature) const override
739 {
740 return GetTrialOfTheChampionAI<boss_shaman_toc5AI>(creature);
741 }
742};
743
745{
746public:
747 boss_hunter_toc5() : CreatureScript("boss_hunter_toc5") { }
748
749 // Jaelyne Evensong && Zul'tore || Hunter
751 {
753 {
754 Initialize();
755 instance = creature->GetInstanceScript();
756
757 bDone = false;
758 bHome = false;
759
760 uiPhase = 0;
761 uiPhaseTimer = 0;
762
764 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
766 me->SetImmuneToPC(true);
767 }
768
770 {
771 uiShootTimer = 12000;
774
776
777 bShoot = false;
778 }
779
781
784
788
790
791 bool bShoot;
792 bool bDone;
793 bool bHome;
794
795 void Reset() override
796 {
797 Initialize();
798 }
799
800 void JustReachedHome() override
801 {
803
804 if (!bHome)
805 return;
806
807 uiPhaseTimer = 15000;
808 uiPhase = 1;
809
810 bHome = false;
811 }
812
813 void UpdateAI(uint32 uiDiff) override
814 {
816 {
817 bDone = true;
818
820 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
822 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
824 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
825
827
829 bHome = true;
830 }
831
832 if (uiPhaseTimer <= uiDiff)
833 {
834 if (uiPhase == 1)
835 {
837 uiPhase = 0;
838 }
839 }else uiPhaseTimer -= uiDiff;
840
842 return;
843
844 if (uiLightningArrowsTimer <= uiDiff)
845 {
848 } else uiLightningArrowsTimer -= uiDiff;
849
850 if (uiShootTimer <= uiDiff)
851 {
852 if (Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 30.0f))
853 {
854 uiTargetGUID = target->GetGUID();
855 DoCast(target, SPELL_SHOOT);
856 }
857 uiShootTimer = 12000;
858 uiMultiShotTimer = 3000;
859 bShoot = true;
860 } else uiShootTimer -= uiDiff;
861
862 if (bShoot && uiMultiShotTimer <= uiDiff)
863 {
866
867 if (target && me->IsInRange(target, 5.0f, 30.0f, false))
868 {
869 DoCast(target, SPELL_MULTI_SHOT);
870 }
871 else
872 {
873 Map::PlayerList const& players = me->GetMap()->GetPlayers();
874 if (!players.isEmpty())
875 {
876 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
877 {
878 Player* player = itr->GetSource();
879 if (player && !player->IsGameMaster() && me->IsInRange(player, 5.0f, 30.0f, false))
880 {
881 DoCast(player, SPELL_MULTI_SHOT);
882 break;
883 }
884 }
885 }
886 }
887 bShoot = false;
888 } else uiMultiShotTimer -= uiDiff;
889
891 }
892
893 void JustDied(Unit* /*killer*/) override
894 {
896 }
897 };
898
899 CreatureAI* GetAI(Creature* creature) const override
900 {
901 return GetTrialOfTheChampionAI<boss_hunter_toc5AI>(creature);
902 }
903};
904
906{
907public:
908 boss_rouge_toc5() : CreatureScript("boss_rouge_toc5") { }
909
910 // Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
912 {
913 boss_rouge_toc5AI(Creature* creature) : ScriptedAI(creature)
914 {
915 Initialize();
916 instance = creature->GetInstanceScript();
917
918 bDone = false;
919 bHome = false;
920
921 uiPhase = 0;
922 uiPhaseTimer = 0;
923
925 // THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
927 me->SetImmuneToPC(true);
928 }
929
931 {
932 uiEviscerateTimer = 8000;
933 uiFanKivesTimer = 14000;
934 uiPosionBottleTimer = 19000;
935 }
936
938
944
945 bool bDone;
946 bool bHome;
947
948 void Reset() override
949 {
950 Initialize();
951 }
952
953 void JustReachedHome() override
954 {
956
957 if (!bHome)
958 return;
959
960 uiPhaseTimer = 15000;
961 uiPhase = 1;
962
963 bHome = false;
964 }
965
966 void UpdateAI(uint32 uiDiff) override
967 {
969 {
970 bDone = true;
971
973 me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f);
975 me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f);
977 me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f);
978
980
982 bHome = true;
983 }
984
985 if (uiPhaseTimer <= uiDiff)
986 {
987 if (uiPhase == 1)
988 {
990 uiPhase = 0;
991 }
992 } else uiPhaseTimer -= uiDiff;
993
995 return;
996
997 if (uiEviscerateTimer <= uiDiff)
998 {
1000 uiEviscerateTimer = 8000;
1001 } else uiEviscerateTimer -= uiDiff;
1002
1003 if (uiFanKivesTimer <= uiDiff)
1004 {
1006 uiFanKivesTimer = 14000;
1007 } else uiFanKivesTimer -= uiDiff;
1008
1009 if (uiPosionBottleTimer <= uiDiff)
1010 {
1012 DoCast(target, SPELL_POISON_BOTTLE);
1013 uiPosionBottleTimer = 19000;
1014 } else uiPosionBottleTimer -= uiDiff;
1015
1017 }
1018
1019 void JustDied(Unit* /*killer*/) override
1020 {
1022 }
1023 };
1024
1025 CreatureAI* GetAI(Creature* creature) const override
1026 {
1027 return GetTrialOfTheChampionAI<boss_rouge_toc5AI>(creature);
1028 }
1029};
1030
1032{
1034 new boss_warrior_toc5();
1035 new boss_mage_toc5();
1036 new boss_shaman_toc5();
1037 new boss_hunter_toc5();
1038 new boss_rouge_toc5();
1039}
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
@ 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
@ REACT_AGGRESSIVE
@ MOVEMENTFLAG_ONTRANSPORT
@ UNIT_FLAG_NON_ATTACKABLE
void AggroAllPlayers(Creature *temp)
@ SPELL_MORTAL_STRIKE_H
@ SPELL_HEALING_WAVE_H
@ SPELL_EVISCERATE_H
@ SPELL_EVISCERATE
@ SPELL_SHIELD_BREAKER
@ SPELL_FAN_OF_KNIVES
@ SPELL_BLAST_WAVE
@ SPELL_MORTAL_STRIKE
@ SPELL_EARTH_SHIELD
@ SPELL_INTERCEPT
@ SPELL_ROLLING_THROW
@ 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_CHAIN_LIGHTNING_H
bool GrandChampionsOutVehicle(Creature *me)
void AddSC_boss_grand_champions()
virtual void JustReachedHome()
Definition CreatureAI.h:178
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:293
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void SetReactState(ReactStates st)
Definition Creature.h:119
virtual bool SetBossState(uint32 id, EncounterState state)
virtual ObjectGuid GetGuidData(uint32 type) const override
bool isEmpty() const
Definition LinkedList.h:108
iterator end()
iterator begin()
PlayerList const & GetPlayers() const
Definition Map.h:448
bool IsEmpty() const
Definition ObjectGuid.h:172
void Clear()
Definition ObjectGuid.h:150
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
bool IsGameMaster() const
Definition Player.h:998
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:1678
void EngageWithTarget(Unit *who)
Definition Unit.cpp:8292
Unit * GetVictim() const
Definition Unit.h:859
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition Vehicle.cpp:296
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition Object.cpp:1283
MovementInfo m_movementInfo
Definition Object.h:575
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
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