aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2025_08_16_02_world.sql16
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp548
2 files changed, 274 insertions, 290 deletions
diff --git a/sql/updates/world/3.3.5/2025_08_16_02_world.sql b/sql/updates/world/3.3.5/2025_08_16_02_world.sql
new file mode 100644
index 00000000000..fbac81171ae
--- /dev/null
+++ b/sql/updates/world/3.3.5/2025_08_16_02_world.sql
@@ -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");
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index f22d7fe791a..d03699e444a 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -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
+};
+
+enum HydrossSpells
+{
+ SPELL_WATER_TOMB = 38235,
+ SPELL_VILE_SLUDGE = 38246,
+
+ SPELL_BERSERK = 27680, // This spell need verification
+ SPELL_CORRUPTION = 37961,
+
+ 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,
+
+ 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
{
- 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,
-
- MODEL_CORRUPT = 20609,
- MODEL_CLEAN = 20162,
-
- 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,
-
- ENTRY_PURE_SPAWN = 22035,
- ENTRY_TAINTED_SPAWN = 22036,
- ENTRY_BEAM_DUMMY = 21934
+ 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)
- {
- Initialize();
- }
+ boss_hydross_the_unstable(Creature* creature) : BossAI(creature, BOSS_HYDROSS_THE_UNSTABLE),
+ _markOfHydrossCount(0), _markOfCorruptionCount(0), _corruptedForm(false) { }
- void Initialize()
+ void JustAppeared() override
{
- 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;
+ events.ScheduleEvent(EVENT_BLUE_BEAMS, 5s);
}
- 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()
- {
- Creature* beamer = me->SummonCreature(ENTRY_BEAM_DUMMY, -258.333f, -356.34f, 22.0499f, 5.90835f, TEMPSUMMON_CORPSE_DESPAWN);
- if (beamer)
- {
- 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()
+ void HandleBeamHelpers(bool reset)
{
- for (uint8 i = 0; i < 2; ++i)
+ std::list<Creature*> helpersList;
+ me->GetCreatureListWithEntryInGrid(helpersList, NPC_HYDROSS_BEAM_HELPER);
+ if (!helpersList.empty())
{
- 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 KilledUnit(Unit* /*victim*/) override
+ void JustReachedHome() override
{
- Talk(CorruptedForm ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY);
+ events.ScheduleEvent(EVENT_BLUE_BEAMS, 5s);
+ _JustReachedHome();
}
- void JustSummoned(Creature* summoned) override
+ void KilledUnit(Unit* /*victim*/) 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 UpdateAI(uint32 diff) override
+ void UpdateOutOfCombatEvents(uint32 diff)
{
- if (!beam)
- {
- SummonBeams();
- beam = true;
- }
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ events.Update(diff);
- // 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)
- {
- case 0:
- mark_spell = SPELL_MARK_OF_CORRUPTION1;
- break;
-
- case 1:
- mark_spell = SPELL_MARK_OF_CORRUPTION2;
- break;
-
- case 2:
- mark_spell = SPELL_MARK_OF_CORRUPTION3;
- break;
-
- 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;
- }
-
- DoCastVictim(mark_spell);
-
- if (MarkOfCorruption_Count < 5)
- ++MarkOfCorruption_Count;
- }
+ case EVENT_BLUE_BEAMS:
+ HandleBeamHelpers(false);
+ break;
+ default:
+ break;
+ }
+ }
+ }
- MarkOfCorruption_Timer = 15000;
- } else MarkOfCorruption_Timer -= diff;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ {
+ UpdateOutOfCombatEvents(diff);
+ return;
+ }
- //VileSludge_Timer
- if (VileSludge_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_VILE_SLUDGE);
+ events.Update(diff);
- VileSludge_Timer = 15000;
- } else VileSludge_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //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
+ while (uint32 eventId = events.ExecuteEvent())
{
- //MarkOfHydross_Timer
- if (MarkOfHydross_Timer <= diff)
+ switch (eventId)
{
- if (MarkOfHydross_Count <= 5)
- {
- uint32 mark_spell = 0;
-
- switch (MarkOfHydross_Count)
+ // Purified form
+ case EVENT_MARK_OF_HYDROSS:
+ if (_markOfHydrossCount <= 5)
{
- case 0:
- mark_spell = SPELL_MARK_OF_HYDROSS1;
- break;
-
- case 1:
- mark_spell = SPELL_MARK_OF_HYDROSS2;
- break;
-
- case 2:
- mark_spell = SPELL_MARK_OF_HYDROSS3;
- break;
-
- case 3:
- mark_spell = SPELL_MARK_OF_HYDROSS4;
- break;
-
- case 4:
- mark_spell = SPELL_MARK_OF_HYDROSS5;
- break;
-
- case 5:
- mark_spell = SPELL_MARK_OF_HYDROSS6;
- break;
+ uint32 markSpell = 0;
+
+ 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;
+ }
+
+ DoCastVictim(markSpell);
+
+ if (_markOfHydrossCount < 5)
+ ++_markOfHydrossCount;
}
+ 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))
+ {
+ DoCastSelf(SPELL_CORRUPTION);
+ _markOfCorruptionCount = 0;
+ _corruptedForm = true;
+
+ Talk(SAY_SWITCH_TO_CORRUPT);
+ ResetThreatList();
+ HandleBeamHelpers(true);
+
+ DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_1);
+ DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_2);
+ DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_3);
+ DoCastSelf(SPELL_SUMMON_CORRUPTED_SPAWN_4);
+
+ 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_HYDROSS);
+ events.CancelEvent(EVENT_WATER_TOMB);
+ events.CancelEvent(EVENT_SWITCH_TO_CORRUPTED);
+
+ 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);
-
- if (MarkOfHydross_Count < 5)
- ++MarkOfHydross_Count;
- }
-
- MarkOfHydross_Timer = 15000;
- } else MarkOfHydross_Timer -= diff;
-
- //WaterTomb_Timer
- if (WaterTomb_Timer <= diff)
- {
- Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true);
- if (target)
- DoCast(target, SPELL_WATER_TOMB);
-
- WaterTomb_Timer = 7000;
- } else WaterTomb_Timer -= diff;
-
- //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;
-
- Talk(SAY_SWITCH_TO_CORRUPT);
- ResetThreatList();
- DeSummonBeams();
-
- // 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);
-
- 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);
- }
-
- PosCheck_Timer = 2500;
- } else PosCheck_Timer -=diff;
+ // Corrupted form
+ case EVENT_MARK_OF_CORRUPTION:
+ if (_markOfCorruptionCount <= 5)
+ {
+ uint32 markSpell = 0;
+
+ 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;
+ }
+
+ DoCastVictim(markSpell);
+
+ 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;
+
+ Talk(SAY_SWITCH_TO_CLEAN);
+ ResetThreatList();
+ HandleBeamHelpers(false);
+
+ DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_1);
+ DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_2);
+ DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_3);
+ DoCastSelf(SPELL_SUMMON_PURIFIED_SPAWN_4);
+
+ 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);
+
+ events.ScheduleEvent(EVENT_MARK_OF_HYDROSS, 15s);
+ events.ScheduleEvent(EVENT_WATER_TOMB, 7s);
+ events.ScheduleEvent(EVENT_SWITCH_TO_CORRUPTED, 2500ms);
+
+ events.CancelEvent(EVENT_MARK_OF_CORRUPTION);
+ events.CancelEvent(EVENT_VILE_SLUDGE);
+ events.CancelEvent(EVENT_SWITCH_TO_PURIFIED);
+ }
+ else
+ events.Repeat(2500ms);
+ break;
+
+ // 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()