Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_ingvar_the_plunderer.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_Ingvar_The_Plunderer
8SD%Complete: 95
9SDComment: Some Problems with Annhylde Movement, Blizzlike Timers (just shadow axe summon needs a new timer)
10SDCategory: Udgarde Keep
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "utgarde_keep.h"
16
18{
19 // Ingvar (Human)
23
24 // Ingvar (Undead)
28
29 // Annhylde The Caller
31};
32
50
57
59{
60 // Ingvar Spells human form
61 SPELL_CLEAVE = 42724,
62 SPELL_SMASH = 42669,
64 SPELL_ENRAGE = 42705,
65
68 SPELL_SCOURG_RESURRECTION = 42863, // Spawn resurrect effect around Ingvar
69
70 // Ingvar Spells undead form
74
76
77 // Spells for Annhylde
78 SPELL_SCOURG_RESURRECTION_HEAL = 42704, // Heal Max + DummyAura
79 SPELL_SCOURG_RESURRECTION_BEAM = 42857, // Channeling Beam of Annhylde
80 SPELL_SCOURG_RESURRECTION_DUMMY = 42862, // Some Emote Dummy?
82};
83
88
90{
91 public:
92 boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
93
95 {
97 {
98 _isUndead = false;
99 }
100
102 {
103 _isUndead = false;
104
106
107 _Reset();
108 events.SetPhase(PHASE_HUMAN);
109
110 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % (12 * IN_MILLISECONDS) + (6 * IN_MILLISECONDS), 0, PHASE_HUMAN);
111 events.ScheduleEvent(EVENT_STAGGERING_ROAR, std::rand() % (21 * IN_MILLISECONDS) + (18 * IN_MILLISECONDS), 0, PHASE_HUMAN);
112 events.ScheduleEvent(EVENT_ENRAGE, std::rand() % (14 * IN_MILLISECONDS) + (7 * IN_MILLISECONDS), 0, PHASE_HUMAN);
113 events.ScheduleEvent(EVENT_SMASH, std::rand() % (17 * IN_MILLISECONDS) + (12 * IN_MILLISECONDS), 0, PHASE_HUMAN);
114 }
115
116 void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
117 {
118 if (damage >= me->GetHealth() && events.IsInPhase(PHASE_HUMAN))
119 {
120 me->RemoveAllAuras();
122
124
125 events.SetPhase(PHASE_EVENT);
127
129 }
130
131 if (events.IsInPhase(PHASE_EVENT))
132 damage = 0;
133 }
134
135 void DoAction(int32 actionId) OVERRIDE
136 {
137 if (actionId == ACTION_START_PHASE_2)
139 }
140
142 {
143 _isUndead = true;
144 me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
147
149 }
150
151 void EnterCombat(Unit* /*who*/) OVERRIDE
152 {
153 _EnterCombat();
154
155 if (!_isUndead)
157 }
158
159 void JustDied(Unit* /*killer*/) OVERRIDE
160 {
161 _JustDied();
163 }
164
166 {
167 events.SetPhase(PHASE_UNDEAD);
168 events.ScheduleEvent(EVENT_DARK_SMASH, std::rand() % (18 * IN_MILLISECONDS) + (14 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
169 events.ScheduleEvent(EVENT_DREADFUL_ROAR, std::rand() % (22 * IN_MILLISECONDS) + (18 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
170 events.ScheduleEvent(EVENT_WOE_STRIKE, std::rand() % (14 * IN_MILLISECONDS) + (10 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
172 }
173
174 void KilledUnit(Unit* /*victim*/) OVERRIDE
175 {
177 }
178
180 {
181 if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
182 return;
183
184 events.Update(diff);
185
186 if (me->HasUnitState(UNIT_STATE_CASTING))
187 return;
188
189 while (uint32 eventId = events.ExecuteEvent())
190 {
191 switch (eventId)
192 {
193 // PHASE ONE
194 case EVENT_CLEAVE:
196 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % (12 * IN_MILLISECONDS) + (6 * IN_MILLISECONDS), 0, PHASE_HUMAN);
197 break;
200 events.ScheduleEvent(EVENT_STAGGERING_ROAR, std::rand() % (22 * IN_MILLISECONDS) + (18 * IN_MILLISECONDS), 0, PHASE_HUMAN);
201 break;
202 case EVENT_ENRAGE:
204 events.ScheduleEvent(EVENT_ENRAGE, std::rand() % (14 * IN_MILLISECONDS) + (7 * IN_MILLISECONDS), 0, PHASE_HUMAN);
205 break;
206 case EVENT_SMASH:
208 events.ScheduleEvent(EVENT_SMASH, std::rand() % (16 * IN_MILLISECONDS) + (12 * IN_MILLISECONDS), 0, PHASE_HUMAN);
209 break;
214 return;
217 return;
218 // PHASE TWO
219 case EVENT_DARK_SMASH:
221 events.ScheduleEvent(EVENT_DARK_SMASH, std::rand() % (16 * IN_MILLISECONDS) + (12 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
222 break;
225 events.ScheduleEvent(EVENT_DREADFUL_ROAR, std::rand() % (22 * IN_MILLISECONDS) + (18 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
226 break;
227 case EVENT_WOE_STRIKE:
229 events.ScheduleEvent(EVENT_WOE_STRIKE, std::rand() % (14 * IN_MILLISECONDS) + (10 * IN_MILLISECONDS), 0, PHASE_UNDEAD);
230 break;
231 case EVENT_SHADOW_AXE:
232 if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
234
236 break;
237 }
238 }
239
240 if (!events.IsInPhase(PHASE_EVENT))
242 }
243
244 private:
246 };
247
249 {
251 }
252};
253
255{
256 public:
257 npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { }
258
260 {
262 {
263 _instance = creature->GetInstanceScript();
264 }
265
267 {
268 _events.Reset();
269
271 me->SetHover(true);
272
273 me->GetPosition(x, y, z);
274 DoTeleportTo(x+1, y, z+30);
275 me->GetMotionMaster()->MovePoint(1, x, y, z+15);
276 }
277
279 {
280 if (type != POINT_MOTION_TYPE)
281 return;
282
283 switch (id)
284 {
285 case 1:
287 if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
288 {
289 ingvar->RemoveAura(SPELL_SUMMON_BANSHEE);
290 ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true);
292 }
293 _events.ScheduleEvent(EVENT_RESURRECT_1, 8000);
294 break;
295 case 2:
296 me->DespawnOrUnsummon();
297 break;
298 default:
299 break;
300 }
301 }
302
303 void AttackStart(Unit* /*who*/) OVERRIDE { }
304 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
305 void EnterCombat(Unit* /*who*/) OVERRIDE { }
306
308 {
309 _events.Update(diff);
310
311 while (uint32 eventId = _events.ExecuteEvent())
312 {
313 switch (eventId)
314 {
316 if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
317 {
318 ingvar->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
319 ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false);
320 }
321 _events.ScheduleEvent(EVENT_RESURRECT_2, 3000);
322 break;
324 if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
325 {
326 ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY);
327 ingvar->AI()->DoAction(ACTION_START_PHASE_2);
328 }
329
330 me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
331 break;
332 default:
333 break;
334 }
335 }
336 }
337
338 private:
341 float x, y, z;
342 };
343
345 {
347 }
348};
349
356
358{
359public:
360 npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { }
361
363 {
364 return new npc_ingvar_throw_dummyAI(creature);
365 }
366
368 {
370 {
371 }
372
374 {
375 if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 50.0f))
376 {
377 float x, y, z;
378 target->GetPosition(x, y, z);
379 me->GetMotionMaster()->MoveCharge(x, y, z, 42.0f, POINT_TARGET);
380 target->DisappearAndDie();
381 }
382 else
383 me->DisappearAndDie();
384 }
385
387 {
388 if (type == EFFECT_MOTION_TYPE && id == POINT_TARGET)
389 {
392 me->DespawnOrUnsummon(10000);
393 }
394 }
395 };
396};
397
@ 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
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_DISABLE_MOVE
Definition Unit.h:627
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ SELECT_TARGET_TOPAGGRO
Definition UnitAI.h:24
@ UNIT_FIELD_FLAGS
@ SPELL_CLEAVE
@ SPELL_ENRAGE
@ EVENT_ENRAGE
@ EVENT_CLEAVE
@ PHASE_UNDEAD
@ SPELL_SCOURG_RESURRECTION_BEAM
@ SPELL_SCOURG_RESURRECTION
@ SPELL_SCOURG_RESURRECTION_DUMMY
@ SPELL_SCOURG_RESURRECTION_HEAL
void AddSC_boss_ingvar_the_plunderer()
@ EVENT_SMASH
@ SAY_AGGRO_2
@ SAY_AGGRO_1
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
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
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ SAY_DEATH_2
@ SAY_DEATH_1
Creature * me
void DoTeleportTo(float x, float y, float z, uint32 time=0)
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
AI * GetUtgardeKeepAI(Creature *creature)
@ NPC_THROW_TARGET
@ DATA_INGVAR