Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_algalon_the_observer.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#include "ObjectMgr.h"
7#include "ScriptMgr.h"
8#include "ScriptedCreature.h"
9#include "SpellScript.h"
10#include "PassiveAI.h"
11#include "GameObjectAI.h"
12#include "MapManager.h"
13#include "MoveSplineInit.h"
14#include "ulduar.h"
15#include "Player.h"
16
45
89
90uint32 const PhasePunchAlphaId[5] = {64435, 64434, 64428, 64421, 64417};
91
141
151
162
169
175
176
177Position const BrannIntroSpawnPos = {1676.277f, -162.5308f, 427.3326f, 3.235537f};
179{
180 {1642.482f, -164.0812f, 427.2602f, 0.0f},
181 {1635.000f, -169.5145f, 427.2523f, 0.0f},
182 {1632.814f, -173.9334f, 427.2621f, 0.0f},
183 {1632.676f, -190.5927f, 425.8831f, 0.0f},
184 {1631.497f, -214.2221f, 418.1152f, 0.0f},
185 {1624.717f, -224.6876f, 418.1152f, 0.0f},
186 {1631.497f, -214.2221f, 418.1152f, 0.0f},
187 {1632.676f, -190.5927f, 425.8831f, 0.0f},
188 {1632.814f, -173.9334f, 427.2621f, 0.0f},
189 {1635.000f, -169.5145f, 427.2523f, 0.0f},
190};
191Position const AlgalonSummonPos = {1632.531f, -304.8516f, 450.1123f, 1.530165f};
192Position const AlgalonLandPos = {1632.668f, -302.7656f, 417.3211f, 1.530165f};
193
194#define LIVING_CONSTELLATION_COUNT 11
196{
197 {1625.208f, -267.2771f, 446.4296f, 5.044002f},
198 {1658.279f, -262.5490f, 441.9073f, 4.188790f},
199 {1678.677f, -276.3280f, 427.7531f, 3.979351f},
200 {1593.389f, -299.4325f, 432.4636f, 6.073746f},
201 {1685.613f, -300.1219f, 443.2366f, 3.385939f},
202 {1591.706f, -263.8201f, 441.4153f, 5.253441f},
203 {1668.317f, -324.7676f, 457.9394f, 3.211406f},
204 {1592.242f, -325.5323f, 446.9508f, 0.226893f},
205 {1635.821f, -363.3442f, 424.3459f, 1.466077f},
206 {1672.188f, -357.2484f, 436.7337f, 2.338741f},
207 {1615.800f, -348.0065f, 442.9586f, 1.134464f},
208};
209
210#define COLLAPSING_STAR_COUNT 4
212{
213 {1649.438f, -319.8127f, 418.3941f, 1.082104f},
214 {1647.005f, -288.6790f, 417.3955f, 3.490659f},
215 {1622.451f, -321.1563f, 417.6188f, 4.677482f},
216 {1615.060f, -291.6816f, 417.7796f, 3.490659f},
217};
218Position const AlgalonOutroPos = {1633.64f, -317.78f, 417.3211f, 0.0f};
220{
221 {1632.023f, -243.7434f, 417.9118f, 0.0f},
222 {1631.986f, -297.7831f, 417.3210f, 0.0f},
223 {1633.832f, -216.2948f, 417.0463f, 0.0f},
224};
225
227{
228 public:
229 ActivateLivingConstellation(Unit* owner) : _owner(owner), _instance(owner->GetInstanceScript())
230 {
231 }
232
233 bool Execute(uint64 execTime, uint32 /*diff*/)
234 {
235 if (!_instance || _instance->GetBossState(BOSS_ALGALON) != IN_PROGRESS)
236 return true; // delete event
237
239 _owner->m_Events.AddEvent(this, execTime + std::rand() % 50000 + 45000);
240 return false;
241 }
242
243 private:
246};
247
249{
250 public:
252 {
253 }
254
255 bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
256 {
258 return true;
259 }
260
261 private:
263};
264
266{
267 public:
269 {
270 }
271
272 bool Execute(uint64 execTime, uint32 /*diff*/)
273 {
275 _caster->m_Events.AddEvent(this, execTime + 30000);
276 return false;
277 }
278
279 private:
281};
282
284{
285 public:
286 boss_algalon_the_observer() : CreatureScript("boss_algalon_the_observer") { }
287
289 {
291 {
292 _firstPull = true;
293 _fedOnTears = false;
294 }
295
297 {
298 _Reset();
299 me->SetReactState(REACT_PASSIVE);
300 _phaseTwo = false;
301 _fightWon = false;
302 _hasYelled = false;
303 }
304
306 {
307 if (victim->GetTypeId() == TypeID::TYPEID_UNIT)
308 {
309 _fedOnTears = true;
310 if (!_hasYelled)
311 {
312 _hasYelled = true;
313 events.ScheduleEvent(EVENT_UNLOCK_YELL, 1000);
315 }
316 }
317 }
318
320 {
321 switch (action)
322 {
324 {
325 me->SetFlag(UNIT_FIELD_FLAGS2, 0x20);
326 me->SetDisableGravity(true);
327 DoCast(me, SPELL_ARRIVAL, true);
329 me->GetMotionMaster()->MovePoint(POINT_ALGALON_LAND, AlgalonLandPos);
330 me->SetHomePosition(AlgalonLandPos);
332 init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false);
333 init.SetOrientationFixed(true);
334 init.Launch();
335 events.Reset();
336 events.SetPhase(PHASE_ROLE_PLAY);
337 events.ScheduleEvent(EVENT_INTRO_1, 5000, 0, PHASE_ROLE_PLAY);
338 events.ScheduleEvent(EVENT_INTRO_2, 15000, 0, PHASE_ROLE_PLAY);
339 events.ScheduleEvent(EVENT_INTRO_3, 23000, 0, PHASE_ROLE_PLAY);
340 events.ScheduleEvent(EVENT_INTRO_FINISH, 36000, 0, PHASE_ROLE_PLAY);
341 break;
342 }
343 case ACTION_ASCEND:
344 events.SetPhase(PHASE_BIG_BANG);
345 events.CancelEvent(EVENT_RESUME_UPDATING);
346 events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1500);
347 break;
349 events.Reset();
350 events.SetPhase(PHASE_ROLE_PLAY);
351 if (me->IsInCombat())
352 events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1);
353 events.ScheduleEvent(EVENT_DESPAWN_ALGALON_1, 5000);
354 events.ScheduleEvent(EVENT_DESPAWN_ALGALON_2, 17000);
355 events.ScheduleEvent(EVENT_DESPAWN_ALGALON_3, 26000);
356 me->DespawnOrUnsummon(34000);
358 break;
360 _firstPull = false;
362 break;
363 }
364 }
365
367 {
368 return type == DATA_HAS_FED_ON_TEARS ? _fedOnTears : 1;
369 }
370
371 void EnterCombat(Unit* /*target*/) OVERRIDE
372 {
373 uint32 introDelay = 0;
375 events.Reset();
376 events.SetPhase(PHASE_ROLE_PLAY);
377
378 if (!_firstPull)
379 {
381 _EnterCombat();
382 introDelay = 8000;
383 }
384 else
385 {
386 _firstPull = false;
389 brann->AI()->DoAction(ACTION_FINISH_INTRO);
390
391 me->setActive(true);
393 introDelay = 26000;
394 summons.DespawnEntry(NPC_AZEROTH);
395 instance->SetData(EVENT_DESPAWN_ALGALON, 0);
396 events.ScheduleEvent(EVENT_START_COMBAT, 18000);
397 }
398
399 events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay);
400 events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500 + introDelay);
401 events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500 + introDelay);
402 events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 18000 + introDelay);
403 events.ScheduleEvent(EVENT_BIG_BANG, 90000 + introDelay);
404 events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360000 + introDelay);
405 events.ScheduleEvent(EVENT_COSMIC_SMASH, 25000 + introDelay);
406
407 std::list<Creature*> stalkers;
408 me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f);
409 for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
410 (*itr)->m_Events.KillAllEvents(true);
411 }
412
413 void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
414 {
415 if (movementType != POINT_MOTION_TYPE)
416 return;
417
418 if (pointId == POINT_ALGALON_LAND)
419 me->SetDisableGravity(false);
420 else if (pointId == POINT_ALGALON_OUTRO)
421 {
422 me->SetFacingTo(1.605703f);
423 events.ScheduleEvent(EVENT_OUTRO_3, 1200);
424 events.ScheduleEvent(EVENT_OUTRO_4, 2400);
425 events.ScheduleEvent(EVENT_OUTRO_5, 8500);
426 events.ScheduleEvent(EVENT_OUTRO_6, 15500);
427 events.ScheduleEvent(EVENT_OUTRO_7, 55500);
428 events.ScheduleEvent(EVENT_OUTRO_8, 73500);
429 events.ScheduleEvent(EVENT_OUTRO_9, 85500);
430 events.ScheduleEvent(EVENT_OUTRO_10, 108500);
431 events.ScheduleEvent(EVENT_OUTRO_11, 123500);
432 }
433 }
434
436 {
437 summons.Summon(summon);
438 switch (summon->GetEntry())
439 {
440 case NPC_AZEROTH:
442 break;
444 summon->SetReactState(REACT_PASSIVE);
445 summon->GetMotionMaster()->MoveRandom(20.0f);
446 summon->CastSpell(summon, SPELL_COLLAPSE, TRIGGERED_FULL_MASK);
447 break;
448 case NPC_BLACK_HOLE:
449 summon->SetReactState(REACT_PASSIVE);
450 summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_TRIGGER, TRIGGERED_FULL_MASK);
451 summon->CastSpell(summon, SPELL_CONSTELLATION_PHASE_TRIGGER, TRIGGERED_FULL_MASK);
452 summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_EXPLOSION);
453 summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK);
454 break;
456 summon->CastSpell(summon, SPELL_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK);
457 break;
459 summon->CastSpell(summon, SPELL_COSMIC_SMASH_VISUAL_STATE, TRIGGERED_FULL_MASK);
460 break;
462 summon->m_Events.AddEvent(new CosmicSmashDamageEvent(summon), summon->m_Events.CalculateTime(3250));
463 break;
464 case NPC_WORM_HOLE:
465 summon->SetReactState(REACT_PASSIVE);
466 summon->CastSpell(summon, SPELL_WORM_HOLE_TRIGGER, TRIGGERED_FULL_MASK);
467 summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, TRIGGERED_FULL_MASK);
468 break;
471 if (summon->Attack(target, true))
472 summon->GetMotionMaster()->MoveChase(target);
473 break;
474 }
475 }
476
478 {
479 instance->SetBossState(BOSS_ALGALON, FAIL);
482 me->SetSheath(SHEATH_STATE_UNARMED);
483 }
484
485 void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
486 {
487 if (_fightWon)
488 {
489 damage = 0;
490 return;
491 }
492
493 if (!_phaseTwo && me->HealthBelowPctDamaged(20, damage))
494 {
495 _phaseTwo = true;
497 summons.DespawnEntry(NPC_LIVING_CONSTELLATION);
498 summons.DespawnEntry(NPC_COLLAPSING_STAR);
499 summons.DespawnEntry(NPC_BLACK_HOLE);
502 std::list<Creature*> stalkers;
503 me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f);
504 for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
505 (*itr)->m_Events.KillAllEvents(true);
506 for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i)
508 wormHole->m_Events.AddEvent(new SummonUnleashedDarkMatter(wormHole), wormHole->m_Events.CalculateTime(i >= 2 ? 8000 : 6000));
509 }
510 else if ((int32(me->GetHealth()) - int32(damage)) < CalculatePct<int32>(int32(me->GetMaxHealth()), 2.5f) && !_fightWon)
511 {
512 _fightWon = true;
513 damage = 0;
514 me->SetReactState(REACT_PASSIVE);
515 me->AttackStop();
516 me->setFaction(35);
519 events.Reset();
520 summons.DespawnAll();
521 events.SetPhase(PHASE_ROLE_PLAY);
522 events.ScheduleEvent(EVENT_OUTRO_START, 1500);
523 events.ScheduleEvent(EVENT_OUTRO_1, 7200);
524 events.ScheduleEvent(EVENT_OUTRO_2, 8700);
525 }
526 }
527
529 {
530 if ((!(events.IsInPhase(PHASE_ROLE_PLAY) || events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim()) || !CheckInRoom())
531 return;
532
533 events.Update(diff);
534
535 if (!events.IsInPhase(PHASE_ROLE_PLAY))
536 if (me->HasUnitState(UNIT_STATE_CASTING))
537 return;
538
539 while (uint32 eventId = events.ExecuteEvent())
540 {
541 switch (eventId)
542 {
543 case EVENT_INTRO_1:
544 me->RemoveAurasDueToSpell(SPELL_RIDE_THE_LIGHTNING);
546 break;
547 case EVENT_INTRO_2:
550 break;
551 case EVENT_INTRO_3:
553 break;
555 events.Reset();
557 break;
559 instance->SetBossState(BOSS_ALGALON, IN_PROGRESS);
560 break;
562 {
563 events.SetPhase(PHASE_NORMAL);
564 me->SetSheath(SHEATH_STATE_MELEE);
566 me->SetReactState(REACT_DEFENSIVE);
571 if (!me->getThreatManager().isThreatListEmpty())
572 AttackStart(me->getThreatManager().getHostilTarget());
573 for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i)
575 summon->SetReactState(REACT_PASSIVE);
576
577 std::list<Creature*> stalkers;
578 me->GetCreatureListWithEntryInGrid(stalkers, NPC_ALGALON_STALKER, 200.0f);
579 if (!stalkers.empty())
580 {
582 stalker->m_Events.AddEvent(new ActivateLivingConstellation(stalker), stalker->m_Events.CalculateTime(std::rand() % 50000 + 45000));
583 }
584 break;
585 }
588 events.ScheduleEvent(EVENT_QUANTUM_STRIKE, std::rand() % 5000 + 3000);
589 break;
592 events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500);
593 break;
597 for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i)
599 events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 60000);
600 break;
601 case EVENT_BIG_BANG:
602 {
605 events.SetPhase(PHASE_BIG_BANG);
606 std::list<Creature*> constellations;
607 me->GetCreatureListWithEntryInGrid(constellations, NPC_LIVING_CONSTELLATION, 200.0f);
608 for (std::list<Creature*>::iterator itr = constellations.begin(); itr != constellations.end(); ++itr)
609 (*itr)->AI()->DoAction(ACTION_BIG_BANG);
611 events.ScheduleEvent(EVENT_BIG_BANG, 90500);
612 events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500);
613 break;
614 }
616 events.SetPhase(0);
617 break;
621 events.ScheduleEvent(EVENT_EVADE, 2500);
622 break;
623 case EVENT_EVADE:
625 break;
629 events.ScheduleEvent(EVENT_COSMIC_SMASH, 25500);
630 break;
632 _hasYelled = false;
633 break;
635 instance->SetBossState(BOSS_ALGALON, DONE);
636 break;
637 case EVENT_OUTRO_1:
638 me->RemoveAllAuras();
640 break;
641 case EVENT_OUTRO_2:
643 me->AddUnitState(UNIT_STATE_EVADE);
644 me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos);
645 break;
646 case EVENT_OUTRO_3:
648 break;
649 case EVENT_OUTRO_4:
652 break;
653 case EVENT_OUTRO_5:
655 brann->AI()->DoAction(ACTION_OUTRO);
656 break;
657 case EVENT_OUTRO_6:
659 me->SetStandState(UNIT_STAND_STATE_KNEEL);
660 break;
661 case EVENT_OUTRO_7:
663 break;
664 case EVENT_OUTRO_8:
666 break;
667 case EVENT_OUTRO_9:
669 break;
670 case EVENT_OUTRO_10:
672 break;
673 case EVENT_OUTRO_11:
674 me->SetStandState(UNIT_STAND_STATE_STAND);
676 me->DespawnOrUnsummon(1500);
677 break;
678 }
679 }
680
682 }
683
684 private:
690 };
691
693 {
695 }
696};
697
699{
700 public:
701 npc_living_constellation() : CreatureScript("npc_living_constellation") { }
702
704 {
706 {
707 }
708
710 {
711 _events.Reset();
712 _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500);
713 _isActive = false;
714 }
715
717 {
718 return _isActive ? 1 : 0;
719 }
720
722 {
723 switch (action)
724 {
726 if (Creature* algalon = me->FindNearestCreature(NPC_ALGALON, 200.0f))
727 {
728 if (Unit* target = algalon->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(algalon)))
729 {
730 me->SetReactState(REACT_AGGRESSIVE);
732 AttackStart(target);
734 _isActive = true;
735 }
736 }
737 break;
738 case ACTION_BIG_BANG:
739 _events.SetPhase(PHASE_BIG_BANG);
740 _events.DelayEvents(9500);
741 _events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500);
742 break;
743 }
744 }
745
746 void SpellHit(Unit* caster, SpellInfo const* spell) OVERRIDE
747 {
748 if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TypeID::TYPEID_UNIT)
749 return;
750
751 me->DespawnOrUnsummon(1);
752 if (InstanceScript* instance = me->GetInstanceScript())
753 instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START);
754 caster->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK);
755 caster->ToCreature()->DespawnOrUnsummon(1);
756 }
757
759 {
760 if (!(_events.IsInPhase(PHASE_ROLE_PLAY) || _events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim())
761 return;
762
763 _events.Update(diff);
764
765 while (uint32 eventId = _events.ExecuteEvent())
766 {
767 switch (eventId)
768 {
771 _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500);
772 break;
774 _events.SetPhase(0);
775 break;
776 }
777 }
778 }
779
780 private:
783 };
784
786 {
788 }
789};
790
792{
793 public:
794 npc_collapsing_star() : CreatureScript("npc_collapsing_star") { }
795
797 {
799 {
800 _dying = false;
801 }
802
804 {
805 if (summon->GetEntry() != NPC_BLACK_HOLE)
806 return;
807
808 if (TempSummon* summ = me->ToTempSummon())
809 if (Creature* algalon = ObjectAccessor::GetCreature(*me, summ->GetSummonerGUID()))
810 algalon->AI()->JustSummoned(summon);
811
812 me->DespawnOrUnsummon(1);
813 }
814
815 void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
816 {
817 if (_dying)
818 {
819 damage = 0;
820 return;
821 }
822
823 if (damage >= me->GetHealth())
824 {
825 _dying = true;
826 damage = 0;
829 }
830 }
831
832 bool _dying;
833 };
834
836 {
837 return GetUlduarAI<npc_collapsing_starAI>(creature);
838 }
839};
840
842{
843 public:
844 npc_brann_bronzebeard_algalon() : CreatureScript("npc_brann_bronzebeard_algalon") { }
845
847 {
849 {
850 }
851
853 {
854 switch (action)
855 {
857 _currentPoint = 0;
858 _events.Reset();
859 me->SetWalk(false);
860 _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1);
861 break;
864 _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1);
865 break;
866 case ACTION_OUTRO:
867 me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO, BrannOutroPos[1]);
868 _events.ScheduleEvent(EVENT_BRANN_OUTRO_1, 89500);
869 _events.ScheduleEvent(EVENT_BRANN_OUTRO_2, 116500);
870 break;
871 }
872 }
873
874 void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
875 {
876 if (movementType != POINT_MOTION_TYPE)
877 return;
878
879 uint32 delay = 1;
880 _currentPoint = pointId + 1;
881 switch (pointId)
882 {
883 case 2:
884 delay = 8000;
885 me->SetWalk(true);
886 break;
887 case 5:
888 me->SetWalk(false);
890 _events.ScheduleEvent(EVENT_SUMMON_ALGALON, 7500);
891 return;
892 case 9:
893 me->DespawnOrUnsummon(1);
894 return;
897 return;
898 }
899
900 _events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay);
901 }
902
904 {
905 UpdateVictim();
906
907 if (_events.Empty())
908 return;
909
910 _events.Update(diff);
911
912 while (uint32 eventId = _events.ExecuteEvent())
913 {
914 switch (eventId)
915 {
918 me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
919 break;
921 if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos))
922 algalon->AI()->DoAction(ACTION_START_INTRO);
923 break;
926 break;
928 me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO_END, BrannOutroPos[2]);
929 break;
930 }
931 }
932 }
933
934 private:
937 };
938
940 {
942 }
943};
944
946{
947 public:
948 go_celestial_planetarium_access() : GameObjectScript("go_celestial_planetarium_access") { }
949
951 {
955
957 {
958 bool hasKey = true;
959 if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId))
960 {
961 hasKey = false;
962 for (uint32 i = 0; i < MAX_LOCK_CASE; ++i)
963 {
964 if (!lock->Index[i])
965 continue;
966
967 if (player->HasItemCount(lock->Index[i]))
968 {
969 hasKey = true;
970 break;
971 }
972 }
973 }
974
975 if (!hasKey)
976 return false;
977
978 // Start Algalon event
980 _events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000);
981 if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos))
982 brann->AI()->DoAction(ACTION_START_INTRO);
983
984 if (InstanceScript* instance = go->GetInstanceScript())
985 {
986 instance->SetData(DATA_ALGALON_SUMMON_STATE, 1);
987 if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(DATA_SIGILDOOR_01)))
988 sigil->SetGoState(GOState::GO_STATE_ACTIVE);
989
990 if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(DATA_SIGILDOOR_02)))
991 sigil->SetGoState(GOState::GO_STATE_ACTIVE);
992 }
993
994 return false;
995 }
996
998 {
999 if (_events.Empty())
1000 return;
1001
1002 _events.Update(diff);
1003
1004 while (uint32 eventId = _events.ExecuteEvent())
1005 {
1006 switch (eventId)
1007 {
1009 go->Delete();
1010 break;
1011 }
1012 }
1013 }
1014
1016 };
1017
1022};
1023
1061
1063{
1064 public:
1065 NotVictimFilter(Unit* caster) : _victim(caster->GetVictim())
1066 {
1067 }
1068
1070 {
1071 return target != _victim;
1072 }
1073
1074 private:
1076};
1077
1103
1105{
1106 public:
1107 bool operator()(WorldObject* target) const
1108 {
1109 return target->ToUnit() && target->ToUnit()->GetAI() && target->ToUnit()->GetAI()->GetData(0);
1110 }
1111};
1112
1114{
1115 public:
1116 spell_algalon_trigger_3_adds() : SpellScriptLoader("spell_algalon_trigger_3_adds") { }
1117
1119 {
1121
1122 void SelectTarget(std::list<WorldObject*>& targets)
1123 {
1124 targets.remove_if(ActiveConstellationFilter());
1125 }
1126
1128 {
1129 PreventHitDefaultEffect(effIndex);
1130 Creature* target = GetHitCreature();
1131 if (!target)
1132 return;
1133
1134 target->AI()->DoAction(ACTION_ACTIVATE_STAR);
1135 }
1136
1141 };
1142
1147};
1148
1175
1177{
1178 public:
1179 spell_algalon_big_bang() : SpellScriptLoader("spell_algalon_big_bang") { }
1180
1210
1215};
1216
1243
1245{
1246 public:
1247 spell_algalon_cosmic_smash() : SpellScriptLoader("spell_algalon_cosmic_smash") { }
1248
1250 {
1252
1253 void ModDestHeight(SpellEffIndex /*effIndex*/)
1254 {
1255 Position offset = {0.0f, 0.0f, 65.0f, 0.0f};
1256 const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
1257 GetHitDest()->RelocateOffset(offset);
1258 }
1259
1264 };
1265
1270};
1271
1273{
1274 public:
1275 spell_algalon_cosmic_smash_damage() : SpellScriptLoader("spell_algalon_cosmic_smash_damage") { }
1276
1278 {
1280
1282 {
1283 if (!GetExplTargetDest() || !GetHitUnit())
1284 return;
1285
1286 float distance = GetHitUnit()->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY());
1287 if (distance > 6.0f)
1288 SetHitDamage(int32(float(GetHitDamage()) / distance) * 2);
1289 }
1290
1295 };
1296
1301};
1302
1331
1333{
1334 public:
1335 achievement_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_he_feeds_on_your_tears") { }
1336
1337 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
1338 {
1339 return !target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS);
1340 }
1341};
1342
Actions
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:158
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT
Definition DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition DBCEnums.h:193
DBCStorage< LockEntry > sLockStore(LockEntryfmt)
#define MAX_LOCK_CASE
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ IN_PROGRESS
@ FAIL
@ DONE
@ POINT_MOTION_TYPE
@ TYPEID_UNIT
Definition Object.h:54
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:75
@ TEMPSUMMON_CORPSE_DESPAWN
Definition Object.h:72
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SUMMON
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ GO_FLAG_IN_USE
@ SPELL_AURA_PHASE
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellCastFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_STAND_STATE_KNEEL
Definition Unit.h:170
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ AURA_REMOVE_BY_DEFAULT
Definition Unit.h:407
@ TRIGGERED_FULL_MASK
Will ignore most target checks (mostly DBC target checks).
Definition Unit.h:435
@ SHEATH_STATE_UNARMED
Definition Unit.h:245
@ SHEATH_STATE_MELEE
Definition Unit.h:246
@ UNIT_STATE_EVADE
Definition Unit.h:533
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_DEFENSIVE
Definition Unit.h:1157
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_IMMUNE_TO_NPC
Definition Unit.h:634
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FLAG_RENAME
Definition Unit.h:629
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ NODAMAGE
Definition Unit.h:618
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS2
@ UNIT_FIELD_FLAGS
@ GAMEOBJECT_FIELD_FLAGS
T CalculatePct(T base, U pct)
Definition Util.h:103
Position const AlgalonLandPos
Position const AlgalonOutroPos
Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO]
Position const CollapsingStarPos[COLLAPSING_STAR_COUNT]
void AddSC_boss_algalon_the_observer()
@ SPELL_CONSTELLATION_PHASE_EFFECT
@ SPELL_SUMMON_UNLEASHED_DARK_MATTER
@ SPELL_BLACK_HOLE_EXPLOSION
@ SPELL_COSMIC_SMASH_TRIGGERED
@ SPELL_ASCEND_TO_THE_HEAVENS
@ SPELL_CONSTELLATION_PHASE_TRIGGER
@ SPELL_SUMMON_VOID_ZONE_VISUAL
@ SPELL_BLACK_HOLE_SPAWN_VISUAL
@ SPELL_COSMIC_SMASH_VISUAL_STATE
uint32 const PhasePunchAlphaId[5]
#define LIVING_CONSTELLATION_COUNT
@ EVENT_ID_SUPERMASSIVE_START
#define COLLAPSING_STAR_COUNT
Position const ConstellationPos[LIVING_CONSTELLATION_COUNT]
@ SAY_BRANN_ALGALON_INTRO_1
@ EMOTE_ALGALON_COSMIC_SMASH
@ SAY_ALGALON_COLLAPSING_STAR
@ EMOTE_ALGALON_COLLAPSING_STAR
@ SAY_BRANN_ALGALON_INTRO_2
Position const AlgalonSummonPos
Position const BrannOutroPos[3]
Position const BrannIntroSpawnPos
@ EVENT_ASCEND_TO_THE_HEAVENS
@ EVENT_SUMMON_COLLAPSING_STAR
Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO]
@ MAX_BRANN_WAYPOINTS_INTRO
@ EVENT_BRANN_MOVE_INTRO
@ SPELL_ARCANE_BARRAGE
@ PHASE_NORMAL
@ ACTION_OUTRO
@ EVENT_OUTRO_9
@ EVENT_OUTRO_11
@ EVENT_OUTRO_7
@ EVENT_OUTRO_12
@ EVENT_OUTRO_5
@ EVENT_OUTRO_8
@ EVENT_OUTRO_13
@ EVENT_OUTRO_6
@ EVENT_OUTRO_10
@ EVENT_OUTRO_4
@ SPELL_KILL_CREDIT
@ EVENT_INTRO_1
@ EVENT_INTRO_2
@ EVENT_INTRO_3
AchievementCriteriaScript(const char *name)
bool Execute(uint64 execTime, uint32)
bool operator()(WorldObject *target) const
void PreventDefaultAction()
void Remove(uint32 removeMode=0)
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
uint8 GetStackAmount() const
InstanceScript *const instance
bool CheckInRoom()
SummonList summons
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
CreatureAI(Creature *creature)
Definition CreatureAI.h:69
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
Creature * DoSummon(uint32 entry, Position const &pos, uint32 despawnTime=30000, TempSummonType summonType=TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN)
bool _EnterEvadeMode()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:56
virtual void EnterEvadeMode()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
uint64 CalculateTime(uint64 t_offset) const
GameObject *const go
GameObjectAI(GameObject *g)
GameObjectScript(const char *name)
void MoveTo(const Vector3 &destination, bool generatePath=true, bool forceDestination=false)
void SetOrientationFixed(bool enable)
bool operator()(WorldObject *target)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static GameObject * GetGameObject(WorldObject const &u, uint64 guid)
Unit * ToUnit()
Definition Object.h:210
PassiveAI(Creature *c)
Definition PassiveAI.cpp:10
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1=0, uint64 miscValue2=0, bool evenIfCriteriaComplete=false)
Definition Player.cpp:21028
Creature * GetHitCreature()
HookList< CastHandler > AfterCast
WorldLocation const * GetExplTargetDest()
Player * GetHitPlayer()
SpellInfo const * GetSpellInfo()
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit()
WorldLocation * GetHitDest()
void SetHitDamage(int32 damage)
HookList< EffectHandler > OnEffectLaunch
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
int32 GetHitDamage()
SpellScriptLoader(const char *name)
bool Execute(uint64 execTime, uint32)
virtual void DoAction(int32)
Definition UnitAI.h:126
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
virtual uint32 GetData(uint32) const
Definition UnitAI.h:127
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
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:16
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
uint32 DealDamage(Unit *victim, uint32 damage, CleanDamage const *cleanDamage=NULL, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=NULL, bool durabilityLoss=true)
EventProcessor m_Events
Definition Unit.h:2396
void RemoveAurasByType(AuraType auraType, uint64 casterGUID=0, Aura *except=NULL, bool negative=true, bool positive=true)
UnitAI * GetAI()
Definition Unit.h:1393
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1684
bool OnCheck(Player *, Unit *target) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
GameObjectAI * GetAI(GameObject *go) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_algalon_arcane_barrage_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_algalon_big_bang_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_algalon_collapse_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_algalon_cosmic_smash_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_algalon_phase_punch_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_algalon_remove_phase_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_algalon_trigger_3_adds_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
@ ACTION_START_INTRO
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
void RelocateOffset(Position const &offset)
Definition Object.cpp:1841
Creature * me
void AttackStart(Unit *) OVERRIDE
void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
void DamageTaken(Unit *, uint32 &damage) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, SpellInfo const *spell) OVERRIDE
@ EVENT_DESPAWN_ALGALON
Definition ulduar.h:323
@ ACTION_INIT_ALGALON
Definition ulduar.h:325
@ BOSS_ALGALON
Definition ulduar.h:36
@ DATA_SIGILDOOR_02
Definition ulduar.h:298
@ DATA_SIGILDOOR_01
Definition ulduar.h:297
@ DATA_BRANN_BRONZEBEARD_ALG
Definition ulduar.h:304
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:296
AI * GetUlduarAI(T *obj)
Definition ulduar.h:336
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition ulduar.h:150
@ NPC_BLACK_HOLE
Definition ulduar.h:147
@ NPC_COLLAPSING_STAR
Definition ulduar.h:146
@ NPC_UNLEASHED_DARK_MATTER
Definition ulduar.h:152
@ NPC_WORM_HOLE
Definition ulduar.h:148
@ NPC_LIVING_CONSTELLATION
Definition ulduar.h:144
@ NPC_ALGALON_STALKER
Definition ulduar.h:145
@ NPC_ALGALON
Definition ulduar.h:68
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition ulduar.h:151
@ NPC_AZEROTH
Definition ulduar.h:143
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition ulduar.h:149
@ NPC_BRANN_BRONZBEARD_ALG
Definition ulduar.h:142