Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.98 KB | None | 0 0
  1. #include "ObjectMgr.h"
  2. #include "ScriptMgr.h"
  3. #include "InstanceScript.h"
  4. #include "ScriptedCreature.h"
  5. #include "Map.h"
  6. #include "icecrown_citadel.h"
  7.  
  8. static const DoorData doorData[] =
  9. {
  10. {GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N },
  11. {GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  12. {GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  13. {GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM, BOUNDARY_N },
  14. {GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  15. {GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM, BOUNDARY_E },
  16. {GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM, BOUNDARY_E },
  17. {GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM, BOUNDARY_E },
  18. {GO_CRIMSON_HALL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_S },
  19. {GO_BLOOD_ELF_COUNCIL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE, BOUNDARY_W },
  20. {GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE, BOUNDARY_E },
  21. {GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_ROOM, BOUNDARY_S },
  22. {GO_DOODAD_ICECROWN_GRATE_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  23. {GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_ROOM, BOUNDARY_N },
  24. {GO_GREEN_DRAGON_BOSS_EXIT, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_PASSAGE, BOUNDARY_S },
  25. {GO_SINDRAGOSA_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_S },
  26. {GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE, BOUNDARY_E },
  27. {GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  28. {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SE },
  29. {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SW },
  30. {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END
  31. };
  32.  
  33. class instance_icecrown_citadel : public InstanceMapScript
  34. {
  35. public:
  36. instance_icecrown_citadel() : InstanceMapScript(ICCScriptName, 631) { }
  37.  
  38. struct instance_icecrown_citadel_InstanceMapScript : public InstanceScript
  39. {
  40. instance_icecrown_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
  41. {
  42. SetBossNumber(MAX_ENCOUNTER);
  43. LoadDoorData(doorData);
  44. teamInInstance = 0;
  45. ladyDeathwisperElevator = 0;
  46. deathbringerSaurfang = 0;
  47. saurfangDoor = 0;
  48. saurfangEventNPC = 0;
  49. deathbringersCache = 0;
  50. saurfangTeleport = 0;
  51. memset(putricidePipes, 0, 2*sizeof(uint64));
  52. memset(putricideGates, 0, 2*sizeof(uint64));
  53. putricideCollision = 0;
  54. festergut = 0;
  55. rotface = 0;
  56. professorPutricide = 0;
  57. putricideTable = 0;
  58. memset(bloodCouncil, 0, 3*sizeof(uint64));
  59. bloodCouncilController = 0;
  60. bloodQueenLanaThel = 0;
  61. valithriaDreamwalker = 0;
  62. dreamwalkerCache = 0;
  63. sindragosa = 0;
  64. spinestalker = 0;
  65. rimefang = 0;
  66. frostwyrms = 0;
  67. spinestalkerTrash = 0;
  68. rimefangTrash = 0;
  69. lichKing = 0;
  70. tirion = 0;
  71. isBonedEligible = true;
  72. isOozeDanceEligible = true;
  73. isNauseaEligible = true;
  74. isOrbWhispererEligible = true;
  75. coldflameJetsState = NOT_STARTED;
  76. }
  77.  
  78. void OnPlayerEnter(Player* player)
  79. {
  80. if (!teamInInstance)
  81. teamInInstance = player->GetTeam();
  82. }
  83.  
  84. void OnCreatureCreate(Creature* creature)
  85. {
  86. if (!teamInInstance)
  87. {
  88. Map::PlayerList const &players = instance->GetPlayers();
  89. if (!players.isEmpty())
  90. if (Player* player = players.begin()->getSource())
  91. teamInInstance = player->GetTeam();
  92. }
  93.  
  94. switch (creature->GetEntry())
  95. {
  96. case NPC_KOR_KRON_GENERAL:
  97. if (teamInInstance == ALLIANCE)
  98. creature->UpdateEntry(NPC_ALLIANCE_COMMANDER, ALLIANCE);
  99. break;
  100. case NPC_KOR_KRON_LIEUTENANT:
  101. if (teamInInstance == ALLIANCE)
  102. creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT, ALLIANCE);
  103. break;
  104. case NPC_TORTUNOK:
  105. if (teamInInstance == ALLIANCE)
  106. creature->UpdateEntry(NPC_ALANA_MOONSTRIKE, ALLIANCE);
  107. break;
  108. case NPC_GERARDO_THE_SUAVE:
  109. if (teamInInstance == ALLIANCE)
  110. creature->UpdateEntry(NPC_TALAN_MOONSTRIKE, ALLIANCE);
  111. break;
  112. case NPC_UVLUS_BANEFIRE:
  113. if (teamInInstance == ALLIANCE)
  114. creature->UpdateEntry(NPC_MALFUS_GRIMFROST, ALLIANCE);
  115. break;
  116. case NPC_IKFIRUS_THE_VILE:
  117. if (teamInInstance == ALLIANCE)
  118. creature->UpdateEntry(NPC_YILI, ALLIANCE);
  119. break;
  120. case NPC_VOL_GUK:
  121. if (teamInInstance == ALLIANCE)
  122. creature->UpdateEntry(NPC_JEDEBIA, ALLIANCE);
  123. break;
  124. case NPC_HARAGG_THE_UNSEEN:
  125. if (teamInInstance == ALLIANCE)
  126. creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY, ALLIANCE);
  127. break;
  128. case NPC_GARROSH_HELLSCREAM:
  129. if (teamInInstance == ALLIANCE)
  130. creature->UpdateEntry(NPC_KING_VARIAN_WRYNN, ALLIANCE);
  131. break;
  132. case NPC_DEATHBRINGER_SAURFANG:
  133. deathbringerSaurfang = creature->GetGUID();
  134. break;
  135. case NPC_SE_HIGH_OVERLORD_SAURFANG:
  136. if (teamInInstance == ALLIANCE)
  137. creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE);
  138. case NPC_SE_MURADIN_BRONZEBEARD:
  139. saurfangEventNPC = creature->GetGUID();
  140. creature->LastUsedScriptID = creature->GetScriptId();
  141. break;
  142. case NPC_SE_KOR_KRON_REAVER:
  143. if (teamInInstance == ALLIANCE)
  144. creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE, ALLIANCE);
  145. break;
  146. case NPC_FROST_FREEZE_TRAP:
  147. coldflameJets.insert(creature->GetGUID());
  148. break;
  149. case NPC_FESTERGUT:
  150. festergut = creature->GetGUID();
  151. break;
  152. case NPC_ROTFACE:
  153. rotface = creature->GetGUID();
  154. break;
  155. case NPC_PROFESSOR_PUTRICIDE:
  156. professorPutricide = creature->GetGUID();
  157. break;
  158. case NPC_PRINCE_KELESETH:
  159. bloodCouncil[0] = creature->GetGUID();
  160. break;
  161. case NPC_PRINCE_TALDARAM:
  162. bloodCouncil[1] = creature->GetGUID();
  163. break;
  164. case NPC_PRINCE_VALANAR:
  165. bloodCouncil[2] = creature->GetGUID();
  166. break;
  167. case NPC_BLOOD_ORB_CONTROLLER:
  168. bloodCouncilController = creature->GetGUID();
  169. break;
  170. case NPC_BLOOD_QUEEN_LANA_THEL:
  171. bloodQueenLanaThel = creature->GetGUID();
  172. break;
  173. case NPC_SINDRAGOSA:
  174. sindragosa = creature->GetGUID();
  175. break;
  176. case NPC_SPINESTALKER:
  177. spinestalker = creature->GetGUID();
  178. if (!creature->isDead())
  179. ++frostwyrms;
  180. break;
  181. case NPC_RIMEFANG:
  182. rimefang = creature->GetGUID();
  183. if (!creature->isDead())
  184. ++frostwyrms;
  185. break;
  186. default:
  187. break;
  188. }
  189. }
  190.  
  191. void OnCreatureRemove(Creature* creature)
  192. {
  193. if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP)
  194. coldflameJets.erase(creature->GetGUID());
  195. }
  196.  
  197. void OnGameObjectCreate(GameObject* go)
  198. {
  199. switch (go->GetEntry())
  200. {
  201. case GO_DOODAD_ICECROWN_ICEWALL02:
  202. case GO_ICEWALL:
  203. case GO_LORD_MARROWGAR_S_ENTRANCE:
  204. case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
  205. case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE:
  206. case GO_GREEN_PLAGUE_MONSTER_ENTRANCE:
  207. case GO_SCIENTIST_ENTRANCE:
  208. case GO_CRIMSON_HALL_DOOR:
  209. case GO_BLOOD_ELF_COUNCIL_DOOR:
  210. case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT:
  211. case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01:
  212. case GO_DOODAD_ICECROWN_GRATE_01:
  213. case GO_GREEN_DRAGON_BOSS_ENTRANCE:
  214. case GO_GREEN_DRAGON_BOSS_EXIT:
  215. case GO_SINDRAGOSA_ENTRANCE_DOOR:
  216. case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR:
  217. case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR:
  218. case GO_ICE_WALL:
  219. AddDoor(go, true);
  220. break;
  221. case GO_LADY_DEATHWHISPER_ELEVATOR:
  222. ladyDeathwisperElevator = go->GetGUID();
  223. if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
  224. {
  225. go->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
  226. go->SetGoState(GO_STATE_READY);
  227. }
  228. break;
  229. case GO_SAURFANG_S_DOOR:
  230. saurfangDoor = go->GetGUID();
  231. AddDoor(go, true);
  232. break;
  233. case GO_DEATHBRINGER_S_CACHE_10N:
  234. case GO_DEATHBRINGER_S_CACHE_25N:
  235. case GO_DEATHBRINGER_S_CACHE_10H:
  236. case GO_DEATHBRINGER_S_CACHE_25H:
  237. deathbringersCache = go->GetGUID();
  238. break;
  239. case GO_SCOURGE_TRANSPORTER_SAURFANG:
  240. saurfangTeleport = go->GetGUID();
  241. break;
  242. case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION:
  243. putricideCollision = go->GetGUID();
  244. if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
  245. HandleGameObject(putricideCollision, true, go);
  246. break;
  247. case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE:
  248. putricideGates[0] = go->GetGUID();
  249. if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
  250. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  251. else if (GetBossState(DATA_FESTERGUT) == DONE)
  252. HandleGameObject(putricideGates[1], false, go);
  253. break;
  254. case GO_SCIENTIST_AIRLOCK_DOOR_GREEN:
  255. putricideGates[1] = go->GetGUID();
  256. if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE)
  257. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  258. else if (GetBossState(DATA_ROTFACE) == DONE)
  259. HandleGameObject(putricideGates[1], false, go);
  260. break;
  261. case GO_DOODAD_ICECROWN_ORANGETUBES02:
  262. putricidePipes[0] = go->GetGUID();
  263. if (GetBossState(DATA_FESTERGUT) == DONE)
  264. HandleGameObject(putricidePipes[0], true, go);
  265. break;
  266. case GO_DOODAD_ICECROWN_GREENTUBES02:
  267. putricidePipes[1] = go->GetGUID();
  268. if (GetBossState(DATA_ROTFACE) == DONE)
  269. HandleGameObject(putricidePipes[1], true, go);
  270. break;
  271. case GO_DRINK_ME:
  272. putricideTable = go->GetGUID();
  273. break;
  274. default:
  275. break;
  276. }
  277. }
  278.  
  279. void OnGameObjectRemove(GameObject* go)
  280. {
  281. switch (go->GetEntry())
  282. {
  283. case GO_DOODAD_ICECROWN_ICEWALL02:
  284. case GO_ICEWALL:
  285. case GO_LORD_MARROWGAR_S_ENTRANCE:
  286. case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
  287. case GO_SAURFANG_S_DOOR:
  288. case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE:
  289. case GO_GREEN_PLAGUE_MONSTER_ENTRANCE:
  290. case GO_SCIENTIST_ENTRANCE:
  291. case GO_CRIMSON_HALL_DOOR:
  292. case GO_BLOOD_ELF_COUNCIL_DOOR:
  293. case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT:
  294. case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01:
  295. case GO_DOODAD_ICECROWN_GRATE_01:
  296. case GO_GREEN_DRAGON_BOSS_ENTRANCE:
  297. case GO_GREEN_DRAGON_BOSS_EXIT:
  298. case GO_SINDRAGOSA_ENTRANCE_DOOR:
  299. case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR:
  300. case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR:
  301. case GO_ICE_WALL:
  302. AddDoor(go, false);
  303. break;
  304. default:
  305. break;
  306. }
  307. }
  308.  
  309. uint32 GetData(uint32 type)
  310. {
  311. switch (type)
  312. {
  313. case DATA_SINDRAGOSA_FROSTWYRMS:
  314. return frostwyrms;
  315. case DATA_SPINESTALKER:
  316. return spinestalkerTrash;
  317. case DATA_RIMEFANG:
  318. return rimefangTrash;
  319. case DATA_COLDFLAME_JETS:
  320. return coldflameJetsState;
  321. default:
  322. break;
  323. }
  324.  
  325. return 0;
  326. }
  327.  
  328. uint64 GetData64(uint32 type)
  329. {
  330. switch (type)
  331. {
  332. case DATA_DEATHBRINGER_SAURFANG:
  333. return deathbringerSaurfang;
  334. case DATA_SAURFANG_EVENT_NPC:
  335. return saurfangEventNPC;
  336. case GO_SAURFANG_S_DOOR:
  337. return saurfangDoor;
  338. case GO_SCOURGE_TRANSPORTER_SAURFANG:
  339. return saurfangTeleport;
  340. case DATA_FESTERGUT:
  341. return festergut;
  342. case DATA_ROTFACE:
  343. return rotface;
  344. case DATA_PROFESSOR_PUTRICIDE:
  345. return professorPutricide;
  346. case DATA_PUTRICIDE_TABLE:
  347. return putricideTable;
  348. case DATA_PRINCE_KELESETH_GUID:
  349. return bloodCouncil[0];
  350. case DATA_PRINCE_TALDARAM_GUID:
  351. return bloodCouncil[1];
  352. case DATA_PRINCE_VALANAR_GUID:
  353. return bloodCouncil[2];
  354. case DATA_BLOOD_PRINCES_CONTROL:
  355. return bloodCouncilController;
  356. case DATA_BLOOD_QUEEN_LANA_THEL:
  357. return bloodQueenLanaThel;
  358. case DATA_SINDRAGOSA:
  359. return sindragosa;
  360. case DATA_SPINESTALKER:
  361. return spinestalker;
  362. case DATA_RIMEFANG:
  363. return rimefang;
  364. default:
  365. break;
  366. }
  367.  
  368. return 0;
  369. }
  370.  
  371. bool SetBossState(uint32 type, EncounterState state)
  372. {
  373. if (!InstanceScript::SetBossState(type, state))
  374. return false;
  375.  
  376. switch (type)
  377. {
  378. case DATA_LADY_DEATHWHISPER:
  379. SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
  380. if (state == DONE)
  381. if (GameObject* elevator = instance->GetGameObject(ladyDeathwisperElevator))
  382. {
  383. elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
  384. elevator->SetGoState(GO_STATE_READY);
  385. }
  386. break;
  387. case DATA_DEATHBRINGER_SAURFANG:
  388. switch (state)
  389. {
  390. case DONE:
  391. DoRespawnGameObject(deathbringersCache, 7*DAY);
  392. case NOT_STARTED:
  393. if (GameObject* teleporter = instance->GetGameObject(saurfangTeleport))
  394. {
  395. HandleGameObject(saurfangTeleport, true, teleporter);
  396. teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  397. }
  398. break;
  399. default:
  400. break;
  401. }
  402. break;
  403. case DATA_FESTERGUT:
  404. if (state == DONE)
  405. {
  406. if (GetBossState(DATA_ROTFACE) == DONE)
  407. {
  408. HandleGameObject(putricideCollision, true);
  409. if (GameObject* go = instance->GetGameObject(putricideGates[0]))
  410. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  411. if (GameObject* go = instance->GetGameObject(putricideGates[1]))
  412. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  413. }
  414. else
  415. HandleGameObject(putricideGates[0], false);
  416. HandleGameObject(putricidePipes[0], true);
  417. }
  418. break;
  419. case DATA_ROTFACE:
  420. if (state == DONE)
  421. {
  422. if (GetBossState(DATA_FESTERGUT) == DONE)
  423. {
  424. HandleGameObject(putricideCollision, true);
  425. if (GameObject* go = instance->GetGameObject(putricideGates[0]))
  426. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  427. if (GameObject* go = instance->GetGameObject(putricideGates[1]))
  428. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  429. }
  430. else
  431. HandleGameObject(putricideGates[1], false);
  432. HandleGameObject(putricidePipes[1], true);
  433. }
  434. break;
  435. case DATA_VALITHRIA_DREAMWALKER:
  436. case DATA_SINDRAGOSA:
  437. case DATA_THE_LICH_KING:
  438. break;
  439. default:
  440. break;
  441. }
  442.  
  443. return true;
  444. }
  445.  
  446. void SetData(uint32 type, uint32 data)
  447. {
  448. switch (type)
  449. {
  450. case DATA_BONED_ACHIEVEMENT:
  451. isBonedEligible = data ? true : false;
  452. break;
  453. case DATA_OOZE_DANCE_ACHIEVEMENT:
  454. isOozeDanceEligible = data ? true : false;
  455. break;
  456. case DATA_NAUSEA_ACHIEVEMENT:
  457. isNauseaEligible = data ? true : false;
  458. break;
  459. case DATA_ORB_WHISPERER_ACHIEVEMENT:
  460. isOrbWhispererEligible = data ? true : false;
  461. break;
  462. case DATA_SINDRAGOSA_FROSTWYRMS:
  463. if (data > 1)
  464. frostwyrms = data;
  465. else if (data == 1)
  466. ++frostwyrms;
  467. else if (!data && !--frostwyrms && GetBossState(DATA_SINDRAGOSA) != DONE)
  468. {
  469. instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
  470. if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
  471. {
  472. boss->setActive(true);
  473. boss->AI()->DoAction(ACTION_START_FROSTWYRM);
  474. }
  475. }
  476. break;
  477. case DATA_SPINESTALKER:
  478. if (data > 1)
  479. spinestalkerTrash = data;
  480. else if (data == 1)
  481. ++spinestalkerTrash;
  482. else if (!data && !--spinestalkerTrash)
  483. if (Creature* spinestalk = instance->GetCreature(spinestalker))
  484. spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
  485. break;
  486. case DATA_RIMEFANG:
  487. if (data > 1)
  488. rimefangTrash = data;
  489. else if (data == 1)
  490. ++rimefangTrash;
  491. else if (!data && !--rimefangTrash)
  492. if (Creature* rime = instance->GetCreature(rimefang))
  493. rime->AI()->DoAction(ACTION_START_FROSTWYRM);
  494. break;
  495. case DATA_COLDFLAME_JETS:
  496. coldflameJetsState = data;
  497. if (coldflameJetsState == DONE)
  498. for (std::set<uint64>::iterator itr = coldflameJets.begin(); itr != coldflameJets.end(); ++itr)
  499. if (Creature* trap = instance->GetCreature(*itr))
  500. trap->AI()->DoAction(ACTION_STOP_TRAPS);
  501. break;
  502. default:
  503. break;
  504. }
  505. }
  506.  
  507. bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
  508. {
  509. switch (criteria_id)
  510. {
  511. case CRITERIA_BONED_10N:
  512. case CRITERIA_BONED_25N:
  513. case CRITERIA_BONED_10H:
  514. case CRITERIA_BONED_25H:
  515. return isBonedEligible;
  516. case CRITERIA_DANCES_WITH_OOZES_10N:
  517. case CRITERIA_DANCES_WITH_OOZES_25N:
  518. case CRITERIA_DANCES_WITH_OOZES_10H:
  519. case CRITERIA_DANCES_WITH_OOZES_25H:
  520. return isOozeDanceEligible;
  521. case CRITERIA_NAUSEA_10N:
  522. case CRITERIA_NAUSEA_25N:
  523. case CRITERIA_NAUSEA_10H:
  524. case CRITERIA_NAUSEA_25H:
  525. return isNauseaEligible;
  526. case CRITERIA_ORB_WHISPERER_10N:
  527. case CRITERIA_ORB_WHISPERER_25N:
  528. case CRITERIA_ORB_WHISPERER_10H:
  529. case CRITERIA_ORB_WHISPERER_25H:
  530. return isOrbWhispererEligible;
  531. // Only one criteria for both modes, need to do it like this
  532. case CRITERIA_KILL_LANA_THEL_10M:
  533. case CRITERIA_ONCE_BITTEN_TWICE_SHY_10N:
  534. case CRITERIA_ONCE_BITTEN_TWICE_SHY_10V:
  535. return CAST_INST(InstanceMap, instance)->GetMaxPlayers() == 10;
  536. case CRITERIA_KILL_LANA_THEL_25M:
  537. case CRITERIA_ONCE_BITTEN_TWICE_SHY_25N:
  538. case CRITERIA_ONCE_BITTEN_TWICE_SHY_25V:
  539. return CAST_INST(InstanceMap, instance)->GetMaxPlayers() == 25;
  540. default:
  541. break;
  542. }
  543.  
  544. return false;
  545. }
  546.  
  547. bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const
  548. {
  549. if (player && player->isGameMaster())
  550. return true;
  551.  
  552. switch (bossId)
  553. {
  554. case DATA_THE_LICH_KING:
  555. if (!CheckPlagueworks(bossId))
  556. return false;
  557. if (!CheckCrimsonHalls(bossId))
  558. return false;
  559. if (!CheckFrostwingHalls(bossId))
  560. return false;
  561. break;
  562. case DATA_SINDRAGOSA:
  563. case DATA_VALITHRIA_DREAMWALKER:
  564. if (!CheckFrostwingHalls(bossId))
  565. return false;
  566. break;
  567. case DATA_BLOOD_QUEEN_LANA_THEL:
  568. case DATA_BLOOD_PRINCE_COUNCIL:
  569. if (!CheckCrimsonHalls(bossId))
  570. return false;
  571. break;
  572. case DATA_FESTERGUT:
  573. case DATA_ROTFACE:
  574. case DATA_PROFESSOR_PUTRICIDE:
  575. if (!CheckPlagueworks(bossId))
  576. return false;
  577. break;
  578. default:
  579. break;
  580. }
  581.  
  582. if (!CheckLowerSpire(bossId))
  583. return false;
  584.  
  585. return true;
  586. }
  587.  
  588. bool CheckPlagueworks(uint32 bossId) const
  589. {
  590. switch (bossId)
  591. {
  592. case DATA_THE_LICH_KING:
  593. if (GetBossState(DATA_PROFESSOR_PUTRICIDE) != DONE)
  594. return false;
  595. // no break
  596. case DATA_PROFESSOR_PUTRICIDE:
  597. if (GetBossState(DATA_FESTERGUT) != DONE || GetBossState(DATA_ROTFACE) != DONE)
  598. return false;
  599. break;
  600. default:
  601. break;
  602. }
  603.  
  604. return true;
  605. }
  606.  
  607. bool CheckCrimsonHalls(uint32 bossId) const
  608. {
  609. switch (bossId)
  610. {
  611. case DATA_THE_LICH_KING:
  612. if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE)
  613. return false;
  614. // no break
  615. case DATA_BLOOD_QUEEN_LANA_THEL:
  616. if (GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE)
  617. return false;
  618. break;
  619. default:
  620. break;
  621. }
  622.  
  623. return true;
  624. }
  625.  
  626. bool CheckFrostwingHalls(uint32 bossId) const
  627. {
  628. switch (bossId)
  629. {
  630. case DATA_THE_LICH_KING:
  631. if (GetBossState(DATA_SINDRAGOSA) != DONE)
  632. return false;
  633. // no break
  634. case DATA_SINDRAGOSA:
  635. //if (GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE)
  636. // return false;
  637. break;
  638. default:
  639. break;
  640. }
  641.  
  642. return true;
  643. }
  644.  
  645. bool CheckLowerSpire(uint32 bossId) const
  646. {
  647. switch (bossId)
  648. {
  649. case DATA_THE_LICH_KING:
  650. case DATA_SINDRAGOSA:
  651. case DATA_BLOOD_QUEEN_LANA_THEL:
  652. case DATA_PROFESSOR_PUTRICIDE:
  653. case DATA_VALITHRIA_DREAMWALKER:
  654. case DATA_BLOOD_PRINCE_COUNCIL:
  655. case DATA_ROTFACE:
  656. case DATA_FESTERGUT:
  657. if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
  658. return false;
  659. // no break
  660. case DATA_DEATHBRINGER_SAURFANG:
  661. if (GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  662. return false;
  663. // no break
  664. case DATA_GUNSHIP_EVENT:
  665. if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
  666. return false;
  667. // no break
  668. case DATA_LADY_DEATHWHISPER:
  669. if (GetBossState(DATA_LORD_MARROWGAR) != DONE)
  670. return false;
  671. // no break
  672. case DATA_LORD_MARROWGAR:
  673. default:
  674. break;
  675. }
  676.  
  677. return true;
  678. }
  679.  
  680. std::string GetSaveData()
  681. {
  682. OUT_SAVE_INST_DATA;
  683.  
  684. std::ostringstream saveStream;
  685. saveStream << "I C " << GetBossSaveData() << uint32(coldflameJetsState);
  686.  
  687. OUT_SAVE_INST_DATA_COMPLETE;
  688. return saveStream.str();
  689. }
  690.  
  691. void Load(const char* in)
  692. {
  693. if (!in)
  694. {
  695. OUT_LOAD_INST_DATA_FAIL;
  696. return;
  697. }
  698.  
  699. OUT_LOAD_INST_DATA(in);
  700.  
  701. char dataHead1, dataHead2;
  702.  
  703. std::istringstream loadStream(in);
  704. loadStream >> dataHead1 >> dataHead2;
  705.  
  706. if (dataHead1 == 'I' && dataHead2 == 'C')
  707. {
  708. for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  709. {
  710. uint32 tmpState;
  711. loadStream >> tmpState;
  712. if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
  713. tmpState = NOT_STARTED;
  714. SetBossState(i, EncounterState(tmpState));
  715. }
  716. uint32 jets = 0;
  717. loadStream >> jets;
  718. if (jets)
  719. jets = DONE;
  720. coldflameJetsState = jets;
  721. } else OUT_LOAD_INST_DATA_FAIL;
  722.  
  723. OUT_LOAD_INST_DATA_COMPLETE;
  724. }
  725.  
  726. private:
  727. uint64 ladyDeathwisperElevator;
  728. uint64 deathbringerSaurfang;
  729. uint64 saurfangDoor;
  730. uint64 saurfangEventNPC; // Muradin Bronzebeard or High Overlord Saurfang
  731. uint64 deathbringersCache;
  732. uint64 saurfangTeleport;
  733. uint64 putricidePipes[2];
  734. uint64 putricideGates[2];
  735. uint64 putricideCollision;
  736. uint64 festergut;
  737. uint64 rotface;
  738. uint64 professorPutricide;
  739. uint64 putricideTable;
  740. uint64 bloodCouncil[3];
  741. uint64 bloodCouncilController;
  742. uint64 bloodQueenLanaThel;
  743. uint64 sindragosa;
  744. uint64 spinestalker;
  745. uint64 rimefang;
  746. std::set<uint64> coldflameJets;
  747. uint32 teamInInstance;
  748. uint8 coldflameJetsState;
  749. uint8 frostwyrms;
  750. uint8 spinestalkerTrash;
  751. uint8 rimefangTrash;
  752. bool isBonedEligible;
  753. bool isOozeDanceEligible;
  754. bool isNauseaEligible;
  755. bool isOrbWhispererEligible;
  756. };
  757.  
  758. InstanceScript* GetInstanceScript(InstanceMap* map) const
  759. {
  760. return new instance_icecrown_citadel_InstanceMapScript(map);
  761. }
  762. };
  763.  
  764. void AddSC_instance_icecrown_citadel()
  765. {
  766. new instance_icecrown_citadel();
  767. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement