Scripts/SerpentshrineCavern: Rewrite Hydross (#31150)

This commit is contained in:
offl
2025-08-16 15:40:49 +03:00
committed by GitHub
parent 60c8dc17bc
commit 5649e4e76c
2 changed files with 257 additions and 273 deletions

View File

@@ -0,0 +1,16 @@
--
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` IN (22035,22036);
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (22035,22036) AND `source_type` = 0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (2203500) AND `source_type` = 9;
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(22035,0,0,0,37,0,100,0,0,0,0,0,0,116,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Pure Spawn of Hydross - On AI Initialize - Set Corpse Delay"),
(22035,0,1,0,37,0,100,0,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Pure Spawn of Hydross - On AI Initialize - Set Reactstate Passive"),
(22035,0,2,0,11,0,100,0,0,0,0,0,0,11,25035,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Pure Spawn of Hydross - On Spawn - Cast 'Elemental Spawn-in'"),
(22035,0,3,0,11,0,100,0,0,0,0,0,0,80,2203500,2,0,0,0,0,1,0,0,0,0,0,0,0,0,"Pure Spawn of Hydross - On Spawn - Run Script"),
(22036,0,0,0,37,0,100,0,0,0,0,0,0,116,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tainted Spawn of Hydross - On AI Initialize - Set Corpse Delay"),
(22036,0,1,0,37,0,100,0,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tainted Spawn of Hydross - On AI Initialize - Set Reactstate Passive"),
(22036,0,2,0,11,0,100,0,0,0,0,0,0,11,25035,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tainted Spawn of Hydross - On Spawn - Cast 'Elemental Spawn-in'"),
(22036,0,3,0,11,0,100,0,0,0,0,0,0,80,2203500,2,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tainted Spawn of Hydross - On Spawn - Run Script"),
(2203500,9,0,0,0,0,100,0,3000,3000,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Pure Spawn of Hydross - On Script - Set Reactstate Aggressive");

View File

@@ -15,145 +15,127 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Hydross_The_Unstable
SD%Complete: 90
SDComment: Some details and adjustments left to do, probably nothing major. Spawns may be spawned in different way/location.
SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
EndScriptData */
/*
* Everything should be rechecked with sniffs
* The way beams are handled out of combat requires additional research. It seems like it's timed
and is enabled and disabled from time to time, not used all the time
*/
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
#include "serpent_shrine.h"
#include "TemporarySummon.h"
enum HydrossTheUnstable
enum HydrossTexts
{
SAY_AGGRO = 0,
SAY_SWITCH_TO_CLEAN = 1,
SAY_CLEAN_SLAY = 2,
SAY_CLEAN_DEATH = 3,
SAY_SWITCH_TO_CORRUPT = 4,
SAY_CORRUPT_SLAY = 5,
SAY_CORRUPT_DEATH = 6,
SAY_AGGRO = 0,
SAY_SWITCH_TO_CLEAN = 1,
SAY_CLEAN_SLAY = 2,
SAY_CLEAN_DEATH = 3,
SAY_SWITCH_TO_CORRUPT = 4,
SAY_CORRUPT_SLAY = 5,
SAY_CORRUPT_DEATH = 6
};
SWITCH_RADIUS = 18,
enum HydrossSpells
{
SPELL_WATER_TOMB = 38235,
SPELL_VILE_SLUDGE = 38246,
MODEL_CORRUPT = 20609,
MODEL_CLEAN = 20162,
SPELL_BERSERK = 27680, // This spell need verification
SPELL_CORRUPTION = 37961,
SPELL_WATER_TOMB = 38235,
SPELL_MARK_OF_HYDROSS1 = 38215,
SPELL_MARK_OF_HYDROSS2 = 38216,
SPELL_MARK_OF_HYDROSS3 = 38217,
SPELL_MARK_OF_HYDROSS4 = 38218,
SPELL_MARK_OF_HYDROSS5 = 38231,
SPELL_MARK_OF_HYDROSS6 = 40584,
SPELL_MARK_OF_CORRUPTION1 = 38219,
SPELL_MARK_OF_CORRUPTION2 = 38220,
SPELL_MARK_OF_CORRUPTION3 = 38221,
SPELL_MARK_OF_CORRUPTION4 = 38222,
SPELL_MARK_OF_CORRUPTION5 = 38230,
SPELL_MARK_OF_CORRUPTION6 = 40583,
SPELL_VILE_SLUDGE = 38246,
SPELL_ENRAGE = 27680, //this spell need verification
SPELL_SUMMON_WATER_ELEMENT = 36459, //not in use yet(in use ever?)
SPELL_ELEMENTAL_SPAWNIN = 25035,
SPELL_BLUE_BEAM = 38015,
SPELL_MARK_OF_HYDROSS_1 = 38215,
SPELL_MARK_OF_HYDROSS_2 = 38216,
SPELL_MARK_OF_HYDROSS_3 = 38217,
SPELL_MARK_OF_HYDROSS_4 = 38218,
SPELL_MARK_OF_HYDROSS_5 = 38231,
SPELL_MARK_OF_HYDROSS_6 = 40584,
ENTRY_PURE_SPAWN = 22035,
ENTRY_TAINTED_SPAWN = 22036,
ENTRY_BEAM_DUMMY = 21934
SPELL_MARK_OF_CORRUPTION_1 = 38219,
SPELL_MARK_OF_CORRUPTION_2 = 38220,
SPELL_MARK_OF_CORRUPTION_3 = 38221,
SPELL_MARK_OF_CORRUPTION_4 = 38222,
SPELL_MARK_OF_CORRUPTION_5 = 38230,
SPELL_MARK_OF_CORRUPTION_6 = 40583,
SPELL_SUMMON_PURIFIED_SPAWN_1 = 38198,
SPELL_SUMMON_PURIFIED_SPAWN_2 = 38199,
SPELL_SUMMON_PURIFIED_SPAWN_3 = 38200,
SPELL_SUMMON_PURIFIED_SPAWN_4 = 38201,
SPELL_SUMMON_CORRUPTED_SPAWN_1 = 38188,
SPELL_SUMMON_CORRUPTED_SPAWN_2 = 38189,
SPELL_SUMMON_CORRUPTED_SPAWN_3 = 38190,
SPELL_SUMMON_CORRUPTED_SPAWN_4 = 38191,
SPELL_BLUE_BEAM = 38015,
SPELL_SUMMON_WATER_ELEMENTAL = 36459, // NYI, OOC
SPELL_PURIFY_ELEMENTAL = 36461 // NYI, OOC
};
enum HydrossEvents
{
EVENT_MARK_OF_HYDROSS = 1,
EVENT_WATER_TOMB,
EVENT_SWITCH_TO_CORRUPTED,
EVENT_MARK_OF_CORRUPTION,
EVENT_VILE_SLUDGE,
EVENT_SWITCH_TO_PURIFIED,
EVENT_BERSERK,
EVENT_BLUE_BEAMS
};
enum HydrossMisc
{
SWITCH_RADIUS = 18,
NPC_HYDROSS_BEAM_HELPER = 21933
};
#define HYDROSS_X -239.439f
#define HYDROSS_Y -363.481f
#define SPAWN_X_DIFF1 6.934003f
#define SPAWN_Y_DIFF1 -11.255012f
#define SPAWN_X_DIFF2 -6.934003f
#define SPAWN_Y_DIFF2 11.255012f
#define SPAWN_X_DIFF3 -12.577011f
#define SPAWN_Y_DIFF3 -4.72702f
#define SPAWN_X_DIFF4 12.577011f
#define SPAWN_Y_DIFF4 4.72702f
// 21216 - Hydross the Unstable
struct boss_hydross_the_unstable : public BossAI
{
boss_hydross_the_unstable(Creature* creature) : BossAI(creature, BOSS_HYDROSS_THE_UNSTABLE)
boss_hydross_the_unstable(Creature* creature) : BossAI(creature, BOSS_HYDROSS_THE_UNSTABLE),
_markOfHydrossCount(0), _markOfCorruptionCount(0), _corruptedForm(false) { }
void JustAppeared() override
{
Initialize();
events.ScheduleEvent(EVENT_BLUE_BEAMS, 5s);
}
void Initialize()
{
beams[0].Clear();
beams[1].Clear();
PosCheck_Timer = 2500;
MarkOfHydross_Timer = 15000;
MarkOfCorruption_Timer = 15000;
WaterTomb_Timer = 7000;
VileSludge_Timer = 7000;
MarkOfHydross_Count = 0;
MarkOfCorruption_Count = 0;
EnrageTimer = 600000;
CorruptedForm = false;
beam = false;
}
ObjectGuid beams[2];
uint32 PosCheck_Timer;
uint32 MarkOfHydross_Timer;
uint32 MarkOfCorruption_Timer;
uint32 WaterTomb_Timer;
uint32 VileSludge_Timer;
uint32 MarkOfHydross_Count;
uint32 MarkOfCorruption_Count;
uint32 EnrageTimer;
bool CorruptedForm;
bool beam;
void Reset() override
{
DeSummonBeams();
Initialize();
HandleBeamHelpers(true);
me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
me->SetDisplayId(MODEL_CLEAN);
me->RemoveAurasDueToSpell(SPELL_CORRUPTION);
_Reset();
_markOfHydrossCount = 0;
_markOfCorruptionCount = 0;
_corruptedForm = false;
}
void SummonBeams()
void HandleBeamHelpers(bool reset)
{
Creature* beamer = me->SummonCreature(ENTRY_BEAM_DUMMY, -258.333f, -356.34f, 22.0499f, 5.90835f, TEMPSUMMON_CORPSE_DESPAWN);
if (beamer)
std::list<Creature*> helpersList;
me->GetCreatureListWithEntryInGrid(helpersList, NPC_HYDROSS_BEAM_HELPER);
if (!helpersList.empty())
{
beamer->CastSpell(me, SPELL_BLUE_BEAM, true);
beamer->SetDisplayId(11686); //invisible
beams[0] = beamer->GetGUID();
}
beamer = me->SummonCreature(ENTRY_BEAM_DUMMY, -219.918f, -371.308f, 22.0042f, 2.73072f, TEMPSUMMON_CORPSE_DESPAWN);
if (beamer)
{
beamer->CastSpell(me, SPELL_BLUE_BEAM, true);
beamer->SetDisplayId(11686); //invisible
beams[1] = beamer->GetGUID();
}
}
void DeSummonBeams()
{
for (uint8 i = 0; i < 2; ++i)
{
if (Creature* mob = ObjectAccessor::GetCreature(*me, beams[i]))
mob->DespawnOrUnsummon();
for (Creature* helper : helpersList)
if (reset)
helper->InterruptNonMeleeSpells(false);
else
helper->CastSpell(helper, SPELL_BLUE_BEAM);
}
}
@@ -162,219 +144,205 @@ struct boss_hydross_the_unstable : public BossAI
Talk(SAY_AGGRO);
_JustEngagedWith(who);
events.ScheduleEvent(EVENT_MARK_OF_HYDROSS, 15s);
events.ScheduleEvent(EVENT_WATER_TOMB, 7s);
events.ScheduleEvent(EVENT_SWITCH_TO_CORRUPTED, 2500ms);
events.ScheduleEvent(EVENT_BERSERK, 10min);
}
void JustReachedHome() override
{
events.ScheduleEvent(EVENT_BLUE_BEAMS, 5s);
_JustReachedHome();
}
void KilledUnit(Unit* /*victim*/) override
{
Talk(CorruptedForm ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY);
}
void JustSummoned(Creature* summoned) override
{
if (summoned->GetEntry() == ENTRY_PURE_SPAWN)
summoned->CastSpell(summoned, SPELL_ELEMENTAL_SPAWNIN, true);
if (summoned->GetEntry() == ENTRY_TAINTED_SPAWN)
summoned->CastSpell(summoned, SPELL_ELEMENTAL_SPAWNIN, true);
BossAI::JustSummoned(summoned);
Talk(_corruptedForm ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
Talk(CorruptedForm ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH);
Talk(_corruptedForm ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH);
_JustDied();
}
void UpdateOutOfCombatEvents(uint32 diff)
{
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BLUE_BEAMS:
HandleBeamHelpers(false);
break;
default:
break;
}
}
}
void UpdateAI(uint32 diff) override
{
if (!beam)
{
SummonBeams();
beam = true;
}
//Return since we have no target
if (!UpdateVictim())
{
UpdateOutOfCombatEvents(diff);
return;
}
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
// corrupted form
if (CorruptedForm)
while (uint32 eventId = events.ExecuteEvent())
{
//MarkOfCorruption_Timer
if (MarkOfCorruption_Timer <= diff)
switch (eventId)
{
if (MarkOfCorruption_Count <= 5)
{
uint32 mark_spell = 0;
switch (MarkOfCorruption_Count)
// Purified form
case EVENT_MARK_OF_HYDROSS:
if (_markOfHydrossCount <= 5)
{
case 0:
mark_spell = SPELL_MARK_OF_CORRUPTION1;
break;
uint32 markSpell = 0;
case 1:
mark_spell = SPELL_MARK_OF_CORRUPTION2;
break;
switch (_markOfHydrossCount)
{
case 0: markSpell = SPELL_MARK_OF_HYDROSS_1; break;
case 1: markSpell = SPELL_MARK_OF_HYDROSS_2; break;
case 2: markSpell = SPELL_MARK_OF_HYDROSS_3; break;
case 3: markSpell = SPELL_MARK_OF_HYDROSS_4; break;
case 4: markSpell = SPELL_MARK_OF_HYDROSS_5; break;
case 5: markSpell = SPELL_MARK_OF_HYDROSS_6; break;
}
case 2:
mark_spell = SPELL_MARK_OF_CORRUPTION3;
break;
DoCastVictim(markSpell);
case 3:
mark_spell = SPELL_MARK_OF_CORRUPTION4;
break;
case 4:
mark_spell = SPELL_MARK_OF_CORRUPTION5;
break;
case 5:
mark_spell = SPELL_MARK_OF_CORRUPTION6;
break;
if (_markOfHydrossCount < 5)
++_markOfHydrossCount;
}
DoCastVictim(mark_spell);
if (MarkOfCorruption_Count < 5)
++MarkOfCorruption_Count;
}
MarkOfCorruption_Timer = 15000;
} else MarkOfCorruption_Timer -= diff;
//VileSludge_Timer
if (VileSludge_Timer <= diff)
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_VILE_SLUDGE);
VileSludge_Timer = 15000;
} else VileSludge_Timer -= diff;
//PosCheck_Timer
if (PosCheck_Timer <= diff)
{
if (me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
{
// switch to clean form
me->SetDisplayId(MODEL_CLEAN);
CorruptedForm = false;
MarkOfHydross_Count = 0;
Talk(SAY_SWITCH_TO_CLEAN);
ResetThreatList();
SummonBeams();
// spawn 4 adds
DoSpawnCreature(ENTRY_PURE_SPAWN, SPAWN_X_DIFF1, SPAWN_Y_DIFF1, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_PURE_SPAWN, SPAWN_X_DIFF2, SPAWN_Y_DIFF2, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_PURE_SPAWN, SPAWN_X_DIFF3, SPAWN_Y_DIFF3, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_PURE_SPAWN, SPAWN_X_DIFF4, SPAWN_Y_DIFF4, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
}
PosCheck_Timer = 2500;
} else PosCheck_Timer -=diff;
}
// clean form
else
{
//MarkOfHydross_Timer
if (MarkOfHydross_Timer <= diff)
{
if (MarkOfHydross_Count <= 5)
{
uint32 mark_spell = 0;
switch (MarkOfHydross_Count)
events.Repeat(15s);
break;
case EVENT_WATER_TOMB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
DoCast(target, SPELL_WATER_TOMB);
events.Repeat(7s);
break;
case EVENT_SWITCH_TO_CORRUPTED:
if (!me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
{
case 0:
mark_spell = SPELL_MARK_OF_HYDROSS1;
break;
DoCastSelf(SPELL_CORRUPTION);
_markOfCorruptionCount = 0;
_corruptedForm = true;
case 1:
mark_spell = SPELL_MARK_OF_HYDROSS2;
break;
Talk(SAY_SWITCH_TO_CORRUPT);
ResetThreatList();
HandleBeamHelpers(true);
case 2:
mark_spell = SPELL_MARK_OF_HYDROSS3;
break;
DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_1);
DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_2);
DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_3);
DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_4);
case 3:
mark_spell = SPELL_MARK_OF_HYDROSS4;
break;
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
case 4:
mark_spell = SPELL_MARK_OF_HYDROSS5;
break;
events.CancelEvent(EVENT_MARK_OF_HYDROSS);
events.CancelEvent(EVENT_WATER_TOMB);
events.CancelEvent(EVENT_SWITCH_TO_CORRUPTED);
case 5:
mark_spell = SPELL_MARK_OF_HYDROSS6;
break;
events.ScheduleEvent(EVENT_MARK_OF_CORRUPTION, 15s);
events.ScheduleEvent(EVENT_VILE_SLUDGE, 7s);
events.ScheduleEvent(EVENT_SWITCH_TO_PURIFIED, 2500ms);
}
else
events.Repeat(2500ms);
break;
DoCastVictim(mark_spell);
// Corrupted form
case EVENT_MARK_OF_CORRUPTION:
if (_markOfCorruptionCount <= 5)
{
uint32 markSpell = 0;
if (MarkOfHydross_Count < 5)
++MarkOfHydross_Count;
}
switch (_markOfCorruptionCount)
{
case 0: markSpell = SPELL_MARK_OF_CORRUPTION_1; break;
case 1: markSpell = SPELL_MARK_OF_CORRUPTION_2; break;
case 2: markSpell = SPELL_MARK_OF_CORRUPTION_3; break;
case 3: markSpell = SPELL_MARK_OF_CORRUPTION_4; break;
case 4: markSpell = SPELL_MARK_OF_CORRUPTION_5; break;
case 5: markSpell = SPELL_MARK_OF_CORRUPTION_6; break;
}
MarkOfHydross_Timer = 15000;
} else MarkOfHydross_Timer -= diff;
DoCastVictim(markSpell);
//WaterTomb_Timer
if (WaterTomb_Timer <= diff)
{
Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true);
if (target)
DoCast(target, SPELL_WATER_TOMB);
if (_markOfCorruptionCount < 5)
++_markOfCorruptionCount;
}
events.Repeat(15s);
break;
case EVENT_VILE_SLUDGE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
DoCast(target, SPELL_VILE_SLUDGE);
events.Repeat(15s);
break;
case EVENT_SWITCH_TO_PURIFIED:
if (me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
{
me->RemoveAurasDueToSpell(SPELL_CORRUPTION);
_corruptedForm = false;
_markOfHydrossCount = 0;
WaterTomb_Timer = 7000;
} else WaterTomb_Timer -= diff;
Talk(SAY_SWITCH_TO_CLEAN);
ResetThreatList();
HandleBeamHelpers(false);
//PosCheck_Timer
if (PosCheck_Timer <= diff)
{
if (!me->IsWithinDist2d(HYDROSS_X, HYDROSS_Y, SWITCH_RADIUS))
{
// switch to corrupted form
me->SetDisplayId(MODEL_CORRUPT);
MarkOfCorruption_Count = 0;
CorruptedForm = true;
DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_1);
DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_2);
DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_3);
DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_4);
Talk(SAY_SWITCH_TO_CORRUPT);
ResetThreatList();
DeSummonBeams();
me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
// spawn 4 adds
DoSpawnCreature(ENTRY_TAINTED_SPAWN, SPAWN_X_DIFF1, SPAWN_Y_DIFF1, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_TAINTED_SPAWN, SPAWN_X_DIFF2, SPAWN_Y_DIFF2, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_TAINTED_SPAWN, SPAWN_X_DIFF3, SPAWN_Y_DIFF3, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
DoSpawnCreature(ENTRY_TAINTED_SPAWN, SPAWN_X_DIFF4, SPAWN_Y_DIFF4, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0s);
events.ScheduleEvent(EVENT_MARK_OF_HYDROSS, 15s);
events.ScheduleEvent(EVENT_WATER_TOMB, 7s);
events.ScheduleEvent(EVENT_SWITCH_TO_CORRUPTED, 2500ms);
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
}
events.CancelEvent(EVENT_MARK_OF_CORRUPTION);
events.CancelEvent(EVENT_VILE_SLUDGE);
events.CancelEvent(EVENT_SWITCH_TO_PURIFIED);
}
else
events.Repeat(2500ms);
break;
PosCheck_Timer = 2500;
} else PosCheck_Timer -=diff;
// All forms
case EVENT_BERSERK:
DoCastSelf(SPELL_BERSERK);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
//EnrageTimer
if (EnrageTimer <= diff)
{
DoCast(me, SPELL_ENRAGE);
EnrageTimer = 60000;
} else EnrageTimer -= diff;
DoMeleeAttackIfReady();
}
private:
uint32 _markOfHydrossCount;
uint32 _markOfCorruptionCount;
bool _corruptedForm;
};
void AddSC_boss_hydross_the_unstable()