Full aberrus

This commit is contained in:
luis
2026-02-27 21:26:20 -03:00
parent 7a6ab1a3d5
commit 6ebdb785c9
9 changed files with 3484 additions and 0 deletions
@@ -37,7 +37,10 @@ enum AberrusDataTypes
DATA_MAGMORAX = 6,
DATA_ECHO_OF_NELTHARION = 7,
DATA_SCALECOMMANDER_SARKARETH = 8,
DATA_KAZZARA_INTRO = 9,
DATA_NELDRIS = 10,
DATA_THADRION = 11,
// Creatures
DATA_SARKARETH_AT_KAZZARA,
@@ -0,0 +1,208 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum magmoraxSpells
{
PERIODIC_ENERGY_GAIN = 299956,
SPELL_BLAZING_BREATH = 409093,//need test
SPELL_BLAZING_BREATH_DAMAGE = 410684,//need test
SPELL_BLAZING_TANTRUM = 407879,//ready
SPELL_CATASTROPHIC_ERUPTION = 408358,//ready,
SPELL_CATASTROPHIC_ERUPTION_DAMAGE = 408359,//ready
SPELL_EXPLOSIVE_MAGMA = 411149,//ready
SPELL_IGNITING_ROAR = 403740,//ready
SPELL_IGNITING_ROAR_DAMAGE = 403747,//ready
SPELL_INCINERATING_MAWS = 404846,//need test
SPELL_INCINERATING_MAWS_AURA = 408966,//need test
SPELL_INCINERATING_MAWS_DAMAGE = 401348,//need test
SPELL_INCINERATING_MAWS_AT = 404776,//401507,need script
SPELL_LAVA_EJECTION = 413367,//ready
SPELL_MOLTEN_SPITTLE = 411692,//need test
SPELL_MOLTEN_SPITTLE_PERIODIC = 411695,//need test
SPELL_MOLTEN_SPITTLE_DAMAGE = 411697,//need test
SPELL_OVERPOWERING_STOMP = 403671,//ready
};
enum magmoraxEvents
{
EVENT_BLAZING_BREATH = 2,
EVENT_BLAZING_TANTRUM = 3,
EVENT_CATASTROPHIC_ERUPTION = 4,
EVENT_EXPLOSIVE_MAGMA = 5,
EVENT_IGNITING_ROAR = 6,
EVENT_INCINERATING_MAWS = 7,
EVENT_LAVA_EJECTION = 8,
EVENT_MOLTEN_SPITTLE = 9,
EVENT_OVERPOWERING_STOMP = 10,
};
// 201579
struct boss_magmorax : public BossAI
{
boss_magmorax(Creature* creature) : BossAI(creature, DATA_MAGMORAX)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
if (!instance->GetData(DATA_MAGMORAX))
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_MAGMORAX, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_CATASTROPHIC_ERUPTION);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_BLAZING_BREATH, 24s);
events.ScheduleEvent(EVENT_BLAZING_TANTRUM, 27s);
events.ScheduleEvent(EVENT_EXPLOSIVE_MAGMA, 14s);
events.ScheduleEvent(EVENT_IGNITING_ROAR, 20s);
events.ScheduleEvent(EVENT_INCINERATING_MAWS, 12s);
events.ScheduleEvent(EVENT_LAVA_EJECTION, 9s);
events.ScheduleEvent(EVENT_MOLTEN_SPITTLE, 80s);
events.ScheduleEvent(EVENT_OVERPOWERING_STOMP, 32s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
DoCast(me, SPELL_CATASTROPHIC_ERUPTION);
DoCast(me, SPELL_CATASTROPHIC_ERUPTION_DAMAGE);
}
std::list<Player*> targetList;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BLAZING_BREATH:
DoCast(SPELL_BLAZING_BREATH);
DoCastVictim(SPELL_BLAZING_BREATH_DAMAGE);
events.ScheduleEvent(EVENT_BLAZING_BREATH, 31s);
break;
case EVENT_BLAZING_TANTRUM:
DoCast(SPELL_BLAZING_TANTRUM);
events.ScheduleEvent(EVENT_BLAZING_TANTRUM, 71s);
break;
case EVENT_EXPLOSIVE_MAGMA:
DoCastVictim(SPELL_EXPLOSIVE_MAGMA);
events.ScheduleEvent(EVENT_EXPLOSIVE_MAGMA, 60s);
break;
case EVENT_IGNITING_ROAR:
DoCast(SPELL_IGNITING_ROAR);
DoCastVictim(SPELL_IGNITING_ROAR_DAMAGE);
events.ScheduleEvent(EVENT_IGNITING_ROAR, 18s);
break;
case EVENT_INCINERATING_MAWS:
DoCastVictim(SPELL_INCINERATING_MAWS);
DoCastVictim(SPELL_INCINERATING_MAWS_AURA);
DoCastVictim(SPELL_INCINERATING_MAWS_DAMAGE);
events.ScheduleEvent(EVENT_INCINERATING_MAWS, 25s);
break;
case EVENT_LAVA_EJECTION:
DoCastVictim(SPELL_LAVA_EJECTION);
me->GetPlayerListInGrid(targetList, 150.0f);
for (Player* targets : targetList)
{
if (targets->HasAura(SPELL_CATASTROPHIC_ERUPTION_DAMAGE))
targets->RemoveAurasDueToSpell(SPELL_CATASTROPHIC_ERUPTION_DAMAGE);
if (targets->HasAura(SPELL_BLAZING_TANTRUM))
targets->RemoveAurasDueToSpell(SPELL_BLAZING_TANTRUM);
}
me->RemoveAurasDueToSpell(SPELL_CATASTROPHIC_ERUPTION);
me->RemoveAurasDueToSpell(SPELL_CATASTROPHIC_ERUPTION_DAMAGE);
me->RemoveAurasDueToSpell(SPELL_BLAZING_TANTRUM);
events.ScheduleEvent(EVENT_LAVA_EJECTION, 12s);
break;
case EVENT_MOLTEN_SPITTLE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{
me->CastSpell(target, SPELL_MOLTEN_SPITTLE, false);
me->CastSpell(target, SPELL_MOLTEN_SPITTLE_PERIODIC, false);
me->CastSpell(target, SPELL_MOLTEN_SPITTLE_DAMAGE, false);
}
events.ScheduleEvent(EVENT_MOLTEN_SPITTLE, 46s);
break;
case EVENT_OVERPOWERING_STOMP:
DoCast(SPELL_OVERPOWERING_STOMP);
events.ScheduleEvent(EVENT_OVERPOWERING_STOMP, 80s);
break;
}
}
}
};
void AddSC_boss_magmorax()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_magmorax);
}
@@ -0,0 +1,232 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum rashoktheelderSpells
{
PERIODIC_ENERGY_GAIN = 299956,
SPELL_ANCIENT_FURY = 405316,//ready
SPELL_CHARGED_SMASH = 400777,//ready
SPELL_DOOM_FLAMES = 406851,//need test
SPELL_DOOM_FLAMES_DAMAGE = 406153,//need test
SPELL_EARTHEN_CRUSH = 334575,//need test
SPELL_EARTHEN_CRUSH_DAMAGE = 407597,//need test
SPELL_ELDERS_CONDUIT = 401419,//ready
SPELL_FLAMING_SLASH = 403203,//need test
SPELL_FLAMING_SLASH_DAMAGE = 407547,//need test
SPELL_OVERCHARGED = 405827,//ready
SPELL_SCORCHED_FLESH = 408204, // need test
SPELL_SEARING_SLAM = 405819, //need test
SPELL_SEARING_SLAM_TRIGGER = 408684, //need test
SPELL_SEARING_SLAM_DAMAGE = 405821, //no damage
SPELL_SHADOWLAVA_BLAST = 406333,//ready
SPELL_SMOLDERING_RAGE = 405091,//ready
SPELL_SMOLDERING_RAGE_TRIGGER = 411738,// need fix
SPELL_SMOLDERING_RAGE_PERIODIC = 405091,// need test
SPELL_SMOLDERING_RAGE_DAMAGE = 411739,// need fix
SPELL_SUMMON_DJARUUN = 411740,// need fix
SPELL_UNLEASH_SHADOWFLAME = 410070,//ready
SPELL_WRATH_OF_DJARUUN = 407641,// need fix
};
enum rashoktheelderEvents
{
EVENT_ANCIENT_FURY = 2,
EVENT_CHARGED_SMASH = 3,
EVENT_DOOM_FLAMES = 4,
EVENT_EARTHEN_CRUSH = 5,
EVENT_FLAMING_SLASH = 6,
EVENT_OVERCHARGED = 7,
EVENT_SCORCHED_FLESH = 8,
EVENT_SEARING_SLAM = 9,
EVENT_SHADOWLAVA_BLAST = 10,
EVENT_SMOLDERING_RAGE = 11,
EVENT_SUMMON_DJARUUN = 12,
EVENT_UNLEASH_SHADOWFLAME = 13,
EVENT_WRATH_OF_DJARUUN = 14,
};
// 201320
struct boss_rashok_the_elder : public BossAI
{
boss_rashok_the_elder(Creature* creature) : BossAI(creature, DATA_RASHOK_THE_ELDER)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
if (!instance->GetData(DATA_RASHOK_THE_ELDER))
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_RASHOK_THE_ELDER, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_ELDERS_CONDUIT);
me->RemoveAurasDueToSpell(SPELL_ANCIENT_FURY);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_ANCIENT_FURY, 24s);
events.ScheduleEvent(EVENT_CHARGED_SMASH, 27s);
events.ScheduleEvent(EVENT_DOOM_FLAMES, 60s);
events.ScheduleEvent(EVENT_EARTHEN_CRUSH, 14s);
events.ScheduleEvent(EVENT_FLAMING_SLASH, 20s);
events.ScheduleEvent(EVENT_OVERCHARGED, 12s);
events.ScheduleEvent(EVENT_SCORCHED_FLESH, 90s);
events.ScheduleEvent(EVENT_SEARING_SLAM, 80s);
events.ScheduleEvent(EVENT_SHADOWLAVA_BLAST, 32s);
events.ScheduleEvent(EVENT_SMOLDERING_RAGE, 44s);
events.ScheduleEvent(EVENT_SUMMON_DJARUUN, 55s);
events.ScheduleEvent(EVENT_UNLEASH_SHADOWFLAME, 66s);
events.ScheduleEvent(EVENT_WRATH_OF_DJARUUN, 70s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
DoCast(me, SPELL_ELDERS_CONDUIT);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ANCIENT_FURY:
DoCast(SPELL_ANCIENT_FURY);
events.ScheduleEvent(EVENT_ANCIENT_FURY, 65s);
break;
case EVENT_CHARGED_SMASH:
DoCastVictim(SPELL_CHARGED_SMASH);
events.ScheduleEvent(EVENT_CHARGED_SMASH, 27s);
break;
case EVENT_DOOM_FLAMES:
DoCastVictim(SPELL_DOOM_FLAMES);
DoCastVictim(SPELL_DOOM_FLAMES_DAMAGE);
events.ScheduleEvent(EVENT_DOOM_FLAMES, 60s);
break;
case EVENT_EARTHEN_CRUSH:
DoCastVictim(SPELL_EARTHEN_CRUSH);
DoCastVictim(SPELL_EARTHEN_CRUSH_DAMAGE);
me->RemoveAurasDueToSpell(SPELL_ANCIENT_FURY);
me->RemoveAurasDueToSpell(SPELL_ELDERS_CONDUIT);
events.ScheduleEvent(EVENT_EARTHEN_CRUSH, 14s);
break;
case EVENT_FLAMING_SLASH:
DoCastVictim(SPELL_FLAMING_SLASH);
DoCastVictim(SPELL_FLAMING_SLASH_DAMAGE);
events.ScheduleEvent(EVENT_FLAMING_SLASH, 21s);
break;
case EVENT_OVERCHARGED:
DoCastVictim(SPELL_OVERCHARGED);
events.ScheduleEvent(EVENT_OVERCHARGED, 31s);
break;
case EVENT_SCORCHED_FLESH:
DoCastVictim(SPELL_SCORCHED_FLESH);
events.ScheduleEvent(EVENT_SCORCHED_FLESH, 90s);
break;
case EVENT_SEARING_SLAM:
DoCastVictim(SPELL_SEARING_SLAM);
DoCastVictim(SPELL_SEARING_SLAM_TRIGGER);
DoCastVictim(SPELL_SEARING_SLAM_DAMAGE);
events.ScheduleEvent(EVENT_SEARING_SLAM, 80s);
break;
case EVENT_SHADOWLAVA_BLAST:
DoCastVictim(SPELL_SHADOWLAVA_BLAST);
events.ScheduleEvent(EVENT_SHADOWLAVA_BLAST, 32s);
break;
case EVENT_SMOLDERING_RAGE:
DoCastVictim(SPELL_SMOLDERING_RAGE);
DoCastVictim(SPELL_SMOLDERING_RAGE_TRIGGER);
DoCastVictim(SPELL_SMOLDERING_RAGE_PERIODIC);
DoCastVictim(SPELL_SMOLDERING_RAGE_DAMAGE);
events.ScheduleEvent(EVENT_SMOLDERING_RAGE, 44s);
break;
case EVENT_SUMMON_DJARUUN:
DoCastVictim(SPELL_SUMMON_DJARUUN);
events.ScheduleEvent(EVENT_SUMMON_DJARUUN, 55s);
break;
case EVENT_UNLEASH_SHADOWFLAME:
DoCastVictim(SPELL_UNLEASH_SHADOWFLAME);
events.ScheduleEvent(EVENT_UNLEASH_SHADOWFLAME, 66s);
break;
case EVENT_WRATH_OF_DJARUUN:
DoCastVictim(SPELL_WRATH_OF_DJARUUN);
events.ScheduleEvent(EVENT_WRATH_OF_DJARUUN, 70s);
break;
}
}
}
};
void AddSC_boss_rashok_the_elder()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_rashok_the_elder);
}
@@ -0,0 +1,403 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum scalecommandersarkarethSpells
{
PERIODIC_ENERGY_GAIN = 299956,
SPELL_ABYSSAL_BREATH = 410243,//need test
SPELL_ABYSSAL_BREATH_AT = 404474,//need script
SPELL_BURNING_CLAWS = 401325,//need test
SPELL_BURNING_CLAWS_DAMAGE = 401339,//no damage
SPELL_BURNING_CLAWS_AREA = 403120,//need test
SPELL_BURNING_CLAWS_AREA_DAAMGE = 417928,//need script
SPELL_BURNING_CLAWS_AREA_AURAE = 401330,//need script
SPELL_BURNING_GROUND = 406989,//ready
SPELL_COSMIC_ASCENSION = 403766,//need test
SPELL_COSMIC_ASCENSION_DAMAGE = 403771,//need test
SPELL_DAZZIED = 401905,//ready
SPELL_DESOLATE_BLOSSOM = 404403,//need test
SPELL_DESOLATE_BLOSSOM_SUMMON = 404417,//need test
SPELL_DESOLATE_BLOSSOM_HEAL_ABSORB = 404425,//need test
SPELL_DESTABILIZE = 351092,//need test 408805
SPELL_DESTABILIZE_DEBUFF = 334695,//need test
SPELL_EBON_MIGHT = 404269, //ready
SPELL_EMBRACE_OF_NOTHINGNESS = 403517,//ready
SPELL_EMBRACE_OF_NOTHINGNESS_DAMAGE = 403520,//ready
SPELL_END_EXISTENCE = 410611,//need test
SPELL_ENGULFING_VOID = 405933,//ready
SPELL_ENGULFING_VOID_DAMAGE = 405934,//ready
SPELL_GLITERING_SURGE = 401810,//ready
SPELL_HURTING_BARRAGE = 405485,//need test
SPELL_INFINITE_DURESS = 404288,//ready
SPELL_INFINITE_DURESS_DAMAGE = 407496,//ready
SPELL_MASS_DISINTEGRATE = 401642,//need test
SPELL_MASS_DISINTEGRATE_SUMMON = 401653,//need test
SPELL_MASS_DISINTEGRATE_TRIGGER = 401642,//need test
SPELL_MASS_DISINTEGRATE_DAMAGE = 402600,//need test
SPELL_OBLIVION = 417537,//need test
SPELL_OBLIVION_DAMAGE = 401952,//need test
SPELL_OPPRESSING_HOWL = 401383,//ready
SPELL_SCORCHING_BOMB = 401500,//ready
SPELL_SCORCHING_DETONATION = 401525,//ready
SPELL_SCOURING_ETERNITY = 403625,//ready
SPELL_SEARING_BREATH = 402050,//ready
SPELL_SEARING_BREATH_DAMAGE = 402051,//ready
SPELL_VOID_BOMB = 404027,//ready
SPELL_VOID_CLAWS = 408448,//need test
SPELL_VOID_CLAWS_DAMAGE = 411242,//need test
SPELL_VOID_EMPOWERMENT = 403284,//ready
SPELL_VOID_FRACTURE = 410642,//ready
SPELL_VOID_MIGHT = 413106,//ready
SPELL_VOID_SLASH = 408429,//need test
SPELL_VOID_SLASH_DAMAGE = 315746,//need test
SPELL_VOID_SURGE = 404154,//ready
};
enum scalecommandersarkarethEvents
{
EVENT_ABYSSAL_BREATH = 2,
EVENT_BURNING_CLAWS = 3,
EVENT_BURNING_GROUND = 4,
EVENT_COSMIC_ASCENSION = 5,
EVENT_DAZZIED = 6,
EVENT_DESOLATE_BLOSSOM = 7,
EVENT_DESTABILIZE = 8,
EVENT_EBON_MIGHT = 9,
EVENT_EMBRACE_OF_NOTHINGNESS = 10,
EVENT_END_EXISTENCE = 11,
EVENT_ENGULFING_VOID = 12,
EVENT_GLITERING_SURGE = 13,
EVENT_HURTING_BARRAGE = 14,
EVENT_INFINITE_DURESS = 15,
EVENT_MASS_DISINTEGRATE = 16,
EVENT_OBLIVION = 17,
EVENT_OPPRESSING_HOWL = 18,
EVENT_SCORCHING_BOMB = 19,
EVENT_SCORCHING_DETONATION = 20,
EVENT_SCOURING_ETERNITY = 21,
EVENT_SEARING_BREATH = 22,
EVENT_VOID_BOMB = 23,
EVENT_VOID_CLAWS = 24,
EVENT_VOID_EMPOWERMENT = 25,
EVENT_VOID_FRACTURE = 26,
EVENT_VOID_MIGHT = 27,
EVENT_VOID_SLASH = 28,
EVENT_VOID_SURGE = 29,
};
enum scalecommandersarkarethAchievement
{
ACHIEVEMENT_MYTHIC_SARKARETH = 18159
};
// 201754
struct boss_scale_commander_sarkareth : public BossAI
{
boss_scale_commander_sarkareth(Creature* creature) : BossAI(creature, DATA_SCALECOMMANDER_SARKARETH)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENGULFING_VOID_DAMAGE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OPPRESSING_HOWL);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BURNING_GROUND);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DESTABILIZE);
me->RemoveAurasDueToSpell(SPELL_ENGULFING_VOID);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
if (!instance->GetData(DATA_SCALECOMMANDER_SARKARETH))
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_SCALECOMMANDER_SARKARETH, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
EndEncounter();
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENGULFING_VOID_DAMAGE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OPPRESSING_HOWL);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BURNING_GROUND);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DESTABILIZE);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_MASS_DISINTEGRATE);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_ABYSSAL_BREATH, 90s);
events.ScheduleEvent(EVENT_BURNING_CLAWS, 27s);
events.ScheduleEvent(EVENT_BURNING_GROUND, 60s);
events.ScheduleEvent(EVENT_COSMIC_ASCENSION, 14s);
events.ScheduleEvent(EVENT_DAZZIED, 30s);
events.ScheduleEvent(EVENT_DESOLATE_BLOSSOM, 12s);
events.ScheduleEvent(EVENT_DESTABILIZE, 90s);
events.ScheduleEvent(EVENT_EBON_MIGHT, 80s);
events.ScheduleEvent(EVENT_EMBRACE_OF_NOTHINGNESS, 32s);
events.ScheduleEvent(EVENT_END_EXISTENCE, 300s);
events.ScheduleEvent(EVENT_ENGULFING_VOID, 55s);
events.ScheduleEvent(EVENT_GLITERING_SURGE, 66s);
events.ScheduleEvent(EVENT_HURTING_BARRAGE, 70s);
events.ScheduleEvent(EVENT_INFINITE_DURESS, 83s);
events.ScheduleEvent(EVENT_MASS_DISINTEGRATE, 20s);
events.ScheduleEvent(EVENT_OBLIVION, 36s);
events.ScheduleEvent(EVENT_OPPRESSING_HOWL, 52s);
events.ScheduleEvent(EVENT_SCORCHING_BOMB, 48s);
events.ScheduleEvent(EVENT_SCORCHING_DETONATION, 24s);
events.ScheduleEvent(EVENT_SCOURING_ETERNITY, 65s);
events.ScheduleEvent(EVENT_SEARING_BREATH, 29s);
events.ScheduleEvent(EVENT_VOID_BOMB, 22s);
events.ScheduleEvent(EVENT_VOID_CLAWS, 40s);
events.ScheduleEvent(EVENT_VOID_EMPOWERMENT, 55s);
events.ScheduleEvent(EVENT_VOID_FRACTURE, 18s);
events.ScheduleEvent(EVENT_VOID_MIGHT, 58s);
events.ScheduleEvent(EVENT_VOID_SLASH, 68s);
events.ScheduleEvent(EVENT_VOID_SURGE, 73s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
DoCast(me, SPELL_MASS_DISINTEGRATE);
}
std::list<Player*> targetList;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ABYSSAL_BREATH:
DoCastVictim(SPELL_ABYSSAL_BREATH);
DoCastVictim(SPELL_ABYSSAL_BREATH_AT);
me->GetPlayerListInGrid(targetList, 150.0f);
for (Player* targets : targetList)
{
if (targets->HasAura(SPELL_OPPRESSING_HOWL))
targets->RemoveAurasDueToSpell(SPELL_OPPRESSING_HOWL);
if (targets->HasAura(SPELL_BURNING_GROUND))
targets->RemoveAurasDueToSpell(SPELL_BURNING_GROUND);
if (targets->HasAura(SPELL_DESTABILIZE))
targets->RemoveAurasDueToSpell(SPELL_DESTABILIZE);
}
me->RemoveAurasDueToSpell(SPELL_ENGULFING_VOID);
events.ScheduleEvent(EVENT_ABYSSAL_BREATH, 24s);
break;
case EVENT_BURNING_CLAWS:
DoCastVictim(SPELL_BURNING_CLAWS);
DoCastVictim(SPELL_BURNING_CLAWS_DAMAGE);
events.ScheduleEvent(EVENT_BURNING_CLAWS, 31s);
break;
case EVENT_BURNING_GROUND:
DoCastVictim(SPELL_BURNING_GROUND);
events.ScheduleEvent(EVENT_BURNING_GROUND, 35s);
break;
case EVENT_COSMIC_ASCENSION:
DoCast(SPELL_COSMIC_ASCENSION);
DoCastVictim(SPELL_COSMIC_ASCENSION_DAMAGE);
events.ScheduleEvent(EVENT_COSMIC_ASCENSION, 40s);
break;
case EVENT_DAZZIED:
DoCastVictim(SPELL_DAZZIED);
events.ScheduleEvent(EVENT_DAZZIED, 112s);
break;
case EVENT_DESOLATE_BLOSSOM:
DoCastVictim(SPELL_DESOLATE_BLOSSOM);
DoCastVictim(SPELL_DESOLATE_BLOSSOM_SUMMON);
DoCastVictim(SPELL_DESOLATE_BLOSSOM_HEAL_ABSORB);
events.ScheduleEvent(EVENT_DESOLATE_BLOSSOM, 44s);
break;
case EVENT_DESTABILIZE:
DoCastVictim(SPELL_DESTABILIZE);
DoCastVictim(SPELL_DESTABILIZE_DEBUFF);
events.ScheduleEvent(EVENT_DESTABILIZE, 48s);
break;
case EVENT_EBON_MIGHT:
DoCastSelf(SPELL_EBON_MIGHT);
events.ScheduleEvent(EVENT_EBON_MIGHT, 52s);
break;
case EVENT_EMBRACE_OF_NOTHINGNESS:
DoCastVictim(SPELL_EMBRACE_OF_NOTHINGNESS);
DoCastVictim(SPELL_EMBRACE_OF_NOTHINGNESS_DAMAGE);
events.ScheduleEvent(EVENT_EMBRACE_OF_NOTHINGNESS, 57s);
break;
case EVENT_END_EXISTENCE:
{
std::list<Player*> targetList;
me->GetPlayerListInGrid(targetList, 200.0f);
for (Player* targets : targetList)
{
me->CastSpell(targets->GetPosition(), SPELL_END_EXISTENCE, true);
}
events.ScheduleEvent(EVENT_END_EXISTENCE, 300s);
break;
}
case EVENT_ENGULFING_VOID:
DoCastVictim(SPELL_ENGULFING_VOID);
DoCastVictim(SPELL_ENGULFING_VOID_DAMAGE);
events.ScheduleEvent(EVENT_ENGULFING_VOID, 61s);
break;
case EVENT_GLITERING_SURGE:
DoCastVictim(SPELL_GLITERING_SURGE);
events.ScheduleEvent(EVENT_GLITERING_SURGE, 74s);
break;
case EVENT_HURTING_BARRAGE:
DoCast(SPELL_HURTING_BARRAGE);
events.ScheduleEvent(EVENT_HURTING_BARRAGE, 70s);
break;
case EVENT_INFINITE_DURESS:
DoCastVictim(SPELL_INFINITE_DURESS);
DoCastVictim(SPELL_INFINITE_DURESS_DAMAGE);
events.ScheduleEvent(EVENT_INFINITE_DURESS, 74s);
break;
case EVENT_MASS_DISINTEGRATE:
DoCastVictim(SPELL_MASS_DISINTEGRATE);
DoCastVictim(SPELL_MASS_DISINTEGRATE_TRIGGER);
DoCastVictim(SPELL_MASS_DISINTEGRATE_SUMMON);
DoCastVictim(SPELL_MASS_DISINTEGRATE_DAMAGE);
events.ScheduleEvent(EVENT_MASS_DISINTEGRATE, 79s);
break;
case EVENT_OBLIVION:
DoCastVictim(SPELL_OBLIVION);
DoCastVictim(SPELL_OBLIVION_DAMAGE);
events.ScheduleEvent(EVENT_OBLIVION, 83s);
break;
case EVENT_OPPRESSING_HOWL:
DoCastVictim(SPELL_OPPRESSING_HOWL);
events.ScheduleEvent(EVENT_OPPRESSING_HOWL, 88s);
break;
case EVENT_SCORCHING_BOMB:
DoCastVictim(SPELL_SCORCHING_BOMB);
events.ScheduleEvent(EVENT_SCORCHING_BOMB, 94s);
break;
case EVENT_SCORCHING_DETONATION:
DoCastVictim(SPELL_SCORCHING_DETONATION);
events.ScheduleEvent(EVENT_SCORCHING_DETONATION, 99s);
break;
case EVENT_SCOURING_ETERNITY:
DoCastVictim(SPELL_SCOURING_ETERNITY);
events.ScheduleEvent(EVENT_SCOURING_ETERNITY, 105s);
break;
case EVENT_SEARING_BREATH:
DoCastVictim(SPELL_SEARING_BREATH);
DoCastVictim(SPELL_SEARING_BREATH_DAMAGE);
events.ScheduleEvent(EVENT_SEARING_BREATH, 116s);
break;
case EVENT_VOID_BOMB:
DoCastVictim(SPELL_VOID_BOMB);
events.ScheduleEvent(EVENT_VOID_BOMB, 121s);
break;
case EVENT_VOID_CLAWS:
DoCastVictim(SPELL_VOID_CLAWS);
DoCastVictim(SPELL_VOID_CLAWS_DAMAGE);
events.ScheduleEvent(EVENT_VOID_CLAWS, 125s);
break;
case EVENT_VOID_EMPOWERMENT:
DoCastSelf(SPELL_VOID_EMPOWERMENT);
events.ScheduleEvent(EVENT_VOID_EMPOWERMENT, 109s);
break;
case EVENT_VOID_FRACTURE:
DoCastVictim(SPELL_VOID_FRACTURE);
events.ScheduleEvent(EVENT_VOID_FRACTURE, 112s);
break;
case EVENT_VOID_MIGHT:
DoCastVictim(SPELL_VOID_MIGHT);
events.ScheduleEvent(EVENT_VOID_MIGHT, 129s);
break;
case EVENT_VOID_SLASH:
DoCastVictim(SPELL_VOID_SLASH);
DoCastVictim(SPELL_VOID_SLASH_DAMAGE);
events.ScheduleEvent(EVENT_VOID_SLASH, 134s);
break;
case EVENT_VOID_SURGE:
DoCastVictim(SPELL_VOID_SURGE);
events.ScheduleEvent(EVENT_VOID_SURGE, 139s);
break;
default:
break;
}
}
}
void EndEncounter()
{
if (IsMythic())
{
if (AchievementEntry const* mythicsarkareth = sAchievementStore.LookupEntry(ACHIEVEMENT_MYTHIC_SARKARETH))
{
me->GetMap()->DoOnPlayers([mythicsarkareth](Player* player)
{
player->CompletedAchievement(mythicsarkareth);
});
}
}
}
};
void AddSC_boss_scale_commander_sarkareth()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_scale_commander_sarkareth);
}
@@ -0,0 +1,754 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum theforgottenexperimentsSpells
{
// Neldris
PERIODIC_ENERGY_GAIN = 299956,
SPELL_INFUSED_EXPLOSION = 407302,
SPELL_INFUSED_STRIKES = 406313,
SPELL_MASSIVE_SLAM = 404472,
SPELL_MASSIVE_SLAM_1 = 404473,
SPELL_MASSIVE_SLAM_2 = 412117,
SPELL_RENDING_CHARGE = 406358,
SPELL_RENDING_CHARGE_JUMP_CHARGE = 406370,
SPELL_RENDING_CHARGE_KNOCKBACK = 413076,
SPELL_RENDING_CHARGE_AURA = 406317,
SPELL_RENDING_CHARGE_DAMAGE = 406365,
SPELL_VAT_BREAK = 404031,
SPELL_BELOWING_ROAR = 404713,
SPELL_BELOWING_ROAR_DAMAGE = 409367,
// Thadrion
SPELL_UNSTABLE_ESSENCE = 405042,
SPELL_UNSTABLE_ESSENCE_DAMAGE = 407327,
SPELL_UNSTABLE_ESSENCE_TRIGGER = 405077,
SPELL_UNSTABLE_ESSENCE_DAMAGE2 = 408462,
SPELL_VAT_BREAK_T = 404032,
SPELL_VIOLENT_ERUPTION = 405375,
SPELL_VIOLENT_ERUPTION_DAMAGE = 407775,
SPELL_VOLATILE_SPEW = 410019,
SPELL_VOLATILE_SPEW_TRIGGER = 405586,
SPELL_VOLATILE_SPEW_DAMAGE = 405599,
// Rionthus
SPELL_DEEP_BREATH = 406233,
SPELL_DEEP_BREATH_TRIGGER = 406229,//need fix trigger 413074,406233
SPELL_DEEP_BREATH_DAMAGE = 408576,
SPELL_DISINTEGRATE = 405391,//need fix
SPELL_DISINTEGRATE_TRIGGER = 405392,//need fix
SPELL_DISINTEGRATE_PERIODIC = 405413, //need fix
SPELL_DISINTEGRATE_DAMAGE = 405423,//no damage
SPELL_TEMPORAL_ANOMALY = 407552,//need fix
SPELL_TEMPORAL_ANOMALY_SHIELD = 407617,
SPELL_TEMPORAL_ANOMALY_DAMAGE = 410608,
SPELL_TEMPORAL_ANOMALY_AT = 407572,// 28608
SPELL_TEMPORAL_FRACTURE = 410635,
};
enum theforgottenexperimentsEvents
{
// Neldris
EVENT_VAT_BREAK = 2,
EVENT_INFUSED_EXPLOSION = 3,
EVENT_RENDING_CHARGE = 4,
EVENT_INFUSED_STRIKES = 5,
EVENT_BELOWING_ROAR = 6,
EVENT_MASSIVE_SLAM = 7,
// Thadrion
EVENT_INFUSED_EXPLOSION_T = 8,
EVENT_INFUSED_STRIKES_T = 9,
EVENT_UNSTABLE_ESSENCE = 10,
EVENT_VAT_BREAK_T = 11,
EVENT_VIOLENT_ERUPTION = 12,
EVENT_VOLATILE_SPEW = 13,
// Rionthus
EVENT_DEEP_BREATH = 14,
EVENT_DISINTEGRATE = 15,
EVENT_INFUSED_EXPLOSION_R = 16,
EVENT_INFUSED_STRIKES_R = 17,
EVENT_TEMPORAL_ANOMALY = 18,
EVENT_TEMPORAL_FRACTURE = 19,
};
Position Positionthadrion = { 2884.59f, 2689.06f, 746.814f, 0.851714f };
Position Positionrionthus = { 2880.07f, 2694.74f, 746.81f, 0.71f };
// 200912,200913,200918
// 200912
struct boss_neldris : public BossAI
{
boss_neldris(Creature* creature) : BossAI(creature, DATA_NELDRIS)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->SummonCreature(BOSS_THADRION, Positionthadrion, TEMPSUMMON_DEAD_DESPAWN);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RENDING_CHARGE_DAMAGE);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RENDING_CHARGE_DAMAGE);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_VAT_BREAK, 20s);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION, 24s);
events.ScheduleEvent(EVENT_RENDING_CHARGE, 30s);
events.ScheduleEvent(EVENT_INFUSED_STRIKES, 12s);
events.ScheduleEvent(EVENT_BELOWING_ROAR, 7s);
events.ScheduleEvent(EVENT_MASSIVE_SLAM, 16s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_VAT_BREAK:
DoCastVictim(SPELL_VAT_BREAK);
events.ScheduleEvent(EVENT_VAT_BREAK, 54s);
break;
case EVENT_INFUSED_EXPLOSION:
DoCastVictim(SPELL_INFUSED_EXPLOSION);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RENDING_CHARGE_DAMAGE);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION, 25s);
break;
case EVENT_RENDING_CHARGE:
DoCastVictim(SPELL_RENDING_CHARGE);
events.ScheduleEvent(EVENT_RENDING_CHARGE, 30s);
break;
case EVENT_INFUSED_STRIKES:
DoCastVictim(SPELL_INFUSED_STRIKES);
DoCastVictim(SPELL_MASSIVE_SLAM);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
events.ScheduleEvent(EVENT_INFUSED_STRIKES, 14s);
break;
case EVENT_BELOWING_ROAR:
DoCastVictim(SPELL_BELOWING_ROAR);
events.ScheduleEvent(EVENT_BELOWING_ROAR, 35s);
break;
case EVENT_MASSIVE_SLAM:
DoCastVictim(SPELL_MASSIVE_SLAM);
DoCastVictim(SPELL_MASSIVE_SLAM_1);
DoCastVictim(SPELL_MASSIVE_SLAM_2);
events.ScheduleEvent(EVENT_MASSIVE_SLAM, 41s);
break;
}
}
}
};
// 200913
struct boss_thadrion : public BossAI
{
boss_thadrion(Creature* creature) : BossAI(creature, DATA_THADRION)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
void JustDied(Unit* /*killer*/) override
{
if (Creature* rionthus = me->FindNearestCreature(BOSS_RIONTHUS, 150.0f))
{
rionthus->SetUninteractible(false);
rionthus->SetImmuneToAll(false);
rionthus->SetVisible(true);
rionthus->AI()->DoZoneInCombat();
}
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void JustSummoned(Creature* summon) override
{
summon->AI()->DoZoneInCombat(nullptr);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION_R, 24s);
events.ScheduleEvent(EVENT_INFUSED_STRIKES_R, 30s);
events.ScheduleEvent(EVENT_UNSTABLE_ESSENCE, 60s);
events.ScheduleEvent(EVENT_VAT_BREAK_T, 14s);
events.ScheduleEvent(EVENT_VIOLENT_ERUPTION, 37s);
events.ScheduleEvent(EVENT_VOLATILE_SPEW, 12s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_INFUSED_EXPLOSION_R:
DoCastVictim(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION_R, 12s);
break;
case EVENT_INFUSED_STRIKES_R:
DoCastVictim(SPELL_INFUSED_STRIKES);
events.ScheduleEvent(EVENT_INFUSED_STRIKES_R, 14s);
break;
case EVENT_UNSTABLE_ESSENCE:
DoCastVictim(SPELL_UNSTABLE_ESSENCE);
events.ScheduleEvent(EVENT_UNSTABLE_ESSENCE, 30s);
break;
case EVENT_VAT_BREAK_T:
DoCastVictim(SPELL_VAT_BREAK_T);
events.ScheduleEvent(EVENT_VAT_BREAK_T, 60s);
break;
case EVENT_VIOLENT_ERUPTION:
DoCastVictim(SPELL_VIOLENT_ERUPTION);
DoCastVictim(SPELL_VIOLENT_ERUPTION_DAMAGE);
events.ScheduleEvent(EVENT_VIOLENT_ERUPTION, 55s);
break;
case EVENT_VOLATILE_SPEW:
DoCastVictim(SPELL_VOLATILE_SPEW_TRIGGER);
events.ScheduleEvent(EVENT_VOLATILE_SPEW, 46s);
break;
}
}
}
};
// 200918
struct boss_rionthus : public BossAI
{
boss_rionthus(Creature* creature) : BossAI(creature, DATA_THE_FORGOTTEN_EXPERIMENTS)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
me->SetUninteractible(true);
me->SetImmuneToAll(true);
me->SetVisible(false);
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_THE_FORGOTTEN_EXPERIMENTS, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_DEEP_BREATH, 24s);
events.ScheduleEvent(EVENT_DISINTEGRATE, 30s);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION_R, 12s);
events.ScheduleEvent(EVENT_INFUSED_STRIKES_R, 14s);
events.ScheduleEvent(EVENT_TEMPORAL_ANOMALY, 37s);
events.ScheduleEvent(EVENT_TEMPORAL_FRACTURE, 60s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_DEEP_BREATH:
DoCastVictim(SPELL_DEEP_BREATH);
DoCastVictim(SPELL_DEEP_BREATH_DAMAGE);
events.ScheduleEvent(EVENT_DEEP_BREATH, 49s);
break;
case EVENT_DISINTEGRATE:
DoCastSelf(SPELL_DISINTEGRATE);
DoCastSelf(SPELL_DISINTEGRATE_TRIGGER);
DoCastVictim(SPELL_DISINTEGRATE_DAMAGE);
events.ScheduleEvent(EVENT_DISINTEGRATE, 55s);
break;
case EVENT_INFUSED_EXPLOSION_R:
DoCastVictim(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_EXPLOSION);
me->RemoveAurasDueToSpell(SPELL_INFUSED_STRIKES);
events.ScheduleEvent(EVENT_INFUSED_EXPLOSION_R, 15s);
break;
case EVENT_INFUSED_STRIKES_R:
DoCastVictim(SPELL_INFUSED_STRIKES);
events.ScheduleEvent(EVENT_INFUSED_STRIKES_R, 20s);
break;
case EVENT_TEMPORAL_ANOMALY:
DoCastSelf(SPELL_TEMPORAL_ANOMALY);
DoCastVictim(SPELL_TEMPORAL_ANOMALY_AT);
events.ScheduleEvent(EVENT_TEMPORAL_ANOMALY, 60s);
break;
case EVENT_TEMPORAL_FRACTURE:
DoCastVictim(SPELL_TEMPORAL_FRACTURE);
events.ScheduleEvent(EVENT_TEMPORAL_FRACTURE, 67s);
break;
}
}
}
};
// Rending Charge 406358
class spell_rending_charge : public SpellScriptLoader
{
public:
spell_rending_charge() : SpellScriptLoader("spell_rending_charge") { }
class spell_rending_charge_SpellScript : public SpellScript
{
uint8 targetsCount = 1;
void FilterTargets(std::list<WorldObject*>& targets)
{
if(targets.size())
targetsCount = targets.size();
}
void HandleHit(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
{
if (Unit* target = GetHitUnit())
{
caster->CastSpell(target, SPELL_RENDING_CHARGE_JUMP_CHARGE, true);
caster->CastSpell(nullptr, SPELL_RENDING_CHARGE_KNOCKBACK, true);
caster->CastSpell(nullptr, SPELL_RENDING_CHARGE_DAMAGE, true);
caster->CastSpell(target, SPELL_RENDING_CHARGE_AURA, true);
}
}
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rending_charge_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget += SpellEffectFn(spell_rending_charge_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
OnEffectHitTarget += SpellEffectFn(spell_rending_charge_SpellScript::HandleHit, EFFECT_1, SPELL_EFFECT_CREATE_AREATRIGGER);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_rending_charge_SpellScript();
}
};
//28447 areatrigger - spell 406358
struct at_spell_rending_charge : AreaTriggerAI
{
at_spell_rending_charge(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
if (!unit->IsPlayer())
return;
unit->CastSpell(unit, SPELL_RENDING_CHARGE_DAMAGE, true);
}
void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
{
if (!unit->IsPlayer())
return;
unit->RemoveAura(SPELL_RENDING_CHARGE_AURA);
}
};
//404713
class spell_belowing_roar : public SpellScript
{
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
caster->CastSpell(nullptr, SPELL_BELOWING_ROAR_DAMAGE, true);
}
void Register() override
{
OnEffectLaunch += SpellEffectFn(spell_belowing_roar::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
//405042
class spell_unstable_essence : public SpellScript
{
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
caster->CastSpell(nullptr, SPELL_UNSTABLE_ESSENCE_DAMAGE, true);
}
void Register() override
{
OnEffectLaunch += SpellEffectFn(spell_unstable_essence::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
OnEffectLaunch += SpellEffectFn(spell_unstable_essence::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
}
};
// 407327
class spell_unstable_essence_aura : public SpellScriptLoader
{
public:
spell_unstable_essence_aura() : SpellScriptLoader("spell_unstable_essence_aura") { }
class spell_unstable_essence_aura_AuraScript : public AuraScript
{
PrepareAuraScript(spell_unstable_essence_aura_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_UNSTABLE_ESSENCE_DAMAGE,
SPELL_UNSTABLE_ESSENCE_DAMAGE2,
SPELL_UNSTABLE_ESSENCE_TRIGGER
});
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* caster = GetCaster())
{
if (Unit* target = GetTarget())
{
caster->CastSpell(target, SPELL_UNSTABLE_ESSENCE_TRIGGER, true);
caster->CastSpell(target, SPELL_UNSTABLE_ESSENCE_DAMAGE2, true);
}
}
}
void Register() override
{
OnEffectRemove += AuraEffectRemoveFn(spell_unstable_essence_aura_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_unstable_essence_aura_AuraScript();
}
};
//405586
class spell_volatile_spew_trigger : public SpellScript
{
void HandleTriggerSpell(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
Unit* caster = GetCaster();
if (!caster)
return;
if (WorldLocation const* target = GetExplTargetDest())
caster->CastSpell(target->GetPosition(), SPELL_VOLATILE_SPEW_TRIGGER, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_volatile_spew_trigger::HandleTriggerSpell, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE);
}
};
//405599 405601
class spell_volatile_spew_damage : public SpellScript
{
void HandleDamage(SpellEffIndex /*effectIndex*/)
{
SetHitDamage(GetHitDamage());
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_volatile_spew_damage::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
//405392
class spell_disintegrate_periodic : public AuraScript
{
void OnTick(AuraEffect const* /*aurEff*/)
{
if (auto aurEff = GetAura()->GetEffect(EFFECT_0))
{
float damage = aurEff->GetBaseAmount() * aurEff->GetTickNumber();
aurEff->SetAmount(damage);
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_disintegrate_periodic::OnTick, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
}
};
//405423
class spell_disintegrate_trigger : public AuraScript
{
void OnTick(AuraEffect const* /*aurEff*/)
{
if (auto aurEff = GetAura()->GetEffect(EFFECT_0))
{
float damage = aurEff->GetBaseAmount() * aurEff->GetTickNumber();
aurEff->SetAmount(damage);
}
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (!target)
return;
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_disintegrate_trigger::OnTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
OnEffectRemove += AuraEffectRemoveFn(spell_disintegrate_trigger::OnRemove, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED, AURA_EFFECT_HANDLE_REAPPLY);
}
};
//407617
class temporal_anomaly : public AuraScript
{
void CalculateAmount(AuraEffect const* /*AuraEffect**/, int32& amount, bool& /*canBeRecalculated*/)
{
amount = -1;
}
void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& /*absorbAmount*/)
{
if (auto target = GetTarget())
{
if (dmgInfo.GetDamage() < target->GetHealth())
return;
target->SetHealth(target->CountPctFromMaxHealth(GetSpellInfo()->GetEffect(EFFECT_1).BasePoints));
aurEff->GetBase()->Remove();
}
}
void Register() override
{
DoEffectCalcAmount += AuraEffectCalcAmountFn(temporal_anomaly::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
OnEffectAbsorb += AuraEffectAbsorbFn(temporal_anomaly::Absorb, EFFECT_0);
}
};
//28608 areatrigger - spell 407572
struct at_temporal_anomaly : AreaTriggerAI
{
at_temporal_anomaly(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
if (unit->IsPlayer())
unit->CastSpell(unit, SPELL_TEMPORAL_ANOMALY_DAMAGE, true);
else
unit->CastSpell(unit, SPELL_TEMPORAL_ANOMALY_SHIELD, true);
}
};
void AddSC_boss_the_forgotten_experiment()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_neldris);
new spell_rending_charge();
RegisterAreaTriggerAI(at_spell_rending_charge);
RegisterSpellScript(spell_belowing_roar);
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_thadrion);
RegisterSpellScript(spell_unstable_essence);
new spell_unstable_essence_aura();
RegisterSpellScript(spell_volatile_spew_trigger);
RegisterSpellScript(spell_volatile_spew_damage);
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_rionthus);
RegisterSpellScript(spell_disintegrate_periodic);
RegisterSpellScript(spell_disintegrate_trigger);
RegisterSpellScript(temporal_anomaly);
RegisterAreaTriggerAI(at_temporal_anomaly);
}
@@ -0,0 +1,205 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum warlordkagniSpells
{
PERIODIC_ENERGY_GAIN = 299956,
SPELL_BARRIER_BACKFIRE = 404687,//ready
SPELL_CATASTROPHIC_SLAM = 410516,//ready
SPELL_CATASTROPHIC_SLAM_DAMAGE = 410535,//ready
SPELL_DESPERATE_INMOLATION = 409359,// need test
SPELL_DESPERATE_INMOLATION_DAMAGE = 397514,// need test
SPELL_DEVASTATING_LEAP = 408117,// need test 406291
SPELL_DEVASTATING_LEAP_DAMAGE = 418126,// need test
SPELL_FLAMING_CUDGEL = 410351,// need test
SPELL_FLAMING_CUDGEL_TRIGGER = 410353, // need test
SPELL_FLAMING_CUDGEL_DAMAGE = 410369, // need test no damage
SPELL_HEAVY_CUDGEL = 401258,// need test
SPELL_HEAVY_CUDGEL_DAMAGE = 408873,// need test
SPELL_HEAVY_CUDGEL_FALL_DAMAGE = 400450,// need test
SPELL_IGNARAS_FLAME = 411230,// need test
SPELL_IGNARAS_FURY = 406585,//ready
SPELL_WEAKENED_VITALITY = 404616,//ready
SPELL_ZAQAIL_AIDE = 404382,// need script, summon 2 adds for helping boss
SPELL_ZAQAIL_AIDE_TRIGGER = 410207,// need script
SPELL_ZAQAIL_AIDE_DAMAGE = 411767,// for the 2 npcs summoned
};
enum warlordkagniEvents
{
EVENT_BARRIER_BACKFIRE = 2,
EVENT_CATASTROPHIC_SLAM = 3,
EVENT_DESPERATE_INMOLATION = 4,
EVENT_DEVASTATING_LEAP = 5,
EVENT_FLAMING_CUDGEL = 6,
EVENT_HEAVY_CUDGEL = 7,
EVENT_IGNARAS_FLAME = 8,
EVENT_WEAKENED_VITALITY = 9,
EVENT_ZAQAIL_AIDE = 10
};
// 199659
struct boss_warlord_kagni : public BossAI
{
boss_warlord_kagni(Creature* creature) : BossAI(creature, DATA_ASSAULT_OF_THE_ZAQALI)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
if (!instance->GetData(DATA_ASSAULT_OF_THE_ZAQALI))
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_ASSAULT_OF_THE_ZAQALI, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_WEAKENED_VITALITY);
me->RemoveAurasDueToSpell(SPELL_IGNARAS_FLAME);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_BARRIER_BACKFIRE, 24s);
events.ScheduleEvent(EVENT_CATASTROPHIC_SLAM, 24s);
events.ScheduleEvent(EVENT_DESPERATE_INMOLATION, 60s);
events.ScheduleEvent(EVENT_DEVASTATING_LEAP, 14s);
events.ScheduleEvent(EVENT_FLAMING_CUDGEL, 12s);
events.ScheduleEvent(EVENT_HEAVY_CUDGEL, 20s);
events.ScheduleEvent(EVENT_IGNARAS_FLAME, 54s);
events.ScheduleEvent(EVENT_WEAKENED_VITALITY, 90s);
events.ScheduleEvent(EVENT_ZAQAIL_AIDE, 80s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_IGNARAS_FURY);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BARRIER_BACKFIRE:
DoCast(SPELL_BARRIER_BACKFIRE);
events.ScheduleEvent(EVENT_BARRIER_BACKFIRE, 63s);
break;
case EVENT_CATASTROPHIC_SLAM:
DoCastVictim(SPELL_CATASTROPHIC_SLAM);
DoCastVictim(SPELL_CATASTROPHIC_SLAM_DAMAGE);
me->RemoveAurasDueToSpell(SPELL_IGNARAS_FLAME);
me->RemoveAurasDueToSpell(SPELL_IGNARAS_FURY);
me->RemoveAurasDueToSpell(SPELL_BARRIER_BACKFIRE);
events.ScheduleEvent(EVENT_CATASTROPHIC_SLAM, 20s);
break;
case EVENT_DESPERATE_INMOLATION:
DoCastSelf(SPELL_DESPERATE_INMOLATION);
DoCastSelf(SPELL_DESPERATE_INMOLATION_DAMAGE);
events.ScheduleEvent(EVENT_DESPERATE_INMOLATION, 60s);
break;
case EVENT_DEVASTATING_LEAP:
DoCastVictim(SPELL_DEVASTATING_LEAP);
DoCastVictim(SPELL_DEVASTATING_LEAP_DAMAGE);
events.ScheduleEvent(EVENT_DEVASTATING_LEAP, 35s);
break;
case EVENT_FLAMING_CUDGEL:
DoCastVictim(SPELL_FLAMING_CUDGEL);
DoCastVictim(SPELL_FLAMING_CUDGEL_TRIGGER);
DoCastVictim(SPELL_FLAMING_CUDGEL_DAMAGE);
events.ScheduleEvent(EVENT_FLAMING_CUDGEL, 40s);
break;
case EVENT_HEAVY_CUDGEL:
DoCastVictim(SPELL_HEAVY_CUDGEL);
DoCastVictim(SPELL_HEAVY_CUDGEL_DAMAGE);
events.ScheduleEvent(EVENT_HEAVY_CUDGEL, 54s);
break;
case EVENT_IGNARAS_FLAME:
DoCastSelf(SPELL_IGNARAS_FLAME);
DoCast(SPELL_IGNARAS_FURY);
events.ScheduleEvent(EVENT_IGNARAS_FLAME, 120s);
break;
case EVENT_WEAKENED_VITALITY:
DoCastVictim(SPELL_WEAKENED_VITALITY);
events.ScheduleEvent(EVENT_WEAKENED_VITALITY, 44s);
break;
case EVENT_ZAQAIL_AIDE:
DoCastVictim(SPELL_ZAQAIL_AIDE);
DoCastVictim(SPELL_ZAQAIL_AIDE_TRIGGER);
DoCastVictim(SPELL_ZAQAIL_AIDE_DAMAGE);
events.ScheduleEvent(EVENT_ZAQAIL_AIDE, 80s);
break;
}
}
}
};
void AddSC_boss_warlord_kagni()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_warlord_kagni);
}
@@ -0,0 +1,206 @@
/*
* This file is part of DekkCore Team
*
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "aberrus_the_shadowed_crucible.h"
enum zskarnthevigilantstewardSpells
{
PERIODIC_ENERGY_GAIN = 299956,
SPELL_ANIMATE_GOLEMS = 309653,// need test /golem npc 147286
SPELL_BLAST_WAVE = 403978,// ready
SPELL_DRAGONFIRE_TRAPS = 405462,// need test
SPELL_ELIMINATION_PROTOCOL_MARK = 404404,// need test
SPELL_ELIMINATION_PROTOCOL_TRIGGER = 403440,// need test
SPELL_ELIMINATION_PROTOCOL = 409942,// need test
SPELL_SEARING_CLAVES = 404939,// ready
SPELL_SEARING_CLAVES_DAMAGE = 404942,// ready
SPELL_SHARPNEL_BOMB = 404955,// ready
SPELL_SHARPNEL_BOMB_TRIGGER = 404959,// ready
SPELL_SHARPNEL_BOMB_DAMAGE = 406725,// ready
SPELL_TACTICAL_DESTRUCTION = 406678, // need test,
SPELL_UNSTABLE_EMBERS = 369198, // need test
SPELL_UNSTABLE_EMBERS_DAMAGE = 404404, // need test
};
enum zskarnthevigilantstewardEvents
{
EVENT_ANIMATE_GOLEMS = 2,
EVENT_BLAST_WAVE = 3,
EVENT_DRAGONFIRE_TRAPS = 4,
EVENT_ELIMINATION_PROTOCOL = 5,
EVENT_SEARING_CLAVES = 6,
EVENT_SHARPNEL_BOMB = 7,
EVENT_TACTICAL_DESTRUCTION = 8,
EVENT_UNSTABLE_EMBERS = 9,
};
// 202637/202375
struct boss_zskarn_the_vigilant_steward : public BossAI
{
boss_zskarn_the_vigilant_steward(Creature* creature) : BossAI(creature, DATA_ZSKARN_THE_VIGILANT_STEWARD)
{
Initialize();
}
void Reset() override
{
BossAI::Reset();
me->RemoveAura(PERIODIC_ENERGY_GAIN);
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
}
void Initialize()
{
me->SetPower(POWER_ENERGY, 0);
}
void JustAppeared() override
{
if (!instance->GetData(DATA_ZSKARN_THE_VIGILANT_STEWARD))
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetVisible(true);
}
}
void JustDied(Unit* /*killer*/) override
{
events.Reset();
summons.DespawnAll();
scheduler.CancelAll();
if (instance)
instance->SetBossState(DATA_ZSKARN_THE_VIGILANT_STEWARD, DONE);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->RemoveAurasDueToSpell(SPELL_TACTICAL_DESTRUCTION);
me->RemoveAurasDueToSpell(SPELL_SEARING_CLAVES);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCast(PERIODIC_ENERGY_GAIN);
events.ScheduleEvent(EVENT_ANIMATE_GOLEMS, 24s);
events.ScheduleEvent(EVENT_BLAST_WAVE, 27s);
events.ScheduleEvent(EVENT_DRAGONFIRE_TRAPS, 60s);
events.ScheduleEvent(EVENT_ELIMINATION_PROTOCOL, 14s);
events.ScheduleEvent(EVENT_SEARING_CLAVES, 20s);
events.ScheduleEvent(EVENT_SHARPNEL_BOMB, 12s);
events.ScheduleEvent(EVENT_TACTICAL_DESTRUCTION, 90s);
events.ScheduleEvent(EVENT_UNSTABLE_EMBERS, 80s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->GetPowerPct(POWER_ENERGY) == 100)
{
me->ModifyPower(POWER_ENERGY, -100);
DoCast(me, SPELL_TACTICAL_DESTRUCTION);
}
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ANIMATE_GOLEMS:
DoCastVictim(SPELL_ANIMATE_GOLEMS);
me->RemoveAurasDueToSpell(SPELL_SEARING_CLAVES);
events.ScheduleEvent(EVENT_ANIMATE_GOLEMS, 24s);
break;
case EVENT_BLAST_WAVE:
DoCastVictim(SPELL_BLAST_WAVE);
events.ScheduleEvent(EVENT_BLAST_WAVE, 27s);
break;
case EVENT_DRAGONFIRE_TRAPS:
DoCastVictim(SPELL_DRAGONFIRE_TRAPS);
events.ScheduleEvent(EVENT_DRAGONFIRE_TRAPS, 60s);
break;
case EVENT_ELIMINATION_PROTOCOL:
{
std::list<Player*> playerList;
me->GetPlayerListInGrid(playerList, 150.0f);
if (!playerList.empty())
{
for (auto player : playerList)
{
if (player->HasAura(SPELL_ELIMINATION_PROTOCOL_MARK))
{
me->CastSpell(player, SPELL_ELIMINATION_PROTOCOL_TRIGGER, true);
me->CastSpell(player, SPELL_ELIMINATION_PROTOCOL, true);
}
}
}
events.ScheduleEvent(EVENT_ELIMINATION_PROTOCOL, 35s);
break;
}
case EVENT_SEARING_CLAVES:
DoCastVictim(SPELL_SEARING_CLAVES);
DoCastVictim(SPELL_SEARING_CLAVES_DAMAGE);
events.ScheduleEvent(EVENT_SEARING_CLAVES, 31s);
break;
case EVENT_SHARPNEL_BOMB:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{
me->CastSpell(target, SPELL_SHARPNEL_BOMB, true);
me->CastSpell(target, SPELL_SHARPNEL_BOMB_TRIGGER, true);
me->CastSpell(target, SPELL_SHARPNEL_BOMB_DAMAGE, true);
}
events.ScheduleEvent(EVENT_SHARPNEL_BOMB, 39s);
break;
}
case EVENT_TACTICAL_DESTRUCTION:
DoCastVictim(SPELL_TACTICAL_DESTRUCTION);
events.ScheduleEvent(EVENT_TACTICAL_DESTRUCTION, 90s);
break;
case EVENT_UNSTABLE_EMBERS:
DoCastVictim(SPELL_UNSTABLE_EMBERS);
DoCastVictim(SPELL_UNSTABLE_EMBERS_DAMAGE);
events.ScheduleEvent(EVENT_UNSTABLE_EMBERS, 80s);
break;
}
}
}
};
void AddSC_boss_zskarn_the_vigilant_steward()
{
RegisterAberrusTheShadowedCrucibleCreatureAI(boss_zskarn_the_vigilant_steward);
}
@@ -32,6 +32,13 @@ void AddSC_instance_aberrus_the_shadowed_crucible();
void AddSC_aberrus_the_shadowed_crucible();
void AddSC_boss_kazzara_the_hellforged();
void AddSC_boss_echo_of_neltharion();
void AddSC_boss_magmorax();
void AddSC_boss_rashok_the_elder();
void AddSC_boss_scale_commander_sarkareth();
void AddSC_boss_the_amalgamation_chamber();
void AddSC_boss_the_forgotten_experiment();
void AddSC_boss_warlord_kagni();
void AddSC_boss_zskarn_the_vigilant_steward();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
@@ -53,4 +60,11 @@ void AddDragonIslesScripts()
AddSC_aberrus_the_shadowed_crucible();
AddSC_boss_kazzara_the_hellforged();
AddSC_boss_echo_of_neltharion();
AddSC_boss_magmorax();
AddSC_boss_rashok_the_elder();
AddSC_boss_scale_commander_sarkareth();
AddSC_boss_the_amalgamation_chamber();
AddSC_boss_the_forgotten_experiment();
AddSC_boss_warlord_kagni();
AddSC_boss_zskarn_the_vigilant_steward();
}