Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
wailing_caverns.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7SDName: Wailing Caverns
8SD%Complete: 95
9SDComment: Need to add skill usage for Disciple of Naralex
10SDCategory: Wailing Caverns
11EndScriptData */
12
13/* ContentData
14EndContentData */
15
16#include "ScriptMgr.h"
17#include "ScriptedCreature.h"
18#include "ScriptedGossip.h"
19#include "ScriptedEscortAI.h"
20#include "wailing_caverns.h"
21#include "Player.h"
22
23/*######
24## npc_disciple_of_naralex
25######*/
26
59
60#define GOSSIP_ID_START_1 698 //Naralex sleeps again!
61#define GOSSIP_ID_START_2 699 //The fanglords are dead!
62#define GOSSIP_ITEM_NARALEX "Let the event begin!"
63
65{
66public:
67 npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { }
68
70 {
71 return new npc_disciple_of_naralexAI(creature);
72 }
73
74 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
75 {
76 player->PlayerTalkClass->ClearMenus();
77 InstanceScript* instance = creature->GetInstanceScript();
78 if (action == GOSSIP_ACTION_INFO_DEF + 1)
79 {
80 player->CLOSE_GOSSIP_MENU();
81 if (instance)
83
84 creature->AI()->Talk(SAY_MAKE_PREPARATIONS);
85
86 creature->setFaction(250);
87 creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
88
89 CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
90 CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false);
91 CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false);
92 }
93 return true;
94 }
95
96 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
97 {
98 InstanceScript* instance = creature->GetInstanceScript();
99
100 if (instance)
101 {
102 creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true);
103 if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) &&
104 (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE))
105 {
107 player->SEND_GOSSIP_MENU(GOSSIP_ID_START_2, creature->GetGUID());
108
109 if (!instance->GetData(TYPE_NARALEX_YELLED))
110 {
111 creature->AI()->Talk(SAY_AT_LAST);
112 instance->SetData(TYPE_NARALEX_YELLED, 1);
113 }
114 }
115 else
116 {
117 player->SEND_GOSSIP_MENU(GOSSIP_ID_START_1, creature->GetGUID());
118 }
119 }
120 return true;
121 }
122
124 {
126 {
127 instance = creature->GetInstanceScript();
128 eventTimer = 0;
129 currentEvent = 0;
130 eventProgress = 0;
131 me->setActive(true);
133 }
134
139
141 {
142 if (!instance)
143 return;
144
145 switch (waypointId)
146 {
147 case 4:
148 eventProgress = 1;
151 break;
152 case 5:
155 break;
156 case 11:
157 eventProgress = 1;
160 break;
161 case 19:
163 break;
164 case 24:
165 eventProgress = 1;
168 break;
169 }
170 }
171
172 void Reset() OVERRIDE { }
173
175 {
176 Talk(SAY_ATTACKED, who);
177 }
178
179 void JustDied(Unit* /*slayer*/) OVERRIDE
180 {
181 if (instance)
182 {
187 }
188 }
189
191 {
192 summoned->AI()->AttackStart(me);
193 }
194
196 {
199
200 if (!instance)
201 return;
202 if (eventTimer <= diff)
203 {
204 eventTimer = 0;
205 if (instance->GetData(currentEvent) == IN_PROGRESS)
206 {
207 switch (currentEvent)
208 {
210 if (eventProgress == 1)
211 {
214 me->SummonCreature(NPC_DEVIATE_RAVAGER, -82.1763f, 227.874f, -93.3233f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
215 me->SummonCreature(NPC_DEVIATE_RAVAGER, -72.9506f, 216.645f, -93.6756f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
216 }
217 break;
219 if (eventProgress == 1)
220 {
224 //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(false);
225 eventTimer = 30000;
226 me->SummonCreature(NPC_DEVIATE_VIPER, -61.5261f, 273.676f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
227 me->SummonCreature(NPC_DEVIATE_VIPER, -58.4658f, 280.799f, -92.8393f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
228 me->SummonCreature(NPC_DEVIATE_VIPER, -50.002f, 278.578f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
229 }
230 else
231 if (eventProgress == 2)
232 {
233 //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(true);
236 if (me->HasAura(SPELL_SERPENTINE_CLEANSING))
237 me->RemoveAura(SPELL_SERPENTINE_CLEANSING);
238 }
239 break;
241 if (eventProgress == 1)
242 {
244 eventTimer = 4000;
245 me->SetStandState(UNIT_STAND_STATE_KNEEL);
247 }
248 else
249 if (eventProgress == 2)
250 {
252 eventTimer = 15000;
253 //CAST_AI(npc_escort::npc_escortAI, me->AI())->SetCanDefend(false);
254 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
255 DoCast(naralex, SPELL_NARALEXS_AWAKENING, true);
257 }
258 else
259 if (eventProgress == 3)
260 {
262 eventTimer = 15000;
263 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
264 naralex->AI()->Talk(EMOTE_TROUBLED_SLEEP);
265 me->SummonCreature(NPC_DEVIATE_MOCCASIN, 135.943f, 199.701f, -103.529f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
266 me->SummonCreature(NPC_DEVIATE_MOCCASIN, 151.08f, 221.13f, -103.609f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
267 me->SummonCreature(NPC_DEVIATE_MOCCASIN, 128.007f, 227.428f, -97.421f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
268 }
269 else
270 if (eventProgress == 4)
271 {
273 eventTimer = 30000;
274 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
275 naralex->AI()->Talk(EMOTE_WRITHE_IN_AGONY);
276 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 133.413f, 207.188f, -102.469f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
277 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 142.857f, 218.645f, -102.905f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
278 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 105.102f, 227.211f, -102.752f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
279 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 153.372f, 235.149f, -102.826f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
280 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 149.524f, 251.113f, -102.558f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
281 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 136.208f, 266.466f, -102.977f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
282 me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 126.167f, 274.759f, -102.962f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000);
283 }
284 else
285 if (eventProgress == 5)
286 {
288 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
289 naralex->AI()->Talk(EMOTE_HORRENDOUS_VISION);
290 me->SummonCreature(NPC_MUTANUS_THE_DEVOURER, 150.872f, 262.905f, -103.503f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
293 }
294 else
295 if (eventProgress == 6 && instance->GetData(TYPE_MUTANUS_THE_DEVOURER) == DONE)
296 {
298 eventTimer = 3000;
299 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
300 {
301 if (me->HasAura(SPELL_NARALEXS_AWAKENING))
302 me->RemoveAura(SPELL_NARALEXS_AWAKENING);
303 naralex->SetStandState(UNIT_STAND_STATE_STAND);
304 naralex->AI()->Talk(SAY_I_AM_AWAKE);
305 }
307 }
308 else
309 if (eventProgress == 7)
310 {
312 eventTimer = 6000;
313 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
314 naralex->AI()->Talk(SAY_THANK_YOU);
315 }
316 else
317 if (eventProgress == 8)
318 {
320 eventTimer = 8000;
321 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
322 {
323 naralex->AI()->Talk(SAY_FAREWELL);
324 naralex->AddAura(SPELL_FLIGHT_FORM, naralex);
325 }
326 SetRun();
327 me->SetStandState(UNIT_STAND_STATE_STAND);
328 me->AddAura(SPELL_FLIGHT_FORM, me);
329 }
330 else
331 if (eventProgress == 9)
332 {
334 eventTimer = 1500;
335 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
336 naralex->GetMotionMaster()->MovePoint(25, naralex->GetPositionX(), naralex->GetPositionY(), naralex->GetPositionZ());
337 }
338 else
339 if (eventProgress == 10)
340 {
342 eventTimer = 2500;
343 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
344 {
345 naralex->GetMotionMaster()->MovePoint(0, 117.095512f, 247.107971f, -96.167870f);
346 naralex->GetMotionMaster()->MovePoint(1, 90.388809f, 276.135406f, -83.389801f);
347 }
348 me->GetMotionMaster()->MovePoint(26, 117.095512f, 247.107971f, -96.167870f);
349 me->GetMotionMaster()->MovePoint(27, 144.375443f, 281.045837f, -82.477135f);
350 }
351 else
352 if (eventProgress == 11)
353 {
354 if (Creature* naralex = instance->instance->GetCreature(instance->GetData64(DATA_NARALEX)))
355 naralex->SetVisible(false);
356 me->SetVisible(false);
358 }
359 break;
360 }
361 }
362 } else eventTimer -= diff;
363 }
364 };
365};
366
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
static constexpr TempSummonType TEMPSUMMON_CORPSE_TIMED_DESPAWN
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ IN_PROGRESS
@ FAIL
@ DONE
#define CAST_AI(a, b)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ UNIT_STAND_STATE_KNEEL
Definition Unit.h:170
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FIELD_FLAGS
Enums
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
CreatureScript(const char *name)
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Definition Unit.h:1367
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:36
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
Creature * me
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetRun(bool on=true)
npc_escortAI(Creature *creature)
@ EMOTE_TROUBLED_SLEEP
@ SAY_MUST_CONTINUE
@ SAY_BANISH_THE_SPIRITS
@ SAY_ATTACKED
@ SAY_MUTANUS_THE_DEVOURER
@ NPC_NIGHTMARE_ECTOPLASM
@ SAY_TEMPLE_OF_PROMISE
@ SPELL_MARK_OF_THE_WILD_RANK_2
@ SAY_FAREWELL
@ SAY_NARALEX_AWAKES
@ EMOTE_HORRENDOUS_VISION
@ SAY_CAVERNS_PURIFIED
@ SAY_MAKE_PREPARATIONS
@ SPELL_NARALEXS_AWAKENING
@ NPC_MUTANUS_THE_DEVOURER
@ SAY_THANK_YOU
@ SPELL_FLIGHT_FORM
@ SAY_I_AM_AWAKE
@ NPC_DEVIATE_MOCCASIN
@ EMOTE_AWAKENING_RITUAL
@ SPELL_SERPENTINE_CLEANSING
@ SAY_EMERALD_DREAM
@ SAY_BEYOND_THIS_CORRIDOR
@ NPC_DEVIATE_RAVAGER
@ EMOTE_WRITHE_IN_AGONY
@ NPC_DEVIATE_VIPER
@ SAY_AT_LAST
void AddSC_wailing_caverns()
#define GOSSIP_ID_START_2
#define GOSSIP_ID_START_1
#define GOSSIP_ITEM_NARALEX
@ TYPE_LADY_ANACONDRA
@ TYPE_NARALEX_PART1
@ DATA_NARALEX
@ TYPE_NARALEX_EVENT
@ TYPE_LORD_SERPENTIS
@ TYPE_NARALEX_PART2
@ TYPE_NARALEX_PART3
@ TYPE_MUTANUS_THE_DEVOURER
@ TYPE_LORD_COBRAHN
@ TYPE_LORD_PYTHAS
@ TYPE_NARALEX_YELLED