Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_ulduar.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 "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "InstanceScript.h"
9#include "ulduar.h"
10#include "Player.h"
11#include "WorldPacket.h"
12
31
39
41{
42 public:
44
46 {
48
49 // Creatures
73
74 // GameObjects
88
89 // Miscellaneous
99
100 std::set<uint64> mRubbleSpawns;
101
103 {
107 IgnisGUID = 0;
108 RazorscaleGUID = 0;
111 XT002GUID = 0;
112 KologarnGUID = 0;
113 AuriayaGUID = 0;
114 MimironGUID = 0;
115 HodirGUID = 0;
116 ThorimGUID = 0;
117 FreyaGUID = 0;
118 VezaxGUID = 0;
119 YoggSaronGUID = 0;
121 SaraGUID = 0;
123 AlgalonGUID = 0;
126 ThorimChestGUID = 0;
128 HodirChestGUID = 0;
134 _algalonTimer = 61;
137 TeamInInstance = 0;
139 ColossusData = 0;
140 elderCount = 0;
141 illusion = 0;
142 keepersCount = 0;
143 conSpeedAtory = false;
144 Unbroken = true;
145 _algalonSummoned = false;
146 _summonAlgalon = false;
147
148 memset(AlgalonSigilDoorGUID, 0, sizeof(AlgalonSigilDoorGUID));
149 memset(AlgalonFloorGUID, 0, sizeof(AlgalonFloorGUID));
150 memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs));
151 memset(AssemblyGUIDs, 0, sizeof(AssemblyGUIDs));
152 memset(RazorHarpoonGUIDs, 0, sizeof(RazorHarpoonGUIDs));
153 memset(ElderGUIDs, 0, sizeof(ElderGUIDs));
154 memset(BrainRoomDoorGUIDs, 0, sizeof(BrainRoomDoorGUIDs));
155 memset(KeeperGUIDs, 0, sizeof(KeeperGUIDs));
157 memset(_summonYSKeeper, false, sizeof(_summonYSKeeper));
158 }
159
161 {
163 builder.AppendState(WORLD_STATE_ALGALON_DESPAWN_TIMER, std::min<uint32>(_algalonTimer, 60));
164 }
165
167 {
168 if (!TeamInInstance)
169 TeamInInstance = player->GetTeam();
170
171 if (_summonAlgalon)
172 {
173 _summonAlgalon = false;
174 TempSummon* algalon = instance->SummonCreature(NPC_ALGALON, AlgalonLandPos);
175 if (_algalonTimer && _algalonTimer <= 60)
176 algalon->AI()->DoAction(ACTION_INIT_ALGALON);
177 else
179 }
180
181 // Keepers at Observation Ring
183 {
186 }
188 {
191 }
193 {
196 }
198 {
201 }
202
203 // Keepers in Yogg-Saron's room
204 if (_summonYSKeeper[0])
205 instance->SummonCreature(NPC_FREYA_YS, YSKeepersPos[0]);
206 if (_summonYSKeeper[1])
207 instance->SummonCreature(NPC_HODIR_YS, YSKeepersPos[1]);
208 if (_summonYSKeeper[2])
209 instance->SummonCreature(NPC_THORIM_YS, YSKeepersPos[2]);
210 if (_summonYSKeeper[3])
211 instance->SummonCreature(NPC_MIMIRON_YS, YSKeepersPos[3]);
212 }
213
215 {
216 if (!TeamInInstance)
217 {
218 Map::PlayerList const& Players = instance->GetPlayers();
219 if (!Players.isEmpty())
220 if (Player* player = Players.begin()->GetSource())
221 TeamInInstance = player->GetTeam();
222 }
223
224 switch (creature->GetEntry())
225 {
226 case NPC_LEVIATHAN:
227 LeviathanGUID = creature->GetGUID();
228 break;
229 case NPC_IGNIS:
230 IgnisGUID = creature->GetGUID();
231 break;
232
233 // Razorscale
234 case NPC_RAZORSCALE:
235 RazorscaleGUID = creature->GetGUID();
236 break;
238 RazorscaleController = creature->GetGUID();
239 break;
241 ExpeditionCommanderGUID = creature->GetGUID();
242 break;
243
244 // XT-002 Deconstructor
245 case NPC_XT002:
246 XT002GUID = creature->GetGUID();
247 break;
248 case NPC_XT_TOY_PILE:
249 for (uint8 i = 0; i < 4; ++i)
250 if (!XTToyPileGUIDs[i])
251 {
252 XTToyPileGUIDs[i] = creature->GetGUID();
253 break;
254 }
255 break;
256
257 // Assembly of Iron
258 case NPC_STEELBREAKER:
259 AssemblyGUIDs[0] = creature->GetGUID();
260 AddMinion(creature, true);
261 break;
262 case NPC_MOLGEIM:
263 AssemblyGUIDs[1] = creature->GetGUID();
264 AddMinion(creature, true);
265 break;
266 case NPC_BRUNDIR:
267 AssemblyGUIDs[2] = creature->GetGUID();
268 AddMinion(creature, true);
269 break;
270
271 case NPC_KOLOGARN:
272 KologarnGUID = creature->GetGUID();
273 break;
274 case NPC_AURIAYA:
275 AuriayaGUID = creature->GetGUID();
276 break;
277 case NPC_MIMIRON:
278 MimironGUID = creature->GetGUID();
279 break;
280
281 // Hodir
282 case NPC_HODIR:
283 HodirGUID = creature->GetGUID();
284 break;
286 if (TeamInInstance == HORDE)
287 creature->UpdateEntry(NPC_TOR_GREYCLOUD, HORDE);
288 break;
290 if (TeamInInstance == HORDE)
291 creature->UpdateEntry(NPC_KAR_GREYCLOUD, HORDE);
292 break;
294 if (TeamInInstance == HORDE)
295 creature->UpdateEntry(NPC_SPIRITWALKER_TARA, HORDE);
296 break;
298 if (TeamInInstance == HORDE)
299 creature->UpdateEntry(NPC_SPIRITWALKER_YONA, HORDE);
300 break;
302 if (TeamInInstance == HORDE)
303 creature->UpdateEntry(NPC_AMIRA_BLAZEWEAVER, HORDE);
304 break;
306 if (TeamInInstance == HORDE)
307 creature->UpdateEntry(NPC_VEESHA_BLAZEWEAVER, HORDE);
308 break;
310 if (TeamInInstance == HORDE)
311 creature->UpdateEntry(NPC_BATTLE_PRIEST_ELIZA, HORDE);
312 break;
314 if (TeamInInstance == HORDE)
315 creature->UpdateEntry(NPC_BATTLE_PRIEST_GINA, HORDE);
316 break;
317
318 case NPC_THORIM:
319 ThorimGUID = creature->GetGUID();
320 break;
321
322 // Freya
323 case NPC_FREYA:
324 FreyaGUID = creature->GetGUID();
325 break;
326 case NPC_IRONBRANCH:
327 ElderGUIDs[0] = creature->GetGUID();
329 creature->DespawnOrUnsummon();
330 break;
331 case NPC_BRIGHTLEAF:
332 ElderGUIDs[1] = creature->GetGUID();
334 creature->DespawnOrUnsummon();
335 break;
336 case NPC_STONEBARK:
337 ElderGUIDs[2] = creature->GetGUID();
339 creature->DespawnOrUnsummon();
340 break;
341
342 case NPC_VEZAX:
343 VezaxGUID = creature->GetGUID();
344 break;
345
346 // Yogg-Saron
347 case NPC_YOGG_SARON:
348 YoggSaronGUID = creature->GetGUID();
349 break;
351 VoiceOfYoggSaronGUID = creature->GetGUID();
352 break;
354 BrainOfYoggSaronGUID = creature->GetGUID();
355 break;
356 case NPC_SARA:
357 SaraGUID = creature->GetGUID();
358 break;
359 case NPC_FREYA_YS:
360 KeeperGUIDs[0] = creature->GetGUID();
361 _summonYSKeeper[0] = false;
362 SaveToDB();
363 ++keepersCount;
364 break;
365 case NPC_HODIR_YS:
366 KeeperGUIDs[1] = creature->GetGUID();
367 _summonYSKeeper[1] = false;
368 SaveToDB();
369 ++keepersCount;
370 break;
371 case NPC_THORIM_YS:
372 KeeperGUIDs[2] = creature->GetGUID();
373 _summonYSKeeper[2] = false;
374 SaveToDB();
375 ++keepersCount;
376 break;
377 case NPC_MIMIRON_YS:
378 KeeperGUIDs[3] = creature->GetGUID();
379 _summonYSKeeper[3] = false;
380 SaveToDB();
381 ++keepersCount;
382 break;
383 case NPC_SANITY_WELL:
384 creature->SetReactState(REACT_PASSIVE);
385 break;
386
387 // Algalon
388 case NPC_ALGALON:
389 AlgalonGUID = creature->GetGUID();
390 break;
392 BrannBronzebeardAlgGUID = creature->GetGUID();
393 break;
401 if (Creature* algalon = instance->GetCreature(AlgalonGUID))
402 algalon->AI()->JustSummoned(creature);
403 break;
404 }
405 }
406
408 {
409 switch (creature->GetEntry())
410 {
411 case NPC_XT_TOY_PILE:
412 for (uint8 i = 0; i < 4; ++i)
413 if (XTToyPileGUIDs[i] == creature->GetGUID())
414 {
415 XTToyPileGUIDs[i] = 0;
416 break;
417 }
418 break;
419 case NPC_STEELBREAKER:
420 case NPC_MOLGEIM:
421 case NPC_BRUNDIR:
422 AddMinion(creature, false);
423 break;
425 if (BrannBronzebeardAlgGUID == creature->GetGUID())
427 break;
428 default:
429 break;
430 }
431 }
432
434 {
435 switch (gameObject->GetEntry())
436 {
439 KologarnChestGUID = gameObject->GetGUID();
440 break;
442 KologarnBridgeGUID = gameObject->GetGUID();
444 HandleGameObject(0, false, gameObject);
445 break;
447 case GO_THORIM_CHEST:
448 ThorimChestGUID = gameObject->GetGUID();
449 break;
452 HodirRareCacheGUID = gameObject->GetGUID();
453 break;
455 case GO_HODIR_CHEST:
456 HodirChestGUID = gameObject->GetGUID();
457 break;
459 LeviathanGateGUID = gameObject->GetGUID();
461 gameObject->SetGoState(GOState::GO_STATE_ACTIVE_ALTERNATIVE);
462 break;
464 case GO_XT_002_DOOR:
466 case GO_ARCHIVUM_DOOR:
468 case GO_HODIR_DOOR:
470 case GO_VEZAX_DOOR:
472 AddDoor(gameObject, true);
473 break;
475 RazorHarpoonGUIDs[0] = gameObject->GetGUID();
476 break;
478 RazorHarpoonGUIDs[1] = gameObject->GetGUID();
479 break;
481 RazorHarpoonGUIDs[2] = gameObject->GetGUID();
482 break;
484 RazorHarpoonGUIDs[3] = gameObject->GetGUID();
485 break;
486 case GO_MOLE_MACHINE:
488 gameObject->SetGoState(GOState::GO_STATE_ACTIVE);
489 break;
491 BrainRoomDoorGUIDs[0] = gameObject->GetGUID();
492 break;
494 BrainRoomDoorGUIDs[1] = gameObject->GetGUID();
495 break;
497 BrainRoomDoorGUIDs[2] = gameObject->GetGUID();
498 break;
502 gameObject->SetFlag(GAMEOBJECT_FIELD_FLAGS, GO_FLAG_IN_USE);
503 break;
505 AlgalonSigilDoorGUID[0] = gameObject->GetGUID();
507 gameObject->SetGoState(GOState::GO_STATE_ACTIVE);
508 break;
510 AlgalonSigilDoorGUID[1] = gameObject->GetGUID();
512 gameObject->SetGoState(GOState::GO_STATE_ACTIVE);
513 break;
515 AlgalonSigilDoorGUID[2] = gameObject->GetGUID();
516 AddDoor(gameObject, true);
517 break;
519 AlgalonFloorGUID[0] = gameObject->GetGUID();
520 AddDoor(gameObject, true);
521 break;
523 AlgalonFloorGUID[1] = gameObject->GetGUID();
524 AddDoor(gameObject, true);
525 break;
527 AlgalonUniverseGUID = gameObject->GetGUID();
528 AddDoor(gameObject, true);
529 break;
531 AlgalonTrapdoorGUID = gameObject->GetGUID();
532 AddDoor(gameObject, true);
533 break;
536 GiftOfTheObserverGUID = gameObject->GetGUID();
537 break;
538 default:
539 break;
540 }
541 }
542
544 {
545 switch (gameObject->GetEntry())
546 {
548 case GO_XT_002_DOOR:
550 case GO_ARCHIVUM_DOOR:
552 case GO_HODIR_DOOR:
554 case GO_VEZAX_DOOR:
561 AddDoor(gameObject, false);
562 break;
563 default:
564 break;
565 }
566 }
567
569 {
570 Creature* creature = unit->ToCreature();
571 if (!creature)
572 return;
573
574 switch (creature->GetEntry())
575 {
580 case NPC_MANGROVE_ENT:
584 if (!conSpeedAtory)
585 {
587 conSpeedAtory = true;
588 }
589 break;
590 default:
591 break;
592 }
593 }
594
595 void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId) OVERRIDE
596 {
597 // Flame Leviathan's Tower Event triggers
598 Creature* FlameLeviathan = instance->GetCreature(LeviathanGUID);
599
600 switch (eventId)
601 {
603 if (FlameLeviathan && FlameLeviathan->IsAlive())
604 FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_STORM_DESTROYED);
605 break;
607 if (FlameLeviathan && FlameLeviathan->IsAlive())
608 FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FROST_DESTROYED);
609 break;
611 if (FlameLeviathan && FlameLeviathan->IsAlive())
612 FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FLAMES_DESTROYED);
613 break;
615 if (FlameLeviathan && FlameLeviathan->IsAlive())
616 FlameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED);
617 break;
619 if (Creature* freya = instance->GetCreature(KeeperGUIDs[0]))
620 freya->AI()->DoAction(4/*ACTION_SANITY_WELLS*/);
621 break;
623 if (Creature* hodir = instance->GetCreature(KeeperGUIDs[1]))
624 hodir->AI()->DoAction(5/*ACTION_FLASH_FREEZE*/);
625 break;
626 }
627 }
628
630 {
631 if (!InstanceScript::SetBossState(type, state))
632 return false;
633
634 switch (type)
635 {
636 case BOSS_LEVIATHAN:
637 case BOSS_IGNIS:
638 case BOSS_RAZORSCALE:
639 case BOSS_XT002:
641 case BOSS_AURIAYA:
642 case BOSS_VEZAX:
643 case BOSS_YOGG_SARON:
644 break;
645 case BOSS_MIMIRON:
646 if (state == DONE)
648 break;
649 case BOSS_FREYA:
650 if (state == DONE)
652 break;
653 case BOSS_KOLOGARN:
654 if (state == DONE)
655 {
656 if (GameObject* gameObject = instance->GetGameObject(KologarnChestGUID))
657 {
658 gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
659 gameObject->RemoveFlag(GAMEOBJECT_FIELD_FLAGS, GO_FLAG_NOT_SELECTABLE);
660 }
662 }
663 break;
664 case BOSS_HODIR:
665 if (state == DONE)
666 {
667 if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
669 HodirRareCache->RemoveFlag(GAMEOBJECT_FIELD_FLAGS, GO_FLAG_NOT_SELECTABLE);
670 if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID))
671 HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());
672
674 }
675 break;
676 case BOSS_THORIM:
677 if (state == DONE)
678 {
679 if (GameObject* gameObject = instance->GetGameObject(ThorimChestGUID))
680 gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
681
683 }
684 break;
685 case BOSS_ALGALON:
686 if (state == DONE)
687 {
689 _events.CancelEvent(EVENT_DESPAWN_ALGALON);
691 _algalonTimer = 61;
692 if (GameObject* gameObject = instance->GetGameObject(GiftOfTheObserverGUID))
693 gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
694 // get item level (recheck weapons)
695 Map::PlayerList const& players = instance->GetPlayers();
696 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
697 if (Player* player = itr->GetSource())
698 for (uint8 slot = EQUIPMENT_SLOT_MAINHAND; slot <= EQUIPMENT_SLOT_OFFHAND; ++slot)
699 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
700 if (item->GetTemplate()->ItemLevel > _maxWeaponItemLevel)
701 _maxWeaponItemLevel = item->GetTemplate()->ItemLevel;
702 }
703 else if (state == IN_PROGRESS)
704 {
705 // get item level (armor cannot be swapped in combat)
706 Map::PlayerList const& players = instance->GetPlayers();
707 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
708 {
709 if (Player* player = itr->GetSource())
710 {
711 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
712 {
713 if (slot == EQUIPMENT_SLOT_TABARD || slot == EQUIPMENT_SLOT_BODY)
714 continue;
715
716 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
717 {
718 if (slot >= EQUIPMENT_SLOT_MAINHAND && slot <= EQUIPMENT_SLOT_OFFHAND)
719 {
720 if (item->GetTemplate()->ItemLevel > _maxWeaponItemLevel)
721 _maxWeaponItemLevel = item->GetTemplate()->ItemLevel;
722 }
723 else if (item->GetTemplate()->ItemLevel > _maxArmorItemLevel)
724 _maxArmorItemLevel = item->GetTemplate()->ItemLevel;
725 }
726 }
727 }
728 }
729 }
730 break;
731 }
732
733 return true;
734 }
735
736 void SetData(uint32 type, uint32 data) OVERRIDE
737 {
738 switch (type)
739 {
740 case DATA_COLOSSUS:
741 ColossusData = data;
742 if (data == 2)
743 {
744 if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
745 Leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
746 if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID))
747 gameObject->SetGoState(GOState::GO_STATE_ACTIVE_ALTERNATIVE);
748 SaveToDB();
749 }
750 break;
752 HodirRareCacheData = data;
754 {
755 if (Creature* Hodir = instance->GetCreature(HodirGUID))
756 if (GameObject* gameObject = instance->GetGameObject(HodirRareCacheGUID))
757 Hodir->RemoveGameObject(gameObject, false);
758 }
759 break;
760 case DATA_UNBROKEN:
761 Unbroken = bool(data);
762 break;
763 case DATA_ILLUSION:
764 illusion = data;
765 break;
767 IsDriveMeCrazyEligible = data ? true : false;
768 break;
772 _algalonTimer = 60;
773 _events.ScheduleEvent(EVENT_DESPAWN_ALGALON, 3600000);
774 _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000);
775 break;
777 _algalonSummoned = true;
778 break;
779 default:
780 break;
781 }
782 }
783
784 void SetData64(uint32 /*type*/, uint64 /*data*/) OVERRIDE
785 {
786 }
787
789 {
790 switch (data)
791 {
792 case BOSS_LEVIATHAN:
793 return LeviathanGUID;
794 case BOSS_IGNIS:
795 return IgnisGUID;
796
797 // Razorscale
798 case BOSS_RAZORSCALE:
799 return RazorscaleGUID;
805 return RazorHarpoonGUIDs[0];
807 return RazorHarpoonGUIDs[1];
809 return RazorHarpoonGUIDs[2];
811 return RazorHarpoonGUIDs[3];
812
813 // XT-002 Deconstructor
814 case BOSS_XT002:
815 return XT002GUID;
816 case DATA_TOY_PILE_0:
817 case DATA_TOY_PILE_1:
818 case DATA_TOY_PILE_2:
819 case DATA_TOY_PILE_3:
820 return XTToyPileGUIDs[data - DATA_TOY_PILE_0];
821
822 // Assembly of Iron
824 return AssemblyGUIDs[0];
825 case DATA_MOLGEIM:
826 return AssemblyGUIDs[1];
827 case DATA_BRUNDIR:
828 return AssemblyGUIDs[2];
829
830 case BOSS_KOLOGARN:
831 return KologarnGUID;
832 case BOSS_AURIAYA:
833 return AuriayaGUID;
834 case BOSS_MIMIRON:
835 return MimironGUID;
836 case BOSS_HODIR:
837 return HodirGUID;
838 case BOSS_THORIM:
839 return ThorimGUID;
840
841 // Freya
842 case BOSS_FREYA:
843 return FreyaGUID;
844 case BOSS_BRIGHTLEAF:
845 return ElderGUIDs[0];
846 case BOSS_IRONBRANCH:
847 return ElderGUIDs[1];
848 case BOSS_STONEBARK:
849 return ElderGUIDs[2];
850
851 case BOSS_VEZAX:
852 return VezaxGUID;
853
854 // Yogg-Saron
855 case BOSS_YOGG_SARON:
856 return YoggSaronGUID;
861 case DATA_SARA:
862 return SaraGUID;
864 return BrainRoomDoorGUIDs[0];
866 return BrainRoomDoorGUIDs[1];
868 return BrainRoomDoorGUIDs[2];
869 case DATA_FREYA_YS:
870 return KeeperGUIDs[0];
871 case DATA_HODIR_YS:
872 return KeeperGUIDs[1];
873 case DATA_THORIM_YS:
874 return KeeperGUIDs[2];
875 case DATA_MIMIRON_YS:
876 return KeeperGUIDs[3];
877
878 // Algalon
879 case BOSS_ALGALON:
880 return AlgalonGUID;
882 return AlgalonSigilDoorGUID[0];
884 return AlgalonSigilDoorGUID[1];
886 return AlgalonSigilDoorGUID[2];
888 return AlgalonFloorGUID[0];
890 return AlgalonFloorGUID[1];
892 return AlgalonUniverseGUID;
894 return AlgalonTrapdoorGUID;
897 }
898
899 return 0;
900 }
901
903 {
904 switch (type)
905 {
906 case DATA_COLOSSUS:
907 return ColossusData;
909 return HodirRareCacheData;
910 case DATA_UNBROKEN:
911 return uint32(Unbroken);
912 case DATA_ILLUSION:
913 return illusion;
915 return keepersCount;
916 default:
917 break;
918 }
919
920 return 0;
921 }
922
957
958 std::string GetSaveData() OVERRIDE
959 {
961
962 std::ostringstream saveStream;
963 saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << (_algalonSummoned ? 1 : 0);
964
965 for (uint8 i = 0; i < 4; ++i)
966 saveStream << ' ' << (KeeperGUIDs[i] ? 1 : 0);
967
969 return saveStream.str();
970 }
971
972 void Load(char const* strIn) OVERRIDE
973 {
974 if (!strIn)
975 {
977 return;
978 }
979
980 OUT_LOAD_INST_DATA(strIn);
981
982 char dataHead1, dataHead2;
983
984 std::istringstream loadStream(strIn);
985 loadStream >> dataHead1 >> dataHead2;
986
987 if (dataHead1 == 'U' && dataHead2 == 'U')
988 {
989 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
990 {
991 uint32 tmpState;
992 loadStream >> tmpState;
993 if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
994 tmpState = NOT_STARTED;
995
996 SetBossState(i, EncounterState(tmpState));
997 }
998
999 uint32 tempState;
1000 loadStream >> tempState;
1001 if (tempState == IN_PROGRESS || tempState > SPECIAL)
1002 tempState = NOT_STARTED;
1003 SetData(DATA_COLOSSUS, tempState);
1004
1005 loadStream >> _algalonTimer;
1006 loadStream >> tempState;
1007 _algalonSummoned = tempState != 0;
1009 {
1010 _summonAlgalon = true;
1011 if (_algalonTimer && _algalonTimer <= 60)
1012 {
1013 _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000);
1016 }
1017 }
1018
1019 for (uint8 i = 0; i < 4; ++i)
1020 {
1021 loadStream >> tempState;
1022 _summonYSKeeper[i] = tempState != 0;
1023 }
1024
1033 }
1034
1036 }
1037
1039 {
1040 if (_events.Empty())
1041 return;
1042
1043 _events.Update(diff);
1044
1045 while (uint32 eventId = _events.ExecuteEvent())
1046 {
1047 switch (eventId)
1048 {
1050 SaveToDB();
1052 if (_algalonTimer)
1053 _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000);
1054 else
1055 {
1058 if (Creature* algalon = instance->GetCreature(AlgalonGUID))
1059 algalon->AI()->DoAction(EVENT_DESPAWN_ALGALON);
1060 }
1061 break;
1062 }
1063 }
1064 }
1065
1066 private:
1075 };
1076
1081};
1082
1084{
1085 new instance_ulduar();
1086}
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:158
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
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ GO_STATE_ACTIVE_ALTERNATIVE
Definition GameObject.h:578
#define OUT_LOAD_INST_DATA_FAIL
EncounterState
@ IN_PROGRESS
@ DONE
@ SPECIAL
@ NOT_STARTED
#define OUT_SAVE_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA
#define OUT_LOAD_INST_DATA(a)
@ DOOR_TYPE_SPAWN_HOLE
@ DOOR_TYPE_ROOM
@ DOOR_TYPE_PASSAGE
@ BOUNDARY_NONE
@ BOUNDARY_W
@ BOUNDARY_S
@ BOUNDARY_N
@ BOUNDARY_E
@ EQUIPMENT_SLOT_BODY
Definition Player.h:692
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:704
@ EQUIPMENT_SLOT_TABARD
Definition Player.h:707
@ EQUIPMENT_SLOT_END
Definition Player.h:708
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:705
@ EQUIPMENT_SLOT_START
Definition Player.h:688
#define INVENTORY_SLOT_BAG_0
Definition Player.h:684
@ HORDE
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_IN_USE
@ REACT_PASSIVE
Definition Unit.h:1156
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FIELD_FLAGS
@ GAMEOBJECT_FIELD_FLAGS
Position const AlgalonLandPos
Position const ObservationRingKeepersPos[4]
Position const YSKeepersPos[4]
CreatureAI * AI() const
Definition Creature.h:483
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
std::string GetBossSaveData()
void AddMinion(Creature *minion, bool add)
EncounterState GetBossState(uint32 id) const
void AddDoor(GameObject *door, bool add)
void LoadMinionData(MinionData const *data)
void LoadDoorData(DoorData const *data)
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
Definition Item.h:202
bool isEmpty() const
Definition LinkedList.h:86
MapRefManager PlayerList
Definition Map.h:406
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:1280
uint32 GetEntry() const
Definition Object.h:125
Creature * ToCreature()
Definition Object.h:207
FROM * GetSource() const
Definition Reference.h:83
virtual void DoAction(int32)
Definition UnitAI.h:126
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
DoorData const doorData[]
#define MAX_ENCOUNTER
MinionData const minionData[]
MinionData const minionData[]
static DoorData const doorData[]
void AddSC_instance_ulduar()
void OnGameObjectRemove(GameObject *gameObject) OVERRIDE
void FillInitialWorldStates(WorldStateBuilder &builder) OVERRIDE
bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const *, Unit const *, uint32) OVERRIDE
bool SetBossState(uint32 type, EncounterState state) OVERRIDE
void SetData(uint32 type, uint32 data) OVERRIDE
void ProcessEvent(WorldObject *, uint32 eventId) OVERRIDE
void OnCreatureCreate(Creature *creature) OVERRIDE
void OnGameObjectCreate(GameObject *gameObject) OVERRIDE
void OnCreatureRemove(Creature *creature) OVERRIDE
@ ICECROWN_ILLUSION
Definition ulduar.h:331
@ STORMWIND_ILLUSION
Definition ulduar.h:332
@ CHAMBER_ILLUSION
Definition ulduar.h:330
@ EVENT_DESPAWN_ALGALON
Definition ulduar.h:323
@ ACTION_INIT_ALGALON
Definition ulduar.h:325
@ EVENT_UPDATE_ALGALON_TIMER
Definition ulduar.h:324
@ BOSS_IGNIS
Definition ulduar.h:21
@ BOSS_BRIGHTLEAF
Definition ulduar.h:31
@ BOSS_LEVIATHAN
Definition ulduar.h:20
@ BOSS_ALGALON
Definition ulduar.h:36
@ BOSS_RAZORSCALE
Definition ulduar.h:22
@ BOSS_STONEBARK
Definition ulduar.h:33
@ BOSS_IRONBRANCH
Definition ulduar.h:32
@ BOSS_HODIR
Definition ulduar.h:28
@ BOSS_YOGG_SARON
Definition ulduar.h:35
@ BOSS_KOLOGARN
Definition ulduar.h:25
@ BOSS_THORIM
Definition ulduar.h:29
@ BOSS_FREYA
Definition ulduar.h:30
@ BOSS_AURIAYA
Definition ulduar.h:26
@ BOSS_ASSEMBLY_OF_IRON
Definition ulduar.h:24
@ BOSS_XT002
Definition ulduar.h:23
@ BOSS_MIMIRON
Definition ulduar.h:27
@ BOSS_VEZAX
Definition ulduar.h:34
@ DATA_UNBROKEN
Definition ulduar.h:316
@ MAX_HERALD_WEAPON_ITEMLEVEL
Definition ulduar.h:318
@ MAX_HERALD_ARMOR_ITEMLEVEL
Definition ulduar.h:317
@ DATA_SARA
Definition ulduar.h:285
@ DATA_SIGILDOOR_02
Definition ulduar.h:298
@ DATA_TOY_PILE_3
Definition ulduar.h:273
@ DATA_MOLGEIM
Definition ulduar.h:277
@ DATA_DRIVE_ME_CRAZY
Definition ulduar.h:292
@ DATA_RAZORSCALE_CONTROL
Definition ulduar.h:267
@ DATA_BRUNDIR
Definition ulduar.h:278
@ DATA_ILLUSION
Definition ulduar.h:291
@ DATA_TOY_PILE_0
Definition ulduar.h:270
@ DATA_SIGILDOOR_01
Definition ulduar.h:297
@ DATA_EXPEDITION_COMMANDER
Definition ulduar.h:266
@ DATA_STEELBREAKER
Definition ulduar.h:276
@ DATA_BRANN_BRONZEBEARD_ALG
Definition ulduar.h:304
@ DATA_MIMIRON_YS
Definition ulduar.h:290
@ DATA_KEEPERS_COUNT
Definition ulduar.h:293
@ DATA_TOY_PILE_1
Definition ulduar.h:271
@ DATA_FREYA_YS
Definition ulduar.h:287
@ DATA_HODIR_RARE_CACHE
Definition ulduar.h:281
@ DATA_BRAIN_OF_YOGG_SARON
Definition ulduar.h:286
@ DATA_UNIVERSE_FLOOR_02
Definition ulduar.h:301
@ DATA_UNIVERSE_GLOBE
Definition ulduar.h:302
@ DATA_UNIVERSE_FLOOR_01
Definition ulduar.h:300
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:296
@ DATA_SIGILDOOR_03
Definition ulduar.h:299
@ DATA_TOY_PILE_2
Definition ulduar.h:272
@ DATA_VOICE_OF_YOGG_SARON
Definition ulduar.h:284
@ DATA_THORIM_YS
Definition ulduar.h:289
@ DATA_ALGALON_TRAPDOOR
Definition ulduar.h:303
@ DATA_HODIR_YS
Definition ulduar.h:288
@ DATA_COLOSSUS
Definition ulduar.h:263
@ GO_DOODAD_UL_SIGILDOOR_03
Definition ulduar.h:209
@ GO_DOODAD_UL_UNIVERSEGLOBE01
Definition ulduar.h:212
@ GO_HODIR_ICE_DOOR
Definition ulduar.h:185
@ GO_BRAIN_ROOM_DOOR_2
Definition ulduar.h:201
@ GO_XT_002_DOOR
Definition ulduar.h:170
@ GO_HODIR_RARE_CACHE_OF_WINTER
Definition ulduar.h:186
@ GO_DOODAD_UL_SIGILDOOR_01
Definition ulduar.h:207
@ GO_BRAIN_ROOM_DOOR_3
Definition ulduar.h:202
@ GO_LEVIATHAN_GATE
Definition ulduar.h:159
@ GO_GIFT_OF_THE_OBSERVER_10
Definition ulduar.h:214
@ GO_ARCHIVUM_DOOR
Definition ulduar.h:174
@ GO_KOLOGARN_BRIDGE
Definition ulduar.h:179
@ GO_VEZAX_DOOR
Definition ulduar.h:196
@ GO_BRAIN_ROOM_DOOR_1
Definition ulduar.h:200
@ GO_THORIM_CHEST
Definition ulduar.h:193
@ GO_RAZOR_HARPOON_4
Definition ulduar.h:166
@ GO_DOODAD_UL_SIGILDOOR_02
Definition ulduar.h:208
@ GO_IRON_COUNCIL_DOOR
Definition ulduar.h:173
@ GO_HODIR_RARE_CACHE_OF_WINTER_HERO
Definition ulduar.h:187
@ GO_CELESTIAL_PLANETARIUM_ACCESS_25
Definition ulduar.h:206
@ GO_HODIR_ENTRANCE
Definition ulduar.h:183
@ GO_DOODAD_UL_ULDUAR_TRAPDOOR_03
Definition ulduar.h:213
@ GO_HODIR_CHEST
Definition ulduar.h:189
@ GO_KOLOGARN_CHEST
Definition ulduar.h:178
@ GO_LEVIATHAN_DOOR
Definition ulduar.h:158
@ GO_HODIR_CHEST_HERO
Definition ulduar.h:188
@ GO_YOGG_SARON_DOOR
Definition ulduar.h:199
@ GO_RAZOR_HARPOON_3
Definition ulduar.h:165
@ GO_RAZOR_HARPOON_2
Definition ulduar.h:164
@ GO_DOODAD_UL_UNIVERSEFLOOR_01
Definition ulduar.h:210
@ GO_HODIR_DOOR
Definition ulduar.h:184
@ GO_RAZOR_HARPOON_1
Definition ulduar.h:163
@ GO_GIFT_OF_THE_OBSERVER_25
Definition ulduar.h:215
@ GO_THORIM_CHEST_HERO
Definition ulduar.h:192
@ GO_KOLOGARN_CHEST_HERO
Definition ulduar.h:177
@ GO_CELESTIAL_PLANETARIUM_ACCESS_10
Definition ulduar.h:205
@ GO_DOODAD_UL_UNIVERSEFLOOR_02
Definition ulduar.h:211
@ GO_MOLE_MACHINE
Definition ulduar.h:162
@ ACTION_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:232
@ ACTION_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:230
@ ACTION_MOVE_TO_CENTER_POSITION
Definition ulduar.h:234
@ ACTION_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:233
@ ACTION_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:231
@ WORLD_STATE_ALGALON_DESPAWN_TIMER
Definition ulduar.h:309
@ WORLD_STATE_ALGALON_TIMER_ENABLED
Definition ulduar.h:310
@ NPC_VEZAX
Definition ulduar.h:66
@ NPC_BRIGHTLEAF
Definition ulduar.h:77
@ NPC_NATURES_BLADE
Definition ulduar.h:105
@ NPC_MOLGEIM
Definition ulduar.h:53
@ NPC_FIELD_MEDIC_PENNY
Definition ulduar.h:95
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition ulduar.h:150
@ NPC_HODIR_OBSERVATION_RING
Definition ulduar.h:111
@ NPC_BRUNDIR
Definition ulduar.h:54
@ NPC_GUARDIAN_LASHER
Definition ulduar.h:101
@ NPC_AMIRA_BLAZEWEAVER
Definition ulduar.h:89
@ NPC_MIMIRON_OBSERVATION_RING
Definition ulduar.h:114
@ NPC_XT_TOY_PILE
Definition ulduar.h:51
@ NPC_UNLEASHED_DARK_MATTER
Definition ulduar.h:152
@ NPC_IRONROOT_LASHER
Definition ulduar.h:104
@ NPC_MISGUIDED_NYMPH
Definition ulduar.h:100
@ NPC_BATTLE_PRIEST_ELIZA
Definition ulduar.h:93
@ NPC_BRAIN_OF_YOGG_SARON
Definition ulduar.h:130
@ NPC_YOGG_SARON
Definition ulduar.h:67
@ NPC_THORIM_YS
Definition ulduar.h:120
@ NPC_SARA
Definition ulduar.h:109
@ NPC_FOREST_SWARMER
Definition ulduar.h:102
@ NPC_SISSY_FLAMECUFFS
Definition ulduar.h:92
@ NPC_FREYA
Definition ulduar.h:65
@ NPC_EIVI_NIGHTFEATHER
Definition ulduar.h:83
@ NPC_THORIM
Definition ulduar.h:64
@ NPC_STONEBARK
Definition ulduar.h:78
@ NPC_SANITY_WELL
Definition ulduar.h:137
@ NPC_EXPEDITION_COMMANDER
Definition ulduar.h:49
@ NPC_ALGALON
Definition ulduar.h:68
@ NPC_XT002
Definition ulduar.h:50
@ NPC_FREYA_OBSERVATION_RING
Definition ulduar.h:112
@ NPC_HODIR_YS
Definition ulduar.h:118
@ NPC_THORIM_OBSERVATION_RING
Definition ulduar.h:113
@ NPC_HODIR
Definition ulduar.h:63
@ NPC_RAZORSCALE_CONTROLLER
Definition ulduar.h:47
@ NPC_KAR_GREYCLOUD
Definition ulduar.h:82
@ NPC_MISSY_FLAMECUFFS
Definition ulduar.h:91
@ NPC_MANGROVE_ENT
Definition ulduar.h:103
@ NPC_BATTLE_PRIEST_GINA
Definition ulduar.h:94
@ NPC_IGNIS
Definition ulduar.h:45
@ NPC_LEVIATHAN
Definition ulduar.h:42
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition ulduar.h:151
@ NPC_SPIRITWALKER_YONA
Definition ulduar.h:86
@ NPC_ELEMENTALIST_MAHFUUN
Definition ulduar.h:87
@ NPC_GUARDIAN_OF_LIFE
Definition ulduar.h:106
@ NPC_MIMIRON_YS
Definition ulduar.h:119
@ NPC_TOR_GREYCLOUD
Definition ulduar.h:81
@ NPC_STEELBREAKER
Definition ulduar.h:52
@ NPC_VOICE_OF_YOGG_SARON
Definition ulduar.h:115
@ NPC_KOLOGARN
Definition ulduar.h:55
@ NPC_IRONBRANCH
Definition ulduar.h:76
@ NPC_AURIAYA
Definition ulduar.h:61
@ NPC_RAZORSCALE
Definition ulduar.h:46
@ NPC_SPIRITWALKER_TARA
Definition ulduar.h:85
@ NPC_ELLIE_NIGHTFEATHER
Definition ulduar.h:84
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition ulduar.h:149
@ NPC_FREYA_YS
Definition ulduar.h:117
@ NPC_BRANN_BRONZBEARD_ALG
Definition ulduar.h:142
@ NPC_CORRUPTED_SERVITOR
Definition ulduar.h:99
@ NPC_VEESHA_BLAZEWEAVER
Definition ulduar.h:90
@ NPC_MIMIRON
Definition ulduar.h:62
@ NPC_ELEMENTALIST_AVUUN
Definition ulduar.h:88
@ NPC_FIELD_MEDIC_JESSI
Definition ulduar.h:96
@ EVENT_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:220
@ EVENT_HODIRS_PROTECTIVE_GAZE_PROC
Definition ulduar.h:225
@ EVENT_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:223
@ EVENT_ACTIVATE_SANITY_WELL
Definition ulduar.h:224
@ EVENT_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:222
@ EVENT_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:221
#define UlduarScriptName
Definition ulduar.h:10
@ CRITERIA_THREE_LIGHTS_IN_THE_DARKNESS_10
Definition ulduar.h:249
@ CRITERIA_WAITS_DREAMING_CHAMBER_25
Definition ulduar.h:242
@ CRITERIA_WAITS_DREAMING_STORMWIND_25
Definition ulduar.h:241
@ CRITERIA_DRIVE_ME_CRAZY_25
Definition ulduar.h:248
@ CRITERIA_THREE_LIGHTS_IN_THE_DARKNESS_25
Definition ulduar.h:250
@ CRITERIA_ONE_LIGHT_IN_THE_DARKNESS_10
Definition ulduar.h:253
@ CRITERIA_WAITS_DREAMING_STORMWIND_10
Definition ulduar.h:244
@ CRITERIA_WAITS_DREAMING_ICECROWN_10
Definition ulduar.h:246
@ CRITERIA_TWO_LIGHTS_IN_THE_DARKNESS_25
Definition ulduar.h:252
@ CRITERIA_CON_SPEED_ATORY
Definition ulduar.h:239
@ CRITERIA_ONE_LIGHT_IN_THE_DARKNESS_25
Definition ulduar.h:254
@ CRITERIA_TWO_LIGHTS_IN_THE_DARKNESS_10
Definition ulduar.h:251
@ CRITERIA_WAITS_DREAMING_CHAMBER_10
Definition ulduar.h:245
@ CRITERIA_DRIVE_ME_CRAZY_10
Definition ulduar.h:247
@ CRITERIA_HERALD_OF_TITANS
Definition ulduar.h:257
@ CRITERIA_ALONE_IN_THE_DARKNESS_25
Definition ulduar.h:256
@ CRITERIA_WAITS_DREAMING_ICECROWN_25
Definition ulduar.h:243
@ CRITERIA_ALONE_IN_THE_DARKNESS_10
Definition ulduar.h:255