1. #include "ScriptMgr.h"
  2. #include "ScriptedCreature.h"
  3. #include "ScriptedGossip.h"
  4. #include "ScriptedEscortAI.h"
  5. #include "wailing_caverns.h"
  6. #include "Player.h"
  7. /*######
  8. ## npc_disciple_of_naralex
  9. ######*/
  10. enum Enums
  11. {
  12. SAY_AT_LAST = 0,
  13. SAY_MAKE_PREPARATIONS = 1,
  14. SAY_TEMPLE_OF_PROMISE = 2,
  15. SAY_MUST_CONTINUE = 3,
  16. SAY_BANISH_THE_SPIRITS = 4,
  17. SAY_CAVERNS_PURIFIED = 5,
  18. SAY_BEYOND_THIS_CORRIDOR = 6,
  19. SAY_EMERALD_DREAM = 7,
  20. EMOTE_AWAKENING_RITUAL = 8,
  21. EMOTE_TROUBLED_SLEEP = 0,
  22. EMOTE_WRITHE_IN_AGONY = 1,
  23. EMOTE_HORRENDOUS_VISION = 2,
  24. SAY_MUTANUS_THE_DEVOURER = 9,
  25. SAY_I_AM_AWAKE = 3,
  26. SAY_NARALEX_AWAKES = 10,
  27. SAY_THANK_YOU = 4,
  28. SAY_FAREWELL = 5,
  29. SAY_ATTACKED = 11,
  30. GOSSIP_OPTION_LET_EVENT_BEGIN = 201,
  31. NPC_TEXT_NARALEX_SLEEPS_AGAIN = 698,
  32. NPC_TEXT_FANGLORDS_ARE_DEAD = 699,
  33. SPELL_MARK_OF_THE_WILD_RANK_2 = 5232,
  34. SPELL_SERPENTINE_CLEANSING = 6270,
  35. SPELL_NARALEXS_AWAKENING = 6271,
  36. SPELL_FLIGHT_FORM = 33943,
  37. NPC_DEVIATE_RAVAGER = 3636,
  38. NPC_DEVIATE_VIPER = 5755,
  39. NPC_DEVIATE_MOCCASIN = 5762,
  40. NPC_NIGHTMARE_ECTOPLASM = 5763,
  41. NPC_MUTANUS_THE_DEVOURER = 3654,
  42. };
  43. class npc_disciple_of_naralex : public CreatureScript
  44. {
  45. public:
  46. npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { }
  47. CreatureAI* GetAI(Creature* creature) const override
  48. {
  49. return GetInstanceAI<npc_disciple_of_naralexAI>(creature);
  50. }
  51. bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
  52. {
  53. player->PlayerTalkClass->ClearMenus();
  54. InstanceScript* instance = creature->GetInstanceScript();
  55. if (action == GOSSIP_ACTION_INFO_DEF + 1)
  56. {
  57. player->CLOSE_GOSSIP_MENU();
  58. if (instance)
  59. instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS);
  60. creature->AI()->Talk(SAY_MAKE_PREPARATIONS);
  61. creature->setFaction(250);
  62. creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
  63. ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
  64. ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false);
  65. ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false);
  66. }
  67. return true;
  68. }
  69. bool OnGossipHello(Player* player, Creature* creature) override
  70. {
  71. InstanceScript* instance = creature->GetInstanceScript();
  72. if (instance)
  73. {
  74. creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true);
  75. if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) &&
  76. (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE))
  77. {
  78. player->ADD_GOSSIP_ITEM_DB(GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  79. player->SEND_GOSSIP_MENU(NPC_TEXT_FANGLORDS_ARE_DEAD, creature->GetGUID());
  80. if (!instance->GetData(TYPE_NARALEX_YELLED))
  81. {
  82. creature->AI()->Talk(SAY_AT_LAST);
  83. instance->SetData(TYPE_NARALEX_YELLED, 1);
  84. }
  85. }
  86. else
  87. {
  88. player->SEND_GOSSIP_MENU(NPC_TEXT_NARALEX_SLEEPS_AGAIN, creature->GetGUID());
  89. }
  90. }
  91. return true;
  92. }
  93. struct npc_disciple_of_naralexAI : public npc_escortAI
  94. {
  95. npc_disciple_of_naralexAI(Creature* creature) : npc_escortAI(creature)
  96. {
  97. instance = creature->GetInstanceScript();
  98. eventTimer = 0;
  99. currentEvent = 0;
  100. eventProgress = 0;
  101. me->setActive(true);
  102. me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
  103. }
  104. uint32 eventTimer;
  105. uint32 currentEvent;
  106. uint32 eventProgress;
  107. InstanceScript* instance;
  108. void WaypointReached(uint32 waypointId) override
  109. {
  110. switch (waypointId)
  111. {
  112. case 4:
  113. eventProgress = 1;
  114. currentEvent = TYPE_NARALEX_PART1;
  115. instance->SetData(TYPE_NARALEX_PART1, IN_PROGRESS);
  116. break;
  117. case 5:
  118. Talk(SAY_MUST_CONTINUE);
  119. instance->SetData(TYPE_NARALEX_PART1, DONE);
  120. break;
  121. case 11:
  122. eventProgress = 1;
  123. currentEvent = TYPE_NARALEX_PART2;
  124. instance->SetData(TYPE_NARALEX_PART2, IN_PROGRESS);
  125. break;
  126. case 19:
  127. Talk(SAY_BEYOND_THIS_CORRIDOR);
  128. break;
  129. case 24:
  130. eventProgress = 1;
  131. currentEvent = TYPE_NARALEX_PART3;
  132. instance->SetData(TYPE_NARALEX_PART3, IN_PROGRESS);
  133. break;
  134. }
  135. }
  136. void Reset() override
  137. {
  138. }
  139. void EnterCombat(Unit* who) override
  140. {
  141. Talk(SAY_ATTACKED, who);
  142. }
  143. void JustDied(Unit* /*slayer*/) override
  144. {
  145. instance->SetData(TYPE_NARALEX_EVENT, FAIL);
  146. instance->SetData(TYPE_NARALEX_PART1, FAIL);
  147. instance->SetData(TYPE_NARALEX_PART2, FAIL);
  148. instance->SetData(TYPE_NARALEX_PART3, FAIL);
  149. }
  150. void JustSummoned(Creature* summoned) override
  151. {
  152. summoned->AI()->AttackStart(me);
  153. }
  154. void UpdateAI(uint32 diff) override
  155. {
  156. if (currentEvent != TYPE_NARALEX_PART3)
  157. npc_escortAI::UpdateAI(diff);
  158. if (eventTimer <= diff)
  159. {
  160. eventTimer = 0;
  161. if (instance->GetData(currentEvent) == IN_PROGRESS)
  162. {
  163. switch (currentEvent)
  164. {
  165. case TYPE_NARALEX_PART1:
  166. if (eventProgress == 1)
  167. {
  168. ++eventProgress;
  169. Talk(SAY_TEMPLE_OF_PROMISE);
  170. me->SummonCreature(NPC_DEVIATE_RAVAGER, -82.1763f, 227.874f, -93.3233f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
  171. me->SummonCreature(NPC_DEVIATE_RAVAGER, -72.9506f, 216.645f, -93.6756f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
  172. }
  173. break;
  174. case TYPE_NARALEX_PART2:
  175. if (eventProgress == 1)
  176. {
  177. ++eventProgress;
  178. Talk(SAY_BANISH_THE_SPIRITS);
  179. DoCast(me, SPELL_SERPENTINE_CLEANSING);
  180. //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(false);
  181. eventTimer = 30000;
  182. me->SummonCreature(NPC_DEVIATE_VIPER, -61.5261f, 273.676f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
  183. me->SummonCreature(NPC_DEVIATE_VIPER, -58.4658f, 280.799f, -92.8393f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
  184. me->SummonCreature(NPC_DEVIATE_VIPER, -50.002f, 278.578f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
  185. }
  186. else
  187. if (eventProgress == 2)
  188. {
  189. //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(true);
  190. Talk(SAY_CAVERNS_PURIFIED);
  191. instance->SetData(TYPE_NARALEX_PART2, DONE);
  192. if (me->HasAura(SPELL_SERPENTINE_CLEANSING))
  193. me->RemoveAura(SPELL_SERPENTINE_CLEANSING);
  194. }
  195. break;
  196. case TYPE_NARALEX_PART3:
  197. if (eventProgress == 1)
  198. {
  199. ++eventProgress;
  200. eventTimer = 4000;
  201. me->SetStandState(UNIT_STAND_STATE_KNEEL);
  202. Talk(SAY_EMERALD_DREAM);
  203. }
  204. else
  205. if (eventProgress == 2)
  206. {
  207. ++eventProgress;
  208. eventTimer = 15000;
  209. //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(false);
  210. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  211. DoCast(naralex, SPELL_NARALEXS_AWAKENING, true);
  212. Talk(EMOTE_AWAKENING_RITUAL);
  213. }
  214. else
  215. if (eventProgress == 3)
  216. {
  217. ++eventProgress;
  218. eventTimer = 15000;
  219. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  220. naralex->AI()->Talk(EMOTE_TROUBLED_SLEEP);
  221. me->SummonCreature(NPC_DEVIATE_MOCCASIN, 135.943f, 199.701f, -103.529f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  222. me->SummonCreature(NPC_DEVIATE_MOCCASIN, 151.08f, 221.13f, -103.609f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  223. me->SummonCreature(NPC_DEVIATE_MOCCASIN, 128.007f, 227.428f, -97.421f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  224. }
  225. else
  226. if (eventProgress == 4)
  227. {
  228. ++eventProgress;
  229. eventTimer = 30000;
  230. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  231. naralex->AI()->Talk(EMOTE_WRITHE_IN_AGONY);
  232. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 133.413f, 207.188f, -102.469f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  233. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 142.857f, 218.645f, -102.905f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  234. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 105.102f, 227.211f, -102.752f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  235. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 153.372f, 235.149f, -102.826f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  236. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 149.524f, 251.113f, -102.558f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  237. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 136.208f, 266.466f, -102.977f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  238. me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 126.167f, 274.759f, -102.962f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
  239. }
  240. else
  241. if (eventProgress == 5)
  242. {
  243. ++eventProgress;
  244. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  245. naralex->AI()->Talk(EMOTE_HORRENDOUS_VISION);
  246. me->SummonCreature(NPC_MUTANUS_THE_DEVOURER, 150.872f, 262.905f, -103.503f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
  247. Talk(SAY_MUTANUS_THE_DEVOURER);
  248. instance->SetData(TYPE_MUTANUS_THE_DEVOURER, IN_PROGRESS);
  249. }
  250. else
  251. if (eventProgress == 6 && instance->GetData(TYPE_MUTANUS_THE_DEVOURER) == DONE)
  252. {
  253. ++eventProgress;
  254. eventTimer = 3000;
  255. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  256. {
  257. if (me->HasAura(SPELL_NARALEXS_AWAKENING))
  258. me->RemoveAura(SPELL_NARALEXS_AWAKENING);
  259. naralex->SetStandState(UNIT_STAND_STATE_STAND);
  260. naralex->AI()->Talk(SAY_I_AM_AWAKE);
  261. }
  262. Talk(SAY_NARALEX_AWAKES);
  263. }
  264. else
  265. if (eventProgress == 7)
  266. {
  267. ++eventProgress;
  268. eventTimer = 6000;
  269. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  270. naralex->AI()->Talk(SAY_THANK_YOU);
  271. }
  272. else
  273. if (eventProgress == 8)
  274. {
  275. ++eventProgress;
  276. eventTimer = 8000;
  277. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  278. {
  279. naralex->AI()->Talk(SAY_FAREWELL);
  280. naralex->AddAura(SPELL_FLIGHT_FORM, naralex);
  281. }
  282. SetRun();
  283. me->SetStandState(UNIT_STAND_STATE_STAND);
  284. me->AddAura(SPELL_FLIGHT_FORM, me);
  285. }
  286. else
  287. if (eventProgress == 9)
  288. {
  289. ++eventProgress;
  290. eventTimer = 1500;
  291. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  292. naralex->GetMotionMaster()->MovePoint(25, naralex->GetPositionX(), naralex->GetPositionY(), naralex->GetPositionZ());
  293. }
  294. else
  295. if (eventProgress == 10)
  296. {
  297. ++eventProgress;
  298. eventTimer = 2500;
  299. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  300. {
  301. naralex->GetMotionMaster()->MovePoint(0, 117.095512f, 247.107971f, -96.167870f);
  302. naralex->GetMotionMaster()->MovePoint(1, 90.388809f, 276.135406f, -83.389801f);
  303. }
  304. me->GetMotionMaster()->MovePoint(26, 117.095512f, 247.107971f, -96.167870f);
  305. me->GetMotionMaster()->MovePoint(27, 144.375443f, 281.045837f, -82.477135f);
  306. }
  307. else
  308. if (eventProgress == 11)
  309. {
  310. if (Creature* naralex = instance->instance->GetCreature(instance->GetGuidData(DATA_NARALEX)))
  311. naralex->SetVisible(false);
  312. me->SetVisible(false);
  313. instance->SetData(TYPE_NARALEX_PART3, DONE);
  314. }
  315. break;
  316. }
  317. }
  318. } else eventTimer -= diff;
  319. }
  320. };
  321. };
  322. void AddSC_wailing_caverns()
  323. {
  324. new npc_disciple_of_naralex();
  325. }