Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_pyroguard_emberseer.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 "ObjectMgr.h"
7#include "ScriptMgr.h"
8#include "ScriptedCreature.h"
9#include "Player.h"
10#include "Spell.h"
11#include "blackrock_spire.h"
12
20
22{
23 SPELL_ENCAGED_EMBERSEER = 15282, // Self on spawn
24 SPELL_FIRE_SHIELD_TRIGGER = 13377, // Self on spawn missing from 335 dbc triggers SPELL_FIRE_SHIELD every 3 sec
25 SPELL_FIRE_SHIELD = 13376, // Triggered by SPELL_FIRE_SHIELD_TRIGGER
26 SPELL_FREEZE_ANIM = 16245, // Self on event start
27 SPELL_EMBERSEER_GROWING = 16048, // Self on event start
28 SPELL_EMBERSEER_GROWING_TRIGGER = 16049, // Triggered by SPELL_EMBERSEER_GROWING
29 SPELL_EMBERSEER_FULL_STRENGTH = 16047, // Emberseer Full Strength
30 SPELL_FIRENOVA = 23462, // Combat
31 SPELL_FLAMEBUFFET = 23341, // Combat
32 SPELL_PYROBLAST = 17274, // Combat
33 // Blackhand Incarcerator Spells
34 SPELL_ENCAGE_EMBERSEER = 15281, // Emberseer on spawn
35 SPELL_STRIKE = 15580, // Combat
36 SPELL_ENCAGE = 16045, // Combat
37 // Cast on player by altar
39};
40
42{
43 // Respawn
45 // Pre fight
48 // Combat
52 // Hack due to trigger spell not in dbc
54 // Make sure all players have aura from altar
57};
58
60{
61public:
62 boss_pyroguard_emberseer() : CreatureScript("boss_pyroguard_emberseer") { }
63
65 {
67
69 {
70 if (instance)
71 {
73 events.Reset();
74 // Apply auras on spawn and reset
75 // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible
77 me->RemoveAura(SPELL_EMBERSEER_GROWING);
79 events.ScheduleEvent(EVENT_RESPAWN, 5000);
80 // Hack for missing trigger spell
81 events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000);
82
83 // Open doors on reset
84 if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS)
85 OpenDoors(false); // Opens 2 entrance doors
86 }
87 }
88
89 void SetData(uint32 /*type*/, uint32 data) OVERRIDE
90 {
91 switch (data)
92 {
93 case 1:
94 events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000);
95 break;
96 case 2:
97 // Close these two doors on Blackhand Incarcerators aggro
98 if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
99 if (door1->GetGoState() == GOState::GO_STATE_ACTIVE)
100 door1->SetGoState(GOState::GO_STATE_READY);
101 if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS)))
102 if (door2->GetGoState() == GOState::GO_STATE_ACTIVE)
103 door2->SetGoState(GOState::GO_STATE_READY);
104 break;
105 case 3:
106 Reset();
107 break;
108 default:
109 break;
110 }
111 }
112
113 void EnterCombat(Unit* /*who*/) OVERRIDE
114 {
115 // ### TODO Check combat timing ###
116 events.ScheduleEvent(EVENT_FIRENOVA, 6000);
117 events.ScheduleEvent(EVENT_FLAMEBUFFET, 3000);
118 events.ScheduleEvent(EVENT_PYROBLAST, 14000);
119 }
120
121 void JustDied(Unit* /*killer*/) OVERRIDE
122 {
123 if (instance)
124 {
125 // Activate all the runes
127 // Opens all 3 doors
128 OpenDoors(true);
129 // Complete encounter
130 instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE);
131 }
132 }
133
134 void SpellHit(Unit* /*caster*/, SpellInfo const* spell) OVERRIDE
135 {
136 if (spell->Id == SPELL_ENCAGE_EMBERSEER)
137 {
138 if (!me->GetAuraCount(SPELL_ENCAGED_EMBERSEER))
139 me->CastSpell(me, SPELL_ENCAGED_EMBERSEER);
140 }
141
142 if (spell->Id == SPELL_EMBERSEER_GROWING_TRIGGER)
143 {
144 if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 10)
146
147 if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 20)
148 {
149 me->RemoveAura(SPELL_ENCAGED_EMBERSEER);
150 me->RemoveAura(SPELL_FREEZE_ANIM);
155 events.ScheduleEvent(EVENT_ENTER_COMBAT, 2000);
156 }
157 }
158 }
159
160 void OpenDoors(bool Boss_Killed)
161 {
162 // These two doors reopen on reset or boss kill
163 if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
164 door1->SetGoState(GOState::GO_STATE_ACTIVE);
165 if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS)))
166 door2->SetGoState(GOState::GO_STATE_ACTIVE);
167
168 // This door opens on boss kill
169 if (Boss_Killed)
170 if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT)))
171 door3->SetGoState(GOState::GO_STATE_ACTIVE);
172 }
173
175 {
176 if (instance)
177 {
178 // update all runes
179 if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1)))
180 rune1->SetGoState(state);
181 if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2)))
182 rune2->SetGoState(state);
183 if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3)))
184 rune3->SetGoState(state);
185 if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4)))
186 rune4->SetGoState(state);
187 if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5)))
188 rune5->SetGoState(state);
189 if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6)))
190 rune6->SetGoState(state);
191 if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7)))
192 rune7->SetGoState(state);
193 }
194 }
195
197 {
198 if (!UpdateVictim())
199 {
200 events.Update(diff);
201
202 while (uint32 eventId = events.ExecuteEvent())
203 {
204 switch (eventId)
205 {
206 case EVENT_RESPAWN:
207 {
208 // Respawn all Blackhand Incarcerators
209 std::list<Creature*> creatureList;
211 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
212 if (Creature* creatureList = *itr)
213 {
214 if (!creatureList->IsAlive())
215 {
216 creatureList->Respawn();
217 }
218 creatureList->AI()->SetData(1, 1);
219 }
220 me->AddAura(SPELL_ENCAGED_EMBERSEER, me);
222 break;
223 }
225 {
226 // Set data on all Blackhand Incarcerators
227 std::list<Creature*> creatureList;
229 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
230 {
231 if (Creature* creatureList = *itr)
232 creatureList->AI()->SetData(1, 1);
233 }
234 events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000);
235 break;
236 }
238 me->CastSpell(me, SPELL_FREEZE_ANIM);
239 me->CastSpell(me, SPELL_EMBERSEER_GROWING);
241 break;
243 // #### Spell isn't doing any damage ??? ####
245 events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000);
246 break;
248 {
249 // Check to see if all players in instance have aura SPELL_EMBERSEER_START before starting event
250 bool _hasAura = true;
251 Map::PlayerList const &players = me->GetMap()->GetPlayers();
252 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
253 if (Player* player = itr->GetSource()->ToPlayer())
254 if (!player->HasAura(SPELL_EMBERSEER_OBJECT_VISUAL))
255 _hasAura = false;
256
257 if (_hasAura)
258 {
259 events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1000);
261 }
262 break;
263 }
265 AttackStart(me->SelectNearestPlayer(30.0f));
266 break;
267 default:
268 break;
269 }
270 }
271 return;
272 }
273
274 events.Update(diff);
275
276 while (uint32 eventId = events.ExecuteEvent())
277 {
278 switch (eventId)
279 {
282 events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000);
283 break;
284 case EVENT_FIRENOVA:
286 events.ScheduleEvent(EVENT_FIRENOVA, 6000);
287 break;
290 events.ScheduleEvent(EVENT_FLAMEBUFFET, 14000);
291 break;
292 case EVENT_PYROBLAST:
293 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
294 DoCast(target, SPELL_PYROBLAST);
295 events.ScheduleEvent(EVENT_PYROBLAST, 15000);
296 break;
297 default:
298 break;
299 }
300 }
302 }
303 };
304
306 {
307 return new boss_pyroguard_emberseerAI(creature);
308 }
309};
310
311/*####
312## npc_blackhand_incarcerator
313####*/
314
316{
317 // OOC
319 // Combat
322};
323
325{
326public:
327 npc_blackhand_incarcerator() : CreatureScript("npc_blackhand_incarcerator") { }
328
330 {
332
334 {
336 if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true))
337 Emberseer->AI()->SetData(1, 3);
338 }
339
340 void JustDied(Unit* /*killer*/) OVERRIDE
341 {
342 me->DespawnOrUnsummon(10000);
343 }
344
345 void SetData(uint32 data, uint32 value) OVERRIDE
346 {
347 if (data == 1 && value == 1)
348 {
350 me->InterruptSpell(CURRENT_CHANNELED_SPELL);
351 _events.CancelEvent(EVENT_ENCAGED_EMBERSEER);
352 }
353
354 if (data == 1 && value == 2)
355 {
356 _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000);
357 }
358 }
359
360 void EnterCombat(Unit* /*who*/) OVERRIDE
361 {
362 // Used to close doors
363 if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true))
364 Emberseer->AI()->SetData(1, 2);
365
366 // Had to do this because CallForHelp will ignore any npcs without LOS
367 std::list<Creature*> creatureList;
369 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
370 {
371 if (Creature* creatureList = *itr)
372 creatureList->SetInCombatWithZone(); // AI()->AttackStart(me->GetVictim());
373 }
374
375 _events.ScheduleEvent(EVENT_STRIKE, std::rand() % 16000 + 8000);
376 _events.ScheduleEvent(EVENT_ENCAGE, std::rand() % 20000 + 10000);
377 }
378
380 {
381 if (!UpdateVictim())
382 {
383 _events.Update(diff);
384
385 while (uint32 eventId = _events.ExecuteEvent())
386 {
387 switch (eventId)
388 {
390 {
391 if (me->GetPositionX() == me->GetHomePosition().GetPositionX())
392 if (!me->HasAura(SPELL_ENCAGE_EMBERSEER))
393 if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true))
394 DoCast(Emberseer, SPELL_ENCAGE_EMBERSEER);
395 break;
396 }
397 }
398 }
399 return;
400 }
401
402 _events.Update(diff);
403
404 while (uint32 eventId = _events.ExecuteEvent())
405 {
406 switch (eventId)
407 {
408 case EVENT_STRIKE:
410 _events.ScheduleEvent(EVENT_STRIKE, std::rand() % 23000 + 14000);
411 break;
412 case EVENT_ENCAGE:
414 _events.ScheduleEvent(EVENT_ENCAGE, std::rand() % 12000 + 6000);
415 break;
416 default:
417 break;
418 }
419 }
420
422 }
423
424 private:
426 };
427
429 {
430 return new npc_blackhand_incarceratorAI(creature);
431 }
432};
433
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
GOState
Definition GameObject.h:575
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ GO_STATE_READY
Definition GameObject.h:577
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
void GetCreatureListWithEntryInGrid(std::list< Creature * > &list, WorldObject *source, uint32 entry, float maxSearchRange)
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:1110
@ UNIT_FLAG_IMMUNE_TO_NPC
Definition Unit.h:634
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
@ NPC_BLACKHAND_INCARCERATOR
@ NPC_PYROGAURD_EMBERSEER
@ GO_EMBERSEER_RUNE_3
@ GO_EMBERSEER_RUNE_7
@ GO_EMBERSEER_IN
@ GO_EMBERSEER_RUNE_4
@ GO_EMBERSEER_OUT
@ GO_EMBERSEER_RUNE_2
@ GO_DOORS
@ GO_EMBERSEER_RUNE_1
@ GO_EMBERSEER_RUNE_5
@ GO_EMBERSEER_RUNE_6
@ DATA_PYROGAURD_EMBERSEER
@ SPELL_FIRENOVA
void AddSC_boss_pyroguard_emberseer()
@ SPELL_EMBERSEER_FULL_STRENGTH
@ SPELL_EMBERSEER_GROWING_TRIGGER
@ SPELL_EMBERSEER_OBJECT_VISUAL
@ SPELL_FIRE_SHIELD_TRIGGER
@ SPELL_ENCAGED_EMBERSEER
@ SPELL_EMBERSEER_GROWING
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
MapRefManager PlayerList
Definition Map.h:406
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
Player * ToPlayer()
Definition Object.h:204
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
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Creature * me
ScriptedAI(Creature *creature)
void AttackStart(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *, SpellInfo const *spell) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================