Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_darkweaver_syth.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: Boss_Darkweaver_Syth
8SD%Complete: 85
9SDComment: Shock spells/times need more work. Heroic partly implemented.
10SDCategory: Auchindoun, Sethekk Halls
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "sethekk_halls.h"
16
17enum Says
18{
23};
24
26{
27 SPELL_FROST_SHOCK = 21401, //37865
31
32 SPELL_CHAIN_LIGHTNING = 15659, //15305
33
34 SPELL_SUMMON_SYTH_FIRE = 33537, // Spawns 19203
35 SPELL_SUMMON_SYTH_ARCANE = 33538, // Spawns 19205
36 SPELL_SUMMON_SYTH_FROST = 33539, // Spawns 19204
37 SPELL_SUMMON_SYTH_SHADOW = 33540, // Spawns 19206
38
43};
44
53
55{
56public:
57 boss_darkweaver_syth() : CreatureScript("boss_darkweaver_syth") { }
58
60 {
62 {
63 summon90 = false;
64 summon50 = false;
65 summon10 = false;
66 }
67
69 {
70 _Reset();
71 summon90 = false;
72 summon50 = false;
73 summon10 = false;
74 }
75
76 void EnterCombat(Unit* /*who*/) OVERRIDE
77 {
79 events.ScheduleEvent(EVENT_FLAME_SHOCK, 2000);
80 events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4000);
81 events.ScheduleEvent(EVENT_FROST_SHOCK, 6000);
82 events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8000);
83 events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15000);
84
86 }
87
88 void JustDied(Unit* /*killer*/) OVERRIDE
89 {
90 _JustDied();
92 }
93
95 {
96 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
98 }
99
101 {
102 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
103 summoned->AI()->AttackStart(target);
104 }
105
107 {
109
110 if (me->IsNonMeleeSpellCasted(false))
111 me->InterruptNonMeleeSpells(false);
112
113 DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front
114 DoCast(me, SPELL_SUMMON_SYTH_FIRE, true); //back
115 DoCast(me, SPELL_SUMMON_SYTH_FROST, true); //left
116 DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right
117 }
118
120 {
121 if (!UpdateVictim())
122 return;
123
124 events.Update(diff);
125
126 while (uint32 eventId = events.ExecuteEvent())
127 {
128 switch (eventId)
129 {
131 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
132 DoCast(target, SPELL_FLAME_SHOCK);
133 events.ScheduleEvent(EVENT_FLAME_SHOCK, std::rand() % 15000 + 10000);
134 break;
136 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
137 DoCast(target, SPELL_ARCANE_SHOCK);
138 events.ScheduleEvent(EVENT_ARCANE_SHOCK, std::rand() % 15000 + 10000);
139 break;
141 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
142 DoCast(target, SPELL_FROST_SHOCK);
143 events.ScheduleEvent(EVENT_FROST_SHOCK, std::rand() % 15000 + 10000);
144 break;
146 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
147 DoCast(target, SPELL_SHADOW_SHOCK);
148 events.ScheduleEvent(EVENT_SHADOW_SHOCK, std::rand() % 15000 + 10000);
149 break;
151 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
153 events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000);
154 break;
155 default:
156 break;
157 }
158 }
159
160 if (HealthBelowPct(90) && !summon90)
161 {
163 summon90 = true;
164 }
165
166 if (HealthBelowPct(50) && !summon50)
167 {
169 summon50 = true;
170 }
171
172 if (HealthBelowPct(10) && !summon10)
173 {
175 summon10 = true;
176 }
177
179 }
180
181 private:
185 };
186
188 {
190 }
191};
192
193/* ELEMENTALS */
195{
196public:
197 npc_syth_fire() : CreatureScript("npc_syth_fire") { }
198
200 {
201 npc_syth_fireAI(Creature* creature) : ScriptedAI(creature)
202 {
205 }
206
208 {
209 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
210 flameshock_timer = 2500;
211 flamebuffet_timer = 5000;
212 }
213
214 void EnterCombat(Unit* /*who*/) OVERRIDE { }
215
217 {
218 if (!UpdateVictim())
219 return;
220
221 if (flameshock_timer <= diff)
222 {
223 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
224 DoCast(target, SPELL_FLAME_SHOCK);
225
226 flameshock_timer = 5000;
227 } else flameshock_timer -= diff;
228
229 if (flamebuffet_timer <= diff)
230 {
231 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
232 DoCast(target, SPELL_FLAME_BUFFET);
233
234 flamebuffet_timer = 5000;
235 } else flamebuffet_timer -= diff;
236
238 }
239 private:
242 };
243
245 {
246 return new npc_syth_fireAI(creature);
247 }
248};
249
251{
252public:
253 npc_syth_arcane() : CreatureScript("npc_syth_arcane") { }
254
256 {
257 npc_syth_arcaneAI(Creature* creature) : ScriptedAI(creature)
258 {
261 }
262
264 {
265 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
266 arcaneshock_timer = 2500;
267 arcanebuffet_timer = 5000;
268 }
269
270 void EnterCombat(Unit* /*who*/) OVERRIDE { }
271
273 {
274 if (!UpdateVictim())
275 return;
276
277 if (arcaneshock_timer <= diff)
278 {
279 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
280 DoCast(target, SPELL_ARCANE_SHOCK);
281
282 arcaneshock_timer = 5000;
283 } else arcaneshock_timer -= diff;
284
285 if (arcanebuffet_timer <= diff)
286 {
287 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
289
290 arcanebuffet_timer = 5000;
291 } else arcanebuffet_timer -= diff;
292
294 }
295
296 private:
299 };
300
302 {
303 return new npc_syth_arcaneAI(creature);
304 }
305};
306
308{
309public:
310 npc_syth_frost() : CreatureScript("npc_syth_frost") { }
311
313 {
314 npc_syth_frostAI(Creature* creature) : ScriptedAI(creature)
315 {
318 }
319
321 {
322 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
323 frostshock_timer = 2500;
324 frostbuffet_timer = 5000;
325 }
326
327 void EnterCombat(Unit* /*who*/) OVERRIDE { }
328
330 {
331 if (!UpdateVictim())
332 return;
333
334 if (frostshock_timer <= diff)
335 {
336 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
337 DoCast(target, SPELL_FROST_SHOCK);
338
339 frostshock_timer = 5000;
340 } else frostshock_timer -= diff;
341
342 if (frostbuffet_timer <= diff)
343 {
344 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
345 DoCast(target, SPELL_FROST_BUFFET);
346
347 frostbuffet_timer = 5000;
348 } else frostbuffet_timer -= diff;
349
351 }
352
353 private:
356 };
357
359 {
360 return new npc_syth_frostAI(creature);
361 }
362};
363
365{
366public:
367 npc_syth_shadow() : CreatureScript("npc_syth_shadow") { }
368
370 {
371 npc_syth_shadowAI(Creature* creature) : ScriptedAI(creature)
372 {
375 }
376
378 {
379 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
380 shadowshock_timer = 2500;
381 shadowbuffet_timer = 5000;
382 }
383
384 void EnterCombat(Unit* /*who*/) OVERRIDE { }
385
387 {
388 if (!UpdateVictim())
389 return;
390
391 if (shadowshock_timer <= diff)
392 {
393 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
394 DoCast(target, SPELL_SHADOW_SHOCK);
395
396 shadowshock_timer = 5000;
397 } else shadowshock_timer -= diff;
398
399 if (shadowbuffet_timer <= diff)
400 {
401 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
403
404 shadowbuffet_timer = 5000;
405 } else shadowbuffet_timer -= diff;
406
408 }
409
410 private:
413 };
414
416 {
417 return new npc_syth_shadowAI(creature);
418 }
419};
420
422{
424 new npc_syth_fire();
425 new npc_syth_arcane();
426 new npc_syth_frost();
427 new npc_syth_shadow();
428}
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
@ IMMUNITY_SCHOOL
@ SPELL_SCHOOL_MASK_SHADOW
@ SPELL_SCHOOL_MASK_ARCANE
@ SPELL_SCHOOL_MASK_FIRE
@ SPELL_SCHOOL_MASK_FROST
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SAY_SLAY
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_FROST_BUFFET
@ SPELL_ARCANE_BUFFET
@ SPELL_SUMMON_SYTH_FIRE
@ SPELL_ARCANE_SHOCK
@ SPELL_FROST_SHOCK
@ SPELL_SUMMON_SYTH_ARCANE
@ SPELL_SUMMON_SYTH_FROST
@ SPELL_SUMMON_SYTH_SHADOW
@ SPELL_FLAME_SHOCK
@ SPELL_CHAIN_LIGHTNING
@ SPELL_SHADOW_BUFFET
@ SPELL_FLAME_BUFFET
@ SPELL_SHADOW_SHOCK
void AddSC_boss_darkweaver_syth()
@ EVENT_CHAIN_LIGHTNING
@ EVENT_ARCANE_SHOCK
@ EVENT_FROST_SHOCK
@ EVENT_FLAME_SHOCK
@ EVENT_SHADOW_SHOCK
@ SPELL_ARCANE_BUFFET
@ SPELL_SHADOW_SHOCK
@ EVENT_SHADOW_SHOCK
@ EVENT_ARCANE_SHOCK
@ EVENT_CHAIN_LIGHTNING
@ SPELL_ARCANE_SHOCK
@ SPELL_CHAIN_LIGHTNING
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
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
Definition Unit.h:1367
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ SPELL_FLAME_BUFFET
AI * GetSethekkHallsAI(Creature *creature)
@ DATA_DARKWEAVER_SYTH
Creature * me
bool HealthBelowPct(uint32 pct) const
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================