TrinityCore
boss_priestess_delrissa.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_Priestess_Delrissa
20SD%Complete: 65
21SDComment: No Heroic support yet. Needs further testing. Several scripts for pets disabled, not seem to require any special script.
22SDCategory: Magister's Terrace
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "magisters_terrace.h"
27#include "InstanceScript.h"
28#include "ObjectAccessor.h"
29#include "ScriptedCreature.h"
30#include "TemporarySummon.h"
31
32struct Speech
33{
35};
36
38{
39 {1},
40 {2},
41 {3},
42 {4},
43};
44
46{
47 {5},
48 {6},
49 {7},
50 {8},
51 {9},
52};
53
55{
58};
59
61{
66 SPELL_SHIELD = 44291,
69
70 // Apoko
73 SPELL_PURGE = 27626,
78};
79
80enum Misc
81{
83};
84
85const float fOrientation = 4.98f;
86const float fZLocation = -19.921f;
87
88float LackeyLocations[4][2]=
89{
90 {123.77f, 17.6007f},
91 {131.731f, 15.0827f},
92 {121.563f, 15.6213f},
93 {129.988f, 17.2355f},
94};
95
97{
98 24557, //Kagani Nightstrike
99 24558, //Elris Duskhallow
100 24554, //Eramas Brightblaze
101 24561, //Yazzaj
102 24559, //Warlord Salaris
103 24555, //Garaxxas
104 24553, //Apoko
105 24556, //Zelfan
106};
107
109{
110public:
111 boss_priestess_delrissa() : CreatureScript("boss_priestess_delrissa") { }
112
113 CreatureAI* GetAI(Creature* creature) const override
114 {
115 return GetMagistersTerraceAI<boss_priestess_delrissaAI>(creature);
116 }
117
119 {
121 {
122 Initialize();
123 instance = creature->GetInstanceScript();
124 LackeyEntryList.clear();
125 }
126
128 {
129 PlayersKilled = 0;
130
131 HealTimer = 15000;
132 RenewTimer = 10000;
133 ShieldTimer = 2000;
134 SWPainTimer = 5000;
135 DispelTimer = 7500;
136 ResetTimer = 5000;
137 }
138
140
141 std::vector<uint32> LackeyEntryList;
143
145
152
153 void Reset() override
154 {
155 Initialize();
156
158 }
159
160 //this mean she at some point evaded
161 void JustReachedHome() override
162 {
164 }
165
166 void JustEngagedWith(Unit* who) override
167 {
169
170 for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i)
172 if (!pAdd->IsEngaged())
173 AddThreat(who, 0.0f, pAdd);
174
176 }
177
179 {
180 //can be called if Creature are dead, so avoid
181 if (!me->IsAlive())
182 return;
183
184 uint8 j = 0;
185
186 //it's empty, so first time
187 if (LackeyEntryList.empty())
188 {
189 //pre-allocate size for speed
190 LackeyEntryList.resize((sizeof(m_auiAddEntries) / sizeof(uint32)));
191
192 //fill vector array with entries from Creature array
193 for (uint8 i = 0; i < LackeyEntryList.size(); ++i)
195
196 //remove random entries
197 while (LackeyEntryList.size() > MAX_ACTIVE_LACKEY)
198 LackeyEntryList.erase(LackeyEntryList.begin() + rand32() % LackeyEntryList.size());
199
200 //summon all the remaining in vector
201 for (std::vector<uint32>::const_iterator itr = LackeyEntryList.begin(); itr != LackeyEntryList.end(); ++itr)
202 {
204 m_auiLackeyGUID[j] = pAdd->GetGUID();
205
206 ++j;
207 }
208 }
209 else
210 {
211 for (std::vector<uint32>::const_iterator itr = LackeyEntryList.begin(); itr != LackeyEntryList.end(); ++itr)
212 {
214
215 //object already removed, not exist
216 if (!pAdd)
217 {
219 if (pAdd)
220 m_auiLackeyGUID[j] = pAdd->GetGUID();
221 }
222 ++j;
223 }
224 }
225 }
226
227 void KilledUnit(Unit* victim) override
228 {
229 if (victim->GetTypeId() != TYPEID_PLAYER)
230 return;
231
233
234 if (PlayersKilled < 4)
236 }
237
238 void JustDied(Unit* /*killer*/) override
239 {
241
244 else
246 }
247
248 void UpdateAI(uint32 diff) override
249 {
250 if (!UpdateVictim())
251 return;
252
253 if (ResetTimer <= diff)
254 {
255 float x, y, z, o;
256 me->GetHomePosition(x, y, z, o);
257 if (me->GetPositionZ() >= z+10)
258 {
260 return;
261 }
262 ResetTimer = 5000;
263 } else ResetTimer -= diff;
264
265 if (HealTimer <= diff)
266 {
267 uint32 health = me->GetHealth();
268 Unit* target = me;
269 for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i)
270 {
272 {
273 if (pAdd->IsAlive() && pAdd->GetHealth() < health)
274 target = pAdd;
275 }
276 }
277
278 DoCast(target, SPELL_FLASH_HEAL);
279 HealTimer = 15000;
280 } else HealTimer -= diff;
281
282 if (RenewTimer <= diff)
283 {
284 Unit* target = me;
285
286 if (urand(0, 1))
288 if (pAdd->IsAlive())
289 target = pAdd;
290
291 DoCast(target, SPELL_RENEW_NORMAL);
292 RenewTimer = 5000;
293 } else RenewTimer -= diff;
294
295 if (ShieldTimer <= diff)
296 {
297 Unit* target = me;
298
299 if (urand(0, 1))
301 if (pAdd->IsAlive() && !pAdd->HasAura(SPELL_SHIELD))
302 target = pAdd;
303
304 DoCast(target, SPELL_SHIELD);
305 ShieldTimer = 7500;
306 } else ShieldTimer -= diff;
307
308 if (DispelTimer <= diff)
309 {
310 Unit* target = nullptr;
311
312 if (urand(0, 1))
313 target = SelectTarget(SelectTargetMethod::Random, 0, 100, true);
314 else
315 {
316 if (urand(0, 1))
317 target = me;
318 else
320 if (pAdd->IsAlive())
321 target = pAdd;
322 }
323
324 if (target)
325 DoCast(target, SPELL_DISPEL_MAGIC);
326
327 DispelTimer = 12000;
328 } else DispelTimer -= diff;
329
330 if (SWPainTimer <= diff)
331 {
332 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
334
335 SWPainTimer = 10000;
336 } else SWPainTimer -= diff;
337 }
338 };
339};
340
342{
345
346//all 8 possible lackey use this common
348{
350 {
351 Initialize();
352 instance = creature->GetInstanceScript();
353 }
354
356 {
357 UsedPotion = false;
358
359 // These guys does not follow normal threat system rules
360 // For later development, some alternative threat system should be made
361 // We do not know what this system is based upon, but one theory is class (healers=high threat, dps=medium, etc)
362 // We reset their threat frequently as an alternative until such a system exist
363 ResetThreatTimer = urand(5000, 20000);
364 }
365
367
370
372
373 void Reset() override
374 {
375 Initialize();
376 AcquireGUIDs();
377
378 // in case she is not alive and Reset was for some reason called, respawn her (most likely party wipe after killing her)
380 {
381 if (!delrissa->IsAlive())
382 delrissa->Respawn();
383 }
384 }
385
386 void JustEngagedWith(Unit* who) override
387 {
388 if (!who)
389 return;
390
391 for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i)
393 if (!pAdd->IsEngaged() && pAdd != me)
394 AddThreat(who, 0.0f, pAdd);
395
397 if (delrissa->IsAlive() && !delrissa->IsEngaged())
398 AddThreat(who, 0.0f, delrissa);
399 }
400
401 void JustDied(Unit* /*killer*/) override
402 {
404 uint32 uiLackeyDeathCount = instance->GetData(DATA_DELRISSA_DEATH_COUNT);
405
406 if (!delrissa)
407 return;
408
409 //should delrissa really yell if dead?
410 delrissa->AI()->Talk(LackeyDeath[uiLackeyDeathCount].id);
411
413
414 //increase local var, since we now may have four dead
415 ++uiLackeyDeathCount;
416
417 if (uiLackeyDeathCount == MAX_ACTIVE_LACKEY)
418 {
419 //time to make her lootable and complete event if she died before lackeys
420 if (!delrissa->IsAlive())
421 {
423
425 }
426 }
427 }
428
429 void KilledUnit(Unit* victim) override
430 {
432 delrissa->AI()->KilledUnit(victim);
433 }
434
436 {
438 {
439 for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i)
440 m_auiLackeyGUIDs[i] = ENSURE_AI(boss_priestess_delrissa::boss_priestess_delrissaAI, delrissa->AI())->m_auiLackeyGUID[i];
441 }
442 }
443
444 void UpdateAI(uint32 diff) override
445 {
446 if (!UsedPotion && HealthBelowPct(25))
447 {
449 UsedPotion = true;
450 }
451
452 if (ResetThreatTimer <= diff)
453 {
455 ResetThreatTimer = urand(5000, 20000);
456 } else ResetThreatTimer -= diff;
457 }
458};
459
461{
463 SPELL_GOUGE = 12540,
464 SPELL_KICK = 27613,
467 SPELL_EVISCERATE = 27611
469
471{
472public:
473 boss_kagani_nightstrike() : CreatureScript("boss_kagani_nightstrike") { }
474
475 CreatureAI* GetAI(Creature* creature) const override
476 {
477 return GetMagistersTerraceAI<boss_kagani_nightstrikeAI>(creature);
478 }
479
481 {
482 //Rogue
484 {
485 Initialize();
486 }
487
489 {
490 Gouge_Timer = 5500;
491 Kick_Timer = 7000;
492 Vanish_Timer = 2000;
493 Eviscerate_Timer = 6000;
494 Wait_Timer = 5000;
495 InVanish = false;
496 }
497
504
505 void Reset() override
506 {
507 Initialize();
508 me->SetVisible(true);
509 me->SetCanMelee(true);
510
512 }
513
514 void UpdateAI(uint32 diff) override
515 {
516 if (!UpdateVictim())
517 return;
518
520
521 if (Vanish_Timer <= diff)
522 {
524
526
528
529 if (unit)
530 AddThreat(unit, 1000.0f);
531
532 InVanish = true;
533 me->SetCanMelee(false);
534 Vanish_Timer = 30000;
535 Wait_Timer = 10000;
536 } else Vanish_Timer -= diff;
537
538 if (InVanish)
539 {
540 if (Wait_Timer <= diff)
541 {
544 me->SetVisible(true); // ...? Hacklike
545 InVanish = false;
546 me->SetCanMelee(true);
547 } else Wait_Timer -= diff;
548 }
549
550 if (Gouge_Timer <= diff)
551 {
553 Gouge_Timer = 5500;
554 } else Gouge_Timer -= diff;
555
556 if (Kick_Timer <= diff)
557 {
559 Kick_Timer = 7000;
560 } else Kick_Timer -= diff;
561
562 if (Eviscerate_Timer <= diff)
563 {
565 Eviscerate_Timer = 4000;
566 } else Eviscerate_Timer -= diff;
567 }
568 };
569};
570
572{
577 SPELL_FEAR = 38595,
579 SPELL_SUMMON_IMP = 44163
581
583{
584public:
585 boss_ellris_duskhallow() : CreatureScript("boss_ellris_duskhallow") { }
586
587 CreatureAI* GetAI(Creature* creature) const override
588 {
589 return GetMagistersTerraceAI<boss_ellris_duskhallowAI>(creature);
590 }
591
593 {
594 //Warlock
596 {
597 Initialize();
598 }
599
601 {
602 Immolate_Timer = 6000;
603 Shadow_Bolt_Timer = 3000;
606 Fear_Timer = 10000;
607 }
608
614
615 void Reset() override
616 {
617 Initialize();
618
620 }
621
622 void JustEngagedWith(Unit* /*who*/) override
623 {
625 }
626
627 void UpdateAI(uint32 diff) override
628 {
629 if (!UpdateVictim())
630 return;
631
633
634 if (Immolate_Timer <= diff)
635 {
637 Immolate_Timer = 6000;
638 } else Immolate_Timer -= diff;
639
640 if (Shadow_Bolt_Timer <= diff)
641 {
643 Shadow_Bolt_Timer = 5000;
644 } else Shadow_Bolt_Timer -= diff;
645
646 if (Seed_of_Corruption_Timer <= diff)
647 {
650
652 } else Seed_of_Corruption_Timer -= diff;
653
654 if (Curse_of_Agony_Timer <= diff)
655 {
658
659 Curse_of_Agony_Timer = 13000;
660 } else Curse_of_Agony_Timer -= diff;
661
662 if (Fear_Timer <= diff)
663 {
665 DoCast(unit, SPELL_FEAR);
666
667 Fear_Timer = 10000;
668 } else Fear_Timer -= diff;
669 }
670 };
671};
672
674{
676 SPELL_SNAP_KICK = 46182
678
680{
681public:
682 boss_eramas_brightblaze() : CreatureScript("boss_eramas_brightblaze") { }
683
684 CreatureAI* GetAI(Creature* creature) const override
685 {
686 return GetMagistersTerraceAI<boss_eramas_brightblazeAI>(creature);
687 }
688
690 {
691 //Monk
693 {
694 Initialize();
695 }
696
698 {
699 Knockdown_Timer = 6000;
700 Snap_Kick_Timer = 4500;
701 }
702
705
706 void Reset() override
707 {
708 Initialize();
709
711 }
712
713 void UpdateAI(uint32 diff) override
714 {
715 if (!UpdateVictim())
716 return;
717
719
720 if (Knockdown_Timer <= diff)
721 {
723 Knockdown_Timer = 6000;
724 } else Knockdown_Timer -= diff;
725
726 if (Snap_Kick_Timer <= diff)
727 {
729 Snap_Kick_Timer = 4500;
730 } else Snap_Kick_Timer -= diff;
731 }
732 };
733};
734
736{
743 SPELL_BLINK = 14514
745
747{
748public:
749 boss_yazzai() : CreatureScript("boss_yazzai") { }
750
751 CreatureAI* GetAI(Creature* creature) const override
752 {
753 return GetMagistersTerraceAI<boss_yazzaiAI>(creature);
754 }
755
757 {
758 //Mage
760 {
761 Initialize();
762 }
763
765 {
766 HasIceBlocked = false;
767
768 Polymorph_Timer = 1000;
769 Ice_Block_Timer = 20000;
770 Wait_Timer = 10000;
771 Blizzard_Timer = 8000;
772 Ice_Lance_Timer = 12000;
773 Cone_of_Cold_Timer = 10000;
774 Frostbolt_Timer = 3000;
775 Blink_Timer = 8000;
776 }
777
779
788
789 void Reset() override
790 {
791 Initialize();
792
794 }
795
796 void UpdateAI(uint32 diff) override
797 {
798 if (!UpdateVictim())
799 return;
800
802
803 if (Polymorph_Timer <= diff)
804 {
806 {
807 DoCast(target, SPELL_POLYMORPH);
808 Polymorph_Timer = 20000;
809 }
810 } else Polymorph_Timer -= diff;
811
812 if (HealthBelowPct(35) && !HasIceBlocked)
813 {
815 HasIceBlocked = true;
816 }
817
818 if (Blizzard_Timer <= diff)
819 {
821 DoCast(unit, SPELL_BLIZZARD);
822
823 Blizzard_Timer = 8000;
824 } else Blizzard_Timer -= diff;
825
826 if (Ice_Lance_Timer <= diff)
827 {
829 Ice_Lance_Timer = 12000;
830 } else Ice_Lance_Timer -= diff;
831
832 if (Cone_of_Cold_Timer <= diff)
833 {
835 Cone_of_Cold_Timer = 10000;
836 } else Cone_of_Cold_Timer -= diff;
837
838 if (Frostbolt_Timer <= diff)
839 {
841 Frostbolt_Timer = 8000;
842 } else Frostbolt_Timer -= diff;
843
844 if (Blink_Timer <= diff)
845 {
846 bool InMeleeRange = false;
847 for (auto const& pair : me->GetCombatManager().GetPvECombatRefs())
848 {
849 if (pair.second->GetOther(me)->IsWithinMeleeRange(me))
850 {
851 InMeleeRange = true;
852 break;
853 }
854 }
855
856 //if anybody is in melee range than escape by blink
857 if (InMeleeRange)
859
860 Blink_Timer = 8000;
861 } else Blink_Timer -= diff;
862 }
863 };
864};
865
867{
874 SPELL_MORTAL_STRIKE = 44268
876
878{
879public:
880 boss_warlord_salaris() : CreatureScript("boss_warlord_salaris") { }
881
882 CreatureAI* GetAI(Creature* creature) const override
883 {
884 return GetMagistersTerraceAI<boss_warlord_salarisAI>(creature);
885 }
886
888 {
889 //Warrior
891 {
892 Initialize();
893 }
894
896 {
898 Disarm_Timer = 6000;
899 Piercing_Howl_Timer = 10000;
901 Hamstring_Timer = 4500;
902 Mortal_Strike_Timer = 8000;
903 }
904
911
912 void Reset() override
913 {
914 Initialize();
915
917 }
918
919 void JustEngagedWith(Unit* /*who*/) override
920 {
922 }
923
924 void UpdateAI(uint32 diff) override
925 {
926 if (!UpdateVictim())
927 return;
928
930
931 if (Intercept_Stun_Timer <= diff)
932 {
933 bool InMeleeRange = false;
934 for (auto const& pair : me->GetCombatManager().GetPvECombatRefs())
935 {
936 if (pair.second->GetOther(me)->IsWithinMeleeRange(me))
937 {
938 InMeleeRange = true;
939 break;
940 }
941 }
942
943 //if nobody is in melee range than try to use Intercept
944 if (!InMeleeRange)
945 {
948 }
949
950 Intercept_Stun_Timer = 10000;
951 } else Intercept_Stun_Timer -= diff;
952
953 if (Disarm_Timer <= diff)
954 {
956 Disarm_Timer = 6000;
957 } else Disarm_Timer -= diff;
958
959 if (Hamstring_Timer <= diff)
960 {
962 Hamstring_Timer = 4500;
963 } else Hamstring_Timer -= diff;
964
965 if (Mortal_Strike_Timer <= diff)
966 {
968 Mortal_Strike_Timer = 4500;
969 } else Mortal_Strike_Timer -= diff;
970
971 if (Piercing_Howl_Timer <= diff)
972 {
974 Piercing_Howl_Timer = 10000;
975 } else Piercing_Howl_Timer -= diff;
976
977 if (Frightening_Shout_Timer <= diff)
978 {
981 } else Frightening_Shout_Timer -= diff;
982 }
983 };
984};
985
987{
989 SPELL_SHOOT = 15620,
994
995 NPC_SLIVER = 24552
997
999{
1000public:
1001 boss_garaxxas() : CreatureScript("boss_garaxxas") { }
1002
1003 CreatureAI* GetAI(Creature* creature) const override
1004 {
1005 return GetMagistersTerraceAI<boss_garaxxasAI>(creature);
1006 }
1007
1009 {
1010 //Hunter
1012 {
1013 Initialize();
1014 }
1015
1017 {
1018 Aimed_Shot_Timer = 6000;
1019 Shoot_Timer = 2500;
1020 Concussive_Shot_Timer = 8000;
1021 Multi_Shot_Timer = 10000;
1022 Wing_Clip_Timer = 4000;
1023 Freezing_Trap_Timer = 15000;
1024 }
1025
1027
1034
1035 void Reset() override
1036 {
1037 Initialize();
1038
1040 if (!pPet)
1041 me->SummonCreature(NPC_SLIVER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN);
1042
1044 }
1045
1046 void JustSummoned(Creature* summoned) override
1047 {
1048 m_uiPetGUID = summoned->GetGUID();
1049 }
1050
1051 void UpdateAI(uint32 diff) override
1052 {
1053 if (!UpdateVictim())
1054 return;
1055
1057
1059 {
1060 if (Wing_Clip_Timer <= diff)
1061 {
1063 Wing_Clip_Timer = 4000;
1064 } else Wing_Clip_Timer -= diff;
1065
1066 if (Freezing_Trap_Timer <= diff)
1067 {
1068 //attempt find go summoned from spell (cast by me)
1070
1071 //if we have a go, we need to wait (only one trap at a time)
1072 if (go)
1073 Freezing_Trap_Timer = 2500;
1074 else
1075 {
1076 //if go does not exist, then we can cast
1078 Freezing_Trap_Timer = 15000;
1079 }
1080 } else Freezing_Trap_Timer -= diff;
1081 }
1082 else
1083 {
1084 if (Concussive_Shot_Timer <= diff)
1085 {
1087 Concussive_Shot_Timer = 8000;
1088 } else Concussive_Shot_Timer -= diff;
1089
1090 if (Multi_Shot_Timer <= diff)
1091 {
1093 Multi_Shot_Timer = 10000;
1094 } else Multi_Shot_Timer -= diff;
1095
1096 if (Aimed_Shot_Timer <= diff)
1097 {
1099 Aimed_Shot_Timer = 6000;
1100 } else Aimed_Shot_Timer -= diff;
1101
1102 if (Shoot_Timer <= diff)
1103 {
1105 Shoot_Timer = 2500;
1106 } else Shoot_Timer -= diff;
1107 }
1108 }
1109 };
1110};
1111
1113{
1114public:
1115 boss_apoko() : CreatureScript("boss_apoko") { }
1116
1117 CreatureAI* GetAI(Creature* creature) const override
1118 {
1119 return GetMagistersTerraceAI<boss_apokoAI>(creature);
1120 }
1121
1123 {
1124 //Shaman
1126 {
1127 Initialize();
1128 }
1129
1131 {
1132 Totem_Timer = 2000;
1133 Totem_Amount = 1;
1134 War_Stomp_Timer = 10000;
1135 Purge_Timer = 8000;
1136 Healing_Wave_Timer = 5000;
1137 Frost_Shock_Timer = 7000;
1138 }
1139
1146
1147 void Reset() override
1148 {
1149 Initialize();
1150
1152 }
1153
1154 void UpdateAI(uint32 diff) override
1155 {
1156 if (!UpdateVictim())
1157 return;
1158
1160
1161 if (Totem_Timer <= diff)
1162 {
1164 ++Totem_Amount;
1166 } else Totem_Timer -= diff;
1167
1168 if (War_Stomp_Timer <= diff)
1169 {
1171 War_Stomp_Timer = 10000;
1172 } else War_Stomp_Timer -= diff;
1173
1174 if (Purge_Timer <= diff)
1175 {
1177 DoCast(unit, SPELL_PURGE);
1178
1179 Purge_Timer = 15000;
1180 } else Purge_Timer -= diff;
1181
1182 if (Frost_Shock_Timer <= diff)
1183 {
1185 Frost_Shock_Timer = 7000;
1186 } else Frost_Shock_Timer -= diff;
1187
1188 if (Healing_Wave_Timer <= diff)
1189 {
1191 Healing_Wave_Timer = 5000;
1192 } else Healing_Wave_Timer -= diff;
1193 }
1194 };
1195};
1196
1198{
1204 SPELL_SHEEP_EXPLOSION = 44279
1206
1208{
1209public:
1210 boss_zelfan() : CreatureScript("boss_zelfan") { }
1211
1212 CreatureAI* GetAI(Creature* creature) const override
1213 {
1214 return GetMagistersTerraceAI<boss_zelfanAI>(creature);
1215 }
1216
1218 {
1219 //Engineer
1221 {
1222 Initialize();
1223 }
1224
1226 {
1228 Rocket_Launch_Timer = 7000;
1229 Recombobulate_Timer = 4000;
1231 Fel_Iron_Bomb_Timer = 15000;
1232 }
1233
1239
1240 void Reset() override
1241 {
1242 Initialize();
1243
1245 }
1246
1247 void UpdateAI(uint32 diff) override
1248 {
1249 if (!UpdateVictim())
1250 return;
1251
1253
1254 if (Goblin_Dragon_Gun_Timer <= diff)
1255 {
1258 } else Goblin_Dragon_Gun_Timer -= diff;
1259
1260 if (Rocket_Launch_Timer <= diff)
1261 {
1263 Rocket_Launch_Timer = 9000;
1264 } else Rocket_Launch_Timer -= diff;
1265
1266 if (Fel_Iron_Bomb_Timer <= diff)
1267 {
1269 Fel_Iron_Bomb_Timer = 15000;
1270 } else Fel_Iron_Bomb_Timer -= diff;
1271
1272 if (Recombobulate_Timer <= diff)
1273 {
1274 for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i)
1275 {
1277 {
1278 if (pAdd->IsPolymorphed())
1279 {
1281 break;
1282 }
1283 }
1284 }
1285 Recombobulate_Timer = 2000;
1286 } else Recombobulate_Timer -= diff;
1287
1288 if (High_Explosive_Sheep_Timer <= diff)
1289 {
1292 } else High_Explosive_Sheep_Timer -= diff;
1293 }
1294 };
1295};
1296
1297/*
1298class npc_high_explosive_sheep : public CreatureScript
1299{
1300public:
1301 npc_high_explosive_sheep() : CreatureScript("npc_high_explosive_sheep") { }
1302
1303 //CreatureAI* GetAI(Creature* creature) const override
1304 //{
1305 // return GetMagistersTerraceAI<npc_high_explosive_sheepAI>(creature);
1306 //};
1307};
1308*/
1309
1311{
1316 new boss_yazzai();
1318 new boss_garaxxas();
1319 new boss_apoko();
1320 new boss_zelfan();
1321 // new npc_high_explosive_sheep();
1322}
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
#define ATTACK_DISTANCE
Definition: ObjectDefines.h:25
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
uint32 rand32()
Definition: Random.cpp:70
@ UNIT_DYNFLAG_LOOTABLE
#define ENSURE_AI(a, b)
Definition: UnitAI.h:29
const float fOrientation
float LackeyLocations[4][2]
const uint32 m_auiAddEntries[]
@ SPELL_HIGH_EXPLOSIVE_SHEEP
@ SPELL_GOBLIN_DRAGON_GUN
void AddSC_boss_priestess_delrissa()
const float fZLocation
static Speech LackeyDeath[]
@ SPELL_SEED_OF_CORRUPTION
@ SPELL_CURSE_OF_AGONY
@ SPELL_INTERCEPT_STUN
@ SPELL_FRIGHTENING_SHOUT
@ SPELL_SW_PAIN_NORMAL
@ SPELL_FIRE_NOVA_TOTEM
@ SPELL_EARTHBIND_TOTEM
@ SPELL_RENEW_NORMAL
@ SPELL_DISPEL_MAGIC
@ SPELL_RENEW_HEROIC
@ SPELL_LESSER_HEALING_WAVE
@ SPELL_SW_PAIN_HEROIC
@ SPELL_WINDFURY_TOTEM
@ SPELL_CONCUSSIVE_SHOT
@ SPELL_HEALING_POTION
static Speech PlayerDeath[]
Yells
std::unordered_map< ObjectGuid, CombatReference * > const & GetPvECombatRefs() const
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
Definition: Creature.cpp:2822
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:373
CreatureAI * AI() const
Definition: Creature.h:214
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
void SetDynamicFlag(uint32 flag)
Definition: Object.h:169
TypeID GetTypeId() const
Definition: Object.h:173
void RemoveDynamicFlag(uint32 flag)
Definition: Object.h:170
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
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 DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetVisible(bool x)
Definition: Unit.cpp:8351
bool IsAlive() const
Definition: Unit.h:1164
GameObject * GetGameObject(uint32 spellId) const
Definition: Unit.cpp:5201
uint64 GetHealth() const
Definition: Unit.h:776
Unit * GetVictim() const
Definition: Unit.h:715
CombatManager & GetCombatManager()
Definition: Unit.h:1023
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
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
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
@ DATA_DELRISSA_DEATH_COUNT
@ DATA_PRIESTESS_DELRISSA
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
constexpr float GetPositionZ() const
Definition: Position.h:78
bool HealthBelowPct(uint32 pct) const
void ResetThreatList(Unit *who=nullptr)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void UpdateAI(uint32 diff) override
void JustSummoned(Creature *summoned) override
void KilledUnit(Unit *victim) override
void JustEngagedWith(Unit *who) override
ObjectGuid m_auiLackeyGUIDs[MAX_ACTIVE_LACKEY]
boss_priestess_lackey_commonAI(Creature *creature)
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override