Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_anraphet.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 "SpellScript.h"
10#include "SpellAuraEffects.h"
11#include "GridNotifiers.h"
12#include "Player.h"
13#include "ObjectAccessor.h"
15
17{
23
24 BRANN_SAY_DOOR_INTRO = 0, // Right, let's go! Just need to input the final entry sequence into the door mechanism... and...
25 BRANN_SAY_UNLOCK_DOOR = 1, // That did the trick! The control room should be right behind this... oh... wow...
26 BRANN_SAY_TROGGS = 2, // What? This isn't the control room! There's another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs!
27 BRANN_SAY_THINK = 3, // Ok, let me think a moment.
28 BRANN_SAY_MIRRORS = 4, // Mirrors pointing all over the place.
29 BRANN_SAY_ELEMENTALS = 5, // Four platforms with huge elementals.
30 BRANN_SAY_GET_IT = 6, // I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door!
31 BRANN_1_ELEMENTAL_DEAD = 7, // One down!
32 BRANN_2_ELEMENTAL_DEAD = 8, // Another one down! Just look at those light beams! They seem to be connecting to the far door!
33 BRANN_3_ELEMENTAL_DEAD = 9, // One more elemental to go! The door is almost open!
34 BRANN_4_ELEMENTAL_DEAD = 10, // That''s it, you''ve done it! The vault door is opening! Now we can... oh, no!
35 BRANN_SAY_ANRAPHET_DIED = 11, // We''ve done it! The control room is breached!
36 BRANN_SAY_MOMENT = 12 // Here we go! Now this should only take a moment...
37};
38
61
78
86
92
93Position const AnraphetActivatePos = {-193.656f, 366.689f, 75.91001f, 3.138207f};
94
96{
97 {-429.583f, 367.019f, 89.79282f, 0.0f},
98 {-409.9531f, 367.0469f, 89.81111f, 0.0f},
99 {-397.8246f, 366.967f, 86.37722f, 0.0f},
100 {-383.7813f, 366.8229f, 82.07919f, 0.0f},
101 {-368.2604f, 366.7448f, 77.0984f, 0.0f},
102 {-353.6458f, 366.4896f, 75.92504f, 0.0f},
103 {-309.0608f, 366.7205f, 75.91345f, 0.0f},
104 {-276.3303f, 367.0f, 75.92413f, 0.0f},
105 {-246.5104f, 366.6389f, 75.87791f, 0.0f},
106 {-202.0417f, 366.7517f, 75.92508f, 0.0f},
107 {-187.6024f, 366.7656f, 76.23077f, 0.0f},
108 {-155.0938f, 366.783f, 86.45834f, 0.0f},
109 {-143.5694f, 366.8177f, 89.73354f, 0.0f},
110 {-128.5608f, 366.8629f, 89.74199f, 0.0f},
111 {-103.559f, 366.5938f, 89.79725f, 0.0f},
112 {-71.58507f, 367.0278f, 89.77069f, 0.0f},
113 {-35.04861f, 366.6563f, 89.77447f, 0.0f},
114};
115
117{
118public:
119 boss_anraphet() : CreatureScript("boss_anraphet") { }
120
121 struct boss_anraphetAI : public BossAI
122 {
123 boss_anraphetAI(Creature* creature) : BossAI(creature, DATA_ANRAPHET) { }
124
126 {
127 events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 8000, 0, PHASE_COMBAT);
128 events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 10000, 0, PHASE_COMBAT);
129 events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 35000, 0, PHASE_COMBAT);
130 }
131
133 {
134 _Reset();
135 me->SetWalk(false);
136 events.SetPhase(PHASE_INTRO);
137 if (instance->GetData(DATA_DEAD_ELEMENTALS) == 4)
138 {
139 // Set to combat automatically, Brann's event won't repeat
141 events.SetPhase(PHASE_COMBAT);
143 me->SetHomePosition(AnraphetActivatePos);
144 }
145 }
146
147 void EnterCombat(Unit* /*who*/) OVERRIDE
148 {
149 instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
151 _EnterCombat();
152 }
153
154 void JustDied(Unit* /*killer*/) OVERRIDE
155 {
156 instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
158
160 brann->AI()->DoAction(ACTION_ANRAPHET_DIED);
161
162 _JustDied();
163 }
164
166 {
167 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
169 }
170
172 {
173 instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
175 instance->SetBossState(DATA_ANRAPHET, FAIL);
176 }
177
179 {
180 if (action == ACTION_ANRAPHET_INTRO)
181 events.ScheduleEvent(EVENT_ANRAPHET_APPEAR, 6000, 0, PHASE_INTRO);
182 }
183
185 {
186 if (type != POINT_MOTION_TYPE)
187 return;
188
189 if (point == POINT_ANRAPHET_ACTIVATE)
190 {
191 events.ScheduleEvent(EVENT_ANRAPHET_ACTIVATE, 1500, 0, PHASE_INTRO);
192 me->SetHomePosition(AnraphetActivatePos);
193 }
194 }
195
197 {
198 if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom()))
199 return;
200
201 events.Update(diff);
202
203 if (me->HasUnitState(UNIT_STATE_CASTING))
204 return;
205
206 while (uint32 eventId = events.ExecuteEvent())
207 {
208 switch (eventId)
209 {
211 me->SetWalk(true);
212 me->GetMotionMaster()->MovePoint(POINT_ANRAPHET_ACTIVATE, AnraphetActivatePos);
213 break;
215 me->SetWalk(false);
217 events.ScheduleEvent(EVENT_ANRAPHET_DESTROY, 17500, 0, PHASE_INTRO);
218 return;
221 events.ScheduleEvent(EVENT_ANRAPHET_READY, 6000, 0, PHASE_INTRO);
222 break;
225 events.SetPhase(PHASE_COMBAT);
227 break;
230 events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 21500, 0, PHASE_COMBAT);
231 break;
234 events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 12500, 0, PHASE_COMBAT);
235 events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, std::rand() % 45000 + 40000, 0, PHASE_COMBAT);
236 break;
241 events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, std::rand() % 50000 + 45000, 0, PHASE_COMBAT);
242 events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 13000, 0, PHASE_COMBAT);
243 break;
246 break;
247 }
248 }
249
250 if (events.GetPhaseMask() & PHASE_MASK_COMBAT)
252 }
253 };
254
256 {
258 }
259};
260
262{
263 public:
264 npc_omega_stance() : CreatureScript("npc_omega_stance") { }
265
267 {
268 npc_omega_stanceAI(Creature* creature) : ScriptedAI(creature) { }
269
271 {
273 }
274
276 };
277
279 {
280 return new npc_omega_stanceAI(creature);
281 }
282};
283
285{
286 public:
287 npc_alpha_beam() : CreatureScript("npc_alpha_beam") { }
288
290 {
291 npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
292
293 void IsSummonedBy(Unit* /*summoner*/) OVERRIDE
294 {
296 anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST);
297 }
298
299 void EnterEvadeMode() OVERRIDE { } // Never evade
300
301 private:
303 };
304
306 {
308 }
309};
310
312{
313 public:
314 npc_brann_bronzebeard_anraphet() : CreatureScript("npc_brann_bronzebeard_anraphet") { }
315
317 {
318 npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { }
319
320 void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) OVERRIDE
321 {
322 if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE)
323 return;
324
325 if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
326 {
328 _currentPoint = 0;
329 events.Reset();
331 me->SetWalk(true);
333 events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500);
334 }
335 }
336
338 {
339 switch (action)
340 {
342 {
343 uint32 dead = _instance->GetData(DATA_DEAD_ELEMENTALS);
344 Talk(BRANN_1_ELEMENTAL_DEAD + dead - 1);
345 if (dead == 4)
346 {
347 _instance->DoCastSpellOnPlayers(SPELL_VAULT_OF_LIGHTS_CREDIT);
349 anraphet->AI()->DoAction(ACTION_ANRAPHET_INTRO);
350 }
351 break;
352 }
355 events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1000);
356 break;
357 }
358 }
359
361 {
362 events.Update(diff);
363
364 while (uint32 eventId = events.ExecuteEvent())
365 {
366 switch (eventId)
367 {
370 me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
371 break;
374 _instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE);
376 events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500);
377 break;
380 events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_1, 6000);
381 break;
383 me->SetFacingTo(5.445427f);
385 events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_2, 1000);
386 break;
388 me->SetFacingTo(0.6283185f);
389 events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_3, 2500);
390 break;
392 me->SetFacingTo(0.01745329f);
393 events.ScheduleEvent(EVENT_BRANN_SAY_ELEMENTALS, 200);
394 break;
397 events.ScheduleEvent(EVENT_BRANN_SAY_GET_IT, 3500);
398 break;
402 break;
404 me->SetFacingTo(3.141593f);
405 break;
406 }
407 }
408 }
409
410 void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
411 {
412 if (movementType != POINT_MOTION_TYPE)
413 return;
414
415 _currentPoint = pointId + 1;
416 uint32 delay = 1;
417
418 switch (pointId)
419 {
420 case 0:
422 events.ScheduleEvent(EVENT_BRANN_THINK, 15000);
423 return;
424 case 1:
426 delay = 1000;
427 break;
428 case 14:
430 delay = 2200;
431 break;
432 case 16:
433 events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_4, 6000);
434 return;
435 default:
436 break;
437 }
438
439 events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay);
440 }
441
442 protected:
446 };
447
452};
453
455{
456public:
457 spell_anraphet_alpha_beams() : SpellScriptLoader("spell_anraphet_alpha_beams") { }
458
460 {
462
463 void FilterTargets(std::list<WorldObject*>& targets)
464 {
465 if (targets.empty())
466 return;
467
469 targets.clear();
470 targets.push_back(target);
471 }
472
477 };
478
483};
484
512
514{
515public:
516 spell_omega_stance_spider_effect() : SpellScriptLoader("spell_omega_stance_spider_effect") { }
517
519 {
521
523 {
524 // Do our own calculations for the destination position.
526 Unit* caster = GetCaster();
527 float angle = float(rand_norm()) * static_cast<float>(2 * M_PI);
528 uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm();
529
530 float x = caster->GetPositionX() + dist * std::cos(angle);
531 float y = caster->GetPositionY() + dist * std::sin(angle);
532 float z = caster->GetMap()->GetHeight(x, y, caster->GetPositionZ());
533
534 const_cast<WorldLocation*>(GetExplTargetDest())->Relocate(x, y, z);
535 GetHitDest()->Relocate(x, y, z);
536 }
537
542 };
543
548};
549
#define M_PI
Definition Common.h:192
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:158
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ IN_PROGRESS
@ FAIL
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SUMMON
@ TARGET_UNIT_SRC_AREA_ENEMY
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
double rand_norm(void)
Definition Util.cpp:50
Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO]
void AddSC_boss_anraphet()
@ MAX_BRANN_WAYPOINTS_INTRO
@ POINT_ANRAPHET_ACTIVATE
@ SPELL_NEMESIS_STRIKE
@ SPELL_DESTRUCTION_PROTOCOL
@ SPELL_ALPHA_BEAMS_BACK_CAST
@ SPELL_OMEGA_STANCE
@ SPELL_OMEGA_STANCE_SPIDER_TRIGGER
@ SPELL_CRUMBLING_RUIN
@ SPELL_OMEGA_STANCE_SUMMON
@ SPELL_ALPHA_BEAMS
@ PHASE_INTRO
@ PHASE_MASK_COMBAT
@ PHASE_COMBAT
Position const AnraphetActivatePos
@ ANRAPHET_SAY_KILL
@ BRANN_SAY_ANRAPHET_DIED
@ ANRAPHET_SAY_AGGRO
@ BRANN_SAY_ELEMENTALS
@ BRANN_SAY_MIRRORS
@ BRANN_SAY_THINK
@ BRANN_SAY_GET_IT
@ BRANN_2_ELEMENTAL_DEAD
@ BRANN_SAY_DOOR_INTRO
@ BRANN_SAY_UNLOCK_DOOR
@ ANRAPHET_SAY_DEATH
@ ANRAPHET_SAY_INTRO
@ BRANN_3_ELEMENTAL_DEAD
@ BRANN_1_ELEMENTAL_DEAD
@ ANRAPHET_SAY_OMEGA_STANCE
@ BRANN_SAY_MOMENT
@ BRANN_SAY_TROGGS
@ BRANN_4_ELEMENTAL_DEAD
@ EVENT_ANRAPHET_NEMESIS_STRIKE
@ EVENT_BRANN_SET_ORIENTATION_3
@ EVENT_ANRAPHET_APPEAR
@ EVENT_BRANN_SAY_ELEMENTALS
@ EVENT_ANRAPHET_ACTIVATE_OMEGA
@ EVENT_ANRAPHET_CRUMBLING_RUIN
@ EVENT_BRANN_SET_ORIENTATION_2
@ EVENT_ANRAPHET_ALPHA_BEAMS
@ EVENT_BRANN_SET_ORIENTATION_1
@ EVENT_ANRAPHET_DESTROY
@ EVENT_ANRAPHET_OMEGA_STANCE
@ EVENT_BRANN_MOVE_INTRO
@ EVENT_BRANN_SAY_GET_IT
@ EVENT_ANRAPHET_READY
@ EVENT_ANRAPHET_ACTIVATE
@ EVENT_BRANN_SET_ORIENTATION_4
@ EVENT_BRANN_THINK
@ EVENT_BRANN_UNLOCK_DOOR
InstanceScript *const instance
void _JustReachedHome()
bool CheckInRoom()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
CreatureAI(Creature *creature)
Definition CreatureAI.h:69
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:56
CreatureScript(const char *name)
float GetHeight(float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
Definition Map.cpp:1959
static Creature * GetCreature(WorldObject const &u, uint64 guid)
float CalcRadius(Unit *caster=NULL, Spell *=NULL) const
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition SpellInfo.h:255
WorldLocation const * GetExplTargetDest()
SpellInfo const * GetSpellInfo()
WorldLocation * GetHitDest()
HookList< EffectHandler > OnEffectLaunch
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
SpellScriptLoader(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
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
Map * GetMap() const
Definition Object.h:740
float GetObjectSize() const
Definition Object.cpp:3100
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_anraphet_alpha_beams_SpellScript)
SpellScript * GetSpellScript() const
SpellScript * GetSpellScript() const
@ ACTION_ANRAPHET_INTRO
@ ACTION_ANRAPHET_DIED
@ ACTION_ELEMENTAL_DIED
@ SPELL_VAULT_OF_LIGHTS_CREDIT
@ ACHIEV_VAULT_OF_LIGHTS_EVENT
CreatureAI * GetHallsOfOriginationAI(Creature *creature)
@ DATA_ANRAPHET_GUID
@ DATA_VAULT_OF_LIGHTS
@ DATA_BRANN_0_GUID
@ DATA_DEAD_ELEMENTALS
@ DATA_ANRAPHET
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
float GetPositionZ() const
Definition Object.h:330
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
void RelocateOffset(Position const &offset)
Definition Object.cpp:1841
void Relocate(float x, float y)
Definition Object.h:302
Creature * me
ScriptedAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
boss_anraphetAI(Creature *creature)
void KilledUnit(Unit *victim) OVERRIDE
void JustDied(Unit *) OVERRIDE
void MovementInform(uint32 type, uint32 point) OVERRIDE
void DoAction(int32 action) OVERRIDE
void IsSummonedBy(Unit *) OVERRIDE
void MovementInform(uint32 movementType, uint32 pointId) OVERRIDE
void sGossipSelect(Player *, uint32 sender, uint32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================