Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.03 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_VALITHRIA_DREAMWALKER:
  174. valithriaDreamwalker = creature->GetGUID();
  175. break;
  176. case NPC_SINDRAGOSA:
  177. sindragosa = creature->GetGUID();
  178. break;
  179. case NPC_SPINESTALKER:
  180. spinestalker = creature->GetGUID();
  181. if (!creature->isDead())
  182. ++frostwyrms;
  183. break;
  184. case NPC_RIMEFANG:
  185. rimefang = creature->GetGUID();
  186. if (!creature->isDead())
  187. ++frostwyrms;
  188. break;
  189. case NPC_LICH_KING:
  190. lichKing = creature->GetGUID();
  191. break;
  192. case NPC_TIRION_ICC:
  193. tirion = creature->GetGUID();
  194. break;
  195. default:
  196. break;
  197. }
  198. }
  199.  
  200. void OnCreatureRemove(Creature* creature)
  201. {
  202. if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP)
  203. coldflameJets.erase(creature->GetGUID());
  204. }
  205.  
  206. void OnGameObjectCreate(GameObject* go)
  207. {
  208. switch (go->GetEntry())
  209. {
  210. case GO_DOODAD_ICECROWN_ICEWALL02:
  211. case GO_ICEWALL:
  212. case GO_LORD_MARROWGAR_S_ENTRANCE:
  213. case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
  214. case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE:
  215. case GO_GREEN_PLAGUE_MONSTER_ENTRANCE:
  216. case GO_SCIENTIST_ENTRANCE:
  217. case GO_CRIMSON_HALL_DOOR:
  218. case GO_BLOOD_ELF_COUNCIL_DOOR:
  219. case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT:
  220. case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01:
  221. case GO_DOODAD_ICECROWN_GRATE_01:
  222. case GO_GREEN_DRAGON_BOSS_ENTRANCE:
  223. case GO_GREEN_DRAGON_BOSS_EXIT:
  224. case GO_GREEN_DRAGON_BOSS_DOOR:
  225. case GO_DREAMWALKER_DOOR_1:
  226. case GO_DREAMWALKER_DOOR_2:
  227. case GO_DREAMWALKER_DOOR_3:
  228. case GO_DREAMWALKER_DOOR_4:
  229. case GO_VALITHRIA_ELEVATOR:
  230. valithriaDreamwalkerElevator = go->GetGUID();
  231. if (GetBossState(DATA_VALITHRIA_DREAMWALKER_EVENT) == DONE)
  232. {
  233. go->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
  234. go->SetGoState(GO_STATE_READY);
  235. }
  236. break;
  237. case GO_SINDRAGOSA_ENTRANCE_DOOR:
  238. case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR:
  239. case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR:
  240. case GO_ICE_WALL:
  241. AddDoor(go, true);
  242. break;
  243. case GO_LADY_DEATHWHISPER_ELEVATOR:
  244. ladyDeathwisperElevator = go->GetGUID();
  245. if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
  246. {
  247. go->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
  248. go->SetGoState(GO_STATE_READY);
  249. }
  250. break;
  251. case GO_SAURFANG_S_DOOR:
  252. saurfangDoor = go->GetGUID();
  253. AddDoor(go, true);
  254. break;
  255. case GO_DEATHBRINGER_S_CACHE_10N:
  256. case GO_DEATHBRINGER_S_CACHE_25N:
  257. case GO_DEATHBRINGER_S_CACHE_10H:
  258. case GO_DEATHBRINGER_S_CACHE_25H:
  259. deathbringersCache = go->GetGUID();
  260. break;
  261. case GO_SCOURGE_TRANSPORTER_SAURFANG:
  262. saurfangTeleport = go->GetGUID();
  263. break;
  264. case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION:
  265. putricideCollision = go->GetGUID();
  266. if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
  267. HandleGameObject(putricideCollision, true, go);
  268. break;
  269. case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE:
  270. putricideGates[0] = go->GetGUID();
  271. if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
  272. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  273. else if (GetBossState(DATA_FESTERGUT) == DONE)
  274. HandleGameObject(putricideGates[1], false, go);
  275. break;
  276. case GO_SCIENTIST_AIRLOCK_DOOR_GREEN:
  277. putricideGates[1] = go->GetGUID();
  278. if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE)
  279. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  280. else if (GetBossState(DATA_ROTFACE) == DONE)
  281. HandleGameObject(putricideGates[1], false, go);
  282. break;
  283. case GO_DOODAD_ICECROWN_ORANGETUBES02:
  284. putricidePipes[0] = go->GetGUID();
  285. if (GetBossState(DATA_FESTERGUT) == DONE)
  286. HandleGameObject(putricidePipes[0], true, go);
  287. break;
  288. case GO_DOODAD_ICECROWN_GREENTUBES02:
  289. putricidePipes[1] = go->GetGUID();
  290. if (GetBossState(DATA_ROTFACE) == DONE)
  291. HandleGameObject(putricidePipes[1], true, go);
  292. break;
  293. case GO_DRINK_ME:
  294. putricideTable = go->GetGUID();
  295. break;
  296. default:
  297. break;
  298. }
  299. }
  300.  
  301. void OnGameObjectRemove(GameObject* go)
  302. {
  303. switch (go->GetEntry())
  304. {
  305. case GO_DOODAD_ICECROWN_ICEWALL02:
  306. case GO_ICEWALL:
  307. case GO_LORD_MARROWGAR_S_ENTRANCE:
  308. case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
  309. case GO_SAURFANG_S_DOOR:
  310. case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE:
  311. case GO_GREEN_PLAGUE_MONSTER_ENTRANCE:
  312. case GO_SCIENTIST_ENTRANCE:
  313. case GO_CRIMSON_HALL_DOOR:
  314. case GO_BLOOD_ELF_COUNCIL_DOOR:
  315. case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT:
  316. case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01:
  317. case GO_DOODAD_ICECROWN_GRATE_01:
  318. case GO_GREEN_DRAGON_BOSS_ENTRANCE:
  319. case GO_GREEN_DRAGON_BOSS_EXIT:
  320. case GO_SINDRAGOSA_ENTRANCE_DOOR:
  321. case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR:
  322. case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR:
  323. case GO_ICE_WALL:
  324. AddDoor(go, false);
  325. break;
  326. default:
  327. break;
  328. }
  329. }
  330.  
  331. uint32 GetData(uint32 type)
  332. {
  333. switch (type)
  334. {
  335. case DATA_SINDRAGOSA_FROSTWYRMS:
  336. return frostwyrms;
  337. case DATA_SPINESTALKER:
  338. return spinestalkerTrash;
  339. case DATA_RIMEFANG:
  340. return rimefangTrash;
  341. case DATA_COLDFLAME_JETS:
  342. return coldflameJetsState;
  343. default:
  344. break;
  345. }
  346.  
  347. return 0;
  348. }
  349.  
  350. uint64 GetData64(uint32 type)
  351. {
  352. switch (type)
  353. {
  354. case DATA_DEATHBRINGER_SAURFANG:
  355. return deathbringerSaurfang;
  356. case DATA_SAURFANG_EVENT_NPC:
  357. return saurfangEventNPC;
  358. case GO_SAURFANG_S_DOOR:
  359. return saurfangDoor;
  360. case GO_SCOURGE_TRANSPORTER_SAURFANG:
  361. return saurfangTeleport;
  362. case DATA_FESTERGUT:
  363. return festergut;
  364. case DATA_ROTFACE:
  365. return rotface;
  366. case DATA_PROFESSOR_PUTRICIDE:
  367. return professorPutricide;
  368. case DATA_PUTRICIDE_TABLE:
  369. return putricideTable;
  370. case DATA_PRINCE_KELESETH_GUID:
  371. return bloodCouncil[0];
  372. case DATA_PRINCE_TALDARAM_GUID:
  373. return bloodCouncil[1];
  374. case DATA_PRINCE_VALANAR_GUID:
  375. return bloodCouncil[2];
  376. case DATA_BLOOD_PRINCES_CONTROL:
  377. return bloodCouncilController;
  378. case DATA_BLOOD_QUEEN_LANA_THEL:
  379. return bloodQueenLanaThel;
  380. case DATA_SINDRAGOSA:
  381. return sindragosa;
  382. case DATA_SPINESTALKER:
  383. return spinestalker;
  384. case DATA_RIMEFANG:
  385. return rimefang;
  386. default:
  387. break;
  388. }
  389.  
  390. return 0;
  391. }
  392.  
  393. bool SetBossState(uint32 type, EncounterState state)
  394. {
  395. if (!InstanceScript::SetBossState(type, state))
  396. return false;
  397.  
  398. switch (type)
  399. {
  400. case DATA_LADY_DEATHWHISPER:
  401. SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
  402. if (state == DONE)
  403. if (GameObject* elevator = instance->GetGameObject(ladyDeathwisperElevator))
  404. {
  405. elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
  406. elevator->SetGoState(GO_STATE_READY);
  407. }
  408. break;
  409. case DATA_DEATHBRINGER_SAURFANG:
  410. switch (state)
  411. {
  412. case DONE:
  413. DoRespawnGameObject(deathbringersCache, 7*DAY);
  414. case NOT_STARTED:
  415. if (GameObject* teleporter = instance->GetGameObject(saurfangTeleport))
  416. {
  417. HandleGameObject(saurfangTeleport, true, teleporter);
  418. teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  419. }
  420. break;
  421. default:
  422. break;
  423. }
  424. break;
  425. case DATA_FESTERGUT:
  426. if (state == DONE)
  427. {
  428. if (GetBossState(DATA_ROTFACE) == DONE)
  429. {
  430. HandleGameObject(putricideCollision, true);
  431. if (GameObject* go = instance->GetGameObject(putricideGates[0]))
  432. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  433. if (GameObject* go = instance->GetGameObject(putricideGates[1]))
  434. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  435. }
  436. else
  437. HandleGameObject(putricideGates[0], false);
  438. HandleGameObject(putricidePipes[0], true);
  439. }
  440. break;
  441. case DATA_ROTFACE:
  442. if (state == DONE)
  443. {
  444. if (GetBossState(DATA_FESTERGUT) == DONE)
  445. {
  446. HandleGameObject(putricideCollision, true);
  447. if (GameObject* go = instance->GetGameObject(putricideGates[0]))
  448. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  449. if (GameObject* go = instance->GetGameObject(putricideGates[1]))
  450. go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
  451. }
  452. else
  453. HandleGameObject(putricideGates[1], false);
  454. HandleGameObject(putricidePipes[1], true);
  455. }
  456. break;
  457. case DATA_VALITHRIA_DREAMWALKER:
  458. case DATA_SINDRAGOSA:
  459. case DATA_THE_LICH_KING:
  460. break;
  461. default:
  462. break;
  463. }
  464.  
  465. return true;
  466. }
  467.  
  468. void SetData(uint32 type, uint32 data)
  469. {
  470. switch (type)
  471. {
  472. case DATA_BONED_ACHIEVEMENT:
  473. isBonedEligible = data ? true : false;
  474. break;
  475. case DATA_OOZE_DANCE_ACHIEVEMENT:
  476. isOozeDanceEligible = data ? true : false;
  477. break;
  478. case DATA_NAUSEA_ACHIEVEMENT:
  479. isNauseaEligible = data ? true : false;
  480. break;
  481. case DATA_ORB_WHISPERER_ACHIEVEMENT:
  482. isOrbWhispererEligible = data ? true : false;
  483. break;
  484. case DATA_SINDRAGOSA_FROSTWYRMS:
  485. if (data > 1)
  486. frostwyrms = data;
  487. else if (data == 1)
  488. ++frostwyrms;
  489. else if (!data && !--frostwyrms && GetBossState(DATA_SINDRAGOSA) != DONE)
  490. {
  491. instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
  492. if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
  493. {
  494. boss->setActive(true);
  495. boss->AI()->DoAction(ACTION_START_FROSTWYRM);
  496. }
  497. }
  498. break;
  499. case DATA_SPINESTALKER:
  500. if (data > 1)
  501. spinestalkerTrash = data;
  502. else if (data == 1)
  503. ++spinestalkerTrash;
  504. else if (!data && !--spinestalkerTrash)
  505. if (Creature* spinestalk = instance->GetCreature(spinestalker))
  506. spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
  507. break;
  508. case DATA_RIMEFANG:
  509. if (data > 1)
  510. rimefangTrash = data;
  511. else if (data == 1)
  512. ++rimefangTrash;
  513. else if (!data && !--rimefangTrash)
  514. if (Creature* rime = instance->GetCreature(rimefang))
  515. rime->AI()->DoAction(ACTION_START_FROSTWYRM);
  516. break;
  517. case DATA_COLDFLAME_JETS:
  518. coldflameJetsState = data;
  519. if (coldflameJetsState == DONE)
  520. for (std::set<uint64>::iterator itr = coldflameJets.begin(); itr != coldflameJets.end(); ++itr)
  521. if (Creature* trap = instance->GetCreature(*itr))
  522. trap->AI()->DoAction(ACTION_STOP_TRAPS);
  523. break;
  524. default:
  525. break;
  526. }
  527. }
  528.  
  529. bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
  530. {
  531. switch (criteria_id)
  532. {
  533. case CRITERIA_BONED_10N:
  534. case CRITERIA_BONED_25N:
  535. case CRITERIA_BONED_10H:
  536. case CRITERIA_BONED_25H:
  537. return isBonedEligible;
  538. case CRITERIA_DANCES_WITH_OOZES_10N:
  539. case CRITERIA_DANCES_WITH_OOZES_25N:
  540. case CRITERIA_DANCES_WITH_OOZES_10H:
  541. case CRITERIA_DANCES_WITH_OOZES_25H:
  542. return isOozeDanceEligible;
  543. case CRITERIA_NAUSEA_10N:
  544. case CRITERIA_NAUSEA_25N:
  545. case CRITERIA_NAUSEA_10H:
  546. case CRITERIA_NAUSEA_25H:
  547. return isNauseaEligible;
  548. case CRITERIA_ORB_WHISPERER_10N:
  549. case CRITERIA_ORB_WHISPERER_25N:
  550. case CRITERIA_ORB_WHISPERER_10H:
  551. case CRITERIA_ORB_WHISPERER_25H:
  552. return isOrbWhispererEligible;
  553. // Only one criteria for both modes, need to do it like this
  554. case CRITERIA_KILL_LANA_THEL_10M:
  555. case CRITERIA_ONCE_BITTEN_TWICE_SHY_10N:
  556. case CRITERIA_ONCE_BITTEN_TWICE_SHY_10V:
  557. return CAST_INST(InstanceMap, instance)->GetMaxPlayers() == 10;
  558. case CRITERIA_KILL_LANA_THEL_25M:
  559. case CRITERIA_ONCE_BITTEN_TWICE_SHY_25N:
  560. case CRITERIA_ONCE_BITTEN_TWICE_SHY_25V:
  561. return CAST_INST(InstanceMap, instance)->GetMaxPlayers() == 25;
  562. default:
  563. break;
  564. }
  565.  
  566. return false;
  567. }
  568.  
  569. bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const
  570. {
  571. if (player && player->isGameMaster())
  572. return true;
  573.  
  574. switch (bossId)
  575. {
  576. case DATA_THE_LICH_KING:
  577. if (!CheckPlagueworks(bossId))
  578. return false;
  579. if (!CheckCrimsonHalls(bossId))
  580. return false;
  581. if (!CheckFrostwingHalls(bossId))
  582. return false;
  583. break;
  584. case DATA_SINDRAGOSA:
  585. case DATA_VALITHRIA_DREAMWALKER:
  586. if (!CheckFrostwingHalls(bossId))
  587. return false;
  588. break;
  589. case DATA_BLOOD_QUEEN_LANA_THEL:
  590. case DATA_BLOOD_PRINCE_COUNCIL:
  591. if (!CheckCrimsonHalls(bossId))
  592. return false;
  593. break;
  594. case DATA_FESTERGUT:
  595. case DATA_ROTFACE:
  596. case DATA_PROFESSOR_PUTRICIDE:
  597. if (!CheckPlagueworks(bossId))
  598. return false;
  599. break;
  600. default:
  601. break;
  602. }
  603.  
  604. if (!CheckLowerSpire(bossId))
  605. return false;
  606.  
  607. return true;
  608. }
  609.  
  610. bool CheckPlagueworks(uint32 bossId) const
  611. {
  612. switch (bossId)
  613. {
  614. case DATA_THE_LICH_KING:
  615. if (GetBossState(DATA_PROFESSOR_PUTRICIDE) != DONE)
  616. return false;
  617. // no break
  618. case DATA_PROFESSOR_PUTRICIDE:
  619. if (GetBossState(DATA_FESTERGUT) != DONE || GetBossState(DATA_ROTFACE) != DONE)
  620. return false;
  621. break;
  622. default:
  623. break;
  624. }
  625.  
  626. return true;
  627. }
  628.  
  629. bool CheckCrimsonHalls(uint32 bossId) const
  630. {
  631. switch (bossId)
  632. {
  633. case DATA_THE_LICH_KING:
  634. if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE)
  635. return false;
  636. // no break
  637. case DATA_BLOOD_QUEEN_LANA_THEL:
  638. if (GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE)
  639. return false;
  640. break;
  641. default:
  642. break;
  643. }
  644.  
  645. return true;
  646. }
  647.  
  648. bool CheckFrostwingHalls(uint32 bossId) const
  649. {
  650. switch (bossId)
  651. {
  652. case DATA_THE_LICH_KING:
  653. if (GetBossState(DATA_SINDRAGOSA) != DONE)
  654. return false;
  655. // no break
  656. case DATA_SINDRAGOSA:
  657. //if (GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE)
  658. // return false;
  659. break;
  660. default:
  661. break;
  662. }
  663.  
  664. return true;
  665. }
  666.  
  667. bool CheckLowerSpire(uint32 bossId) const
  668. {
  669. switch (bossId)
  670. {
  671. case DATA_THE_LICH_KING:
  672. case DATA_SINDRAGOSA:
  673. case DATA_BLOOD_QUEEN_LANA_THEL:
  674. case DATA_PROFESSOR_PUTRICIDE:
  675. case DATA_VALITHRIA_DREAMWALKER:
  676. case DATA_BLOOD_PRINCE_COUNCIL:
  677. case DATA_ROTFACE:
  678. case DATA_FESTERGUT:
  679. if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
  680. return false;
  681. // no break
  682. case DATA_DEATHBRINGER_SAURFANG:
  683. if (GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  684. return false;
  685. // no break
  686. case DATA_GUNSHIP_EVENT:
  687. if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
  688. return false;
  689. // no break
  690. case DATA_LADY_DEATHWHISPER:
  691. if (GetBossState(DATA_LORD_MARROWGAR) != DONE)
  692. return false;
  693. // no break
  694. case DATA_LORD_MARROWGAR:
  695. default:
  696. break;
  697. }
  698.  
  699. return true;
  700. }
  701.  
  702. std::string GetSaveData()
  703. {
  704. OUT_SAVE_INST_DATA;
  705.  
  706. std::ostringstream saveStream;
  707. saveStream << "I C " << GetBossSaveData() << uint32(coldflameJetsState);
  708.  
  709. OUT_SAVE_INST_DATA_COMPLETE;
  710. return saveStream.str();
  711. }
  712.  
  713. void Load(const char* in)
  714. {
  715. if (!in)
  716. {
  717. OUT_LOAD_INST_DATA_FAIL;
  718. return;
  719. }
  720.  
  721. OUT_LOAD_INST_DATA(in);
  722.  
  723. char dataHead1, dataHead2;
  724.  
  725. std::istringstream loadStream(in);
  726. loadStream >> dataHead1 >> dataHead2;
  727.  
  728. if (dataHead1 == 'I' && dataHead2 == 'C')
  729. {
  730. for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  731. {
  732. uint32 tmpState;
  733. loadStream >> tmpState;
  734. if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
  735. tmpState = NOT_STARTED;
  736. SetBossState(i, EncounterState(tmpState));
  737. }
  738. uint32 jets = 0;
  739. loadStream >> jets;
  740. if (jets)
  741. jets = DONE;
  742. coldflameJetsState = jets;
  743. } else OUT_LOAD_INST_DATA_FAIL;
  744.  
  745. OUT_LOAD_INST_DATA_COMPLETE;
  746. }
  747.  
  748. private:
  749. uint64 ladyDeathwisperElevator;
  750. uint64 deathbringerSaurfang;
  751. uint64 saurfangDoor;
  752. uint64 saurfangEventNPC; // Muradin Bronzebeard or High Overlord Saurfang
  753. uint64 deathbringersCache;
  754. uint64 saurfangTeleport;
  755. uint64 putricidePipes[2];
  756. uint64 putricideGates[2];
  757. uint64 putricideCollision;
  758. uint64 festergut;
  759. uint64 rotface;
  760. uint64 professorPutricide;
  761. uint64 putricideTable;
  762. uint64 bloodCouncil[3];
  763. uint64 bloodCouncilController;
  764. uint64 bloodQueenLanaThel;
  765. uint64 sindragosa;
  766. uint64 spinestalker;
  767. uint64 rimefang;
  768. std::set<uint64> coldflameJets;
  769. uint32 teamInInstance;
  770. uint8 coldflameJetsState;
  771. uint8 frostwyrms;
  772. uint8 spinestalkerTrash;
  773. uint8 rimefangTrash;
  774. bool isBonedEligible;
  775. bool isOozeDanceEligible;
  776. bool isNauseaEligible;
  777. bool isOrbWhispererEligible;
  778. };
  779.  
  780. InstanceScript* GetInstanceScript(InstanceMap* map) const
  781. {
  782. return new instance_icecrown_citadel_InstanceMapScript(map);
  783. }
  784. };
  785.  
  786. void AddSC_instance_icecrown_citadel()
  787. {
  788. new instance_icecrown_citadel();
  789. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement