Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_varos.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#include "ScriptMgr.h"
6#include "ScriptedCreature.h"
7#include "SpellScript.h"
8#include "SpellAuraEffects.h"
9#include "oculus.h"
10
18
20{
22 SPELL_ENERGIZE_CORES = 50785, //Damage 5938 to 6562, effec2 Triggers 54069, effect3 Triggers 56251
23 SPELL_CALL_AZURE_RING_CAPTAIN = 51002, //Effect Send Event (12229)
24 /*SPELL_CALL_AZURE_RING_CAPTAIN_2 = 51006, //Effect Send Event (10665)
25 SPELL_CALL_AZURE_RING_CAPTAIN_3 = 51007, //Effect Send Event (18454)
26 SPELL_CALL_AZURE_RING_CAPTAIN_4 = 51008, //Effect Send Event (18455)*/
28
32};
33
41
43{
44public:
45 boss_varos() : CreatureScript("boss_varos") { }
46
48 {
49 return new boss_varosAI(creature);
50 }
51
52 struct boss_varosAI : public BossAI
53 {
55 {
56 if (instance->GetBossState(DATA_DRAKOS_EVENT) != DONE)
58 }
59
61 {
62 _Reset();
63
64 events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, std::rand() % (25 * IN_MILLISECONDS) + (20 * IN_MILLISECONDS));
65 events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
66 // not sure if this is handled by a timer or hp percentage
67 events.ScheduleEvent(EVENT_CALL_AZURE, std::rand() % (30 * IN_MILLISECONDS) + (15 * IN_MILLISECONDS));
68
69 firstCoreEnergize = false;
71 }
72
73 void EnterCombat(Unit* /*who*/) OVERRIDE
74 {
76
78 }
79
84
86 {
87 //Return since we have no target
88 if (!UpdateVictim())
89 return;
90
91 events.Update(diff);
92
93 if (me->HasUnitState(UNIT_STATE_CASTING))
94 return;
95
96 while (uint32 eventId = events.ExecuteEvent())
97 {
98 switch (eventId)
99 {
102 events.CancelEvent(EVENT_ENERGIZE_CORES);
103 break;
106 {
107 coreEnergizeOrientation = me->GetOrientation();
108 firstCoreEnergize = true;
109 } else
111
113 events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
114 events.ScheduleEvent(EVENT_ENERGIZE_CORES, 4000);
115 break;
116 case EVENT_CALL_AZURE:
117 // not sure how blizz handles this, i cant see any pattern between the differnt spells
121 events.ScheduleEvent(EVENT_CALL_AZURE, std::rand() % (25 * IN_MILLISECONDS) + (20 * IN_MILLISECONDS));
122 break;
125 events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, std::rand() % (20 * IN_MILLISECONDS) + (17 * IN_MILLISECONDS));
126 break;
127 }
128 }
129
131 }
132
133 void JustDied(Unit* /*killer*/) OVERRIDE
134 {
135 _JustDied();
137 DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
138 }
139 private:
142 };
143};
144
146{
147 public:
148 npc_azure_ring_captain() : CreatureScript("npc_azure_ring_captain") { }
149
151 {
153 {
154 instance = creature->GetInstanceScript();
155 }
156
158 {
159 targetGUID = 0;
160
161 me->SetWalk(true);
163 me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
164 me->SetReactState(REACT_AGGRESSIVE);
165 }
166
167 void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE
168 {
169 if (spell->Id == SPELL_ICE_BEAM)
170 {
171 target->CastSpell(target, SPELL_SUMMON_ARCANE_BEAM, true);
172 me->DespawnOrUnsummon();
173 }
174 }
175
176 void UpdateAI(uint32 /*diff*/) OVERRIDE
177 {
178 if (!UpdateVictim())
179 return;
180
182 }
183
185 {
186 if (type != POINT_MOTION_TYPE ||
188 return;
189
190 me->GetMotionMaster()->MoveIdle();
191
192 if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID))
193 DoCast(target, SPELL_ICE_BEAM);
194 }
195
197 {
198 switch (action)
199 {
201 if (instance)
202 {
203 if (Creature* varos = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VAROS)))
204 {
205 if (Unit* victim = varos->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
206 {
207 me->SetReactState(REACT_PASSIVE);
208 me->SetWalk(false);
209 me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f);
210 targetGUID = victim->GetGUID();
211 }
212 }
213 }
214 break;
215 }
216 }
217
218 private:
221 };
222
224 {
225 return new npc_azure_ring_captainAI(creature);
226 }
227};
228
230{
231 public:
232 spell_varos_centrifuge_shield() : SpellScriptLoader("spell_varos_centrifuge_shield") { }
233
235 {
237
239 {
240 Unit* caster = GetCaster();
241 return (caster && caster->ToCreature());
242 }
243
244 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
245 {
246 if (Unit* caster = GetCaster())
247 {
248 // flags taken from sniffs
249 // UNIT_FLAG_UNK_9 -> means passive but it is not yet implemented in core
251 {
252 caster->ToCreature()->SetReactState(REACT_PASSIVE);
254 }
255 }
256 }
257
258 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
259 {
260 if (Unit* caster = GetCaster())
261 {
262 caster->ToCreature()->SetReactState(REACT_AGGRESSIVE);
264 }
265 }
266
272 };
273
278};
279
281{
282 public:
283 spell_varos_energize_core_area_enemy() : SpellScriptLoader("spell_varos_energize_core_area_enemy") { }
284
286 {
288
289 void FilterTargets(std::list<WorldObject*>& targets)
290 {
291 Creature* varos = GetCaster()->ToCreature();
292 if (!varos)
293 return;
294
295 if (varos->GetEntry() != NPC_VAROS)
296 return;
297
298 float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation();
299
300 for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();)
301 {
302 Position pos;
303 (*itr)->GetPosition(&pos);
304
305 float angle = varos->GetAngle((*itr)->GetPositionX(), (*itr)->GetPositionY());
306 float diff = fabs(orientation - angle);
307
308 if (diff > 1.0f)
309 itr = targets.erase(itr);
310 else
311 ++itr;
312 }
313 }
314
316 {
317 OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_enemySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
318 }
319 };
320
325};
326
328{
329 public:
330 spell_varos_energize_core_area_entry() : SpellScriptLoader("spell_varos_energize_core_area_entry") { }
331
333 {
335
336 void FilterTargets(std::list<WorldObject*>& targets)
337 {
338 Creature* varos = GetCaster()->ToCreature();
339 if (!varos)
340 return;
341
342 if (varos->GetEntry() != NPC_VAROS)
343 return;
344
345 float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation();
346
347 for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();)
348 {
349 Position pos;
350 (*itr)->GetPosition(&pos);
351
352 float angle = varos->GetAngle((*itr)->GetPositionX(), (*itr)->GetPositionY());
353 float diff = fabs(orientation - angle);
354
355 if (diff > 1.0f)
356 itr = targets.erase(itr);
357 else
358 ++itr;
359 }
360 }
361
363 {
364 OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_entrySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
365 }
366 };
367
372};
373
@ IN_MILLISECONDS
Definition Common.h:125
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ DONE
@ POINT_MOTION_TYPE
#define CAST_AI(a, b)
@ EFFECT_0
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_AURA_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
@ MOVEMENTFLAG_FLYING
Definition Unit.h:747
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_UNK_6
Definition Unit.h:631
@ UNIT_FLAG_IMMUNE_TO_NPC
Definition Unit.h:634
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FLAG_UNK_15
Definition Unit.h:640
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
#define SAY_DEATH
#define SAY_AGGRO
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_AZURE
@ SAY_AZURE_EMOTE
void AddSC_boss_varos()
@ SPELL_ENERGIZE_CORES
@ SPELL_CALL_AZURE_RING_CAPTAIN
@ SPELL_ICE_BEAM
@ SPELL_CALL_AMPLIFY_MAGIC
@ SPELL_ARCANE_BEAM_PERIODIC
@ SPELL_SUMMON_ARCANE_BEAM
@ SPELL_ENERGIZE_CORES_VISUAL
@ EVENT_CALL_AZURE
@ EVENT_ENERGIZE_CORES_VISUAL
@ EVENT_ENERGIZE_CORES
@ EVENT_AMPLIFY_MAGIC
Unit * GetCaster() const
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectApplyHandler > OnEffectApply
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static Unit * GetUnit(WorldObject const &, uint64 guid)
uint32 GetEntry() const
Definition Object.h:125
Creature * ToCreature()
Definition Object.h:207
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
Definition Unit.h:1367
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript) void FilterTargets(std
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript) void FilterTargets(std
void Register() OVERRIDE
spell_varos_energize_core_area_entry()
SpellScript * GetSpellScript() const OVERRIDE
@ ACTION_CALL_DRAGON_EVENT
Definition oculus.h:58
@ DATA_VAROS
Definition oculus.h:21
@ SPELL_DEATH_SPELL
Definition oculus.h:70
@ SPELL_CENTRIFUGE_SHIELD
Definition oculus.h:69
@ NPC_VAROS
Definition oculus.h:29
@ DATA_VAROS_EVENT
Definition oculus.h:12
@ DATA_DRAKOS_EVENT
Definition oculus.h:11
float GetAngle(Position const *pos) const
Definition Object.cpp:1860
static float NormalizeOrientation(float o)
Definition Object.h:427
void GetPosition(float &x, float &y) const
Definition Object.h:333
Creature * me
ScriptedAI(Creature *creature)
boss_varosAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void Reset() OVERRIDE
void SpellHitTarget(Unit *target, SpellInfo const *spell) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 type, uint32 id) OVERRIDE