Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_rend_blackhand.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#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "Player.h"
9#include "blackrock_spire.h"
10
12{
13 SPELL_WHIRLWIND = 13736, // sniffed
14 SPELL_CLEAVE = 15284,
17 SPELL_KNOCKDOWN = 13360 // On spawn during Gyth fight
18};
19
38
45
46enum Misc
47{
48 NEFARIUS_PATH_1 = 1379670,
49 NEFARIUS_PATH_2 = 1379671,
50 NEFARIUS_PATH_3 = 1379672,
51 REND_PATH_1 = 1379680,
52 REND_PATH_2 = 1379681,
53};
54
55/*
56struct Wave
57{
58 uint32 entry;
59 float x_pos;
60 float y_pos;
61 float z_pos;
62 float o_pos;
63};
64
65static Wave Wave2[]= // 22 sec
66{
67 { 10447, 209.8637f, -428.2729f, 110.9877f, 0.6632251f },
68 { 10442, 209.3122f, -430.8724f, 110.9814f, 2.9147f },
69 { 10442, 211.3309f, -425.9111f, 111.0006f, 1.727876f }
70};
71
72static Wave Wave3[]= // 60 sec
73{
74 { 10742, 208.6493f, -424.5787f, 110.9872f, 5.8294f },
75 { 10447, 203.9482f, -428.9446f, 110.982f, 4.677482f },
76 { 10442, 203.3441f, -426.8668f, 110.9772f, 4.712389f },
77 { 10442, 206.3079f, -424.7509f, 110.9943f, 4.08407f }
78};
79
80static Wave Wave4[]= // 49 sec
81{
82 { 10742, 212.3541f, -412.6826f, 111.0352f, 5.88176f },
83 { 10447, 212.5754f, -410.2841f, 111.0296f, 2.740167f },
84 { 10442, 212.3449f, -414.8659f, 111.0348f, 2.356194f },
85 { 10442, 210.6568f, -412.1552f, 111.0124f, 0.9773844f }
86};
87
88static Wave Wave5[]= // 60 sec
89{
90 { 10742, 210.2188f, -410.6686f, 111.0211f, 5.8294f },
91 { 10447, 209.4078f, -414.13f, 111.0264f, 4.677482f },
92 { 10442, 208.0858f, -409.3145f, 111.0118f, 4.642576f },
93 { 10442, 207.9811f, -413.0728f, 111.0098f, 5.288348f },
94 { 10442, 208.0854f, -412.1505f, 111.0057f, 4.08407f }
95};
96
97static Wave Wave6[]= // 27 sec
98{
99 { 10742, 213.9138f, -426.512f, 111.0013f, 3.316126f },
100 { 10447, 213.7121f, -429.8102f, 110.9888f, 1.413717f },
101 { 10447, 213.7157f, -424.4268f, 111.009f, 3.001966f },
102 { 10442, 210.8935f, -423.913f, 111.0125f, 5.969026f },
103 { 10442, 212.2642f, -430.7648f, 110.9807f, 5.934119f }
104};
105*/
106
107Position const GythLoc = { 211.762f, -397.5885f, 111.1817f, 4.747295f };
108Position const Teleport1Loc = { 194.2993f, -474.0814f, 121.4505f, -0.01225555f };
109Position const Teleport2Loc = { 216.485f, -434.93f, 110.888f, -0.01225555f };
110
146
148{
149public:
150 boss_rend_blackhand() : CreatureScript("boss_rend_blackhand") { }
151
153 {
155
157 {
158 _Reset();
159 gythEvent = false;
160 victorGUID = 0;
161 }
162
163 void EnterCombat(Unit* /*who*/) OVERRIDE
164 {
165 _EnterCombat();
166 events.ScheduleEvent(EVENT_WHIRLWIND, std::rand() % 15000 + 13000);
167 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % 17000 + 15000);
168 events.ScheduleEvent(EVENT_MORTAL_STRIKE, std::rand() % 19000 + 17000);
169 }
170
171 void JustDied(Unit* /*killer*/) OVERRIDE
172 {
173 _JustDied();
174 if (Creature* victor = me->FindNearestCreature(NPC_LORD_VICTOR_NEFARIUS, 75.0f, true))
175 victor->AI()->SetData(1, 2);
176 }
177
178 void SetData(uint32 type, uint32 data) OVERRIDE
179 {
180 if (instance && type == AREATRIGGER && data == AREATRIGGER_BLACKROCK_STADIUM)
181 {
182 if (!gythEvent)
183 {
184 gythEvent = true;
185
186 if (Creature* victor = me->FindNearestCreature(NPC_LORD_VICTOR_NEFARIUS, 5.0f, true))
187 victorGUID = victor->GetGUID();
188
189 if (GameObject* portcullis = me->FindNearestGameObject(GO_DR_PORTCULLIS, 50.0f))
190 portcullisGUID = portcullis->GetGUID();
191
192 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
193 events.ScheduleEvent(EVENT_START_1, 1000);
194 }
195 }
196 }
197
199 {
200 if (type == WAYPOINT_MOTION_TYPE)
201 {
202 switch (id)
203 {
204 case 5:
205 events.ScheduleEvent(EVENT_TELEPORT_1, 2000);
206 break;
207 case 11:
208 if (Creature* gyth = me->FindNearestCreature(NPC_GYTH, 10.0f, true))
209 gyth->AI()->SetData(1, 1);
210 me->DespawnOrUnsummon(1000);
211 break;
212 }
213 }
214 }
215
217 {
218 if (gythEvent)
219 {
220 events.Update(diff);
221
222 while (uint32 eventId = events.ExecuteEvent())
223 {
224 switch (eventId)
225 {
226 case EVENT_START_1:
227 if (Creature* victor = me->GetCreature(*me, victorGUID))
228 victor->AI()->Talk(SAY_NEFARIUS_0);
229 events.ScheduleEvent(EVENT_START_2, 4000);
230 break;
231 case EVENT_START_2:
232 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
233 if (Creature* victor = me->GetCreature(*me, victorGUID))
234 victor->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
235 events.ScheduleEvent(EVENT_START_3, 4000);
236 break;
237 case EVENT_START_3:
238 if (Creature* victor = me->GetCreature(*me, victorGUID))
239 victor->AI()->Talk(SAY_NEFARIUS_1);
240 events.ScheduleEvent(EVENT_WAVE_1, 2000);
241 events.ScheduleEvent(EVENT_TURN_TO_REND, 4000);
242 events.ScheduleEvent(EVENT_WAVES_TEXT_1, 20000);
243 break;
245 if (Creature* victor = me->GetCreature(*me, victorGUID))
246 {
247 victor->SetFacingToObject(me);
248 victor->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
249 }
250 break;
252 if (Creature* victor = me->GetCreature(*me, victorGUID))
253 if (Unit* player = victor->SelectNearestPlayer(60.0f))
254 victor->SetFacingToObject(player);
255 break;
257 if (Creature* victor = me->GetCreature(*me, victorGUID))
258 victor->SetFacingTo(1.518436f);
259 break;
261 me->SetFacingTo(1.658063f);
262 break;
264 me->SetFacingTo(1.500983f);
265 break;
267 if (Creature* victor = me->GetCreature(*me, victorGUID))
268 victor->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
269 break;
271 me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
272 break;
274 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
275 if (Creature* victor = me->GetCreature(*me, victorGUID))
276 victor->AI()->Talk(SAY_NEFARIUS_2);
277 me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
278 events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000);
279 events.ScheduleEvent(EVENT_WAVES_EMOTE_1, 5000);
280 events.ScheduleEvent(EVENT_WAVE_2, 2000);
281 events.ScheduleEvent(EVENT_WAVES_TEXT_2, 20000);
282 break;
284 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
285 if (Creature* victor = me->GetCreature(*me, victorGUID))
286 victor->AI()->Talk(SAY_NEFARIUS_3);
287 events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000);
288 events.ScheduleEvent(EVENT_WAVE_3, 2000);
289 events.ScheduleEvent(EVENT_WAVES_TEXT_3, 20000);
290 break;
292 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
293 if (Creature* victor = me->GetCreature(*me, victorGUID))
294 victor->AI()->Talk(SAY_NEFARIUS_4);
295 events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000);
296 events.ScheduleEvent(EVENT_WAVE_4, 2000);
297 events.ScheduleEvent(EVENT_WAVES_TEXT_4, 20000);
298 break;
301 events.ScheduleEvent(EVENT_WAVES_EMOTE_2, 4000);
302 events.ScheduleEvent(EVENT_TURN_TO_FACING_3, 8000);
303 events.ScheduleEvent(EVENT_WAVE_5, 2000);
304 events.ScheduleEvent(EVENT_WAVES_TEXT_5, 20000);
305 break;
307 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
308 if (Creature* victor = me->GetCreature(*me, victorGUID))
309 victor->AI()->Talk(SAY_NEFARIUS_5);
310 events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000);
311 events.ScheduleEvent(EVENT_WAVE_6, 2000);
312 events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_1, 20000);
313 break;
315 events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0);
316 if (Creature* victor = me->GetCreature(*me, victorGUID))
317 victor->AI()->Talk(SAY_NEFARIUS_6);
318 events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000);
319 events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_2, 13000);
320 break;
322 if (Creature* victor = me->GetCreature(*me, victorGUID))
323 victor->AI()->Talk(SAY_NEFARIUS_7);
325 events.ScheduleEvent(EVENT_PATH_REND, 1000);
326 events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_3, 4000);
327 break;
329 if (Creature* victor = me->GetCreature(*me, victorGUID))
330 victor->AI()->Talk(SAY_NEFARIUS_8);
331 events.ScheduleEvent(EVENT_PATH_NEFARIUS, 1000);
332 events.ScheduleEvent(EVENT_PATH_REND, 1000);
333 break;
335 if (Creature* victor = me->GetCreature(*me, victorGUID))
336 victor->GetMotionMaster()->MovePath(NEFARIUS_PATH_1, true);
337 break;
338 case EVENT_PATH_REND:
339 me->GetMotionMaster()->MovePath(REND_PATH_1, false);
340 break;
341 case EVENT_TELEPORT_1:
342 me->NearTeleportTo(194.2993f, -474.0814f, 121.4505f, -0.01225555f);
343 events.ScheduleEvent(EVENT_TELEPORT_2, 50000);
344 break;
345 case EVENT_TELEPORT_2:
346 me->NearTeleportTo(216.485f, -434.93f, 110.888f, -0.01225555f);
347 me->SummonCreature(NPC_GYTH, 211.762f, -397.5885f, 111.1817f, 4.747295f);
348 break;
349 case EVENT_WAVE_1:
350 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
351 portcullis->UseDoorOrButton();
352 // move wave
353 break;
354 case EVENT_WAVE_2:
355 // spawn wave
356 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
357 portcullis->UseDoorOrButton();
358 // move wave
359 break;
360 case EVENT_WAVE_3:
361 // spawn wave
362 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
363 portcullis->UseDoorOrButton();
364 // move wave
365 break;
366 case EVENT_WAVE_4:
367 // spawn wave
368 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
369 portcullis->UseDoorOrButton();
370 // move wave
371 break;
372 case EVENT_WAVE_5:
373 // spawn wave
374 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
375 portcullis->UseDoorOrButton();
376 // move wave
377 break;
378 case EVENT_WAVE_6:
379 // spawn wave
380 if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID))
381 portcullis->UseDoorOrButton();
382 // move wave
383 break;
384 default:
385 break;
386 }
387 }
388 }
389
390 if (!UpdateVictim())
391 return;
392
393 events.Update(diff);
394
395 if (me->HasUnitState(UNIT_STATE_CASTING))
396 return;
397
398 while (uint32 eventId = events.ExecuteEvent())
399 {
400 switch (eventId)
401 {
402 case EVENT_WHIRLWIND:
404 events.ScheduleEvent(EVENT_WHIRLWIND, std::rand() % 18000 + 13000);
405 break;
406 case EVENT_CLEAVE:
408 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % 14000 + 10000);
409 break;
412 events.ScheduleEvent(EVENT_MORTAL_STRIKE, std::rand() % 16000 + 14000);
413 break;
414 }
415 }
417 }
418
419 private:
423 };
424
426 {
427 return new boss_rend_blackhandAI(creature);
428 }
429};
430
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ WAYPOINT_MOTION_TYPE
@ EMOTE_ONESHOT_POINT
@ EMOTE_ONESHOT_QUESTION
@ EMOTE_ONESHOT_ROAR
@ EMOTE_ONESHOT_TALK
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SPELL_CLEAVE
@ SPELL_WHIRLWIND
@ EVENT_WHIRLWIND
@ EVENT_CLEAVE
@ NPC_GYTH
@ NPC_LORD_VICTOR_NEFARIUS
@ AREATRIGGER
@ AREATRIGGER_BLACKROCK_STADIUM
@ GO_DR_PORTCULLIS
@ DATA_WARCHIEF_REND_BLACKHAND
@ SPELL_FRENZY
@ SPELL_KNOCKDOWN
@ SPELL_MORTAL_STRIKE
@ NEFARIUS_PATH_2
Definition boss_gyth.cpp:22
@ NEFARIUS_PATH_3
Definition boss_gyth.cpp:23
void AddSC_boss_rend_blackhand()
@ EMOTE_BLACKHAND_DISMOUNT
@ SAY_NEFARIUS_0
@ SAY_NEFARIUS_4
@ SAY_NEFARIUS_6
@ SAY_NEFARIUS_3
@ SAY_NEFARIUS_9
@ SAY_NEFARIUS_5
@ SAY_NEFARIUS_7
@ SAY_BLACKHAND_1
@ SAY_NEFARIUS_1
@ SAY_BLACKHAND_2
@ SAY_NEFARIUS_8
@ SAY_NEFARIUS_2
Position const GythLoc
@ NPC_CHROMATIC_WHELP
@ NPC_BLACKHAND_DRAGON_HANDLER
@ NPC_CHROMATIC_DRAGONSPAWN
@ NEFARIUS_PATH_1
@ SPELL_MORTAL_STRIKE
@ SPELL_WHIRLWIND
Position const Teleport2Loc
@ EVENT_WAVES_TEXT_2
@ EVENT_WAVES_TEXT_3
@ EVENT_PATH_REND
@ EVENT_TELEPORT_1
@ EVENT_WAVES_COMPLETE_TEXT_2
@ EVENT_WHIRLWIND
@ EVENT_TURN_TO_REND
@ EVENT_WAVES_TEXT_1
@ EVENT_TURN_TO_FACING_1
@ EVENT_PATH_NEFARIUS
@ EVENT_TURN_TO_FACING_3
@ EVENT_WAVES_EMOTE_2
@ EVENT_TELEPORT_2
@ EVENT_WAVES_TEXT_5
@ EVENT_WAVES_TEXT_4
@ EVENT_TURN_TO_FACING_2
@ EVENT_WAVES_COMPLETE_TEXT_3
@ EVENT_WAVES_EMOTE_1
@ EVENT_MORTAL_STRIKE
@ EVENT_WAVES_COMPLETE_TEXT_1
@ EVENT_TURN_TO_PLAYER
Position const Teleport1Loc
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Creature * me
void SetData(uint32 type, uint32 data) OVERRIDE
void MovementInform(uint32 type, uint32 id) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================