TrinityCore
boss_algalon_the_observer.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#include "ScriptMgr.h"
19#include "Containers.h"
20#include "DB2Stores.h"
21#include "GameObject.h"
22#include "GameObjectAI.h"
23#include "InstanceScript.h"
24#include "Map.h"
25#include "MotionMaster.h"
26#include "MoveSplineInit.h"
27#include "PassiveAI.h"
28#include "Player.h"
29#include "ScriptedCreature.h"
30#include "SpellInfo.h"
31#include "SpellScript.h"
32#include "TemporarySummon.h"
33#include "ulduar.h"
34
36{
40
62
63 // Direct Sound
64 ENGAGE_MUSIC_ID = 15878
65};
66
68{
69 // Algalon the Observer
85
86 // Algalon Stalker
87 SPELL_TRIGGER_3_ADDS = 62266, // Triggers Living Constellation
88
89 // Living Constellation
92
93 // Collapsing Star
97
98 // Black Hole
107
108 // Worm Hole
112
113uint32 const PhasePunchAlphaId[5] = {64435, 64434, 64428, 64421, 64417};
114
116{
117 // Celestial Planetarium Access
119
120 // Brann Bronzebeard
126
127 // Algalon the Observer
156
157 // Living Constellation
160
162{
169};
170
172{
177
179{
181 DATA_HAS_FED_ON_TEARS = 30043005
183
185{
192
194{
200
201#define LIVING_CONSTELLATION_COUNT 11
203{
204 {1625.208f, -267.2771f, 446.4296f, 5.044002f},
205 {1658.279f, -262.5490f, 441.9073f, 4.188790f},
206 {1678.677f, -276.3280f, 427.7531f, 3.979351f},
207 {1593.389f, -299.4325f, 432.4636f, 6.073746f},
208 {1685.613f, -300.1219f, 443.2366f, 3.385939f},
209 {1591.706f, -263.8201f, 441.4153f, 5.253441f},
210 {1668.317f, -324.7676f, 457.9394f, 3.211406f},
211 {1592.242f, -325.5323f, 446.9508f, 0.226893f},
212 {1635.821f, -363.3442f, 424.3459f, 1.466077f},
213 {1672.188f, -357.2484f, 436.7337f, 2.338741f},
214 {1615.800f, -348.0065f, 442.9586f, 1.134464f}
215};
216
217#define COLLAPSING_STAR_COUNT 4
219{
220 {1649.438f, -319.8127f, 418.3941f, 1.082104f},
221 {1647.005f, -288.6790f, 417.3955f, 3.490659f},
222 {1622.451f, -321.1563f, 417.6188f, 4.677482f},
223 {1615.060f, -291.6816f, 417.7796f, 3.490659f}
224};
225
226Position const BrannIntroSpawnPos = { 1677.363f, -162.3514f, 427.332f, 3.191144f };
227Position const AlgalonSummonPos = { 1632.531f, -304.8516f, 450.1123f, 1.530165f };
228Position const AlgalonLandPos = { 1632.668f, -302.7656f, 417.3211f, 1.530165f };
229Position const AlgalonOutroPos = {1633.64f, -317.78f, 417.3211f, 0.0f};
230Position const BrannOutroPos = { 1631.989f, -221.5439f, 418.4091f, 4.714909f };
231
233{
234 public:
235 ActivateLivingConstellation(Unit* owner) : _owner(owner), _instance(owner->GetInstanceScript()) { }
236
237 bool Execute(uint64 execTime, uint32 /*diff*/) override
238 {
240 return true; // delete event
241
243 _owner->m_Events.AddEvent(this, Milliseconds(execTime) + randtime(45s, 50s));
244 return false;
245 }
246
247 private:
250};
251
253{
254 public:
255 CosmicSmashDamageEvent(Unit* caster) : _caster(caster) { }
256
257 bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
258 {
260 return true;
261 }
262
263 private:
265};
266
268{
269 public:
271
272 bool Execute(uint64 execTime, uint32 /*diff*/) override
273 {
275 _caster->m_Events.AddEvent(this, Milliseconds(execTime) + 30s);
276 return false;
277 }
278
279 private:
281};
282
284{
286 {
287 Initialize();
288 _firstPull = true;
289 _fedOnTears = false;
290 }
291
293 {
294 _phaseTwo = false;
295 _fightWon = false;
296 _hasYelled = false;
297 }
298
299 void Reset() override
300 {
301 _Reset();
303 Initialize();
304 }
305
306 void DoAction(int32 action) override
307 {
308 switch (action)
309 {
311 {
313 me->SetDisableGravity(true);
317
318 std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
319 {
321 init.SetOrientationFixed(true);
322 };
324
325 events.Reset();
328 break;
329 }
330 case ACTION_ASCEND:
334 break;
336 _firstPull = false;
337 me->SetImmuneToPC(false);
338 break;
339 default:
340 break;
341 }
342 }
343
344 uint32 GetData(uint32 type) const override
345 {
346 return type == DATA_HAS_FED_ON_TEARS ? _fedOnTears : 1;
347 }
348
349 void JustEngagedWith(Unit* who) override
350 {
351 Milliseconds introDelay = 0ms;
352 me->SetUninteractible(true);
353 me->SetImmuneToNPC(true);
354 events.Reset();
356
357 if (!_firstPull)
358 {
362 introDelay = 8s;
363 }
364 else
365 {
366 _firstPull = false;
369 me->setActive(true);
370 me->SetFarVisible(true);
372 introDelay = 26500ms;
375 }
376
378 events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500ms + introDelay);
379 events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500ms + introDelay);
381 events.ScheduleEvent(EVENT_BIG_BANG, 90s + introDelay);
383 events.ScheduleEvent(EVENT_COSMIC_SMASH, 25s + introDelay);
384
385 std::list<Creature*> stalkers;
387 for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
388 (*itr)->m_Events.KillAllEvents(true);
389 }
390
391 void MovementInform(uint32 movementType, uint32 pointId) override
392 {
393 if (movementType != POINT_MOTION_TYPE)
394 return;
395
396 if (pointId == POINT_ALGALON_OUTRO)
397 {
398 me->SetFacingTo(1.605703f);
400 }
401 }
402
403 void JustSummoned(Creature* summon) override
404 {
405 summons.Summon(summon);
406 switch (summon->GetEntry())
407 {
410 summon->GetMotionMaster()->MoveRandom(20.0f);
412 break;
415 break;
418 break;
420 summon->m_Events.AddEventAtOffset(new CosmicSmashDamageEvent(summon), 3s + 250ms);
421 break;
422 case NPC_WORM_HOLE:
426 break;
428 DoZoneInCombat(summon);
429 break;
430 default:
431 break;
432 }
433 }
434
435 void EnterEvadeMode(EvadeReason why) override
436 {
439 me->SetImmuneToPC(false);
441 }
442
443 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
444 {
445 if (_fightWon)
446 {
447 damage = 0;
448 return;
449 }
450
451 if (!_phaseTwo && me->HealthBelowPctDamaged(20, damage))
452 {
453 _phaseTwo = true;
460 std::list<Creature*> stalkers;
462 for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
463 (*itr)->m_Events.KillAllEvents(true);
464 for (uint8 i = 0; i < COLLAPSING_STAR_COUNT; ++i)
466 wormHole->m_Events.AddEventAtOffset(new SummonUnleashedDarkMatter(wormHole), i >= 2 ? 8s : 6s);
467 }
468 else if ((int32(me->GetHealth()) - int32(damage)) < CalculatePct<int32>(int32(me->GetMaxHealth()), 2.5f) && !_fightWon)
469 {
470 _fightWon = true;
471 damage = 0;
474 me->AttackStop();
475 me->SetUninteractible(true);
477 events.Reset();
481 }
482 }
483
484 void KilledUnit(Unit* victim) override
485 {
486 if (victim->GetTypeId() == TYPEID_PLAYER)
487 {
488 _fedOnTears = true;
489 if (!_hasYelled)
490 {
491 _hasYelled = true;
494 }
495 }
496 }
497
498 void UpdateAI(uint32 diff) override
499 {
501 return;
502
503 events.Update(diff);
504
507 return;
508
509 while (uint32 eventId = events.ExecuteEvent())
510 {
511 switch (eventId)
512 {
513 case EVENT_INTRO_1:
517 break;
520 if (Creature* azeroth = instance->GetCreature(DATA_AZEROTH))
521 if (TempSummon* summon = azeroth->ToTempSummon())
522 summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
524 break;
525 case EVENT_INTRO_2:
526 me->SetDisableGravity(false);
530 break;
531 case EVENT_INTRO_3:
534 break;
536 events.Reset();
537 me->SetImmuneToPC(false);
539 brann->AI()->DoAction(ACTION_INTRO_2);
540 break;
545 break;
547 {
550 me->SetUninteractible(false);
551 me->SetImmuneToNPC(false);
559 for (uint8 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i)
561 summon->SetReactState(REACT_PASSIVE);
562
563 std::list<Creature*> stalkers;
565 if (!stalkers.empty())
566 {
568 stalker->m_Events.AddEventAtOffset(new ActivateLivingConstellation(stalker), 45s, 50s);
569 }
570 break;
571 }
574 events.Repeat(3s, 5s);
575 break;
578 events.Repeat(15s + 500ms);
579 break;
583 for (uint8 i = 0; i < COLLAPSING_STAR_COUNT; ++i)
585 events.Repeat(1min);
586 break;
587 case EVENT_BIG_BANG:
588 {
592 std::list<Creature*> constellations;
594 for (std::list<Creature*>::iterator itr = constellations.begin(); itr != constellations.end(); ++itr)
595 (*itr)->AI()->DoAction(ACTION_BIG_BANG);
597 events.Repeat(1min + 30s + 500ms);
599 break;
600 }
603 break;
607 events.ScheduleEvent(EVENT_EVADE, 2s + 500ms);
608 break;
609 case EVENT_EVADE:
611 break;
615 events.Repeat(25s + 500ms);
616 break;
618 _hasYelled = false;
619 break;
622 break;
623 case EVENT_OUTRO_1:
629 break;
630 case EVENT_OUTRO_2:
631 me->SetRegenerateHealth(false);
632 me->CombatStop();
634 break;
635 case EVENT_OUTRO_3:
639 break;
640 case EVENT_OUTRO_4:
642 me->SetUninteractible(false);
643 break;
644 case EVENT_OUTRO_5:
646 brann->AI()->DoAction(ACTION_OUTRO);
648 break;
649 case EVENT_OUTRO_6:
653 break;
654 case EVENT_OUTRO_7:
657 break;
658 case EVENT_OUTRO_8:
661 break;
662 case EVENT_OUTRO_9:
665 break;
666 case EVENT_OUTRO_10:
669 break;
670 case EVENT_OUTRO_11:
673 me->DespawnOrUnsummon(1s + 200ms);
674 break;
675 default:
676 break;
677 }
678
680 return;
681 }
682 }
683
684private:
690};
691
693{
694 npc_living_constellation(Creature* creature) : CreatureAI(creature), _instance(creature->GetInstanceScript())
695 {
696 Initialize();
697 }
698
700 {
701 _isActive = false;
702 }
703
704 void Reset() override
705 {
706 _events.Reset();
708 Initialize();
709 }
710
711 uint32 GetData(uint32 /*type*/) const override
712 {
713 return _isActive ? 1 : 0;
714 }
715
716 void DoAction(int32 action) override
717 {
718 switch (action)
719 {
722 {
723 if (Unit* target = algalon->AI()->SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(algalon)))
724 {
726 me->SetUninteractible(false);
727 AttackStart(target);
729 _isActive = true;
730 }
731 }
732 break;
733 case ACTION_BIG_BANG:
735 _events.DelayEvents(9s + 500ms);
737 break;
738 default:
739 break;
740 }
741 }
742
743 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
744 {
745 Creature* creatureCaster = caster->ToCreature();
746 if (!creatureCaster)
747 return;
748
749 if (spellInfo->Id != SPELL_CONSTELLATION_PHASE_EFFECT)
750 return;
751
753 creatureCaster->CastSpell(nullptr, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK);
755 me->DespawnOrUnsummon(500ms);
756 }
757
758 void UpdateAI(uint32 diff) override
759 {
761 return;
762
763 _events.Update(diff);
764
765 while (uint32 eventId = _events.ExecuteEvent())
766 {
767 switch (eventId)
768 {
770 {
773 _events.Repeat(4s, 5s);
774 break;
775 }
778 break;
779 }
780 }
781 }
782
783private:
787};
788
790{
791 npc_black_hole(Creature* creature) : ScriptedAI(creature), _summons(creature) { }
792
793 void Reset() override
794 {
800 }
801
802 void JustSummoned(Creature* summon) override
803 {
804 _summons.Summon(summon);
805 }
806
807 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
808 {
809 if (spellInfo->Id == SPELL_DESPAWN_BLACK_HOLE)
810 {
812 me->DespawnOrUnsummon(1ms);
813 }
814 }
815
816 void EnterEvadeMode(EvadeReason /*why*/) override { }
817
818private:
820};
821
823{
824 npc_collapsing_star(Creature* creature) : PassiveAI(creature), _dying(false), _instance(creature->GetInstanceScript()) { }
825
826 void JustSummoned(Creature* summon) override
827 {
828 if (summon->GetEntry() != NPC_BLACK_HOLE)
829 return;
830
832 algalon->AI()->JustSummoned(summon);
833
834 me->DespawnOrUnsummon(1ms);
835 }
836
837 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
838 {
839 if (_dying)
840 {
841 damage = 0;
842 return;
843 }
844
845 if (damage >= me->GetHealth())
846 {
847 _dying = true;
848 damage = 0;
851 }
852 }
853
854private:
855 bool _dying;
857};
858
860{
862
863 void DoAction(int32 action) override
864 {
865 switch (action)
866 {
868 _events.Reset();
870 break;
871 case ACTION_OUTRO:
873 _events.ScheduleEvent(EVENT_BRANN_OUTRO_1, 1min + 32s + 200ms);
875 break;
876 case ACTION_INTRO_2:
879 break;
880 default:
881 break;
882 }
883 }
884
885 void MovementInform(uint32 type, uint32 pointId) override
886 {
887 if (type != POINT_MOTION_TYPE && type != SPLINE_CHAIN_MOTION_TYPE)
888 return;
889
890 switch (pointId)
891 {
894 break;
896 me->SetFacingTo(4.714909f);
898 break;
899 case POINT_DESPAWN:
901 break;
902 default:
903 break;
904 }
905 }
906
907 void UpdateAI(uint32 diff) override
908 {
909 if (_events.Empty())
910 return;
911
912 _events.Update(diff);
913
914 while (uint32 eventId = _events.ExecuteEvent())
915 {
916 switch (eventId)
917 {
920 break;
924 break;
927 algalon->AI()->DoAction(ACTION_START_INTRO);
928 break;
931 break;
934 break;
935 default:
936 break;
937 }
938 }
939 }
940
941private:
943};
944
946{
947 go_celestial_planetarium_access(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
948
949 bool OnReportUse(Player* player) override
950 {
952 return true;
953
954 bool hasKey = true;
955 if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->GetLockId()))
956 {
957 hasKey = false;
958 for (uint8 i = 0; i < MAX_LOCK_CASE; ++i)
959 {
960 if (!lock->Index[i])
961 continue;
962
963 if (player->HasItemCount(lock->Index[i]))
964 {
965 hasKey = true;
966 break;
967 }
968 }
969 }
970
971 if (!hasKey)
972 return false;
973
974 // Start Algalon event
978 brann->AI()->DoAction(ACTION_START_INTRO);
979
982 sigil->SetGoState(GO_STATE_ACTIVE);
983
985 sigil->SetGoState(GO_STATE_ACTIVE);
986
987 return false;
988 }
989
990 void UpdateAI(uint32 diff) override
991 {
992 if (_events.Empty())
993 return;
994
995 _events.Update(diff);
996
997 while (uint32 eventId = _events.ExecuteEvent())
998 {
999 switch (eventId)
1000 {
1002 me->Delete();
1003 break;
1004 default:
1005 break;
1006 }
1007 }
1008 }
1009
1010private:
1013};
1014
1015// 64412 - Phase Punch
1017{
1018 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1019 {
1021 if (GetStackAmount() != 1)
1024 if (GetStackAmount() == 5)
1026 }
1027
1029 {
1030 if (GetStackAmount() != 5)
1032 }
1033
1034 void Register() override
1035 {
1038 }
1039};
1040
1041// 65508 - Constellation Phase Trigger
1043{
1044 bool Validate(SpellInfo const* spellInfo) override
1045 {
1046 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
1047 }
1048
1049 void HandlePeriodic(AuraEffect const* aurEff)
1050 {
1052 CastSpellExtraArgs args(aurEff);
1054 // Phase Effect should only 1 target. Avoid 1 black hole despawn multiple Living Constellation
1055 GetTarget()->CastSpell(nullptr, GetSpellInfo()->GetEffect(EFFECT_0).TriggerSpell, args);
1056 }
1057
1058 void Register() override
1059 {
1061 }
1062};
1063
1064// 62266 - Trigger 3 Adds
1066{
1067 void SelectTarget(std::list<WorldObject*>& targets)
1068 {
1069 // Remove Living Constellation already actived
1070 targets.remove_if([](WorldObject* target) -> bool
1071 {
1072 return target->ToUnit() && target->ToUnit()->GetAI() && target->ToUnit()->GetAI()->GetData(0);
1073 });
1074 }
1075
1077 {
1078 PreventHitDefaultEffect(effIndex);
1079 if (Creature* target = GetHitCreature())
1080 target->AI()->DoAction(ACTION_ACTIVATE_STAR);
1081 }
1082
1083 void Register() override
1084 {
1087 }
1088};
1089
1090// 62018 - Collapse
1092{
1093 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1094 {
1096 Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(1), nullptr, NODAMAGE);
1097 }
1098
1099 void Register() override
1100 {
1102 }
1103};
1104
1105// 64443, 64584 - Big Bang
1107{
1108 bool Load() override
1109 {
1110 _targetCount = 0;
1111 return GetCaster()->GetTypeId() == TYPEID_UNIT;
1112 }
1113
1114 void CountTargets(std::list<WorldObject*>& targets)
1115 {
1116 _targetCount = targets.size();
1117 }
1118
1120 {
1121 if (!_targetCount)
1123 }
1124
1125 void Register() override
1126 {
1129 }
1130private:
1132};
1133
1134// 64445 - Remove Player from Phase
1136{
1137 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1138 {
1141 }
1142
1143 void Register() override
1144 {
1146 }
1147};
1148
1149// 62295 - Cosmic Smash
1151{
1153 {
1154 // Meteor should spawn below the platform
1155 Position const offset = { 0.0f, 0.0f, -36.1325f, 0.0f };
1156 dest.RelocateOffset(offset);
1157 }
1158
1159 void Register() override
1160 {
1162 }
1163};
1164
1165// 62311, 64596 - Cosmic Smash
1167{
1169 {
1170 if (!GetExplTargetDest() || !GetHitUnit())
1171 return;
1172
1173 float distance = GetHitUnit()->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY());
1174 if (distance > 6.0f)
1175 SetHitDamage(int32(float(GetHitDamage()) / distance) * 2);
1176 }
1177
1178 void Register() override
1179 {
1181 }
1182};
1183
1184// 62168 - Black Hole (Phase Shifts)
1185// 65250 - Worm Hole (Phase Shifts)
1186// 64417 - Phase Punch (Phase Shifts)
1188{
1189 bool Load() override
1190 {
1191 return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
1192 }
1193
1194 bool Validate(SpellInfo const* /*spellInfo*/) override
1195 {
1197 }
1198
1199 void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1200 {
1202 }
1203
1204 void Register() override
1205 {
1207 }
1208};
1209
1211{
1227}
Texts
Actions
DB2Storage< LockEntry > sLockStore("Lock.db2", &LockLoadInfo::Instance)
#define MAX_LOCK_CASE
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ IN_PROGRESS
@ FAIL
@ DONE
@ MOTION_PRIORITY_NORMAL
@ SPLINE_CHAIN_MOTION_TYPE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
#define RegisterGameObjectAI(ai_name)
Definition: ScriptMgr.h:1398
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_DEST_CASTER_SUMMON
@ SPELL_EFFECT_DUMMY
@ GO_FLAG_IN_USE
@ FACTION_FRIENDLY
@ GO_STATE_ACTIVE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_DEFAULT
@ SPELL_AURA_PHASE
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ SPELLVALUE_MAX_TARGETS
Definition: SpellDefines.h:230
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellCastFn(F)
Definition: SpellScript.h:825
#define SpellDestinationTargetSelectFn(F, I, N)
Definition: SpellScript.h:874
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ UNIT_FLAG2_DONT_FADE_IN
Definition: UnitDefines.h:199
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_KNEEL
Definition: UnitDefines.h:50
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
DamageEffectType
Definition: UnitDefines.h:131
@ NODAMAGE
Definition: UnitDefines.h:136
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:82
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:83
@ UNIT_FLAG_RENAME
Definition: UnitDefines.h:148
@ UNIT_STATE_CASTING
Definition: Unit.h:270
Position const AlgalonLandPos
Position const AlgalonOutroPos
Position const CollapsingStarPos[COLLAPSING_STAR_COUNT]
void AddSC_boss_algalon_the_observer()
Position const BrannOutroPos
@ SPELL_CONSTELLATION_PHASE_EFFECT
@ SPELL_SUPERMASSIVE_FAIL
@ SPELL_BLACK_HOLE_TRIGGER
@ SPELL_SUMMON_UNLEASHED_DARK_MATTER
@ SPELL_DESPAWN_BLACK_HOLE
@ SPELL_RIDE_THE_LIGHTNING
@ SPELL_BLACK_HOLE_EXPLOSION
@ SPELL_COSMIC_SMASH_TRIGGERED
@ SPELL_ASCEND_TO_THE_HEAVENS
@ SPELL_CONSTELLATION_PHASE_TRIGGER
@ SPELL_SUMMON_BLACK_HOLE
@ 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
@ SAY_ALGALON_START_TIMER
@ SAY_BRANN_ALGALON_OUTRO
@ EMOTE_ALGALON_BIG_BANG
Position const AlgalonSummonPos
Position const BrannIntroSpawnPos
@ EVENT_ASCEND_TO_THE_HEAVENS
@ EVENT_SUMMON_COLLAPSING_STAR
bool Execute(uint64 execTime, uint32) override
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
SpellInfo const * GetSpellInfo() const
AuraEffect * GetEffect(uint8 effIndex) const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Unit * GetUnitOwner() const
uint8 GetStackAmount() const
HookList< EffectApplyHandler > OnEffectApply
Definition: SpellScript.h:2024
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
SummonList summons
EventMap events
bool Execute(uint64, uint32) override
void DoZoneInCombat()
Definition: CreatureAI.h:161
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
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
Definition: CreatureAI.cpp:464
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetRegenerateHealth(bool value)
Definition: Creature.h:358
void SetImmuneToNPC(bool apply) override
Definition: Creature.h:173
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
bool Empty() const
Definition: EventMap.h:84
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void DelayEvents(Milliseconds delay)
Definition: EventMap.cpp:96
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
bool IsInPhase(uint8 phase) const
Definition: EventMap.h:217
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
void Reset()
Definition: EventMap.cpp:21
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
GameObject *const me
Definition: GameObjectAI.h:50
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:202
bool HasFlag(GameObjectFlags flags) const
Definition: GameObject.h:273
void Delete()
void SetFlag(GameObjectFlags flags)
Definition: GameObject.h:274
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
GameObject * GetGameObject(uint32 type)
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, Milliseconds duration=0ms, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty, SmoothPhasingInfo const *smoothPhasingInfo=nullptr)
Definition: Object.cpp:1836
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE)
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
void MoveRandom(float wanderDistance=0.0f, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_DEFAULT)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: Player.cpp:9888
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
HookList< CastHandler > AfterCast
Definition: SpellScript.h:824
Creature * GetHitCreature() const
int32 GetHitDamage() const
Unit * GetCaster() const
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Definition: SpellScript.h:873
HookList< HitHandler > OnHit
Definition: SpellScript.h:850
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void SetHitDamage(int32 damage)
WorldLocation const * GetExplTargetDest() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
bool Execute(uint64 execTime, uint32) override
Unit * GetCurrentVictim()
bool IsThreatListEmpty(bool includeOffline=false) const
virtual void DoAction(int32)
Definition: UnitAI.h:72
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
virtual uint32 GetData(uint32) const
Definition: UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true)
Definition: Unit.cpp:769
void ClearUnitState(uint32 f)
Definition: Unit.h:733
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3812
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
void SetFaction(uint32 faction) override
Definition: Unit.h:859
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:838
TempSummon * ToTempSummon()
Definition: Unit.h:1756
UnitAI * GetAI() const
Definition: Unit.h:660
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetSheath(SheathState sheathed)
Definition: Unit.cpp:5630
uint64 GetMaxHealth() const
Definition: Unit.h:777
uint64 GetHealth() const
Definition: Unit.h:776
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void RemoveAllAuras()
Definition: Unit.cpp:4242
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Map * GetMap() const
Definition: Object.h:624
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
void PlayDirectMusic(uint32 musicId, Player const *target=nullptr) const
Definition: Object.cpp:3600
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
void setActive(bool isActiveObject)
Definition: Object.cpp:922
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
void SetFarVisible(bool on)
Definition: Object.cpp:973
EventProcessor m_Events
Definition: Object.h:777
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
void CountTargets(std::list< WorldObject * > &targets)
void HandleEffectApply(AuraEffect const *, AuraEffectHandleModes)
void HandlePeriodic(AuraEffect const *)
void ModDestHeight(SpellDestination &dest)
bool Validate(SpellInfo const *spellInfo) override
void HandlePeriodic(AuraEffect const *aurEff)
void HandlePeriodic(AuraEffect const *)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void HandlePeriodic(AuraEffect const *)
void HandleDummy(SpellEffIndex effIndex)
void SelectTarget(std::list< WorldObject * > &targets)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
Definition: SpellDefines.h:474
uint32 GetLockId() const
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetPositionZ() const
Definition: Position.h:78
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void ResetThreatList(Unit *who=nullptr)
void RelocateOffset(Position const &offset)
Definition: Spell.cpp:122
void UpdateAI(uint32 diff) override
boss_algalon_the_observer(Creature *creature)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustSummoned(Creature *summon) override
void EnterEvadeMode(EvadeReason why) override
void KilledUnit(Unit *victim) override
void DoAction(int32 action) override
void MovementInform(uint32 movementType, uint32 pointId) override
void JustEngagedWith(Unit *who) override
uint32 GetData(uint32 type) const override
bool OnReportUse(Player *player) override
npc_black_hole(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void JustSummoned(Creature *summon) override
void MovementInform(uint32 type, uint32 pointId) override
void DoAction(int32 action) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustSummoned(Creature *summon) override
npc_collapsing_star(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
uint32 GetData(uint32) const override
npc_living_constellation(Creature *creature)
@ NPC_BLACK_HOLE
@ ACTION_INIT_ALGALON
Definition: ulduar.h:492
@ DATA_ALGALON
Definition: ulduar.h:50
@ DATA_SIGILDOOR_02
Definition: ulduar.h:441
@ DATA_SIGILDOOR_01
Definition: ulduar.h:440
@ DATA_AZEROTH
Definition: ulduar.h:449
@ DATA_BRANN_BRONZEBEARD_ALG
Definition: ulduar.h:447
@ DATA_ALGALON_SUMMON_STATE
Definition: ulduar.h:439
#define RegisterUlduarCreatureAI(ai_name)
Definition: ulduar.h:524
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition: ulduar.h:239
@ NPC_COLLAPSING_STAR
Definition: ulduar.h:235
@ NPC_UNLEASHED_DARK_MATTER
Definition: ulduar.h:241
@ NPC_WORM_HOLE
Definition: ulduar.h:237
@ NPC_LIVING_CONSTELLATION
Definition: ulduar.h:233
@ NPC_ALGALON_STALKER
Definition: ulduar.h:234
@ NPC_ALGALON
Definition: ulduar.h:84
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition: ulduar.h:240
@ NPC_AZEROTH
Definition: ulduar.h:232
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition: ulduar.h:238
@ NPC_BRANN_BRONZBEARD_ALG
Definition: ulduar.h:231