Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_hydross_the_unstable.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_Hydross_The_Unstable
8SD%Complete: 90
9SDComment: Some details and adjustments left to do, probably nothing major. Spawns may be spawned in different way/location.
10SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "serpent_shrine.h"
16
55
56
57#define HYDROSS_X -239.439f
58#define HYDROSS_Y -363.481f
59
60#define SPAWN_X_DIFF1 6.934003f
61#define SPAWN_Y_DIFF1 -11.255012f
62#define SPAWN_X_DIFF2 -6.934003f
63#define SPAWN_Y_DIFF2 11.255012f
64#define SPAWN_X_DIFF3 -12.577011f
65#define SPAWN_Y_DIFF3 -4.72702f
66#define SPAWN_X_DIFF4 12.577011f
67#define SPAWN_Y_DIFF4 4.72702f
68
70{
71public:
72 boss_hydross_the_unstable() : CreatureScript("boss_hydross_the_unstable") { }
73
75 {
76 return new boss_hydross_the_unstableAI(creature);
77 }
78
80 {
82 {
83 instance = creature->GetInstanceScript();
84 beams[0] = 0;
85 beams[1] = 0;
86 }
87
89
100 bool beam;
102
104 {
106 beams[0] = 0;
107 beams[1] = 0;
108 PosCheck_Timer = 2500;
109 MarkOfHydross_Timer = 15000;
111 WaterTomb_Timer = 7000;
112 VileSludge_Timer = 7000;
115 EnrageTimer = 600000;
116
117 CorruptedForm = false;
118 me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
119 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
120 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
121
122 me->SetDisplayId(MODEL_CLEAN);
123
124 if (instance)
126 beam = false;
127 Summons.DespawnAll();
128 }
129
131 {
132 Creature* beamer = me->SummonCreature(ENTRY_BEAM_DUMMY, -258.333f, -356.34f, 22.0499f, 5.90835f, TempSummonType::TEMPSUMMON_CORPSE_DESPAWN, 0);
133 if (beamer)
134 {
135 beamer->CastSpell(me, SPELL_BLUE_BEAM, true);
136 beamer->SetDisplayId(11686); //invisible
138 beams[0]=beamer->GetGUID();
139 }
140 beamer = me->SummonCreature(ENTRY_BEAM_DUMMY, -219.918f, -371.308f, 22.0042f, 2.73072f, TempSummonType::TEMPSUMMON_CORPSE_DESPAWN, 0);
141 if (beamer)
142 {
143 beamer->CastSpell(me, SPELL_BLUE_BEAM, true);
144 beamer->SetDisplayId(11686); //invisible
146 beams[1]=beamer->GetGUID();
147 }
148 }
150 {
151 for (uint8 i = 0; i < 2; ++i)
152 {
153 if (Creature* mob = Unit::GetCreature(*me, beams[i]))
154 {
155 mob->setDeathState(DeathState::DEAD);
156 mob->RemoveCorpse();
157 }
158 }
159 }
160 void EnterCombat(Unit* /*who*/) OVERRIDE
161 {
163
164 if (instance)
166 }
167
172
174 {
175 if (summoned->GetEntry() == ENTRY_PURE_SPAWN)
176 {
177 summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
178 summoned->CastSpell(summoned, SPELL_ELEMENTAL_SPAWNIN, true);
179 Summons.Summon(summoned);
180 }
181 if (summoned->GetEntry() == ENTRY_TAINTED_SPAWN)
182 {
183 summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
184 summoned->CastSpell(summoned, SPELL_ELEMENTAL_SPAWNIN, true);
185 Summons.Summon(summoned);
186 }
187 }
188
190 {
191 Summons.Despawn(summon);
192 }
193
194 void JustDied(Unit* /*killer*/) OVERRIDE
195 {
197
198 if (instance)
200 Summons.DespawnAll();
201 }
202
204 {
205 if (!beam)
206 {
207 SummonBeams();
208 beam=true;
209 }
210 //Return since we have no target
211 if (!UpdateVictim())
212 return;
213
214 // corrupted form
215 if (CorruptedForm)
216 {
217 //MarkOfCorruption_Timer
218 if (MarkOfCorruption_Timer <= diff)
219 {
220 if (MarkOfCorruption_Count <= 5)
221 {
222 uint32 mark_spell = 0;
223
225 {
226 case 0:
227 mark_spell = SPELL_MARK_OF_CORRUPTION1;
228 break;
229
230 case 1:
231 mark_spell = SPELL_MARK_OF_CORRUPTION2;
232 break;
233
234 case 2:
235 mark_spell = SPELL_MARK_OF_CORRUPTION3;
236 break;
237
238 case 3:
239 mark_spell = SPELL_MARK_OF_CORRUPTION4;
240 break;
241
242 case 4:
243 mark_spell = SPELL_MARK_OF_CORRUPTION5;
244 break;
245
246 case 5:
247 mark_spell = SPELL_MARK_OF_CORRUPTION6;
248 break;
249 }
250
251 DoCastVictim(mark_spell);
252
255 }
256
258 } else MarkOfCorruption_Timer -= diff;
259
260 //VileSludge_Timer
261 if (VileSludge_Timer <= diff)
262 {
263 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
264 DoCast(target, SPELL_VILE_SLUDGE);
265
266 VileSludge_Timer = 15000;
267 } else VileSludge_Timer -= diff;
268
269 //PosCheck_Timer
270 if (PosCheck_Timer <= diff)
271 {
272 if (me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
273 {
274 // switch to clean form
275 me->SetDisplayId(MODEL_CLEAN);
276 CorruptedForm = false;
278
281 SummonBeams();
282
283 // spawn 4 adds
288
289 me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
290 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
291 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
292 }
293
294 PosCheck_Timer = 2500;
295 } else PosCheck_Timer -=diff;
296 }
297 // clean form
298 else
299 {
300 //MarkOfHydross_Timer
301 if (MarkOfHydross_Timer <= diff)
302 {
303 if (MarkOfHydross_Count <= 5)
304 {
305 uint32 mark_spell = 0;
306
307 switch (MarkOfHydross_Count)
308 {
309 case 0:
310 mark_spell = SPELL_MARK_OF_HYDROSS1;
311 break;
312
313 case 1:
314 mark_spell = SPELL_MARK_OF_HYDROSS2;
315 break;
316
317 case 2:
318 mark_spell = SPELL_MARK_OF_HYDROSS3;
319 break;
320
321 case 3:
322 mark_spell = SPELL_MARK_OF_HYDROSS4;
323 break;
324
325 case 4:
326 mark_spell = SPELL_MARK_OF_HYDROSS5;
327 break;
328
329 case 5:
330 mark_spell = SPELL_MARK_OF_HYDROSS6;
331 break;
332 }
333
334 DoCastVictim(mark_spell);
335
336 if (MarkOfHydross_Count < 5)
338 }
339
340 MarkOfHydross_Timer = 15000;
341 } else MarkOfHydross_Timer -= diff;
342
343 //WaterTomb_Timer
344 if (WaterTomb_Timer <= diff)
345 {
346 Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
347 if (target)
348 DoCast(target, SPELL_WATER_TOMB);
349
350 WaterTomb_Timer = 7000;
351 } else WaterTomb_Timer -= diff;
352
353 //PosCheck_Timer
354 if (PosCheck_Timer <= diff)
355 {
356 if (!me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
357 {
358 // switch to corrupted form
359 me->SetDisplayId(MODEL_CORRUPT);
361 CorruptedForm = true;
362
366
367 // spawn 4 adds
372
373 me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
374 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
375 me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
376 }
377
378 PosCheck_Timer = 2500;
379 } else PosCheck_Timer -=diff;
380 }
381
382 //EnrageTimer
383 if (EnrageTimer <= diff)
384 {
386 EnrageTimer = 60000;
387 } else EnrageTimer -= diff;
388
390 }
391 };
392};
393
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_CORPSE_DESPAWN
Definition Object.h:72
@ SPELL_SCHOOL_NATURE
@ SPELL_SCHOOL_FROST
@ IMMUNITY_SCHOOL
@ SPELL_SCHOOL_MASK_NATURE
@ SPELL_SCHOOL_MASK_FROST
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
@ SPELL_ENRAGE
#define SAY_AGGRO
#define SPAWN_Y_DIFF4
#define SPAWN_Y_DIFF3
#define SPAWN_X_DIFF2
#define SPAWN_Y_DIFF1
#define HYDROSS_Y
#define SPAWN_X_DIFF1
#define SPAWN_X_DIFF3
#define SPAWN_Y_DIFF2
#define SPAWN_X_DIFF4
@ SPELL_MARK_OF_CORRUPTION3
@ SPELL_MARK_OF_CORRUPTION5
@ SPELL_MARK_OF_CORRUPTION1
@ SPELL_MARK_OF_CORRUPTION2
@ SPELL_MARK_OF_CORRUPTION6
@ SPELL_SUMMON_WATER_ELEMENT
@ SPELL_MARK_OF_CORRUPTION4
void AddSC_boss_hydross_the_unstable()
#define HYDROSS_X
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
void SetDisplayId(uint32 modelId) OVERRIDE
CreatureScript(const char *name)
uint64 GetGUID() const
Definition Object.h:119
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:1261
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
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ DATA_HYDROSSTHEUNSTABLEEVENT
Creature * me
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, TempSummonType type, uint32 despawntime)
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================