Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_northrend_beasts.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// Known bugs:
7// Gormok - Snobolled (creature at back)
8
9#include "ScriptMgr.h"
10#include "ScriptedCreature.h"
12#include "Vehicle.h"
13#include "Player.h"
14#include "SpellScript.h"
15
17{
18 // Gormok
20
21 // Acidmaw & Dreadscale
23
24 // Icehowl
28};
29
37
45
53
55{
56 //Gormok
57 SPELL_IMPALE = 66331,
60 //Snobold
62 SPELL_BATTER = 66408,
67
68 //Acidmaw & Dreadscale
82 SPELL_ENRAGE = 68335,
83 SPELL_SLIME_POOL_EFFECT = 66882, //In 60s it diameter grows from 10y to 40y (r=r+0.25 per second)
84
85 //Icehowl
88 SPELL_WHIRL = 67345,
93};
94
100
131
138
140{
141 public:
142 boss_gormok() : CreatureScript("boss_gormok") { }
143
144 struct boss_gormokAI : public BossAI
145 {
146 boss_gormokAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)
147 {
148 }
149
151 {
152 events.ScheduleEvent(EVENT_IMPALE, std::rand() % (10 * IN_MILLISECONDS) + (8*IN_MILLISECONDS));
154 events.ScheduleEvent(EVENT_THROW, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
155
156 summons.DespawnAll();
157 }
158
160 {
161 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
163 }
164
166 {
167 if (type != POINT_MOTION_TYPE)
168 return;
169
170 switch (pointId)
171 {
172 case 0:
173 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
175 me->SetReactState(REACT_AGGRESSIVE);
176 me->SetInCombatWithZone();
177 break;
178 default:
179 break;
180 }
181 }
182
183 void JustDied(Unit* /*killer*/) OVERRIDE
184 {
185 if (instance)
187 }
188
190 {
191 if (instance)
192 {
193 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
195 }
196 me->DespawnOrUnsummon();
197 }
198
199 void EnterCombat(Unit* /*who*/) OVERRIDE
200 {
201 _EnterCombat();
202 me->SetInCombatWithZone();
204
205 for (uint8 i = 0; i < MAX_SNOBOLDS; i++)
206 {
208 {
209 pSnobold->EnterVehicle(me, i);
210 pSnobold->SetInCombatWithZone();
211 pSnobold->AI()->DoAction(ACTION_ENABLE_FIRE_BOMB);
212 }
213 }
214 }
215
216 void DamageTaken(Unit* /*who*/, uint32& damage) OVERRIDE
217 {
218 // despawn the remaining passengers on death
219 if (damage >= me->GetHealth())
220 for (uint8 i = 0; i < MAX_SNOBOLDS; ++i)
221 if (Unit* pSnobold = me->GetVehicleKit()->GetPassenger(i))
222 pSnobold->ToCreature()->DespawnOrUnsummon();
223 }
224
226 {
227 if (!UpdateVictim())
228 return;
229
230 events.Update(diff);
231
232 if (me->HasUnitState(UNIT_STATE_CASTING))
233 return;
234
235 while (uint32 eventId = events.ExecuteEvent())
236 {
237 switch (eventId)
238 {
239 case EVENT_IMPALE:
241 events.ScheduleEvent(EVENT_IMPALE, std::rand() % (10 * IN_MILLISECONDS) + (8*IN_MILLISECONDS));
242 return;
246 return;
247 case EVENT_THROW:
248 for (uint8 i = 0; i < MAX_SNOBOLDS; ++i)
249 {
250 if (Unit* pSnobold = me->GetVehicleKit()->GetPassenger(i))
251 {
252 pSnobold->ExitVehicle();
254 pSnobold->ToCreature()->SetReactState(REACT_AGGRESSIVE);
255 pSnobold->ToCreature()->AI()->DoAction(ACTION_DISABLE_FIRE_BOMB);
256 pSnobold->CastSpell(me, SPELL_RISING_ANGER, true);
258 break;
259 }
260 }
261 events.ScheduleEvent(EVENT_THROW, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
262 return;
263 default:
264 return;
265 }
266 }
267
269 }
270 };
271
273 {
274 return new boss_gormokAI(creature);
275 }
276};
277
279{
280 public:
281 npc_snobold_vassal() : CreatureScript("npc_snobold_vassal") { }
282
284 {
286 {
287 _instance = creature->GetInstanceScript();
288 if (_instance)
290 }
291
293 {
294 _events.ScheduleEvent(EVENT_BATTER, 5*IN_MILLISECONDS);
295 _events.ScheduleEvent(EVENT_HEAD_CRACK, 25*IN_MILLISECONDS);
296
297 _targetGUID = 0;
298 _targetDied = false;
299
300 if (_instance)
301 _bossGUID = _instance->GetData64(NPC_GORMOK);
302 //Workaround for Snobold
304 }
305
310
312 {
313 _targetGUID = who->GetGUID();
314 me->TauntApply(who);
316 }
317
318 void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) OVERRIDE
319 {
320 if (pDoneBy->GetGUID() == _targetGUID)
321 uiDamage = 0;
322 }
323
325 {
326 if (type != POINT_MOTION_TYPE)
327 return;
328
329 switch (pointId)
330 {
331 case 0:
332 if (_targetDied)
333 me->DespawnOrUnsummon();
334 break;
335 default:
336 break;
337 }
338 }
339
340 void JustDied(Unit* /*killer*/) OVERRIDE
341 {
343 if (target->IsAlive())
344 target->RemoveAurasDueToSpell(SPELL_SNOBOLLED);
345 if (_instance)
347 }
348
350 {
351 switch (action)
352 {
354 _events.ScheduleEvent(EVENT_FIRE_BOMB, std::rand() % (30 * IN_MILLISECONDS) + (5*IN_MILLISECONDS));
355 break;
357 _events.CancelEvent(EVENT_FIRE_BOMB);
358 break;
359 default:
360 break;
361 }
362 }
363
365 {
366 if (!UpdateVictim() || _targetDied)
367 return;
368
370 {
371 if (!target->IsAlive())
372 {
373 if (_instance)
374 {
375 Unit* gormok = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GORMOK));
376 if (gormok && gormok->IsAlive())
377 {
378 SetCombatMovement(false);
379 _targetDied = true;
380
381 // looping through Gormoks seats
382 for (uint8 i = 0; i < MAX_SNOBOLDS; i++)
383 {
384 if (!gormok->GetVehicleKit()->GetPassenger(i))
385 {
386 me->EnterVehicle(gormok, i);
388 break;
389 }
390 }
391 }
392 else if (Unit* target2 = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
393 {
394 _targetGUID = target2->GetGUID();
395 me->GetMotionMaster()->MoveJump(target2->GetPositionX(), target2->GetPositionY(), target2->GetPositionZ(), 15.0f, 15.0f);
396 }
397 }
398 }
399 }
400
401 _events.Update(diff);
402
403 if (me->HasUnitState(UNIT_STATE_CASTING))
404 return;
405
406 while (uint32 eventId = _events.ExecuteEvent())
407 {
408 switch (eventId)
409 {
410 case EVENT_FIRE_BOMB:
411 if (me->GetVehicleBase())
412 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -me->GetVehicleBase()->GetCombatReach(), true))
413 me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_FIRE_BOMB, true);
414 _events.ScheduleEvent(EVENT_FIRE_BOMB, 20*IN_MILLISECONDS);
415 return;
416 case EVENT_HEAD_CRACK:
417 // commented out while SPELL_SNOBOLLED gets fixed
418 //if (Unit* target = ObjectAccessor::GetPlayer(*me, m_uiTargetGUID))
420 _events.ScheduleEvent(EVENT_HEAD_CRACK, 30*IN_MILLISECONDS);
421 return;
422 case EVENT_BATTER:
423 // commented out while SPELL_SNOBOLLED gets fixed
424 //if (Unit* target = ObjectAccessor::GetPlayer(*me, m_uiTargetGUID))
426 _events.ScheduleEvent(EVENT_BATTER, 10*IN_MILLISECONDS);
427 return;
428 default:
429 return;
430 }
431 }
432
433 // do melee attack only when not on Gormoks back
434 if (!me->GetVehicleBase())
436 }
437 private:
443 };
444
446 {
447 return new npc_snobold_vassalAI(creature);
448 }
449};
450
452{
453 public:
454 npc_firebomb() : CreatureScript("npc_firebomb") { }
455
457 {
458 npc_firebombAI(Creature* creature) : ScriptedAI(creature)
459 {
460 _instance = creature->GetInstanceScript();
461 }
462
464 {
466 SetCombatMovement(false);
467 me->SetReactState(REACT_PASSIVE);
468 me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
469 }
470
471 void UpdateAI(uint32 /*diff*/) OVERRIDE
472 {
474 me->DespawnOrUnsummon();
475 }
476
477 private:
479 };
480
482 {
483 return new npc_firebombAI(creature);
484 }
485};
486
488{
490 {
491 }
492
494 {
495 Enraged = false;
496
497 events.ScheduleEvent(EVENT_SPIT, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
498 events.ScheduleEvent(EVENT_SPRAY, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
499 events.ScheduleEvent(EVENT_SWEEP, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
500 events.ScheduleEvent(EVENT_BITE, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
501 events.ScheduleEvent(EVENT_SPEW, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
503 }
504
505 void JustDied(Unit* /*killer*/) OVERRIDE
506 {
507 if (instance)
508 {
509 if (Creature* otherWorm = Unit::GetCreature(*me, instance->GetData64(OtherWormEntry)))
510 {
511 if (!otherWorm->IsAlive())
512 {
514
515 me->DespawnOrUnsummon();
516 otherWorm->DespawnOrUnsummon();
517 }
518 else
520 }
521 }
522 }
523
525 {
526 // prevent losing 2 attempts at once on heroics
527 if (instance && instance->GetData(TYPE_NORTHREND_BEASTS) != FAIL)
529
530 me->DespawnOrUnsummon();
531 }
532
534 {
535 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
536 if (instance)
538 }
539
540 void EnterCombat(Unit* /*who*/) OVERRIDE
541 {
542 _EnterCombat();
543 me->SetInCombatWithZone();
544 if (instance)
546 }
547
549 {
550 if (!UpdateVictim())
551 return;
552
554 {
555 me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
558 Enraged = true;
560 }
561
562 events.Update(diff);
563
564 if (me->HasUnitState(UNIT_STATE_CASTING))
565 return;
566
567 while (uint32 eventId = events.ExecuteEvent())
568 {
569 switch (eventId)
570 {
571 case EVENT_EMERGE:
572 Emerge();
573 return;
574 case EVENT_SUBMERGE:
575 Submerge();
576 return;
577 case EVENT_BITE:
579 events.ScheduleEvent(EVENT_BITE, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
580 return;
581 case EVENT_SPEW:
583 events.ScheduleEvent(EVENT_SPEW, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
584 return;
585 case EVENT_SLIME_POOL:
588 return;
590 if (Creature* acidmaw = me->SummonCreature(NPC_ACIDMAW, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_MANUAL_DESPAWN))
591 {
593 acidmaw->SetReactState(REACT_AGGRESSIVE);
594 acidmaw->SetInCombatWithZone();
595 acidmaw->CastSpell(acidmaw, SPELL_EMERGE_0);
596 }
597 return;
598 case EVENT_SPRAY:
599 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
600 DoCast(target, SpraySpell);
601 events.ScheduleEvent(EVENT_SPRAY, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
602 return;
603 case EVENT_SWEEP:
605 events.ScheduleEvent(EVENT_SWEEP, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
606 return;
607 default:
608 return;
609 }
610 }
611 if (events.IsInPhase(PHASE_MOBILE))
613 if (events.IsInPhase(PHASE_STATIONARY))
615 }
616
617 void Submerge()
618 {
620 me->RemoveAurasDueToSpell(SPELL_EMERGE_0);
621 me->SetInCombatWithZone();
622 events.SetPhase(PHASE_SUBMERGED);
625 me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+ frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionY() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionZ());
627 }
628
629 void Emerge()
630 {
632 me->SetDisplayId(ModelMobile);
633 me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
635 me->GetMotionMaster()->Clear();
636
637 // if the worm was mobile before submerging, make him stationary now
638 if (WasMobile)
639 {
641 SetCombatMovement(false);
642 me->SetDisplayId(ModelStationary);
643 events.SetPhase(PHASE_STATIONARY);
645 events.ScheduleEvent(EVENT_SPIT, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
646 events.ScheduleEvent(EVENT_SPRAY, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
647 events.ScheduleEvent(EVENT_SWEEP, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_STATIONARY);
648 }
649 else
650 {
652 SetCombatMovement(true);
653 me->GetMotionMaster()->MoveChase(me->GetVictim());
654 me->SetDisplayId(ModelMobile);
655 events.SetPhase(PHASE_MOBILE);
656 events.ScheduleEvent(EVENT_SUBMERGE, 45*IN_MILLISECONDS, 0, PHASE_MOBILE);
657 events.ScheduleEvent(EVENT_BITE, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
658 events.ScheduleEvent(EVENT_SPEW, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS), 0, PHASE_MOBILE);
660 }
661 }
662
663 protected:
667
672
676};
677
679{
680 public:
681 boss_acidmaw() : CreatureScript("boss_acidmaw") { }
682
702
704 {
705 return new boss_acidmawAI(creature);
706 }
707};
708
710{
711 public:
712 boss_dreadscale() : CreatureScript("boss_dreadscale") { }
713
715 {
717 {
718 }
719
736
738 {
739 if (type != POINT_MOTION_TYPE)
740 return;
741
742 switch (pointId)
743 {
744 case 0:
745 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
747 me->SetReactState(REACT_AGGRESSIVE);
748 me->SetInCombatWithZone();
749 break;
750 default:
751 break;
752 }
753 }
754
756 {
757 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
759 }
760
762 {
763 if (instance)
764 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
765
767 }
768 };
769
771 {
772 return new boss_dreadscaleAI(creature);
773 }
774};
775
777{
778 public:
779 npc_slime_pool() : CreatureScript("npc_slime_pool") { }
780
782 {
783 npc_slime_poolAI(Creature* creature) : ScriptedAI(creature)
784 {
785 _instance = creature->GetInstanceScript();
786 }
787
789 {
790 _cast = false;
791 me->SetReactState(REACT_PASSIVE);
792 }
793
794 void UpdateAI(uint32 /*diff*/) OVERRIDE
795 {
796 if (!_cast)
797 {
798 _cast = true;
800 }
801
803 me->DespawnOrUnsummon();
804 }
805 private:
807 bool _cast;
808 };
809
811 {
812 return new npc_slime_poolAI(creature);
813 }
814};
815
817{
818 public:
819 spell_gormok_fire_bomb() : SpellScriptLoader("spell_gormok_fire_bomb") { }
820
822 {
824
826 {
827 if (const WorldLocation* pos = GetExplTargetDest())
828 {
829 if (Unit* caster = GetCaster())
830 caster->SummonCreature(NPC_FIRE_BOMB, pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), 0, TempSummonType::TEMPSUMMON_TIMED_DESPAWN, 30*IN_MILLISECONDS);
831 }
832 }
833
838 };
839
844};
845
847{
848 public:
849 boss_icehowl() : CreatureScript("boss_icehowl") { }
850
851 struct boss_icehowlAI : public BossAI
852 {
854 {
855 }
856
858 {
859 events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
860 events.ScheduleEvent(EVENT_ARCTIC_BREATH, std::rand() % (25 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
861 events.ScheduleEvent(EVENT_WHIRL, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
862 events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS);
863 _movementStarted = false;
864 _movementFinish = false;
865 _trampleCasted = false;
867 _trampleTargetX = 0;
868 _trampleTargetY = 0;
869 _trampleTargetZ = 0;
870 _stage = 0;
871 }
872
873 void JustDied(Unit* /*killer*/) OVERRIDE
874 {
875 _JustDied();
876 if (instance)
878 }
879
881 {
882 if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
883 return;
884
885 switch (pointId)
886 {
887 case 0:
888 if (_stage != 0)
889 {
890 if (me->GetDistance2d(ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY()) < 6.0f)
891 // Middle of the room
892 _stage = 1;
893 else
894 {
895 // Landed from Hop backwards (start trample)
897 _stage = 4;
898 else
899 _stage = 6;
900 }
901 }
902 break;
903 case 1: // Finish trample
904 _movementFinish = true;
905 break;
906 case 2:
907 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
909 me->SetReactState(REACT_AGGRESSIVE);
910 me->SetInCombatWithZone();
911 break;
912 default:
913 break;
914 }
915 }
916
918 {
919 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
921 }
922
924 {
925 if (instance)
926 {
927 instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR));
929 }
930 me->DespawnOrUnsummon();
931 }
932
934 {
935 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
936 {
937 if (instance)
939 }
940 }
941
942 void EnterCombat(Unit* /*who*/) OVERRIDE
943 {
944 _EnterCombat();
945 if (instance)
947 }
948
949 void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE
950 {
951 if (spell->Id == SPELL_TRAMPLE && target->GetTypeId() == TypeID::TYPEID_PLAYER)
952 {
953 if (!_trampleCasted)
954 {
956 _trampleCasted = true;
957 }
958 }
959 }
960
962 {
963 if (!UpdateVictim())
964 return;
965
966 events.Update(diff);
967
968 if (me->HasUnitState(UNIT_STATE_CASTING))
969 return;
970
971 switch (_stage)
972 {
973 case 0:
974 {
975 while (uint32 eventId = events.ExecuteEvent())
976 {
977 switch (eventId)
978 {
981 events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
982 return;
984 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
986 return;
987 case EVENT_WHIRL:
989 events.ScheduleEvent(EVENT_WHIRL, std::rand() % (30 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
990 return;
992 me->GetMotionMaster()->MoveJump(ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 20.0f, 20.0f, 0); // 1: Middle of the room
993 SetCombatMovement(false);
994 me->AttackStop();
995 _stage = 7; //Invalid (Do nothing more than move)
996 return;
997 default:
998 break;
999 }
1000 }
1002 break;
1003 }
1004 case 1:
1006 me->StopMoving();
1007 me->AttackStop();
1008 _stage = 2;
1009 break;
1010 case 2:
1011 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
1012 {
1013 me->StopMoving();
1014 me->AttackStop();
1015 _trampleTargetGUID = target->GetGUID();
1016 me->SetTarget(_trampleTargetGUID);
1017 _trampleCasted = false;
1018 SetCombatMovement(false);
1020 me->GetMotionMaster()->Clear();
1021 me->GetMotionMaster()->MoveIdle();
1022 events.ScheduleEvent(EVENT_TRAMPLE, 4*IN_MILLISECONDS);
1023 _stage = 3;
1024 }
1025 else
1026 _stage = 6;
1027 break;
1028 case 3:
1029 while (uint32 eventId = events.ExecuteEvent())
1030 {
1031 switch (eventId)
1032 {
1033 case EVENT_TRAMPLE:
1034 {
1036 {
1037 me->StopMoving();
1038 me->AttackStop();
1039 _trampleCasted = false;
1040 _movementStarted = true;
1041 _trampleTargetX = target->GetPositionX();
1042 _trampleTargetY = target->GetPositionY();
1043 _trampleTargetZ = target->GetPositionZ();
1044 // 2: Hop Backwards
1045 me->GetMotionMaster()->MoveJump(2*me->GetPositionX() - _trampleTargetX, 2*me->GetPositionY() - _trampleTargetY, me->GetPositionZ(), 30.0f, 20.0f, 0);
1046 _stage = 7; //Invalid (Do nothing more than move)
1047 }
1048 else
1049 _stage = 6;
1050 break;
1051 }
1052 default:
1053 break;
1054 }
1055 }
1056 break;
1057 case 4:
1058 me->StopMoving();
1059 me->AttackStop();
1061 me->GetMotionMaster()->MoveCharge(_trampleTargetX, _trampleTargetY, _trampleTargetZ, 42, 1);
1062 me->SetTarget(0);
1063 _stage = 5;
1064 break;
1065 case 5:
1066 if (_movementFinish)
1067 {
1069 _movementFinish = false;
1070 _stage = 6;
1071 return;
1072 }
1073 if (events.ExecuteEvent() == EVENT_TRAMPLE)
1074 {
1075 Map::PlayerList const &lPlayers = me->GetMap()->GetPlayers();
1076 for (Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
1077 {
1078 if (Unit* player = itr->GetSource())
1079 {
1080 if (player->IsAlive() && player->IsWithinDistInMap(me, 6.0f))
1081 {
1083 events.ScheduleEvent(EVENT_TRAMPLE, 4*IN_MILLISECONDS);
1084 break;
1085 }
1086 }
1087 }
1088 }
1089 break;
1090 case 6:
1091 if (!_trampleCasted)
1092 {
1095 }
1096 else
1097 {
1100 }
1101 _movementStarted = false;
1103 SetCombatMovement(true);
1104 me->GetMotionMaster()->MovementExpired();
1105 me->GetMotionMaster()->Clear();
1106 me->GetMotionMaster()->MoveChase(me->GetVictim());
1107 AttackStart(me->GetVictim());
1108 events.ScheduleEvent(EVENT_MASSIVE_CRASH, 40*IN_MILLISECONDS);
1109 events.ScheduleEvent(EVENT_ARCTIC_BREATH, std::rand() % (25 * IN_MILLISECONDS) + (15*IN_MILLISECONDS));
1110 _stage = 0;
1111 break;
1112 default:
1113 break;
1114 }
1115 }
1116
1117 private:
1124 };
1125
1127 {
1128 return new boss_icehowlAI(creature);
1129 }
1130};
1131
1133{
1134 new boss_gormok();
1135 new npc_snobold_vassal();
1136 new npc_firebomb();
1138
1139 new boss_acidmaw();
1140 new boss_dreadscale();
1141 new npc_slime_pool();
1142
1143 new boss_icehowl();
1144}
@ IN_MILLISECONDS
Definition Common.h:125
@ EQUIP_NO_CHANGE
Definition CreatureAI.h:49
std::int32_t int32
Definition Define.h:73
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
@ FAIL
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:75
@ TEMPSUMMON_CORPSE_DESPAWN
Definition Object.h:72
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
#define sObjectAccessor
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_TRIGGER_MISSILE
#define SpellEffectFn(F, I, N)
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_DISABLE_MOVE
Definition Unit.h:627
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
float frand(float min, float max)
Definition Util.cpp:39
@ SPELL_ENRAGE
@ PHASE_SUBMERGED
@ EMOTE_ENRAGE
@ EVENT_TRAMPLE
Definition boss_moam.cpp:29
@ MODEL_ACIDMAW_MOBILE
@ MODEL_ACIDMAW_STATIONARY
@ MODEL_DREADSCALE_MOBILE
@ MODEL_DREADSCALE_STATIONARY
@ NPC_SNOBOLD_VASSAL
@ EMOTE_TRAMPLE_FAIL
@ EMOTE_TRAMPLE_START
@ EMOTE_TRAMPLE_CRASH
void AddSC_boss_northrend_beasts()
@ SPELL_MASSIVE_CRASH
@ SPELL_FEROCIOUS_BUTT
@ SPELL_FIRE_BOMB_1
@ SPELL_SLIME_POOL_EFFECT
@ SPELL_BURNING_SPRAY
@ SPELL_PARALYTIC_BITE
@ SPELL_BURNING_BITE
@ SUMMON_SLIME_POOL
@ SPELL_FIRE_BOMB_DOT
@ SPELL_FROTHING_RAGE
@ SPELL_RISING_ANGER
@ SPELL_PARALYTIC_SPRAY
@ SPELL_STAGGERING_STOMP
@ SPELL_ARCTIC_BREATH
@ SPELL_MOLTEN_SPEW
@ SPELL_STAGGERED_DAZE
@ ACTION_ENABLE_FIRE_BOMB
@ ACTION_DISABLE_FIRE_BOMB
@ EVENT_SUMMON_ACIDMAW
@ EVENT_MASSIVE_CRASH
@ EVENT_STAGGERING_STOMP
@ EVENT_FEROCIOUS_BUTT
@ EVENT_ARCTIC_BREATH
@ EVENT_SUBMERGE
InstanceScript *const instance
SummonList summons
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureScript(const char *name)
MapRefManager PlayerList
Definition Map.h:406
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
Definition model.h:18
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static Player * GetPlayer(WorldObject const &, uint64 guid)
WorldLocation const * GetExplTargetDest()
HookList< EffectHandler > OnEffectHit
Unit * GetCaster()
SpellScriptLoader(const char *name)
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
bool DoSpellAttackIfReady(uint32 spell)
Definition UnitAI.cpp:48
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
Vehicle * GetVehicleKit() const
Definition Unit.h:2739
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition Vehicle.cpp:306
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
PrepareSpellScript(spell_gormok_fire_bomb_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void SetCombatMovement(bool allowMovement)
Creature * me
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, TempSummonType type, uint32 despawntime)
ScriptedAI(Creature *creature)
void AttackStart(Unit *) OVERRIDE
void MovementInform(uint32 type, uint32 pointId) OVERRIDE
void DamageTaken(Unit *, uint32 &damage) OVERRIDE
void MovementInform(uint32 type, uint32 pointId) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 type, uint32 pointId) OVERRIDE
void KilledUnit(Unit *who) OVERRIDE
void SpellHitTarget(Unit *target, SpellInfo const *spell) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE
void KilledUnit(Unit *who) OVERRIDE
boss_jormungarAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustReachedHome() OVERRIDE
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 type, uint32 pointId) OVERRIDE
void DamageTaken(Unit *pDoneBy, uint32 &uiDamage) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
@ GO_MAIN_GATE_DOOR
@ GORMOK_IN_PROGRESS
@ ICEHOWL_IN_PROGRESS
@ SNAKES_IN_PROGRESS
const Position ToCCommonLoc[]
@ DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE
@ TYPE_NORTHREND_BEASTS
@ DATA_SNOBOLD_COUNT