TrinityCore
Loading...
Searching...
No Matches
instance_icecrown_citadel.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 "icecrown_citadel.h"
19#include "AreaBoundary.h"
20#include "Creature.h"
21#include "CreatureAI.h"
22#include "EventMap.h"
23#include "InstanceScript.h"
24#include "Map.h"
25#include "ObjectMgr.h"
26#include "Player.h"
27#include "QuestPools.h"
28#include "ScriptMgr.h"
29#include "TemporarySummon.h"
30#include "Transport.h"
31#include "TransportMgr.h"
32#include "WorldStatePackets.h"
33#include <unordered_set>
34
46
54
60
62{
63 { DATA_LORD_MARROWGAR, new CircleBoundary(Position(-428.0f,2211.0f), 95.0) },
64 { DATA_LORD_MARROWGAR, new RectangleBoundary(-430.0f, -330.0f, 2110.0f, 2310.0f) },
65 { DATA_LADY_DEATHWHISPER, new RectangleBoundary(-670.0f, -520.0f, 2145.0f, 2280.0f) },
66 { DATA_DEATHBRINGER_SAURFANG, new RectangleBoundary(-565.0f, -465.0f, 2160.0f, 2260.0f) },
67 { DATA_ROTFACE, new RectangleBoundary(4385.0f, 4505.0f, 3082.0f, 3195.0f) },
68 { DATA_FESTERGUT, new RectangleBoundary(4205.0f, 4325.0f, 3082.0f, 3195.0f) },
69 { DATA_PROFESSOR_PUTRICIDE, new ParallelogramBoundary(Position(4356.0f, 3290.0f), Position(4435.0f, 3194.0f), Position(4280.0f, 3194.0f)) },
70 { DATA_PROFESSOR_PUTRICIDE, new RectangleBoundary(4280.0f, 4435.0f, 3150.0f, 4360.0f) },
71 { DATA_BLOOD_PRINCE_COUNCIL, new EllipseBoundary(Position(4660.95f, 2769.194f), 85.0, 60.0) },
72 { DATA_BLOOD_QUEEN_LANA_THEL, new CircleBoundary(Position(4595.93f, 2769.365f), 64.0) },
73 { DATA_BLOOD_QUEEN_LANA_THEL, new ZRangeBoundary(391.78f, 473.43f) },
74 { DATA_SISTER_SVALNA, new RectangleBoundary(4291.0f, 4423.0f, 2438.0f, 2653.0f) },
75 { DATA_VALITHRIA_DREAMWALKER, new RectangleBoundary(4112.5f, 4293.5f, 2385.0f, 2585.0f) },
76 { DATA_SINDRAGOSA, new EllipseBoundary(Position(4408.6f, 2484.0f), 100.0, 75.0) }
77};
78
80{
106 { 0, 0, DOOR_TYPE_ROOM } // END
107};
108
109// this doesnt have to only store questgivers, also can be used for related quest spawns
111{
113 uint32 questId[2]; // 10 and 25 man versions
114};
115
116// when changing the content, remember to update SetData, DATA_BLOOD_QUICKENING_STATE case for NPC_ALRIN_THE_AGILE index
129
130// NPCs spawned at Light's Hammer on Lich King dead
131Position const JainaSpawnPos = { -48.65278f, 2211.026f, 27.98586f, 3.124139f };
132Position const MuradinSpawnPos = { -47.34549f, 2208.087f, 27.98586f, 3.106686f };
133Position const UtherSpawnPos = { -26.58507f, 2211.524f, 30.19898f, 3.124139f };
134Position const SylvanasSpawnPos = { -41.45833f, 2222.891f, 27.98586f, 3.647738f };
135
137{
138 public:
140
142 {
163
164 // A function to help reduce the number of lines for teleporter management.
165 void SetTeleporterState(GameObject* go, bool usable)
166 {
167 if (usable)
168 {
171 }
172 else
173 {
176 }
177 }
178
187
200
205
206 void OnCreatureCreate(Creature* creature) override
207 {
208 if (creature->IsGuardian() && creature->GetOwnerGUID().IsPlayer())
209 {
212 }
213
214 switch (creature->GetEntry())
215 {
217 {
218 uint8 group = (creature->GetPositionX() > -230.0f) ? 0 : 1;
219 nerubarBroodkeepersGUIDs[group].emplace_back(creature->GetGUID());
220 break;
221 }
223 LordMarrowgarGUID = creature->GetGUID();
224 break;
226 LadyDeahtwhisperGUID = creature->GetGUID();
227 break;
229 DeathbringerSaurfangGUID = creature->GetGUID();
230 break;
233 creature->SetControlled(true, UNIT_STATE_ROOT);
234 break;
238 break;
239 case NPC_FESTERGUT:
240 FestergutGUID = creature->GetGUID();
241 break;
242 case NPC_ROTFACE:
243 RotfaceGUID = creature->GetGUID();
244 break;
246 ProfessorPutricideGUID = creature->GetGUID();
247 break;
249 case NPC_GAS_CLOUD:
253 if (Creature* professorPutricide = instance->GetCreature(ProfessorPutricideGUID))
254 professorPutricide->AI()->JustSummoned(creature);
255 break;
257 BloodCouncilGUIDs[0] = creature->GetGUID();
258 break;
260 BloodCouncilGUIDs[1] = creature->GetGUID();
261 break;
263 BloodCouncilGUIDs[2] = creature->GetGUID();
264 break;
267 break;
270 break;
272 BloodQueenLanaThelGUID = creature->GetGUID();
273 break;
275 // keep him in air
277 creature->SetDisableGravity(true);
278 break;
280 CrokScourgebaneGUID = creature->GetGUID();
281 break;
282 // we can only do this because there are no gaps in their entries
287 CrokCaptainGUIDs[creature->GetEntry()-NPC_CAPTAIN_ARNATH] = creature->GetGUID();
288 break;
290 SisterSvalnaGUID = creature->GetGUID();
291 break;
293 ValithriaDreamwalkerGUID = creature->GetGUID();
294 break;
296 ValithriaLichKingGUID = creature->GetGUID();
297 break;
299 ValithriaTriggerGUID = creature->GetGUID();
300 break;
301 case NPC_SINDRAGOSA:
302 SindragosaGUID = creature->GetGUID();
303 break;
304 case NPC_SPINESTALKER:
305 SpinestalkerGUID = creature->GetGUID();
306 break;
307 case NPC_RIMEFANG:
308 RimefangGUID = creature->GetGUID();
309 break;
311 // Teleporter visual at center
312 if (creature->GetExactDist2d(4357.052f, 2769.421f) < 10.0f)
313 creature->CastSpell(creature, SPELL_ARTHAS_TELEPORTER_CEREMONY, false);
314 break;
316 TheLichKingGUID = creature->GetGUID();
317 break;
320 break;
323 TerenasMenethilGUID = creature->GetGUID();
324 break;
326 // Remove corpse as soon as it dies (and respawn 10 seconds later)
327 creature->SetCorpseDelay(0);
328 creature->SetReactState(REACT_PASSIVE);
329 break;
330 default:
331 break;
332 }
333 }
334
335 void OnCreatureRemove(Creature* creature) override
336 {
337 if (creature->GetEntry() == NPC_SINDRAGOSA)
339 }
340
341 // Weekly quest spawn prevention
342 uint32 GetCreatureEntry(ObjectGuid::LowType /*guidLow*/, CreatureData const* data) override
343 {
344 uint32 entry = data->id;
345 switch (entry)
346 {
354 {
355 for (uint8 questIndex = 0; questIndex < WeeklyNPCs; ++questIndex)
356 {
357 if (WeeklyQuestData[questIndex].creatureEntry == entry)
358 {
359 uint8 diffIndex = uint8(instance->GetSpawnMode() & 1);
360 if (!sQuestPoolMgr->IsQuestActive(WeeklyQuestData[questIndex].questId[diffIndex]))
361 return 0;
362 break;
363 }
364 }
365
368 break;
369 }
374 return 0;
375 break;
379 if (TeamInInstance == HORDE)
380 return 0;
381 break;
383 if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A))
384 if ((TeamInInstance == ALLIANCE && int32(data->mapId) == go->moTransport.mapID) ||
385 (TeamInInstance == HORDE && int32(data->mapId) != go->moTransport.mapID))
386 return entry;
387 return 0;
389 if ((TeamInInstance == ALLIANCE && data->spawnPoint.GetPositionX() > 10.0f) ||
390 (TeamInInstance == HORDE && data->spawnPoint.GetPositionX() < 10.0f))
391 return entry;
392 return 0;
397 case NPC_TORTUNOK:
405 case NPC_VOL_GUK:
413 default:
414 break;
415 }
416
417 return entry;
418 }
419
421 {
422 switch (entry)
423 {
429 return 0;
430 break;
435 if (TeamInInstance == HORDE)
436 return 0;
437 break;
438 default:
439 break;
440 }
441
442 return entry;
443 }
444
445 void OnUnitDeath(Unit* unit) override
446 {
447 Creature* creature = unit->ToCreature();
448 if (!creature)
449 return;
450
451 switch (creature->GetEntry())
452 {
459 crok->AI()->SetGUID(creature->GetGUID(), ACTION_VRYKUL_DEATH);
460 break;
462 if (FrostwyrmGUIDs.empty())
463 return;
464
465 if (creature->AI()->GetData(1/*DATA_FROSTWYRM_OWNER*/) == DATA_SPINESTALKER)
466 {
467 SpinestalkerTrash.erase(creature->GetSpawnId());
468 if (SpinestalkerTrash.empty())
469 if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID))
470 spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
471 }
472 else
473 {
474 RimefangTrash.erase(creature->GetSpawnId());
475 if (RimefangTrash.empty())
476 if (Creature* spinestalk = instance->GetCreature(RimefangGUID))
477 spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
478 }
479 break;
480 case NPC_RIMEFANG:
481 case NPC_SPINESTALKER:
482 {
484 return;
485
487 return;
488
489 FrostwyrmGUIDs.erase(creature->GetSpawnId());
490 if (FrostwyrmGUIDs.empty())
491 {
494 boss->AI()->DoAction(ACTION_START_FROSTWYRM);
495 }
496 break;
497 }
498 default:
499 break;
500 }
501 }
502
504 {
505 switch (go->GetEntry())
506 {
508 case GO_ICEWALL:
526 case GO_ICE_WALL:
527 AddDoor(go, true);
528 break;
529 // these 2 gates are functional only on 25man modes
532 if (instance->Is25ManRaid())
533 AddDoor(go, true);
534 break;
538 {
539 go->SetLevel(0);
541 }
542 break;
546 break;
556 break;
559 AddDoor(go, true);
560 break;
566 break;
571 break;
575 SetTeleporterState(go, false);
576 else
577 SetTeleporterState(go, true);
578 break;
582 break;
586 break;
590 break;
594 break;
598 break;
599 case GO_PLAGUE_SIGIL:
600 PlagueSigilGUID = go->GetGUID();
603 break;
608 break;
613 break;
618 break;
620 PutricideGateGUIDs[0] = go->GetGUID();
623 else if (GetBossState(DATA_FESTERGUT) == DONE)
625 break;
627 PutricideGateGUIDs[1] = go->GetGUID();
630 else if (GetBossState(DATA_ROTFACE) == DONE)
632 break;
634 PutricidePipeGUIDs[0] = go->GetGUID();
637 break;
639 PutricidePipeGUIDs[1] = go->GetGUID();
642 break;
643 case GO_DRINK_ME:
645 break;
651 go->SetLootRecipient(valithria->GetLootRecipient(), valithria->GetLootRecipientGroup());
653 break;
655 // this enables movement at The Frozen Throne, when printed this value is 0.000000f
656 // however, when represented as integer client will accept only this value
659 break;
663 break;
666 break;
669 break;
672 break;
676 go->SetRespawnTime(7 * DAY);
677 break;
681 go->SetRespawnTime(7 * DAY);
682 break;
686 go->SetRespawnTime(7 * DAY);
687 break;
688 default:
689 break;
690 }
691 }
692
730
731 uint32 GetData(uint32 type) const override
732 {
733 switch (type)
734 {
736 return FrostwyrmGUIDs.size();
738 return SpinestalkerTrash.size();
739 case DATA_RIMEFANG:
740 return RimefangTrash.size();
742 return ColdflameJetsState;
746 return TeamInInstance;
750 return HeroicAttempts;
752 return BloodPrinceIntro;
754 return SindragosaIntro;
756 return IsFactionBuffActive ? 1 : 0;
757 default:
758 break;
759 }
760
761 return 0;
762 }
763
764 ObjectGuid GetGuidData(uint32 type) const override
765 {
766 switch (type)
767 {
769 return LordMarrowgarGUID;
773 return GunshipGUID;
775 return EnemyGunshipGUID;
782 case DATA_FESTERGUT:
783 return FestergutGUID;
784 case DATA_ROTFACE:
785 return RotfaceGUID;
789 return PutricideTableGUID;
791 return BloodCouncilGUIDs[0];
793 return BloodCouncilGUIDs[1];
795 return BloodCouncilGUIDs[2];
803 return CrokScourgebaneGUID;
810 return SisterSvalnaGUID;
817 case DATA_SINDRAGOSA:
818 return SindragosaGUID;
820 return SpinestalkerGUID;
821 case DATA_RIMEFANG:
822 return RimefangGUID;
824 return TheLichKingGUID;
828 return ArthasPlatformGUID;
830 return TerenasMenethilGUID;
831 default:
832 break;
833 }
834
835 return ObjectGuid::Empty;
836 }
837
839 {
840 if (HeroicAttempts)
841 {
844 }
845
846 if (!HeroicAttempts)
847 {
849 {
850 if (Creature* boss = instance->GetCreature(bossGuid))
851 if (boss->IsAlive())
852 boss->DespawnOrUnsummon();
853 }
854 }
855 }
856
857 bool SetBossState(uint32 type, EncounterState state) override
858 {
859 if (!InstanceScript::SetBossState(type, state))
860 return false;
861
862 switch (type)
863 {
865 {
866 if (state == DONE)
867 {
869 SetTeleporterState(teleporter, true);
871 SetTeleporterState(teleporter, true);
872 }
873 break;
874 }
876 {
877 if (state == DONE)
878 {
880 SetTeleporterState(teleporter, true);
881
883 {
884 elevator->SetLevel(0);
885 elevator->SetGoState(GO_STATE_READY);
886 }
887
888 SpawnGunship();
889 }
890 break;
891 }
893 if (state == DONE)
894 {
896 SetTeleporterState(teleporter, true);
897
900 }
901 else if (state == FAIL)
902 Events.ScheduleEvent(EVENT_RESPAWN_GUNSHIP, 30s);
903 break;
905 switch (state)
906 {
907 case DONE:
908 {
910 {
912 loot->SetLootRecipient(deathbringer->GetLootRecipient(), deathbringer->GetLootRecipientGroup());
914 }
915
917 SetTeleporterState(teleporter, true);
918
920 SetTeleporterState(teleporter, true);
921 break;
922 }
923 case NOT_STARTED:
924 {
926 SetTeleporterState(teleporter, true);
927 break;
928 }
929 case IN_PROGRESS:
930 {
932 SetTeleporterState(teleporter, false);
933 break;
934 }
935 default:
936 break;
937 }
938 break;
939 case DATA_FESTERGUT:
940 if (state == DONE)
941 {
943 {
946 go->SetGoState(GO_STATE_DESTROYED);
948 go->SetGoState(GO_STATE_DESTROYED);
949 }
950 else
953 }
954 break;
955 case DATA_ROTFACE:
956 if (state == DONE)
957 {
959 {
962 go->SetGoState(GO_STATE_DESTROYED);
964 go->SetGoState(GO_STATE_DESTROYED);
965 }
966 else
969 }
970 break;
973 if (instance->IsHeroic() && state == FAIL)
975 else if (state == DONE)
977 break;
980 if (instance->IsHeroic() && state == FAIL)
982 else if (state == DONE)
984 break;
986 if (state == DONE)
987 {
988 if (sQuestPoolMgr->IsQuestActive(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1]))
991 SetTeleporterState(teleporter, true);
992 }
993 break;
994 case DATA_SINDRAGOSA:
996 if (instance->IsHeroic() && state == FAIL)
998 else if (state == DONE)
1000 break;
1001 case DATA_THE_LICH_KING:
1002 {
1003 // set the platform as active object to dramatically increase visibility range
1004 // note: "active" gameobjects do not block grid unloading
1006 precipice->SetFarVisible(state == IN_PROGRESS);
1007
1009 platform->SetFarVisible(state == IN_PROGRESS);
1010
1011 if (instance->IsHeroic() && state == FAIL)
1013 else if (state == DONE)
1014 {
1016 bolvar->SetRespawnTime(7 * DAY);
1018 pillars->SetRespawnTime(7 * DAY);
1020 pillars->SetRespawnTime(7 * DAY);
1021
1026 }
1027 break;
1028 }
1029 default:
1030 break;
1031 }
1032
1033 return true;
1034 }
1035
1037 {
1038 if (!GunshipGUID)
1039 {
1042 if (Transport* gunship = sTransportMgr->CreateTransport(gunshipEntry, 0, instance))
1043 GunshipGUID = gunship->GetGUID();
1044 }
1045 }
1046
1047 void SetData(uint32 type, uint32 data) override
1048 {
1049 switch (type)
1050 {
1052 IsBonedEligible = data ? true : false;
1053 break;
1055 IsOozeDanceEligible = data ? true : false;
1056 break;
1058 IsNauseaEligible = data ? true : false;
1059 break;
1061 IsOrbWhispererEligible = data ? true : false;
1062 break;
1064 ColdflameJetsState = data;
1065 if (ColdflameJetsState == DONE)
1066 SaveToDB();
1067 break;
1069 {
1070 // skip if nothing changes
1071 if (BloodQuickeningState == data)
1072 break;
1073
1074 // 5 is the index of Blood Quickening
1075 if (!sQuestPoolMgr->IsQuestActive(WeeklyQuestData[5].questId[instance->GetSpawnMode() & 1]))
1076 break;
1077
1078 switch (data)
1079 {
1080 case IN_PROGRESS:
1081 Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 1min);
1085 break;
1086 case DONE:
1090 break;
1091 default:
1092 break;
1093 }
1094
1095 BloodQuickeningState = data;
1096 SaveToDB();
1097 break;
1098 }
1102 {
1104 SetTeleporterState(go, true);
1105 SaveToDB();
1106 }
1107 break;
1109 BloodPrinceIntro = data;
1110 break;
1112 SindragosaIntro = data;
1113 break;
1114 case DATA_FACTION_BUFF:
1115 IsFactionBuffActive = data ? true : false;
1118 break;
1120 {
1121 uint8 group = (data == AT_NERUBAR_BROODKEEPER) ? 0 : 1;
1122 for (ObjectGuid guid : nerubarBroodkeepersGUIDs[group])
1123 if (Creature* nerubar = instance->GetCreature(guid))
1124 nerubar->AI()->DoAction(ACTION_NERUBAR_FALL);
1125 break;
1126 }
1127 default:
1128 break;
1129 }
1130 }
1131
1132 void SetData64(uint32 type, uint64 data) override
1133 {
1134 switch (type)
1135 {
1137 FrostwyrmGUIDs.insert(data);
1138 break;
1139 case DATA_SPINESTALKER:
1140 SpinestalkerTrash.insert(data);
1141 break;
1142 case DATA_RIMEFANG:
1143 RimefangTrash.insert(data);
1144 break;
1145 default:
1146 break;
1147 }
1148 }
1149
1150 bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override
1151 {
1152 switch (criteria_id)
1153 {
1154 case CRITERIA_BONED_10N:
1155 case CRITERIA_BONED_25N:
1156 case CRITERIA_BONED_10H:
1157 case CRITERIA_BONED_25H:
1158 return IsBonedEligible;
1163 return IsOozeDanceEligible;
1168 return IsNauseaEligible;
1174 // Only one criteria for both modes, need to do it like this
1178 return instance->ToInstanceMap()->GetMaxPlayers() == 10;
1182 return instance->ToInstanceMap()->GetMaxPlayers() == 25;
1183 default:
1184 break;
1185 }
1186
1187 return false;
1188 }
1189
1190 bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override
1191 {
1192 if (_SkipCheckRequiredBosses(player))
1193 return true;
1194
1195 switch (bossId)
1196 {
1197 case DATA_THE_LICH_KING:
1198 if (!CheckPlagueworks(bossId))
1199 return false;
1200 if (!CheckCrimsonHalls(bossId))
1201 return false;
1202 if (!CheckFrostwingHalls(bossId))
1203 return false;
1204 break;
1205 case DATA_SINDRAGOSA:
1207 if (!CheckFrostwingHalls(bossId))
1208 return false;
1209 break;
1212 if (!CheckCrimsonHalls(bossId))
1213 return false;
1214 break;
1215 case DATA_FESTERGUT:
1216 case DATA_ROTFACE:
1218 if (!CheckPlagueworks(bossId))
1219 return false;
1220 break;
1221 default:
1222 break;
1223 }
1224
1225 if (!CheckLowerSpire(bossId))
1226 return false;
1227
1228 return true;
1229 }
1230
1231 bool CheckPlagueworks(uint32 bossId) const
1232 {
1233 switch (bossId)
1234 {
1235 case DATA_THE_LICH_KING:
1237 return false;
1238 [[fallthrough]];
1241 return false;
1242 break;
1243 default:
1244 break;
1245 }
1246
1247 return true;
1248 }
1249
1250 bool CheckCrimsonHalls(uint32 bossId) const
1251 {
1252 switch (bossId)
1253 {
1254 case DATA_THE_LICH_KING:
1256 return false;
1257 [[fallthrough]];
1260 return false;
1261 break;
1262 default:
1263 break;
1264 }
1265
1266 return true;
1267 }
1268
1269 bool CheckFrostwingHalls(uint32 bossId) const
1270 {
1271 switch (bossId)
1272 {
1273 case DATA_THE_LICH_KING:
1275 return false;
1276 [[fallthrough]];
1277 case DATA_SINDRAGOSA:
1279 return false;
1280 break;
1281 default:
1282 break;
1283 }
1284
1285 return true;
1286 }
1287
1288 bool CheckLowerSpire(uint32 bossId) const
1289 {
1290 switch (bossId)
1291 {
1292 case DATA_THE_LICH_KING:
1293 case DATA_SINDRAGOSA:
1298 case DATA_ROTFACE:
1299 case DATA_FESTERGUT:
1301 return false;
1302 [[fallthrough]];
1305 return false;
1306 [[fallthrough]];
1309 return false;
1310 [[fallthrough]];
1313 return false;
1314 [[fallthrough]];
1316 default:
1317 break;
1318 }
1319
1320 return true;
1321 }
1322
1324 {
1326 {
1328 {
1329 teleporter->SetGoState(GO_STATE_ACTIVE);
1330
1331 std::list<Creature*> stalkers;
1332 teleporter->GetCreatureListWithEntryInGrid(stalkers, NPC_INVISIBLE_STALKER, 100.0f);
1333 if (stalkers.empty())
1334 return;
1335
1336 stalkers.sort(Trinity::ObjectDistanceOrderPred(teleporter));
1337 stalkers.front()->CastSpell(nullptr, SPELL_ARTHAS_TELEPORTER_CEREMONY, false);
1338 stalkers.pop_front();
1339 for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
1340 (*itr)->AI()->Reset();
1341 }
1342 }
1343 }
1344
1345 void WriteSaveDataMore(std::ostringstream& data) override
1346 {
1347 data << HeroicAttempts << ' '
1348 << ColdflameJetsState << ' '
1349 << BloodQuickeningState << ' '
1350 << BloodQuickeningMinutes << ' '
1352 }
1353
1354 void ReadSaveDataMore(std::istringstream& data) override
1355 {
1356 uint32 temp = 0;
1357
1358 data >> HeroicAttempts;
1359
1360 data >> temp;
1362
1363 data >> temp;
1365
1366 data >> BloodQuickeningMinutes;
1367
1368 data >> temp;
1370 }
1371
1372 void Update(uint32 diff) override
1373 {
1375 return;
1376
1377 Events.Update(diff);
1378
1379 while (uint32 eventId = Events.ExecuteEvent())
1380 {
1381 switch (eventId)
1382 {
1384 {
1387 {
1388 Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 1min);
1391 }
1392 else
1393 {
1397 bq->AI()->DoAction(ACTION_KILL_MINCHAR);
1398 }
1399 SaveToDB();
1400 break;
1401 }
1403 {
1405 platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
1407 edge->SetGoState(GO_STATE_ACTIVE);
1409 wind->SetGoState(GO_STATE_READY);
1411 warning->SetGoState(GO_STATE_READY);
1412 if (Creature* theLichKing = instance->GetCreature(TheLichKingGUID))
1413 theLichKing->AI()->DoAction(ACTION_RESTORE_LIGHT);
1414 break;
1415 }
1418 platform->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING);
1420 edge->SetGoState(GO_STATE_READY);
1422 wind->SetGoState(GO_STATE_ACTIVE);
1423 break;
1425 SpawnGunship();
1426 break;
1427 default:
1428 break;
1429 }
1430 }
1431 }
1432
1433 void ProcessEvent(WorldObject* source, uint32 eventId) override
1434 {
1435 switch (eventId)
1436 {
1439 source->AddObjectToRemoveList();
1440 break;
1443 captain->AI()->DoAction(ACTION_ENEMY_GUNSHIP_TALK);
1444 [[fallthrough]];
1447 if (GameObject* go = source->ToGameObject())
1448 if (Transport* transport = go->ToTransport())
1449 transport->EnableMovement(false);
1450 break;
1453 captain->AI()->DoAction(ACTION_EXIT_SHIP);
1454 if (GameObject* go = source->ToGameObject())
1455 if (Transport* transport = go->ToTransport())
1456 transport->EnableMovement(false);
1457 break;
1458 case EVENT_QUAKE:
1460 warning->SetGoState(GO_STATE_ACTIVE);
1461 Events.ScheduleEvent(EVENT_QUAKE_SHATTER, 5s);
1462 break;
1465 {
1466 platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
1467 Events.ScheduleEvent(EVENT_REBUILD_PLATFORM, 1500ms);
1468 }
1469 break;
1470 case EVENT_TELEPORT_TO_FROSTMOURNE: // Harvest Soul (normal mode)
1472 {
1473 terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO);
1474 std::list<Creature*> triggers;
1475 terenas->GetCreatureListWithEntryInGrid(triggers, NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f);
1476 if (!triggers.empty())
1477 {
1478 triggers.sort(Trinity::ObjectDistanceOrderPred(terenas, false));
1479 Unit* visual = triggers.front();
1480 visual->CastSpell(visual, SPELL_FROSTMOURNE_TELEPORT_VISUAL, true);
1481 }
1482
1483 if (Creature* warden = instance->SummonCreature(NPC_SPIRIT_WARDEN, SpiritWardenSpawn, nullptr, 63000))
1484 {
1485 terenas->AI()->AttackStart(warden);
1486 warden->GetThreatManager().AddThreat(terenas, 300000.0f, nullptr, true, true);
1487 }
1488 }
1489 break;
1490 default:
1491 break;
1492 }
1493 }
1494
1495 protected:
1505 ObjectGuid DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang
1552 std::unordered_set<ObjectGuid::LowType> FrostwyrmGUIDs;
1553 std::unordered_set<ObjectGuid::LowType> SpinestalkerTrash;
1554 std::unordered_set<ObjectGuid::LowType> RimefangTrash;
1565 std::array<GuidVector, 2> nerubarBroodkeepersGUIDs;
1566 };
1567
1569 {
1571 }
1572};
1573
@ NPC_ALLIANCE_GUNSHIP_CANNON
@ NPC_HORDE_GUNSHIP_CANNON
@ NPC_INVISIBLE_STALKER
@ DAY
Definition Common.h:31
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
@ DOOR_TYPE_SPAWN_HOLE
@ DOOR_TYPE_ROOM
@ DOOR_TYPE_PASSAGE
#define sObjectMgr
Definition ObjectMgr.h:1721
#define sQuestPoolMgr
Definition QuestPools.h:63
@ EMOTE_ONESHOT_NONE
@ GO_DESTRUCTIBLE_DESTROYED
@ GO_DESTRUCTIBLE_REBUILDING
@ GO_DESTRUCTIBLE_DAMAGED
@ ALLIANCE
@ HORDE
@ GO_FLAG_NODESPAWN
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_LOCKED
@ GO_STATE_READY
@ GO_STATE_DESTROYED
@ GO_STATE_ACTIVE
#define sTransportMgr
@ REACT_PASSIVE
@ UNIT_STATE_ROOT
Definition Unit.h:230
@ GAMEOBJECT_PARENTROTATION
@ DATA_PRINCE_TALDARAM
Definition ahnkahet.h:32
@ NPC_PRINCE_TALDARAM
Definition ahnkahet.h:46
#define DataHeader
uint32 const EncounterCount
Position const SindragosaSpawnPos
Position const TerenasSpawn
Position const SpiritWardenSpawn
Position const ValithriaSpawnPos
@ NPC_THE_LICH_KING
Definition chapter5.cpp:161
void SetReactState(ReactStates st)
Definition Creature.h:119
ObjectGuid::LowType GetSpawnId() const
Definition Creature.h:83
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:89
CreatureAI * AI() const
Definition Creature.h:154
void SetGoState(GOState state)
void RemoveFlag(GameObjectFlags flags)
Definition GameObject.h:172
void SetLootRecipient(Unit *unit, Group *group=nullptr)
void SetFlag(GameObjectFlags flags)
Definition GameObject.h:171
void SetRespawnTime(int32 respawn)
void SetLevel(uint32 level)
Definition GameObject.h:175
Transport * ToTransport()
Definition GameObject.h:291
uint32 GetMaxPlayers() const
Definition Map.cpp:4296
Team GetTeamInInstance() const
Definition Map.h:901
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void DoCastSpellOnPlayer(Player *player, uint32 spell, bool includePets=false, bool includeControlled=false)
InstanceMap * instance
EncounterState GetBossState(uint32 id) const
virtual void AddDoor(GameObject *door, bool add)
void LoadDoorData(DoorData const *data)
void DoRemoveAurasDueToSpellOnPlayer(Player *player, uint32 spell, bool includePets=false, bool includeControlled=false)
void LoadBossBoundaries(BossBoundaryData const &data)
bool _SkipCheckRequiredBosses(Player const *player=nullptr) const
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
void SetHeaders(std::string const &dataHeaders)
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
Definition Map.cpp:3382
void LoadGrid(float x, float y)
Definition Map.cpp:578
uint8 GetSpawnMode() const
Definition Map.h:388
bool Is25ManRaid() const
Definition Map.cpp:4261
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:4430
bool IsSpawnGroupActive(uint32 groupId) const
Definition Map.cpp:3495
InstanceMap * ToInstanceMap()
Definition Map.h:520
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1852
bool IsHeroic() const
Definition Map.cpp:4256
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:4397
static ObjectGuid const Empty
Definition ObjectGuid.h:140
bool IsPlayer() const
Definition ObjectGuid.h:179
uint32 LowType
Definition ObjectGuid.h:142
void Clear()
Definition ObjectGuid.h:150
static Creature * ToCreature(Object *o)
Definition Object.h:186
static GameObject * ToGameObject(Object *o)
Definition Object.h:198
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:585
virtual uint32 GetData(uint32) const
Definition UnitAI.h:155
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition UnitAI.h:157
Definition Unit.h:769
void SetControlled(bool apply, UnitState state)
Definition Unit.cpp:11256
ObjectGuid GetOwnerGUID() const override
Definition Unit.h:1241
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
void SetEmoteState(Emote emote)
Definition Unit.h:967
bool IsGuardian() const
Definition Unit.h:883
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
void AddObjectToRemoveList()
Definition Object.cpp:1838
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
std::vector< WorldStateInfo > Worldstates
InstanceScript * GetInstanceScript(InstanceMap *map) const override
@ DATA_TEAM_IN_INSTANCE
@ GO_ICE_WALL
@ SPELL_STRENGHT_OF_WRYNN
@ SPELL_ARTHAS_TELEPORTER_CEREMONY
@ SPELL_FROSTMOURNE_TELEPORT_VISUAL
@ SPELL_HELLSCREAMS_WARSONG
uint32 const MaxHeroicAttempts
@ AT_NERUBAR_BROODKEEPER
@ GO_THE_SKYBREAKER_A
@ GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR
@ GO_SCIENTIST_AIRLOCK_DOOR_GREEN
@ GO_SCOURGE_TRANSPORTER_LICHKING
@ GO_THE_SKYBREAKER_H
@ GO_GREEN_PLAGUE_MONSTER_ENTRANCE
@ GO_SAURFANG_S_DOOR
@ GO_SCIENTIST_AIRLOCK_DOOR_COLLISION
@ GO_ORGRIMS_HAMMER_A
@ GO_DOODAD_ICECROWN_GREENTUBES02
@ GO_DEATHBRINGER_S_CACHE_10N
@ GO_CACHE_OF_THE_DREAMWALKER_25H
@ GO_FROZEN_LAVAMAN
@ GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER
@ GO_GUNSHIP_ARMORY_H_10N
@ GO_BLOODWING_SIGIL
@ GO_SCOURGE_TRANSPORTER_RAMPART
@ GO_DEATHBRINGER_S_CACHE_25N
@ GO_LADY_DEATHWHISPER_ELEVATOR
@ GO_CACHE_OF_THE_DREAMWALKER_25N
@ GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT
@ GO_GUNSHIP_ARMORY_A_10H
@ GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR
@ GO_DOODAD_ICECROWN_SNOWEDGEWARNING01
@ GO_GUNSHIP_ARMORY_A_25N
@ GO_SCOURGE_TRANSPORTER_UPPERSPIRE
@ GO_DOODAD_ICECROWN_ICEWALL02
@ GO_GUNSHIP_ARMORY_A_10N
@ GO_GUNSHIP_ARMORY_H_25H
@ GO_ICEWALL
@ GO_LAVAMAN_PILLARS_UNCHAINED
@ GO_GUNSHIP_ARMORY_H_25N
@ GO_ORATORY_OF_THE_DAMNED_ENTRANCE
@ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04
@ GO_GUNSHIP_ARMORY_A_25H
@ GO_SCIENTIST_AIRLOCK_DOOR_ORANGE
@ GO_ARTHAS_PLATFORM
@ GO_CACHE_OF_THE_DREAMWALKER_10N
@ GO_GREEN_DRAGON_BOSS_EXIT
@ GO_ORGRIMS_HAMMER_H
@ GO_ORANGE_PLAGUE_MONSTER_ENTRANCE
@ GO_SCOURGE_TRANSPORTER_ORATORY
@ GO_PLAGUE_SIGIL
@ GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01
@ GO_DEATHBRINGER_S_CACHE_10H
@ GO_DOODAD_ICECROWN_THRONEFROSTYWIND01
@ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02
@ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03
@ GO_SIGIL_OF_THE_FROSTWING
@ GO_SCOURGE_TRANSPORTER_SINDRAGOSA
@ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01
@ GO_BLOOD_ELF_COUNCIL_DOOR
@ GO_DOODAD_ICECROWN_ORANGETUBES02
@ GO_DEATHBRINGER_S_CACHE_25H
@ GO_DOODAD_ICECROWN_GRATE_01
@ GO_LORD_MARROWGAR_S_ENTRANCE
@ GO_SCIENTIST_ENTRANCE
@ GO_LAVAMAN_PILLARS_CHAINED
@ GO_DRINK_ME
@ GO_SCOURGE_TRANSPORTER_DEATHBRINGER
@ GO_CRIMSON_HALL_DOOR
@ GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01
@ GO_GUNSHIP_ARMORY_H_10H
@ GO_CACHE_OF_THE_DREAMWALKER_10H
@ GO_GREEN_DRAGON_BOSS_ENTRANCE
@ GO_SINDRAGOSA_ENTRANCE_DOOR
@ GO_ARTHAS_PRECIPICE
#define ICCScriptName
@ WORLDSTATE_SHOW_ATTEMPTS
@ WORLDSTATE_ATTEMPTS_REMAINING
@ WORLDSTATE_ATTEMPTS_MAX
@ WORLDSTATE_EXECUTION_TIME
@ CRITERIA_BONED_25H
@ CRITERIA_BONED_10N
@ CRITERIA_NAUSEA_10H
@ CRITERIA_BONED_25N
@ CRITERIA_BONED_10H
@ CRITERIA_ONCE_BITTEN_TWICE_SHY_25V
@ CRITERIA_DANCES_WITH_OOZES_10H
@ CRITERIA_NAUSEA_10N
@ CRITERIA_NAUSEA_25N
@ CRITERIA_ONCE_BITTEN_TWICE_SHY_10V
@ CRITERIA_NAUSEA_25H
@ CRITERIA_ORB_WHISPERER_25H
@ CRITERIA_DANCES_WITH_OOZES_10N
@ CRITERIA_DANCES_WITH_OOZES_25H
@ CRITERIA_KILL_LANA_THEL_25M
@ CRITERIA_ONCE_BITTEN_TWICE_SHY_10N
@ CRITERIA_DANCES_WITH_OOZES_25N
@ CRITERIA_ORB_WHISPERER_25N
@ CRITERIA_KILL_LANA_THEL_10M
@ CRITERIA_ORB_WHISPERER_10N
@ CRITERIA_ORB_WHISPERER_10H
@ CRITERIA_ONCE_BITTEN_TWICE_SHY_25N
uint32 const WeeklyNPCs
@ ACTION_FROSTMOURNE_INTRO
@ ACTION_ENEMY_GUNSHIP_TALK
@ ACTION_EXIT_SHIP
@ ACTION_VRYKUL_DEATH
@ ACTION_NERUBAR_FALL
@ ACTION_START_FROSTWYRM
@ ACTION_RESTORE_LIGHT
@ ACTION_KILL_MINCHAR
@ DATA_ORB_WHISPERER_ACHIEVEMENT
@ DATA_THE_LICH_KING
@ DATA_HEROIC_ATTEMPTS
@ DATA_SINDRAGOSA_FROSTWYRMS
@ DATA_BLOOD_PRINCE_COUNCIL_INTRO
@ DATA_BLOOD_PRINCE_COUNCIL
@ DATA_PRINCE_VALANAR
@ DATA_DEATHBRINGER_SAURFANG
@ DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL
also used by conditions
@ DATA_VALITHRIA_LICH_KING
@ DATA_OOZE_DANCE_ACHIEVEMENT
@ DATA_NAUSEA_ACHIEVEMENT
@ DATA_BLOOD_PRINCES_CONTROL
@ DATA_VALITHRIA_TRIGGER
@ DATA_TERENAS_MENETHIL
@ DATA_ICECROWN_GUNSHIP_BATTLE
@ DATA_SISTER_SVALNA
@ DATA_ROTFACE
@ DATA_CROK_SCOURGEBANE
@ DATA_SAURFANG_EVENT_NPC
@ DATA_VALITHRIA_DREAMWALKER
@ DATA_HIGHLORD_TIRION_FORDRING
@ DATA_FACTION_BUFF
@ DATA_SINDRAGOSA
@ DATA_LORD_MARROWGAR
@ DATA_UPPERSPIRE_TELE_ACT
@ DATA_BLOOD_QUICKENING_STATE
@ DATA_SINDRAGOSA_INTRO
@ DATA_COLDFLAME_JETS
@ DATA_BLOOD_QUEEN_LANA_THEL
@ DATA_PROFESSOR_PUTRICIDE
@ DATA_PRINCE_KELESETH
@ DATA_ENEMY_GUNSHIP
@ DATA_CAPTAIN_RUPERT
@ DATA_PUTRICIDE_TABLE
@ DATA_CAPTAIN_ARNATH
@ DATA_NERUBAR_BROODKEEPER_EVENT
@ DATA_FESTERGUT
@ DATA_SPINESTALKER
@ DATA_LADY_DEATHWHISPER
@ DATA_BONED_ACHIEVEMENT
@ DATA_CAPTAIN_GRONDEL
@ DATA_CAPTAIN_BRANDON
@ DATA_ARTHAS_PLATFORM
@ NPC_THE_LICH_KING_VALITHRIA
@ NPC_HIGH_CAPTAIN_JUSTIN_BARTLETT
@ NPC_UVLUS_BANEFIRE
@ NPC_GREEN_DRAGON_COMBAT_TRIGGER
@ NPC_CAPTAIN_BRANDON
@ NPC_INFILTRATOR_MINCHAR_BQ
@ NPC_TERENAS_MENETHIL_FROSTMOURNE
@ NPC_SKY_REAVER_KORM_BLACKSCAR
@ NPC_SKYBREAKER_LIEUTENANT
@ NPC_IGB_MURADIN_BRONZEBEARD
@ NPC_PRINCE_VALANAR
@ NPC_YILI
@ NPC_VALITHRIA_DREAMWALKER
@ NPC_ALRIN_THE_AGILE
@ NPC_YMIRJAR_BATTLE_MAIDEN
@ NPC_ALLIANCE_COMMANDER
@ NPC_BLOOD_QUEEN_LANA_THEL_COUNCIL
@ NPC_TALAN_MOONSTRIKE
@ NPC_ROTTING_FROST_GIANT_25
@ NPC_ALANA_MOONSTRIKE
@ NPC_UTHER_THE_LIGHTBRINGER_QUEST
@ NPC_ALCHEMIST_ADRIANNA
@ NPC_IKFIRUS_THE_VILE
@ NPC_DEATHBRINGER_SAURFANG
@ NPC_KING_VARIAN_WRYNN
@ NPC_KOR_KRON_GENERAL
@ NPC_SPIRIT_WARDEN
@ NPC_SINDRAGOSA
@ NPC_BLOOD_ORB_CONTROLLER
@ NPC_YMIRJAR_WARLORD
@ NPC_LADY_JAINA_PROUDMOORE_QUEST
@ NPC_MURADIN_BRONZEBEARD_QUEST
@ NPC_KOR_KRON_LIEUTENANT
@ NPC_SE_SKYBREAKER_MARINE
@ NPC_CAPTAIN_RUPERT
@ NPC_ROTTING_FROST_GIANT_10
@ NPC_FESTERGUT
@ NPC_HARAGG_THE_UNSEEN
@ NPC_INFILTRATOR_MINCHAR
@ NPC_WICKED_SPIRIT
@ NPC_BLOOD_QUEEN_LANA_THEL
@ NPC_VOLATILE_OOZE
@ NPC_HIGHLORD_TIRION_FORDRING_LK
@ NPC_YMIRJAR_HUNTRESS
@ NPC_MALFUS_GRIMFROST
@ NPC_JEDEBIA
@ NPC_ROTFACE
@ NPC_SE_HIGH_OVERLORD_SAURFANG
@ NPC_MINCHAR_BEAM_STALKER
@ NPC_LADY_SYLVANAS_WINDRUNNER_QUEST
@ NPC_PROFESSOR_PUTRICIDE
@ NPC_NIBY_THE_ALMIGHTY
@ NPC_ZAFOD_BOOMBOX
@ NPC_VOL_GUK
@ NPC_CROK_SCOURGEBANE
@ NPC_IGB_HIGH_OVERLORD_SAURFANG
@ NPC_SE_KOR_KRON_REAVER
@ NPC_TORTUNOK
@ NPC_GAS_CLOUD
@ NPC_LADY_DEATHWHISPER
@ NPC_WORLD_TRIGGER_INFINITE_AOI
@ NPC_GARROSH_HELLSCREAM
@ NPC_FROSTWING_WHELP
@ NPC_SISTER_SVALNA
@ NPC_SPINESTALKER
@ NPC_SKYBREAKER_DECKHAND
@ NPC_ORGRIMS_HAMMER_CREW
@ NPC_LORD_MARROWGAR
@ NPC_YMIRJAR_FROSTBINDER
@ NPC_GERARDO_THE_SUAVE
@ NPC_PRINCE_KELESETH
@ NPC_CAPTAIN_GRONDEL
@ NPC_SE_MURADIN_BRONZEBEARD
@ NPC_VALITHRIA_DREAMWALKER_QUEST
@ NPC_TERENAS_MENETHIL_FROSTMOURNE_H
@ NPC_CAPTAIN_ARNATH
@ NPC_NERUBAR_BROODKEEPER
@ QUEST_DEPROGRAMMING_25
@ QUEST_SECURING_THE_RAMPARTS_25
@ QUEST_RESIDUE_RENDEZVOUS_10
@ QUEST_SECURING_THE_RAMPARTS_10
@ QUEST_BLOOD_QUICKENING_10
@ QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10
@ QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25
@ QUEST_DEPROGRAMMING_10
@ QUEST_BLOOD_QUICKENING_25
@ QUEST_RESIDUE_RENDEZVOUS_25
Position const UtherSpawnPos
void AddSC_instance_icecrown_citadel()
DoorData const doorData[]
Position const SylvanasSpawnPos
@ EVENT_UPDATE_EXECUTION_TIME
BossBoundaryData const boundaries
WeeklyQuest const WeeklyQuestData[WeeklyNPCs]
@ EVENT_PLAYERS_GUNSHIP_SPAWN
@ EVENT_SECOND_REMORSELESS_WINTER
@ EVENT_ENEMY_GUNSHIP_DESPAWN
@ EVENT_PLAYERS_GUNSHIP_COMBAT
@ EVENT_TELEPORT_TO_FROSTMOURNE
@ EVENT_ENEMY_GUNSHIP_COMBAT
@ EVENT_PLAYERS_GUNSHIP_SAURFANG
Position const MuradinSpawnPos
Position const JainaSpawnPos
@ WORLDSTATE_SHOW_TIMER
@ DATA_RIMEFANG
@ NPC_RIMEFANG
@ NPC_YMIRJAR_DEATHBRINGER
float GetExactDist2d(const float x, const float y) const
Definition Position.h:109
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
uint32 id
Definition SpawnData.h:96
Position spawnPoint
Definition SpawnData.h:97
uint32 mapId
Definition SpawnData.h:86
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const *, Unit const *, uint32) override
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
uint32 GetCreatureEntry(ObjectGuid::LowType, CreatureData const *data) override
bool CheckRequiredBosses(uint32 bossId, Player const *player=nullptr) const override