Advertisement
Guest User

Untitled

a guest
Apr 17th, 2014
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.95 KB | None | 0 0
  1. /*####
  2. ## Quest 12713: Betrayal
  3. ## npc_overlord_drakuru_enemy
  4. ## npc_lich_king_betrayal_quest
  5. ####*/
  6.  
  7. enum QuestBetrayal
  8. {
  9. NPC_ENEMY_DRAKURU = 28998,
  10. NPC_BLIGHTBLOOD_TROLL = 28931,
  11. NPC_LICH_KING = 1010656,
  12. NPC_TOTALLY_GENERIC_BUNNY = 28960,
  13. NPC_DRAKURUS_SKULL_TRIGGER = 1010657,
  14. GO_DRAKURUS_LAST_WISH = 202357,
  15. GO_DRAKURUS_SKULL = 191458,
  16. SPELL_DRAKURU_SHADOW_BOLT = 54113,
  17. SPELL_THROW_BLIGHT_CRYSTAL = 54087,
  18. SPELL_DRAKURUS_DEATH = 54248,
  19. // SPELL_SPAWN_DRAKURUS_SKULL = 54253,
  20. // SPELL_SCOURGE_DISGUISE = 51966
  21. EVENT_TALK_1 = 1,
  22. EVENT_TALK_2 = 2,
  23. EVENT_SPAWN_TROLLS = 3,
  24. EVENT_FAIL_DISGUISE_WARNING = 4,
  25. EVENT_FAIL_DISGUISE = 5,
  26. EVENT_TALK_3 = 6,
  27. EVENT_TALK_4 = 7,
  28. // EVENT_TALK_5 = 8,
  29. EVENT_TALK_6 = 9,
  30. EVENT_TALK_7 = 10,
  31. EVENT_CAST_SPELL = 11,
  32. EVENT_LICHKING_WALK = 12,
  33. EVENT_LICHKING_TALK_1 = 13,
  34. EVENT_LICHKING_TALK_2 = 14,
  35. EVENT_LICHKING_KILL_DRAKURU = 15,
  36. EVENT_LICHKING_TALK_3 = 16,
  37. EVENT_LICHKING_TALK_4 = 17,
  38. EVENT_LICHKING_TALK_5 = 18,
  39. EVENT_LICHKING_TALK_6 = 19,
  40. SAY_FAIL_DISGUISE_WARNING = 0,
  41. DRAKURU_SAY_1 = 1,
  42. DRAKURU_SAY_2 = 2,
  43. DRAKURU_SAY_3 = 3,
  44. DRAKURU_SAY_4 = 4,
  45. DRAKURU_SAY_5 = 5,
  46. DRAKURU_SAY_6 = 6,
  47. DRAKURU_SAY_7 = 7,
  48. LICHKING_SAY_1 = 0,
  49. LICHKING_SAY_2 = 1,
  50. LICHKING_SAY_3 = 2,
  51. LICHKING_SAY_4 = 3,
  52. LICHKING_SAY_5 = 4,
  53. LICHKING_SAY_6 = 5
  54. };
  55.  
  56. Position BlightbloodTrollSpawnPos[] =
  57. {
  58. {6222.93f, -2026.46f, 586.76f, 2.938f},
  59. {6166.21f, -2065.61f, 586.76f, 1.367f},
  60. {6127.46f, -2008.76f, 586.76f, 6.126f},
  61. {6184.25f, -1969.81f, 586.76f, 4.579f},
  62. };
  63.  
  64. class npc_overlord_drakuru_enemy : public CreatureScript
  65. {
  66. public:
  67. npc_overlord_drakuru_enemy() : CreatureScript("npc_overlord_drakuru_enemy") { }
  68.  
  69. struct npc_overlord_drakuru_enemyAI : public ScriptedAI
  70. {
  71. npc_overlord_drakuru_enemyAI(Creature* creature) : ScriptedAI(creature) { }
  72.  
  73. EventMap events;
  74.  
  75. void InitializeAI()
  76. {
  77. // there should only be one enemy Drakuru at a time
  78. std::list<Creature*> creaturelist;
  79. me->GetCreatureListWithEntryInGrid(creaturelist, NPC_ENEMY_DRAKURU, 1000.0f);
  80. if (creaturelist.size() > 1)
  81. {
  82. me->DespawnOrUnsummon(0);
  83. return;
  84. }
  85.  
  86. // despawn eventually existing skull and last wish when starting a new event
  87. if (Creature* trigger = me->FindNearestCreature(NPC_DRAKURUS_SKULL_TRIGGER, 1000.0f))
  88. {
  89. trigger->DespawnOrUnsummon();
  90. }
  91. if (GameObject* skull = me->FindNearestGameObject(GO_DRAKURUS_SKULL, 1000.0f))
  92. {
  93. skull->Delete();
  94. }
  95. if (GameObject* wish = me->FindNearestGameObject(GO_DRAKURUS_LAST_WISH, 1000.0f))
  96. {
  97. wish->Delete();
  98. }
  99.  
  100. events.ScheduleEvent(EVENT_TALK_1, 10000);
  101. }
  102.  
  103. void UpdateAI(uint32 diff)
  104. {
  105. events.Update(diff);
  106.  
  107. switch (events.ExecuteEvent())
  108. {
  109. case EVENT_TALK_1:
  110. Talk(DRAKURU_SAY_1);
  111. events.ScheduleEvent(EVENT_TALK_2, 10000);
  112. events.ScheduleEvent(EVENT_SPAWN_TROLLS, 3000);
  113. break;
  114. case EVENT_TALK_2:
  115. Talk(DRAKURU_SAY_2);
  116. events.ScheduleEvent(EVENT_FAIL_DISGUISE_WARNING, 7000);
  117. break;
  118. case EVENT_TALK_3:
  119. Talk(DRAKURU_SAY_3);
  120. break;
  121. case EVENT_SPAWN_TROLLS:
  122. SpawnTrolls();
  123. break;
  124. case EVENT_FAIL_DISGUISE_WARNING:
  125. HandleDisguise(false);
  126. events.ScheduleEvent(EVENT_TALK_3, 1500);
  127. events.ScheduleEvent(EVENT_FAIL_DISGUISE, 3000);
  128. break;
  129. case EVENT_FAIL_DISGUISE:
  130. HandleDisguise(false);
  131. if (Player* player = me->FindNearestPlayer(90.0f))
  132. {
  133. me->SetInCombatWith(player);
  134. me->AddThreat(player, 1.0f);
  135. }
  136. events.ScheduleEvent(EVENT_CAST_SPELL, urand(3000, 5000));
  137. events.ScheduleEvent(EVENT_TALK_4, 15000);
  138. break;
  139. case EVENT_TALK_4:
  140. Talk(DRAKURU_SAY_4);
  141. events.RescheduleEvent(EVENT_TALK_4, 15000);
  142. break;
  143. case EVENT_TALK_6:
  144. Talk(DRAKURU_SAY_6);
  145. me->SummonCreature(NPC_LICH_KING, 6169.84f, -2035.72f, 590.88f, 1.25f);
  146. events.ScheduleEvent(EVENT_TALK_7, 5000);
  147. break;
  148. case EVENT_TALK_7:
  149. Talk(DRAKURU_SAY_7);
  150. break;
  151. case EVENT_CAST_SPELL:
  152. if (Unit* victim = me->GetVictim())
  153. {
  154. if (Player* player = victim->ToPlayer()) // if victim is player: shadow bolt
  155. {
  156. DoCast(player, SPELL_DRAKURU_SHADOW_BOLT);
  157. }
  158. else // if victim is not player, throw blight crystal to nearby player
  159. {
  160. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90, true))
  161. {
  162. DoCast(target, SPELL_THROW_BLIGHT_CRYSTAL);
  163. }
  164. }
  165. }
  166. events.RescheduleEvent(EVENT_CAST_SPELL, urand(5, 15)*IN_MILLISECONDS);
  167. break;
  168. }
  169.  
  170. if (UpdateVictim())
  171. {
  172. DoMeleeAttackIfReady();
  173. }
  174. }
  175.  
  176. void DamageTaken(Unit* /*who*/, uint32 &damage)
  177. {
  178. if (damage >= me->GetHealth())
  179. {
  180. damage = 0;
  181. if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
  182. {
  183. Talk(DRAKURU_SAY_5);
  184. events.ScheduleEvent(EVENT_TALK_6, 5000);
  185. }
  186. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  187. events.CancelEvent(EVENT_CAST_SPELL);
  188. events.CancelEvent(EVENT_TALK_4);
  189. me->setFaction(35);
  190. DespawnTrolls();
  191. }
  192. }
  193.  
  194. void HandleDisguise(bool warning)
  195. {
  196. std::list<Player*> players = me->GetNearestPlayersList(100.0f);
  197. for (std::list<Player*>::const_iterator pitr = players.begin(); pitr != players.end(); ++pitr)
  198. {
  199. Player* player = *pitr;
  200. if (player->GetPositionZ() > 580.0f) // only players on the roof
  201. {
  202. if (player->HasAura(SPELL_SCOURGE_DISGUISE))
  203. {
  204. if (warning)
  205. {
  206. player->RemoveAura(SPELL_SCOURGE_DISGUISE);
  207. }
  208. else
  209. {
  210. Talk(SAY_FAIL_DISGUISE_WARNING, player->GetGUID());
  211. }
  212. }
  213. }
  214. }
  215. }
  216.  
  217. void DespawnTrolls()
  218. {
  219. std::list<Creature*> creaturelist;
  220. me->GetCreatureListWithEntryInGrid(creaturelist, NPC_BLIGHTBLOOD_TROLL, 1000.0f);
  221. for (std::list<Creature*>::const_iterator itr = creaturelist.begin(); itr != creaturelist.end(); ++itr)
  222. {
  223. Creature* troll = *itr;
  224. if (troll->GetPositionZ() > 580.0f)
  225. {
  226. troll->DespawnOrUnsummon();
  227. }
  228. }
  229. }
  230.  
  231. void SpawnTrolls()
  232. {
  233. // first despawn old trolls on the roof
  234. DespawnTrolls();
  235.  
  236. // now spawn new trolls
  237. for (uint8 i = 0; i < 4; ++i)
  238. {
  239. me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, BlightbloodTrollSpawnPos[i]);
  240. }
  241. }
  242. };
  243.  
  244. CreatureAI* GetAI(Creature* creature) const
  245. {
  246. return new npc_overlord_drakuru_enemyAI(creature);
  247. }
  248. };
  249.  
  250. class npc_lich_king_betrayal_quest : public CreatureScript
  251. {
  252. public:
  253. npc_lich_king_betrayal_quest() : CreatureScript("npc_lich_king_betrayal_quest") { }
  254.  
  255. struct npc_lich_king_betrayal_questAI : public ScriptedAI
  256. {
  257. npc_lich_king_betrayal_questAI(Creature* creature) : ScriptedAI(creature) { }
  258.  
  259. EventMap events;
  260.  
  261. void Reset()
  262. {
  263. events.ScheduleEvent(EVENT_LICHKING_WALK, 3000);
  264. }
  265.  
  266. void UpdateAI(uint32 diff)
  267. {
  268. events.Update(diff);
  269.  
  270. switch (events.ExecuteEvent())
  271. {
  272. case EVENT_LICHKING_WALK:
  273. if (Creature* drakuru = me->FindNearestCreature(NPC_ENEMY_DRAKURU, 1000.0f))
  274. {
  275. me->GetMotionMaster()->MoveFollow(drakuru, 5.0f, me->GetAngle(drakuru->GetPositionX(), drakuru->GetPositionY()));
  276. }
  277. events.ScheduleEvent(EVENT_LICHKING_TALK_1, 10000);
  278. break;
  279. case EVENT_LICHKING_TALK_1:
  280. Talk(LICHKING_SAY_1);
  281. events.ScheduleEvent(EVENT_LICHKING_TALK_2, 5000);
  282. break;
  283. case EVENT_LICHKING_TALK_2:
  284. Talk(LICHKING_SAY_2);
  285. events.ScheduleEvent(EVENT_LICHKING_KILL_DRAKURU, 8000);
  286. break;
  287. case EVENT_LICHKING_KILL_DRAKURU:
  288. if (Creature* drakuru = me->FindNearestCreature(NPC_ENEMY_DRAKURU, 1000.0f))
  289. {
  290. drakuru->CastSpell(drakuru, SPELL_DRAKURUS_DEATH);
  291. //drakuru->CastSpell(drakuru, SPELL_SPAWN_DRAKURUS_SKULL);
  292. if (Creature* bunny = me->FindNearestCreature(NPC_TOTALLY_GENERIC_BUNNY, 200.0f))
  293. {
  294. // the GO must be spawned by a permanent trigger NPC, because it will despawn when the summoner despawns
  295. bunny->SummonGameObject(GO_DRAKURUS_LAST_WISH, drakuru->GetPositionX(), drakuru->GetPositionY(), drakuru->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180000);
  296. bunny->SummonCreature(NPC_DRAKURUS_SKULL_TRIGGER, drakuru->GetPositionX(), drakuru->GetPositionY(), drakuru->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 190000);
  297. }
  298. me->Kill(drakuru);
  299. }
  300. events.ScheduleEvent(EVENT_LICHKING_TALK_3, 4000);
  301. break;
  302. case EVENT_LICHKING_TALK_3:
  303. Talk(LICHKING_SAY_3);
  304. events.ScheduleEvent(EVENT_LICHKING_TALK_4, 5000);
  305. break;
  306. case EVENT_LICHKING_TALK_4:
  307. Talk(LICHKING_SAY_4);
  308. events.ScheduleEvent(EVENT_LICHKING_TALK_5, 12000);
  309. break;
  310. case EVENT_LICHKING_TALK_5:
  311. Talk(LICHKING_SAY_5);
  312. events.ScheduleEvent(EVENT_LICHKING_TALK_6, 5000);
  313. break;
  314. case EVENT_LICHKING_TALK_6:
  315. Talk(LICHKING_SAY_6);
  316. me->DespawnOrUnsummon(10000);
  317. break;
  318. }
  319. }
  320. };
  321.  
  322. CreatureAI* GetAI(Creature* creature) const
  323. {
  324. return new npc_lich_king_betrayal_questAI(creature);
  325. }
  326. };
  327.  
  328. class npc_drakurus_skull_trigger : public CreatureScript
  329. {
  330. public:
  331. npc_drakurus_skull_trigger() : CreatureScript("npc_drakurus_skull_trigger") { }
  332.  
  333. struct npc_drakurus_skull_triggerAI : public ScriptedAI
  334. {
  335. npc_drakurus_skull_triggerAI(Creature* creature) : ScriptedAI(creature) { }
  336.  
  337. uint32 time;
  338. bool done;
  339.  
  340. void Reset()
  341. {
  342. time = 0;
  343. done = false;
  344. }
  345.  
  346. void UpdateAI(uint32 diff)
  347. {
  348. time += diff;
  349. if (time < 180000)
  350. {
  351. if (!done)
  352. {
  353. if (!me->FindNearestGameObject(GO_DRAKURUS_SKULL, 100.0f))
  354. {
  355. me->SummonGameObject(GO_DRAKURUS_SKULL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180000);
  356. done = true;
  357. }
  358. }
  359. }
  360. else
  361. {
  362. if (GameObject* skull = me->FindNearestGameObject(GO_DRAKURUS_SKULL, 100.0f))
  363. {
  364. skull->Delete();
  365. done = false;
  366. }
  367. me->DespawnOrUnsummon();
  368. }
  369. }
  370. };
  371.  
  372. CreatureAI* GetAI(Creature* creature) const
  373. {
  374. return new npc_drakurus_skull_triggerAI(creature);
  375. }
  376. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement