Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_moroes.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7SDName: Boss_Moroes
8SD%Complete: 95
9SDComment:
10SDCategory: Karazhan
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "karazhan.h"
16
18{
23};
24
62
64{
65 {-10991.0f, -1884.33f, 81.73f, 0.614315f},
66 {-10989.4f, -1885.88f, 81.73f, 0.904913f},
67 {-10978.1f, -1887.07f, 81.73f, 2.035550f},
68 {-10975.9f, -1885.81f, 81.73f, 2.253890f},
69};
70
71const uint32 Adds[6]=
72{
73 17007,
74 19872,
75 19873,
76 19874,
77 19875,
78 19876,
79};
80
82{
83public:
84 boss_moroes() : CreatureScript("boss_moroes") { }
85
87 {
88 return new boss_moroesAI(creature);
89 }
90
91 struct boss_moroesAI : public ScriptedAI
92 {
93 boss_moroesAI(Creature* creature) : ScriptedAI(creature)
94 {
95 memset(AddId, 0, sizeof(AddId));
96 memset(AddGUID, 0, sizeof(AddGUID));
97
98 instance = creature->GetInstanceScript();
99 }
100
102
104
111
113 bool Enrage;
114
116 {
117 Vanish_Timer = 30000;
118 Blind_Timer = 35000;
119 Gouge_Timer = 23000;
120 Wait_Timer = 0;
121 CheckAdds_Timer = 5000;
122
123 Enrage = false;
124 InVanish = false;
125 if (me->IsAlive())
126 SpawnAdds();
127
128 if (instance)
130 }
131
133 {
134 if (instance)
136
138 }
139
140 void EnterCombat(Unit* /*who*/) OVERRIDE
141 {
142 StartEvent();
143
145 AddsAttack();
147 }
148
149 void KilledUnit(Unit* /*victim*/) OVERRIDE
150 {
151 Talk(SAY_KILL);
152 }
153
154 void JustDied(Unit* /*killer*/) OVERRIDE
155 {
157
158 if (instance)
159 instance->SetData(TYPE_MOROES, DONE);
160
161 DeSpawnAdds();
162
163 //remove aura from spell Garrote when Moroes dies
164 if (instance)
165 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE);
166 }
167
169 {
170 DeSpawnAdds();
171
172 if (isAddlistEmpty())
173 {
174 std::list<uint32> AddList;
175
176 for (uint8 i = 0; i < 6; ++i)
177 AddList.push_back(Adds[i]);
178
180
181 uint8 i = 0;
182 for (std::list<uint32>::const_iterator itr = AddList.begin(); itr != AddList.end() && i < 4; ++itr, ++i)
183 {
184 uint32 entry = *itr;
185
186 if (Creature* creature = me->SummonCreature(entry, Locations[i], TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000))
187 {
188 AddGUID[i] = creature->GetGUID();
189 AddId[i] = entry;
190 }
191 }
192 }
193 else
194 {
195 for (uint8 i = 0; i < 4; ++i)
196 {
197 if (Creature* creature = me->SummonCreature(AddId[i], Locations[i], TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000))
198 AddGUID[i] = creature->GetGUID();
199 }
200 }
201 }
202
204 {
205 for (uint8 i = 0; i < 4; ++i)
206 if (AddId[i] == 0)
207 return true;
208
209 return false;
210 }
211
213 {
214 for (uint8 i = 0; i < 4; ++i)
215 {
216 if (AddGUID[i])
217 {
219 temp->DespawnOrUnsummon();
220 }
221 }
222 }
223
225 {
226 for (uint8 i = 0; i < 4; ++i)
227 {
228 if (AddGUID[i])
229 {
231 if (temp && temp->IsAlive())
232 {
233 temp->AI()->AttackStart(me->GetVictim());
234 DoZoneInCombat(temp);
235 } else
237 }
238 }
239 }
240
242 {
243 if (!UpdateVictim())
244 return;
245
246 if (instance && !instance->GetData(TYPE_MOROES))
247 {
249 return;
250 }
251
252 if (!Enrage && HealthBelowPct(30))
253 {
255 Enrage = true;
256 }
257
258 if (CheckAdds_Timer <= diff)
259 {
260 for (uint8 i = 0; i < 4; ++i)
261 {
262 if (AddGUID[i])
263 {
264 Creature* temp = Unit::GetCreature((*me), AddGUID[i]);
265 if (temp && temp->IsAlive())
266 if (!temp->GetVictim())
267 temp->AI()->AttackStart(me->GetVictim());
268 }
269 }
270 CheckAdds_Timer = 5000;
271 } else CheckAdds_Timer -= diff;
272
273 if (!Enrage)
274 {
275 //Cast Vanish, then Garrote random victim
276 if (Vanish_Timer <= diff)
277 {
279 InVanish = true;
280 Vanish_Timer = 30000;
281 Wait_Timer = 5000;
282 } else Vanish_Timer -= diff;
283
284 if (Gouge_Timer <= diff)
285 {
287 Gouge_Timer = 40000;
288 } else Gouge_Timer -= diff;
289
290 if (Blind_Timer <= diff)
291 {
292 std::list<Unit*> targets;
293 SelectTargetList(targets, 5, SELECT_TARGET_RANDOM, me->GetMeleeReach()*5, true);
294 for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i)
295 if (!me->IsWithinMeleeRange(*i))
296 {
297 DoCast(*i, SPELL_BLIND);
298 break;
299 }
300 Blind_Timer = 40000;
301 } else Blind_Timer -= diff;
302 }
303
304 if (InVanish)
305 {
306 if (Wait_Timer <= diff)
307 {
309
310 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
311 target->CastSpell(target, SPELL_GARROTE, true);
312
313 InVanish = false;
314 } else Wait_Timer -= diff;
315 }
316
317 if (!InVanish)
319 }
320 };
321};
322
324{
326
328
330 {
331 for (uint8 i = 0; i < 4; ++i)
332 GuestGUID[i] = 0;
333
334 instance = creature->GetInstanceScript();
335 }
336
338 {
339 if (instance)
341 }
342
344 {
345 if (!instance)
346 return;
347
348 if (Creature* Moroes = Unit::GetCreature(*me, instance->GetData64(DATA_MOROES)))
349 for (uint8 i = 0; i < 4; ++i)
350 if (uint64 GUID = CAST_AI(boss_moroes::boss_moroesAI, Moroes->AI())->AddGUID[i])
351 GuestGUID[i] = GUID;
352 }
353
355 {
356 uint64 TempGUID = GuestGUID[rand()%4];
357 if (TempGUID)
358 {
359 Unit* unit = Unit::GetUnit(*me, TempGUID);
360 if (unit && unit->IsAlive())
361 return unit;
362 }
363
364 return me;
365 }
366
367 void UpdateAI(uint32 /*diff*/) OVERRIDE
368 {
369 if (instance && !instance->GetData(TYPE_MOROES))
371
373 }
374};
375
377{
378public:
379 boss_baroness_dorothea_millstipe() : CreatureScript("boss_baroness_dorothea_millstipe") { }
380
382 {
383 return new boss_baroness_dorothea_millstipeAI(creature);
384 }
385
387 {
388 //Shadow Priest
390
394
396 {
397 ManaBurn_Timer = 7000;
398 MindFlay_Timer = 1000;
400
401 DoCast(me, SPELL_SHADOWFORM, true);
402
404 }
405
407 {
408 if (!UpdateVictim())
409 return;
410
412
413 if (MindFlay_Timer <= diff)
414 {
416 MindFlay_Timer = 12000; // 3 sec channeled
417 } else MindFlay_Timer -= diff;
418
419 if (ManaBurn_Timer <= diff)
420 {
421 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
422 if (target->getPowerType() == POWER_MANA)
423 DoCast(target, SPELL_MANABURN);
424 ManaBurn_Timer = 5000; // 3 sec cast
425 } else ManaBurn_Timer -= diff;
426
427 if (ShadowWordPain_Timer <= diff)
428 {
429 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
430 {
431 DoCast(target, SPELL_SWPAIN);
433 }
434 } else ShadowWordPain_Timer -= diff;
435 }
436 };
437};
438
440{
441public:
442 boss_baron_rafe_dreuger() : CreatureScript("boss_baron_rafe_dreuger") { }
443
445 {
446 return new boss_baron_rafe_dreugerAI(creature);
447 }
448
494};
495
497{
498public:
499 boss_lady_catriona_von_indi() : CreatureScript("boss_lady_catriona_von_indi") { }
500
502 {
503 return new boss_lady_catriona_von_indiAI(creature);
504 }
505
507 {
508 //Holy Priest
510
515
517 {
518 DispelMagic_Timer = 11000;
519 GreaterHeal_Timer = 1500;
520 HolyFire_Timer = 5000;
522
523 AcquireGUID();
524
526 }
527
529 {
530 if (!UpdateVictim())
531 return;
532
534
535 if (PowerWordShield_Timer <= diff)
536 {
538 PowerWordShield_Timer = 15000;
539 } else PowerWordShield_Timer -= diff;
540
541 if (GreaterHeal_Timer <= diff)
542 {
543 Unit* target = SelectGuestTarget();
544
545 DoCast(target, SPELL_GREATERHEAL);
546 GreaterHeal_Timer = 17000;
547 } else GreaterHeal_Timer -= diff;
548
549 if (HolyFire_Timer <= diff)
550 {
552 HolyFire_Timer = 22000;
553 } else HolyFire_Timer -= diff;
554
555 if (DispelMagic_Timer <= diff)
556 {
557 if (Unit* target = RAND(SelectGuestTarget(), SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)))
558 DoCast(target, SPELL_DISPELMAGIC);
559
560 DispelMagic_Timer = 25000;
561 } else DispelMagic_Timer -= diff;
562 }
563 };
564};
565
567{
568public:
569 boss_lady_keira_berrybuck() : CreatureScript("boss_lady_keira_berrybuck") { }
570
572 {
573 return new boss_lady_keira_berrybuckAI(creature);
574 }
575
577 {
578 //Holy Pally
580
585
587 {
588 Cleanse_Timer = 13000;
589 GreaterBless_Timer = 1000;
590 HolyLight_Timer = 7000;
591 DivineShield_Timer = 31000;
592
593 AcquireGUID();
594
596 }
597
599 {
600 if (!UpdateVictim())
601 return;
602
604
605 if (DivineShield_Timer <= diff)
606 {
608 DivineShield_Timer = 31000;
609 } else DivineShield_Timer -= diff;
610
611 if (HolyLight_Timer <= diff)
612 {
613 Unit* target = SelectGuestTarget();
614
615 DoCast(target, SPELL_HOLYLIGHT);
616 HolyLight_Timer = 10000;
617 } else HolyLight_Timer -= diff;
618
619 if (GreaterBless_Timer <= diff)
620 {
621 Unit* target = SelectGuestTarget();
622
624
625 GreaterBless_Timer = 50000;
626 } else GreaterBless_Timer -= diff;
627
628 if (Cleanse_Timer <= diff)
629 {
630 Unit* target = SelectGuestTarget();
631
632 DoCast(target, SPELL_CLEANSE);
633
634 Cleanse_Timer = 10000;
635 } else Cleanse_Timer -= diff;
636 }
637 };
638};
639
641{
642public:
643 boss_lord_robin_daris() : CreatureScript("boss_lord_robin_daris") { }
644
646 {
647 return new boss_lord_robin_darisAI(creature);
648 }
649
651 {
652 //Arms Warr
654
658
660 {
661 Hamstring_Timer = 7000;
662 MortalStrike_Timer = 10000;
663 WhirlWind_Timer = 21000;
664
666 }
667
669 {
670 if (!UpdateVictim())
671 return;
672
674
675 if (Hamstring_Timer <= diff)
676 {
678 Hamstring_Timer = 12000;
679 } else Hamstring_Timer -= diff;
680
681 if (MortalStrike_Timer <= diff)
682 {
684 MortalStrike_Timer = 18000;
685 } else MortalStrike_Timer -= diff;
686
687 if (WhirlWind_Timer <= diff)
688 {
690 WhirlWind_Timer = 21000;
691 } else WhirlWind_Timer -= diff;
692 }
693 };
694};
695
697{
698public:
699 boss_lord_crispin_ference() : CreatureScript("boss_lord_crispin_ference") { }
700
702 {
703 return new boss_lord_crispin_ferenceAI(creature);
704 }
705
707 {
708 //Arms Warr
710
715
717 {
718 Disarm_Timer = 6000;
719 HeroicStrike_Timer = 10000;
720 ShieldBash_Timer = 8000;
721 ShieldWall_Timer = 4000;
722
724 }
725
727 {
728 if (!UpdateVictim())
729 return;
730
732
733 if (Disarm_Timer <= diff)
734 {
736 Disarm_Timer = 12000;
737 } else Disarm_Timer -= diff;
738
739 if (HeroicStrike_Timer <= diff)
740 {
742 HeroicStrike_Timer = 10000;
743 } else HeroicStrike_Timer -= diff;
744
745 if (ShieldBash_Timer <= diff)
746 {
748 ShieldBash_Timer = 13000;
749 } else ShieldBash_Timer -= diff;
750
751 if (ShieldWall_Timer <= diff)
752 {
754 ShieldWall_Timer = 21000;
755 } else ShieldWall_Timer -= diff;
756 }
757 };
758};
759
const T & RAND(const T &v1, const T &v2)
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition Object.h:73
#define CAST_AI(a, b)
@ POWER_MANA
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SPELL_WHIRLWIND
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
@ SPELL_FRENZY
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_SPECIAL
@ SAY_KILL
void AddSC_boss_moroes()
Position const Locations[4]
@ SPELL_HAMSTRING
@ SPELL_SEALOFCOMMAND
@ SPELL_SHADOWFORM
@ SPELL_MORTALSTRIKE
@ SPELL_CLEANSE
@ SPELL_HAMMEROFJUSTICE
@ SPELL_PWSHIELD
@ SPELL_DISPELMAGIC
@ SPELL_BLIND
@ SPELL_SHIELDBASH
@ SPELL_MANABURN
@ SPELL_GREATERBLESSOFMIGHT
@ SPELL_GREATERHEAL
@ SPELL_DIVINESHIELD
@ SPELL_MINDFLY
@ SPELL_VANISH
@ SPELL_FRENZY
@ SPELL_SHIELDWALL
@ SPELL_HOLYLIGHT
@ SPELL_JUDGEMENTOFCOMMAND
@ SPELL_HOLYFIRE
@ SPELL_GOUGE
@ SPELL_WHIRLWIND
@ SPELL_GARROTE
@ SPELL_DISARM
@ SPELL_HEROICSTRIKE
@ SPELL_SWPAIN
const uint32 Adds[6]
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
void SelectTargetList(std::list< Unit * > &targetList, uint32 num, SelectAggroTarget targetType, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:71
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:16
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
Unit * GetVictim() const
Definition Unit.h:1468
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
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
@ TYPE_MOROES
Definition karazhan.h:12
@ DATA_MOROES
Definition karazhan.h:29
void RandomResizeList(std::list< T > &list, uint32 size)
Definition Containers.h:19
Creature * me
bool HealthBelowPct(uint32 pct) const
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE
void KilledUnit(Unit *) OVERRIDE
boss_moroesAI(Creature *creature)
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
InstanceScript * instance
void Reset() OVERRIDE
boss_moroes_guestAI(Creature *creature)