Advertisement
Guest User

Untitled

a guest
Aug 9th, 2011
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.83 KB | None | 0 0
  1. struct MANGOS_DLL_DECL instance_trial_of_the_crusader : public BSWScriptedInstance
  2. {
  3. instance_trial_of_the_crusader(Map* pMap) : BSWScriptedInstance(pMap) {
  4. Difficulty = pMap->GetDifficulty();
  5. Initialize();
  6. }
  7.  
  8. uint32 m_auiEncounter[MAX_ENCOUNTERS+1];
  9. uint32 m_auiEventTimer;
  10. uint32 m_auiEventNPCId;
  11. uint32 m_auiNorthrendBeasts;
  12. uint8 Difficulty;
  13. std::string m_strInstData;
  14. bool needsave;
  15.  
  16. uint32 m_uiDataDamageFjola;
  17. uint32 m_uiDataDamageEydis;
  18. uint32 m_uiValkyrsCasting;
  19.  
  20. uint32 m_uiTributeChest1;
  21. uint32 m_uiTributeChest2;
  22. uint32 m_uiTributeChest3;
  23. uint32 m_uiTributeChest4;
  24.  
  25. uint32 m_auiCrusadersCount;
  26.  
  27. void Initialize()
  28. {
  29. for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  30. m_auiEncounter[i] = NOT_STARTED;
  31.  
  32. m_auiEncounter[0] = 0;
  33. m_auiEncounter[7] = 50;
  34. m_auiEncounter[8] = 0;
  35.  
  36. m_auiNorthrendBeasts = NOT_STARTED;
  37. m_auiEventTimer = 1000;
  38. m_auiCrusadersCount = 6;
  39. needsave = false;
  40. }
  41.  
  42. bool IsEncounterInProgress() const
  43. {
  44. for(uint8 i = 1; i < MAX_ENCOUNTERS-2 ; ++i)
  45. if (m_auiEncounter[i] == IN_PROGRESS) return true;
  46.  
  47. return false;
  48. }
  49.  
  50. void OnPlayerEnter(Player *m_player)
  51. {
  52. if (Difficulty == RAID_DIFFICULTY_10MAN_HEROIC || Difficulty == RAID_DIFFICULTY_25MAN_HEROIC)
  53. {
  54. m_player->SendUpdateWorldState(UPDATE_STATE_UI_SHOW,1);
  55. m_player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, GetData(TYPE_COUNTER));
  56. }
  57. }
  58.  
  59. bool IsRaidWiped()
  60. {
  61. Map::PlayerList const &players = instance->GetPlayers();
  62.  
  63. for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
  64. {
  65. if(Player* pPlayer = i->getSource())
  66. {
  67. if(pPlayer->isAlive())
  68. return false;
  69. }
  70. }
  71. return true;
  72. }
  73.  
  74. void OnCreatureCreate(Creature* pCreature)
  75. {
  76. if (!pCreature)
  77. return;
  78. m_mNpcEntryGuidStore[pCreature->GetEntry()] = pCreature->GetObjectGuid();
  79. }
  80.  
  81. void OnObjectCreate(GameObject *pGo)
  82. {
  83. if (!pGo)
  84. return;
  85. m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid();
  86. }
  87.  
  88. void SetData(uint32 uiType, uint32 uiData)
  89. {
  90. switch(uiType)
  91. {
  92. case TYPE_STAGE: m_auiEncounter[0] = uiData; break;
  93. case TYPE_BEASTS: m_auiEncounter[1] = uiData; break;
  94. case TYPE_JARAXXUS: m_auiEncounter[2] = uiData; break;
  95. case TYPE_CRUSADERS:if (uiData == FAIL && (m_auiEncounter[3] == FAIL || m_auiEncounter[3] == NOT_STARTED))
  96. m_auiEncounter[3] = NOT_STARTED;
  97. else
  98. m_auiEncounter[3] = uiData;
  99. if (uiData == DONE)
  100. {
  101. uint32 uiCacheEntry = GO_CRUSADERS_CACHE_10;
  102.  
  103. switch (instance->GetDifficulty())
  104. {
  105. case RAID_DIFFICULTY_10MAN_HEROIC:
  106. uiCacheEntry = GO_CRUSADERS_CACHE_10_H;
  107. break;
  108. case RAID_DIFFICULTY_25MAN_NORMAL:
  109. uiCacheEntry = GO_CRUSADERS_CACHE_25;
  110. break;
  111. case RAID_DIFFICULTY_25MAN_HEROIC:
  112. uiCacheEntry = GO_CRUSADERS_CACHE_25_H;
  113. break;
  114. }
  115. if (GameObject* pChest = GetSingleGameObjectFromStorage(uiCacheEntry))
  116. if (!pChest->isSpawned())
  117. pChest->SetRespawnTime(7*DAY);
  118. };
  119. break;
  120. case TYPE_CRUSADERS_COUNT: if (uiData == 0) --m_auiCrusadersCount;
  121. else m_auiCrusadersCount = uiData;
  122. break;
  123. case TYPE_VALKIRIES: if (m_auiEncounter[4] == SPECIAL && uiData == SPECIAL) uiData = DONE;
  124. m_auiEncounter[4] = uiData; break;
  125. case TYPE_LICH_KING: m_auiEncounter[5] = uiData; break;
  126. case TYPE_ANUBARAK: m_auiEncounter[6] = uiData;
  127. if (uiData == DONE) {
  128. if (Difficulty == RAID_DIFFICULTY_10MAN_HEROIC)
  129. {
  130. if ( m_auiEncounter[7] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_10H_25;
  131. if ( m_auiEncounter[7] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_10H_45;
  132. if ( m_auiEncounter[7] >= 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_10H_50;
  133. m_uiTributeChest4 = GO_TRIBUTE_CHEST_10H_99;
  134. }
  135. if (Difficulty == RAID_DIFFICULTY_25MAN_HEROIC){
  136. if ( m_auiEncounter[7] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_25H_25;
  137. if ( m_auiEncounter[7] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_25H_45;
  138. if ( m_auiEncounter[7] >= 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_25H_50;
  139. m_uiTributeChest4 = GO_TRIBUTE_CHEST_25H_99;
  140. }
  141. // Attention! It is (may be) not off-like, but spawning all Tribute Chests is real
  142. // reward for clearing TOC instance
  143. if (m_uiTributeChest1)
  144. if (GameObject* pChest1 = GetSingleGameObjectFromStorage(m_uiTributeChest1))
  145. if (pChest1 && !pChest1->isSpawned()) pChest1->SetRespawnTime(7*DAY);
  146. if (m_uiTributeChest2)
  147. if (GameObject* pChest2 = GetSingleGameObjectFromStorage(m_uiTributeChest2))
  148. if (pChest2 && !pChest2->isSpawned()) pChest2->SetRespawnTime(7*DAY);
  149. if (m_uiTributeChest3)
  150. if (GameObject* pChest3 = GetSingleGameObjectFromStorage(m_uiTributeChest3))
  151. if (pChest3 && !pChest3->isSpawned()) pChest3->SetRespawnTime(7*DAY);
  152. if (m_uiTributeChest4)
  153. if (GameObject* pChest4 = GetSingleGameObjectFromStorage(m_uiTributeChest4))
  154. if (pChest4 && !pChest4->isSpawned()) pChest4->SetRespawnTime(7*DAY);
  155. };
  156. break;
  157. case TYPE_COUNTER: m_auiEncounter[7] = uiData; uiData = DONE; break;
  158. case TYPE_EVENT: m_auiEncounter[8] = uiData; uiData = NOT_STARTED; break;
  159. case TYPE_EVENT_TIMER: m_auiEventTimer = uiData; uiData = NOT_STARTED; break;
  160. case TYPE_NORTHREND_BEASTS: m_auiNorthrendBeasts = uiData; break;
  161. case DATA_HEALTH_FJOLA: m_uiDataDamageFjola = uiData; uiData = NOT_STARTED; break;
  162. case DATA_HEALTH_EYDIS: m_uiDataDamageEydis = uiData; uiData = NOT_STARTED; break;
  163. case DATA_CASTING_VALKYRS: m_uiValkyrsCasting = uiData; uiData = NOT_STARTED; break;
  164. }
  165.  
  166. if (IsEncounterInProgress())
  167. {
  168. DoCloseDoor(GetData64(GO_WEST_PORTCULLIS));
  169. DoCloseDoor(GetData64(GO_NORTH_PORTCULLIS));
  170. // DoCloseDoor(GetData64(GO_SOUTH_PORTCULLIS));
  171. }
  172. else
  173. {
  174. DoOpenDoor(GetData64(GO_WEST_PORTCULLIS));
  175. DoOpenDoor(GetData64(GO_NORTH_PORTCULLIS));
  176. // DoOpenDoor(GetData64(GO_SOUTH_PORTCULLIS));
  177. };
  178.  
  179. if (uiData == FAIL && uiType != TYPE_STAGE
  180. && uiType != TYPE_EVENT
  181. && uiType != TYPE_COUNTER
  182. && uiType != TYPE_EVENT_TIMER)
  183. { if (IsRaidWiped()) { --m_auiEncounter[7];
  184. needsave = true;
  185. }
  186. uiData = NOT_STARTED;
  187. }
  188.  
  189. if ((uiData == DONE && uiType != TYPE_STAGE
  190. && uiType != TYPE_EVENT
  191. && uiType != TYPE_EVENT_TIMER)
  192. || needsave == true)
  193. {
  194. OUT_SAVE_INST_DATA;
  195.  
  196. std::ostringstream saveStream;
  197.  
  198. for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  199. saveStream << m_auiEncounter[i] << " ";
  200.  
  201. m_strInstData = saveStream.str();
  202.  
  203. SaveToDB();
  204. OUT_SAVE_INST_DATA_COMPLETE;
  205. needsave = false;
  206. }
  207. }
  208.  
  209. uint32 GetData(uint32 uiType)
  210. {
  211. switch(uiType)
  212. {
  213. case TYPE_STAGE: return m_auiEncounter[0];
  214. case TYPE_BEASTS: return m_auiEncounter[1];
  215. case TYPE_JARAXXUS: return m_auiEncounter[2];
  216. case TYPE_CRUSADERS: return m_auiEncounter[3];
  217. case TYPE_VALKIRIES: return m_auiEncounter[4];
  218. case TYPE_LICH_KING: return m_auiEncounter[5];
  219. case TYPE_ANUBARAK: return m_auiEncounter[6];
  220. case TYPE_COUNTER: return m_auiEncounter[7];
  221. case TYPE_EVENT: return m_auiEncounter[8];
  222. case TYPE_DIFFICULTY: return Difficulty;
  223. case TYPE_NORTHREND_BEASTS: return m_auiNorthrendBeasts;
  224. case TYPE_EVENT_TIMER: return m_auiEventTimer;
  225. case TYPE_CRUSADERS_COUNT: return m_auiCrusadersCount;
  226. case TYPE_EVENT_NPC: switch (m_auiEncounter[8])
  227. {
  228. case 110:
  229. case 140:
  230. case 150:
  231. case 200:
  232. case 205:
  233. case 210:
  234. case 300:
  235. case 305:
  236. case 310:
  237. case 400:
  238. case 666:
  239. case 1010:
  240. case 1180:
  241. case 2000:
  242. case 2030:
  243. case 3000:
  244. case 3001:
  245. case 3060:
  246. case 3061:
  247. case 3090:
  248. case 3091:
  249. case 3100:
  250. case 3110:
  251. case 4000:
  252. case 4010:
  253. case 4015:
  254. case 4040:
  255. case 4050:
  256. case 5000:
  257. case 5005:
  258. case 5020:
  259. case 6000:
  260. case 6005:
  261. case 6010:
  262. m_auiEventNPCId = NPC_TIRION;
  263. break;
  264.  
  265. case 5010:
  266. case 5030:
  267. case 5040:
  268. case 5050:
  269. case 5060:
  270. case 5070:
  271. case 5080:
  272. m_auiEventNPCId = NPC_LICH_KING_1;
  273. break;
  274.  
  275. case 130:
  276. case 132:
  277. case 2020:
  278. case 3080:
  279. case 3051:
  280. case 3071:
  281. case 4020:
  282. m_auiEventNPCId = NPC_RINN;
  283. break;
  284.  
  285. case 120:
  286. case 122:
  287. case 2010:
  288. case 3050:
  289. case 3070:
  290. case 3081:
  291. case 4030:
  292. m_auiEventNPCId = NPC_GARROSH;
  293. break;
  294.  
  295. case 1110:
  296. case 1120:
  297. case 1130:
  298. case 1132:
  299. case 1134:
  300. case 1135:
  301. case 1140:
  302. case 1142:
  303. case 1144:
  304. case 1145:
  305. case 1150:
  306. case 1160:
  307. m_auiEventNPCId = NPC_FIZZLEBANG;
  308. break;
  309.  
  310. default:
  311. m_auiEventNPCId = NPC_TIRION;
  312. break;
  313.  
  314. };
  315. return m_auiEventNPCId;
  316.  
  317. case DATA_HEALTH_FJOLA: return m_uiDataDamageFjola;
  318. case DATA_HEALTH_EYDIS: return m_uiDataDamageEydis;
  319. case DATA_CASTING_VALKYRS: return m_uiValkyrsCasting;
  320. }
  321. return 0;
  322. }
  323.  
  324. const char* Save()
  325. {
  326. return m_strInstData.c_str();
  327. }
  328.  
  329. void Load(const char* strIn)
  330. {
  331. if (!strIn)
  332. {
  333. OUT_LOAD_INST_DATA_FAIL;
  334. return;
  335. }
  336.  
  337. OUT_LOAD_INST_DATA(strIn);
  338.  
  339. std::istringstream loadStream(strIn);
  340.  
  341. for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  342. {
  343. loadStream >> m_auiEncounter[i];
  344.  
  345. if (m_auiEncounter[i] == IN_PROGRESS)
  346. m_auiEncounter[i] = NOT_STARTED;
  347. }
  348. m_auiEncounter[TYPE_EVENT] = 0;
  349. m_auiEncounter[TYPE_STAGE] = 0;
  350.  
  351. OUT_LOAD_INST_DATA_COMPLETE;
  352.  
  353. }
  354. };
  355.  
  356. InstanceData* GetInstanceData_instance_trial_of_the_crusader(Map* pMap)
  357. {
  358. return new instance_trial_of_the_crusader(pMap);
  359. }
  360.  
  361. void AddSC_instance_trial_of_the_crusader()
  362. {
  363. Script *newscript;
  364. newscript = new Script;
  365. newscript->Name = "instance_trial_of_the_crusader";
  366. newscript->GetInstanceData = &GetInstanceData_instance_trial_of_the_crusader;
  367. newscript->RegisterSelf();
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement