PageRenderTime 26ms CodeModel.GetById 41ms RepoModel.GetById 0ms app.codeStats 0ms

/src/server/scripts/Raids/Wyrmrest_Temple/Ruby_Sanctum/instance_ruby_sanctum.cpp

https://github.com/skypeak/VoragineCore
C++ | 310 lines | 258 code | 29 blank | 23 comment | 25 complexity | 068c82f5d847abcdd1ad8b3630bcdacd MD5 | raw file
  1. /* Copyright (C) 2010 Easy for Trinity <http://trinity-core.ru/>
  2. *
  3. * Copyright (C) 2008 - 2010 Trinity <http://www.trinitycore.org/>
  4. *
  5. * Copyright (C) 2010 Myth Project <http://bitbucket.org/sun/myth-core/>
  6. *
  7. * Copyright (C) 2006 - 2010 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22. */
  23. #include "ScriptPCH.h"
  24. #include "ruby_sanctum.h"
  25. static const DoorData doorData[5] =
  26. {
  27. {GO_FIRE_FIELD, DATA_BALTHARUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  28. {GO_FLAME_WALLS, DATA_BALTHARUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  29. {GO_FLAME_WALLS, DATA_RAGEFIRE, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
  30. {GO_FLAME_WALLS, DATA_ZARITHRIAN, DOOR_TYPE_ROOM, BOUNDARY_N },
  31. {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE}
  32. };
  33. class instance_ruby_sanctum : public InstanceMapScript
  34. {
  35. public:
  36. instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { }
  37. struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript
  38. {
  39. instance_ruby_sanctum_InstanceMapScript(Map *pMap) : InstanceScript(pMap)
  40. {
  41. SetBossNumber(MAX_ENCOUNTER);
  42. LoadDoorData(doorData);
  43. m_uiDataDamage = 0;
  44. m_uiXerestrasza = 0;
  45. m_uiTwilightHalion = 0;
  46. m_uiHalionPortalGUID = 0;
  47. m_uiTwilightPortalGUID = 0;
  48. m_uiBaltharusGUID = 0;
  49. m_uiZarithrianGUID = 0;
  50. m_uiRagefireGUID = 0;
  51. m_uiHalionGUID = 0;
  52. m_uiXerestraszaGUID = 0;
  53. m_uiTwilightHalionGUID = 0;
  54. m_uiGOFlameWallsGUID = 0;
  55. m_uiGOTwilightWallsGUID = 0;
  56. }
  57. void OnCreatureCreate(Creature *pCreature)
  58. {
  59. switch(pCreature->GetEntry())
  60. {
  61. case NPC_BALTHARUS: { m_uiBaltharusGUID = pCreature->GetGUID(); break;}
  62. case NPC_RAGEFIRE: { m_uiRagefireGUID = pCreature->GetGUID(); break;}
  63. case NPC_XERESTRASZA: { m_uiXerestraszaGUID = pCreature->GetGUID(); break;}
  64. case NPC_ZARITHRIAN:
  65. {
  66. m_uiZarithrianGUID = pCreature->GetGUID();
  67. if (GetBossState(DATA_RAGEFIRE)==DONE && GetBossState(DATA_BALTHARUS)==DONE)
  68. {
  69. pCreature->SetReactState(REACT_AGGRESSIVE);
  70. pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  71. }
  72. else
  73. {
  74. pCreature->SetReactState(REACT_PASSIVE);
  75. pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  76. }
  77. break;
  78. }
  79. case NPC_HALION:
  80. {
  81. m_uiHalionGUID = pCreature->GetGUID();
  82. if (GetBossState(DATA_ZARITHRIAN)==DONE)
  83. {
  84. pCreature->SetVisible(true);
  85. pCreature->SetReactState(REACT_AGGRESSIVE);
  86. pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  87. pCreature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
  88. }
  89. else
  90. {
  91. pCreature->SetVisible(false);
  92. pCreature->SetReactState(REACT_PASSIVE);
  93. pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  94. }
  95. break;
  96. }
  97. case NPC_TWILIGHT_HALION:{ m_uiTwilightHalionGUID = pCreature->GetGUID(); break;}
  98. default:
  99. break;
  100. }
  101. }
  102. void OnGameObjectCreate(GameObject* pGo, bool add)
  103. {
  104. switch (pGo->GetEntry())
  105. {
  106. case GO_FIRE_FIELD:
  107. case GO_FLAME_WALLS:
  108. //case GO_FLAME_WALLS2:
  109. AddDoor(pGo, add);
  110. break;
  111. case GO_TWILIGHT_PORTAL1: m_uiHalionPortalGUID = pGo->GetGUID(); break;
  112. case GO_TWILIGHT_PORTAL2: m_uiTwilightPortalGUID = pGo->GetGUID(); break;
  113. case GO_FLAME_WALLS2: m_uiGOFlameWallsGUID = pGo->GetGUID(); break;
  114. case GO_FLAME_WALLS3: m_uiGOTwilightWallsGUID = pGo->GetGUID(); break;
  115. default: break;
  116. }
  117. }
  118. void SetData(uint32 uiType, uint32 uiData)
  119. {
  120. switch(uiType)
  121. {
  122. case DATA_XERESTRASZA: m_uiXerestrasza = uiData; break;
  123. case DATA_TWILIGHT_HALION: m_uiTwilightHalion = uiData; break;
  124. case DATA_DAMAGE: m_uiDataDamage = uiData; break;
  125. }
  126. }
  127. uint32 GetData(uint32 uiType)
  128. {
  129. switch(uiType)
  130. {
  131. case DATA_XERESTRASZA: return m_uiXerestrasza; break;
  132. case DATA_TWILIGHT_HALION: return m_uiTwilightHalion; break;
  133. case DATA_DAMAGE: return m_uiDataDamage; break;
  134. }
  135. return 0;
  136. }
  137. void BossZarithrian()
  138. {
  139. if (Creature* Zarithrian = instance->GetCreature(GetData64(DATA_ZARITHRIAN)))
  140. {
  141. Zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  142. Zarithrian->SetReactState(REACT_AGGRESSIVE);
  143. }
  144. }
  145. bool SetBossState(uint32 type, EncounterState state)
  146. {
  147. if (!InstanceScript::SetBossState(type, state))
  148. return false;
  149. switch (type)
  150. {
  151. case DATA_BALTHARUS:
  152. {
  153. if (state==DONE)
  154. {
  155. if (GetBossState(DATA_RAGEFIRE)==DONE)
  156. {
  157. BossZarithrian();
  158. }
  159. }
  160. break;
  161. }
  162. case DATA_RAGEFIRE:
  163. {
  164. if (state==DONE)
  165. {
  166. if (GetBossState(DATA_BALTHARUS)==DONE)
  167. {
  168. BossZarithrian();
  169. }
  170. }
  171. break;
  172. }
  173. case DATA_ZARITHRIAN:
  174. {
  175. if (GetBossState(DATA_BALTHARUS)==DONE && GetBossState(DATA_RAGEFIRE)==DONE)
  176. {
  177. if (state==DONE)
  178. {
  179. if (Creature* halion = instance->GetCreature(GetData64(DATA_HALION)))
  180. {
  181. halion->SummonCreature(NPC_SUMMON_HALIOH,SpawnPosHalion,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,20000);
  182. halion->SetVisible(true);
  183. halion->SetReactState(REACT_AGGRESSIVE);
  184. halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  185. halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
  186. }
  187. }
  188. }
  189. break;
  190. }
  191. case DATA_HALION:
  192. {
  193. if (state==DONE)
  194. {
  195. if (GameObject* flame2 = instance->GetGameObject(GetData64(GO_FLAME_WALLS2)))
  196. flame2->RemoveFromWorld();
  197. if (GameObject* flame3 = instance->GetGameObject(GetData64(GO_FLAME_WALLS3)))
  198. flame3->RemoveFromWorld();
  199. }
  200. if (GetBossState(DATA_ZARITHRIAN)==DONE)
  201. {
  202. if (Creature* halion = instance->GetCreature(GetData64(DATA_HALION)))
  203. {
  204. halion->SetVisible(true);
  205. halion->SetReactState(REACT_AGGRESSIVE);
  206. halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  207. halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
  208. }
  209. }
  210. break;
  211. }
  212. default:
  213. break;
  214. }
  215. return true;
  216. }
  217. uint64 GetData64(uint32 uiData)
  218. {
  219. switch(uiData)
  220. {
  221. case DATA_BALTHARUS: return m_uiBaltharusGUID; break;
  222. case DATA_ZARITHRIAN: return m_uiZarithrianGUID; break;
  223. case DATA_RAGEFIRE: return m_uiRagefireGUID; break;
  224. case DATA_HALION: return m_uiHalionGUID; break;
  225. case DATA_TWILIGHT_HALION: return m_uiTwilightHalionGUID; break;
  226. case DATA_XERESTRASZA: return m_uiXerestraszaGUID; break;
  227. case GO_TWILIGHT_PORTAL1: return m_uiHalionPortalGUID; break;
  228. case GO_TWILIGHT_PORTAL2: return m_uiTwilightPortalGUID; break;
  229. case GO_FLAME_WALLS2: return m_uiGOFlameWallsGUID; break;
  230. case GO_FLAME_WALLS3: return m_uiGOTwilightWallsGUID; break;
  231. default: break;
  232. }
  233. return 0;
  234. }
  235. std::string GetSaveData()
  236. {
  237. std::ostringstream saveStream;
  238. saveStream << GetBossSaveData() << " " << m_uiXerestrasza;
  239. return saveStream.str();
  240. }
  241. void Load(const char* strIn)
  242. {
  243. if (!strIn)
  244. {
  245. return;
  246. }
  247. std::istringstream loadStream(strIn);
  248. uint32 tmpState;
  249. for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  250. {
  251. loadStream >> tmpState;
  252. if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
  253. tmpState = NOT_STARTED;
  254. SetBossState(i, EncounterState(tmpState));
  255. }
  256. loadStream >> m_uiXerestrasza;
  257. }
  258. private:
  259. uint32 m_uiXerestrasza;
  260. uint32 m_uiTwilightHalion;
  261. uint32 m_uiDataDamage;
  262. uint64 m_uiBaltharusGUID;
  263. uint64 m_uiZarithrianGUID;
  264. uint64 m_uiRagefireGUID;
  265. uint64 m_uiHalionGUID;
  266. uint64 m_uiXerestraszaGUID;
  267. uint64 m_uiTwilightHalionGUID;
  268. uint64 m_uiHalionPortalGUID;
  269. uint64 m_uiTwilightPortalGUID;
  270. uint64 m_uiGOFlameWallsGUID;
  271. uint64 m_uiGOTwilightWallsGUID;
  272. };
  273. InstanceScript* GetInstanceScript (InstanceMap *pMap) const
  274. {
  275. return new instance_ruby_sanctum_InstanceMapScript(pMap);
  276. }
  277. };
  278. void AddSC_instance_ruby_sanctum()
  279. {
  280. new instance_ruby_sanctum();
  281. }