mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 17:27:36 +01:00
Scripts/SerpentshrineCavern: Rewrite Hydross (#31150)
This commit is contained in:
16
sql/updates/world/3.3.5/2025_08_16_02_world.sql
Normal file
16
sql/updates/world/3.3.5/2025_08_16_02_world.sql
Normal 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");
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user