Antorus full

This commit is contained in:
luis
2026-10-08 13:22:10 -03:00
parent fca67d5e31
commit 7bac19160b
6 changed files with 1769 additions and 1 deletions
@@ -55,7 +55,21 @@ enum AntorusCreatureIds
NPC_DECIMATOR = 122773,
NPC_ANNIHILATOR = 122778,
NPC_ANNIHILATION = 122818,
NPC_GAROTHI_WORLDBREAKER = 124167
NPC_GAROTHI_WORLDBREAKER = 124167,
//Antoran High Command
NPC_CENTER_STALKER = 122637, //Event Manager
NPC_ADMIRAL_SVIRAX = 122367,
// Encounter related creatures
NPC_ARGUS_THE_UNMAKER = 124828,
NPC_FHARG = 122477,
NPC_SHATUG = 122135,
//Aggramar
NPC_AGGRAMAR = 121975,
NPC_EMBER_OF_TAESHALACH = 122532,
NPC_FLAME_OF_TAESHALACH = 121985,
};
enum AntorusGameObjectIds
@@ -0,0 +1,364 @@
/*
* This file is part of Wow Community
*
*/
#include "antorus_the_burning_throne.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellScript.h"
#include "ScriptedGossip.h"
enum Spells
{
SPELL_TAESHALACH_S_REACH = 243431,
//SPELL_TAESHALACH_S_REACH = 245990,
//SPELL_FLAME_REND = 244033,
SPELL_FLAME_REND = 245463,//????
//SPELL_FLAME_REND = 254654,
//SPELL_FOE_BREAKER = 244291,
SPELL_FOE_BREAKER = 245458,//???
//SPELL_FOE_BREAKER = 254655,
SPELL_WAKE_OF_FLAME = 244693,
//SPELL_WAKE_OF_FLAME = 244736,
SPELL_BURNING_RAGE = 244713,
SPELL_CORRUPT_AEGIS = 244894,
SPELL_SEARING_TEMPEST = 245301,
//SPELL_SEARING_TEMPEST = 246014,
SPELL_SCORCHING_BLAZE = 245994,
SPELL_EMPOWERED_FLAME_REND = 247079,
//SPELL_EMPOWERED_FLAME_REND = 255058,
SPELL_RAVENOUS_BLAZE = 254452,
SPELL_EMPOWERED_FOE_BREAKER = 255059,
//SPELL_EMPOWERED_FOE_BREAKER = 255060,
SPELL_EMPOWERED_SEARING_TEMPEST = 255061,
//SPELL_EMPOWERED_SEARING_TEMPEST = 255062,
SPELL_SEARING_BINDING = 255528,
SPELL_TAESHALACH_TECHNIQUE = 256208,//244688
SPELL_BLAZING_ERUPTION = 244912,
SPELL_MOLTEN_REMNANTS = 245905,
//SPELL_SEARING_TEMPEST = 254653,
SPELL_UNENDING_BLAZE = 254695,
SPELL_TITANS_ASSEMBLE_MOVIE = 254311,
SPELL_FLARE = 245983,
};
enum Events
{
// Intro
EVENT_INTRO = 1,
EVNET_PHASE_2 = 2,
EVNET_PHASE_3 = 3,
EVENT_A1 = 4,
EVENT_A2 = 5,
EVENT_A3 = 6,
EVENT_A4 = 7,
};
enum Phases
{
PHASE_NORMAL,
PHASE_INTRO,
PHASE_1,
PHASE_2,
PHASE_3,
PHASE_4,
};
///.go creature id
struct boss_aggramar : public BossAI
{
boss_aggramar(Creature* creature) : BossAI(creature, DATA_AGGRAMAR) { Initialize(); }
void Initialize()
{
PhaseStatus = Phases::PHASE_INTRO;
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SetBossState(DATA_AGGRAMAR, DONE);
instance->DoPlayConversation(6127);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override
{
if (me->HealthBelowPctDamaged(80, damage))
{
PhaseStatus = PHASE_2;
events.Reset();
me->GetMotionMaster()->MovePoint(1, Position(-12634.2f, -2255.2478f, 2514.2617f, 4.674f));
Talk(4);
DoCastSelf(SPELL_CORRUPT_AEGIS);
killCount = 2;
events.RescheduleEvent(EVNET_PHASE_2, 1s);
}
else if (me->HealthBelowPctDamaged(40, damage))
{
PhaseStatus = PHASE_3;
events.Reset();
me->GetMotionMaster()->MovePoint(1, Position(-12634.2f, -2255.2478f, 2514.2617f, 4.674f));
DoCastSelf(SPELL_CORRUPT_AEGIS);
killCount = 2;
events.RescheduleEvent(EVNET_PHASE_3, 1s);
}
}
void DoAction(int32 action) override
{
if (action == 1)
{
PhaseStatus = PHASE_INTRO;
instance->SetBossState(DATA_AGGRAMAR, SPECIAL);
events.Reset();
}
if (action == 2)
{
--killCount;
if (killCount <= 0)
{
me->RemoveAurasDueToSpell(SPELL_CORRUPT_AEGIS);
events.ScheduleEvent(SPELL_FLAME_REND, 5s);
events.ScheduleEvent(SPELL_FOE_BREAKER, 5s);
if (PhaseStatus < PHASE_2)
events.ScheduleEvent(SPELL_WAKE_OF_FLAME, 6s);
else
events.ScheduleEvent(SPELL_FLARE, 6s);
events.ScheduleEvent(SPELL_BURNING_RAGE, 5s);
events.ScheduleEvent(SPELL_CORRUPT_AEGIS, 5s);
events.ScheduleEvent(SPELL_SEARING_TEMPEST, 5s);
events.ScheduleEvent(SPELL_SCORCHING_BLAZE, 8s);
events.ScheduleEvent(SPELL_TAESHALACH_TECHNIQUE, 60s);
if (me->GetMap()->IsMythic())
{
events.ScheduleEvent(SPELL_EMPOWERED_FLAME_REND, 5s);
events.ScheduleEvent(SPELL_RAVENOUS_BLAZE, 5s);
events.ScheduleEvent(SPELL_EMPOWERED_FOE_BREAKER, 5s);
events.ScheduleEvent(SPELL_EMPOWERED_SEARING_TEMPEST, 5s);
events.ScheduleEvent(SPELL_SEARING_BINDING, 5s);
}
}
}
}
void ScheduleTasks() override
{
Talk(0);
DoCastSelf(SPELL_TAESHALACH_S_REACH);
events.ScheduleEvent(SPELL_FLAME_REND, 5s);
events.ScheduleEvent(SPELL_FOE_BREAKER, 5s);
if (PhaseStatus < PHASE_2)
events.ScheduleEvent(SPELL_WAKE_OF_FLAME, 6s);
else
events.ScheduleEvent(SPELL_FLARE, 6s);
events.ScheduleEvent(SPELL_BURNING_RAGE, 5s);
events.ScheduleEvent(SPELL_CORRUPT_AEGIS, 5s);
events.ScheduleEvent(SPELL_SEARING_TEMPEST, 5s);
events.ScheduleEvent(SPELL_SCORCHING_BLAZE, 8s);
events.ScheduleEvent(SPELL_TAESHALACH_TECHNIQUE, 60s);
if (me->GetMap()->IsMythic())
{
events.ScheduleEvent(SPELL_EMPOWERED_FLAME_REND, 5s);
events.ScheduleEvent(SPELL_RAVENOUS_BLAZE, 5s);
events.ScheduleEvent(SPELL_EMPOWERED_FOE_BREAKER, 5s);
events.ScheduleEvent(SPELL_EMPOWERED_SEARING_TEMPEST, 5s);
events.ScheduleEvent(SPELL_SEARING_BINDING, 5s);
}
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case SPELL_WAKE_OF_FLAME:
{
Talk(1);
DoCast(SPELL_WAKE_OF_FLAME);
events.Repeat(25s);
break;
}
case SPELL_FLARE:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_FLARE, false);
if (Unit* target2 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target2, SPELL_FLARE, false);
if (Unit* target3 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target3, SPELL_FLARE, false);
events.Repeat(25s);
break;
}
case SPELL_SEARING_TEMPEST:
{
DoCast(SPELL_SEARING_TEMPEST);
//events.Repeat(20s);
break;
}
case SPELL_SCORCHING_BLAZE:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_SCORCHING_BLAZE, false);
if (Unit* target2 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target2, SPELL_SCORCHING_BLAZE, false);
events.Repeat(8s);
break;
}
case SPELL_TAESHALACH_TECHNIQUE:
{
Talk(2);
DoCast(SPELL_TAESHALACH_TECHNIQUE);
Talk(3);
events.ScheduleEvent(EVENT_A1, 1s);
events.Repeat(60s);
break;
}
case EVENT_A1:
{
DoCast(SPELL_FOE_BREAKER);
events.ScheduleEvent(EVENT_A2, 4s);
break;
}
case EVENT_A2:
{
DoCast(SPELL_FLAME_REND);
DoCast(SPELL_BURNING_RAGE);
events.ScheduleEvent(EVENT_A3, 4s);
break;
}
case EVENT_A3:
{
DoCast(SPELL_FOE_BREAKER);
events.ScheduleEvent(EVENT_A4, 4s);
break;
}
case EVENT_A4:
{
DoCast(SPELL_FLAME_REND);
DoCast(SPELL_BURNING_RAGE);
events.ScheduleEvent(SPELL_SEARING_TEMPEST, 5s);
break;
}
case SPELL_EMPOWERED_FLAME_REND:
{
DoCast(SPELL_EMPOWERED_FLAME_REND);
events.Repeat(5s);
break;
}
case SPELL_RAVENOUS_BLAZE:
{
DoCast(SPELL_RAVENOUS_BLAZE);
events.Repeat(5s);
break;
}
case SPELL_EMPOWERED_FOE_BREAKER:
{
DoCast(SPELL_EMPOWERED_FOE_BREAKER);
events.Repeat(5s);
break;
}
case SPELL_EMPOWERED_SEARING_TEMPEST:
{
DoCast(SPELL_EMPOWERED_SEARING_TEMPEST);
events.Repeat(5s);
break;
}
case SPELL_SEARING_BINDING:
{
DoCast(SPELL_SEARING_BINDING);
events.Repeat(5s);
break;
}
default:
break;
}
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer() && me->IsWithinDist(who, 50.0f, false) && PhaseStatus == Phases::PHASE_INTRO)
{
PhaseStatus = Phases::PHASE_1;
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
}
}
void JustSummoned(Creature* summon) override
{
BossAI::JustSummoned(summon);
switch (summon->GetEntry())
{
case NPC_EMBER_OF_TAESHALACH:
{
summon->SetFaction(me->GetFaction());
summon->GetMotionMaster()->MovePoint(1, Position(-12634.2f, -2255.2478f, 2514.2617f, 4.674f));
break;
}
}
}
uint8 PhaseStatus;
uint8 killCount;
};
struct npc_ember_of_taeshalach_122532 : public ScriptedAI
{
npc_ember_of_taeshalach_122532(Creature* creature) : ScriptedAI(creature) { }
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (!UpdateVictim())
return;
}
void JustDied(Unit* /*killer*/) override
{
if (Creature* aggramar = me->FindNearestCreature(NPC_AGGRAMAR, 50.0f, true))
aggramar->AI()->DoAction(2);
DoCastSelf(SPELL_MOLTEN_REMNANTS);
}
void MoveInLineOfSight(Unit* who) override
{
if (who->GetEntry() == NPC_AGGRAMAR && me->IsWithinDist(who, 3.0f, false))
{
DoCastAOE(SPELL_BLAZING_ERUPTION);
me->KillSelf();
}
}
};
struct npc_magni_bronzebeard_128169 : public ScriptedAI
{
npc_magni_bronzebeard_128169(Creature* creature) : ScriptedAI(creature) { }
void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/)
{
CloseGossipMenuFor(player);
player->CastSpell(player, SPELL_TITANS_ASSEMBLE_MOVIE, true);
player->TeleportTo(1712, 2826.39f, -4567.94f, 291.95f, 0.02513274f);
}
};
void AddSC_boss_aggramar()
{
RegisterAntorusTheBurningThroneCreatureAI(boss_aggramar);
RegisterAntorusTheBurningThroneCreatureAI(npc_ember_of_taeshalach_122532);
RegisterAntorusTheBurningThroneCreatureAI(npc_magni_bronzebeard_128169);
}
@@ -0,0 +1,426 @@
/*
* This file is part of Wow Community
*
*/
#include "antorus_the_burning_throne.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellScript.h"
/// .go -2826.932, 10857.5, 139.512 1712
enum Spells
{
SPELL_CHAOS_PULSE = 257974,//share radom 2 player
NPC_FANATICAL_PYROMANCER = 127724,
SPELL_PYROBLAST = 246505,
NPC_FELBLADE_SHOCKTROOPER = 127725,
SPELL_BLADESTORM = 253038,
SPELL_ENTROPIC_MINE_2 = 257262,
SPELL_ENTROPIC_BLAST = 253290,//after 3:45
NPC_ADMIRALS_POD = 122554,
SPELL_WITHERING_FIRE = 245103, //[Admiral's Pod]'
///Use Chief Engineer Ishkar's pod
SPELL_FELSHIELD_EMITTER = 244902, //summon
NPC_FELSHIELD_EMITTER = 122867,
///Phase Three - Active Boss: General Erodus
SPELL_SUMMON_DISRUPTOR_BEACON = 245174,
NPC_DISRUPTOR_BEACON = 122884,
//general
SPELL_EXPLOIT_WEAKNESS = 244892,
SPELL_SHOCK_GRENADE = 244722, // mythic
SPELL_ASSUME_COMMAND = 245227,// 90s
//In Pod
//Admiral Svirax
SPELL_FUSILLADE = 244625, //30s
//Chief Engineer Ishkar
SPELL_ENTROPIC_MINE = 245161,//5s every 10s summon 122992/entropic-mine
//General Erodus
SPELL_SUMMON_REINFORCEMENTS = 245546,//8s every 8.4s summon 1 NPC_FANATICAL_PYROMANCER 2 NPC_FELBLADE_SHOCKTROOPER
NPC_CHIEF_ENGINEER_ISHKAR = 122369,
NPC_GENERAL_ERODUS = 122333,
};
Position const phase2pos = { -2809.739f,10829.299f,139.751f,2.05f };
Position const phase3pos = { -2859.6398f,10864.7998f,139.74f,5.9322f };
//Phase One - Active Boss: Admiral Svirax
//Phase Two - Active Boss: Chief Engineer Ishkar
//Phase Three - Active Boss: General Erodus
struct boss_admiral_svirax : public BossAI
{
boss_admiral_svirax(Creature* creature) : BossAI(creature, DATA_ANTORAN_HIGH_COMMAND) { Initialize(); }
void Initialize()
{
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override
{
SubDamageTaken(NPC_CHIEF_ENGINEER_ISHKAR, damage);
SubDamageTaken(NPC_GENERAL_ERODUS, damage);
}
void SubDamageTaken(uint32 dragonid, uint32& damage)
{
if (Creature* target = me->FindNearestCreature(dragonid, 500.0f))
{
uint64 ohealth = target->GetHealth() - damage;
target->SetHealth(ohealth > 0 ? ohealth : 0);
if (ohealth <= 0)
target->setDeathState(JUST_DIED);
}
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(2);
instance->SetBossState(DATA_ANTORAN_HIGH_COMMAND, DONE);
me->SummonCreature(129449, Position(-3098.5f, 10474.6298f, -112.6252f, 4.157f), TEMPSUMMON_MANUAL_DESPAWN);
if (instance)
instance->DoPlayConversation(5525);
}
void ScheduleTasks() override
{
PhaseStatus = 1;
events.ScheduleEvent(NPC_CHIEF_ENGINEER_ISHKAR, 90s);
events.ScheduleEvent(NPC_GENERAL_ERODUS, 180s);
//general
events.ScheduleEvent(SPELL_EXPLOIT_WEAKNESS, 8s);
if (IsMythic())
events.ScheduleEvent(SPELL_SHOCK_GRENADE, 15s);
events.ScheduleEvent(SPELL_ASSUME_COMMAND, 90s);
events.ScheduleEvent(SPELL_CHAOS_PULSE, 15s);
events.ScheduleEvent(SPELL_FUSILLADE, 30s);
events.ScheduleEvent(SPELL_ENTROPIC_MINE, 5s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case NPC_CHIEF_ENGINEER_ISHKAR:
{
PhaseStatus = 2;
events.CancelEvent(SPELL_ENTROPIC_MINE);
events.ScheduleEvent(SPELL_SUMMON_REINFORCEMENTS, 8s);
me->SummonCreature(NPC_CHIEF_ENGINEER_ISHKAR, phase2pos, TEMPSUMMON_MANUAL_DESPAWN);
break;
}
case NPC_GENERAL_ERODUS:
{
PhaseStatus = 3;
events.CancelEvent(SPELL_SUMMON_REINFORCEMENTS);
events.ScheduleEvent(SPELL_ENTROPIC_MINE, 5s);
me->SummonCreature(NPC_GENERAL_ERODUS, phase2pos, TEMPSUMMON_MANUAL_DESPAWN);
break;
}
case SPELL_EXPLOIT_WEAKNESS:
{
DoCast(SPELL_EXPLOIT_WEAKNESS);
events.Repeat(8s, 9s);
break;
}
case SPELL_SHOCK_GRENADE:
{
DoCast(SPELL_SHOCK_GRENADE);
events.Repeat(15s);
break;
}
case SPELL_ASSUME_COMMAND:
{
DoCast(SPELL_ASSUME_COMMAND);
events.Repeat(90s);
break;
}
case SPELL_CHAOS_PULSE:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target->GetPosition(), SPELL_CHAOS_PULSE, false);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target->GetPosition(), SPELL_CHAOS_PULSE, false);
events.Repeat(15s);
break;
}
case SPELL_FUSILLADE:
{
DoCast(SPELL_FUSILLADE);
events.Repeat(30s);
break;
}
case SPELL_ENTROPIC_MINE:
{
DoCast(SPELL_ENTROPIC_MINE);
for (uint8 i = 0; i < 5; ++i)
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target->GetPosition(), SPELL_CHAOS_PULSE, false);
events.Repeat(10s);
break;
}
case SPELL_SUMMON_REINFORCEMENTS:
{
DoCast(SPELL_SUMMON_REINFORCEMENTS);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_FANATICAL_PYROMANCER, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_CHIEF_ENGINEER_ISHKAR, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_FELBLADE_SHOCKTROOPER, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
events.Repeat(8s, 9s);
break;
}
default:
break;
}
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer() && me->IsWithinDist(who, 25.0f, false))
{
Talk(0);
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
}
}
void JustSummoned(Creature* summon) override
{
BossAI::JustSummoned(summon);
switch (summon->GetEntry())
{
case NPC_CHIEF_ENGINEER_ISHKAR:
case NPC_GENERAL_ERODUS:
{
summon->SetFaction(me->GetFaction());
break;
}
}
}
uint8 PhaseStatus;
};
struct npc_chief_engineer_ishkar_122369 : public ScriptedAI
{
npc_chief_engineer_ishkar_122369(Creature* creature) : ScriptedAI(creature) { Initialize(); }
void JustEngagedWith (Unit* /*attacker*/) override
{
events.ScheduleEvent(SPELL_EXPLOIT_WEAKNESS, 8s);
if (IsMythic())
events.ScheduleEvent(SPELL_SHOCK_GRENADE, 15s);
events.ScheduleEvent(SPELL_ASSUME_COMMAND, 90s);
events.ScheduleEvent(SPELL_CHAOS_PULSE, 15s);
//In Pod
events.ScheduleEvent(SPELL_ENTROPIC_MINE, 5s);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case SPELL_EXPLOIT_WEAKNESS:
{
DoCast(SPELL_EXPLOIT_WEAKNESS);
events.Repeat(8s, 9s);
break;
}
case SPELL_SHOCK_GRENADE:
{
DoCast(SPELL_SHOCK_GRENADE);
events.Repeat(15s);
break;
}
case SPELL_ASSUME_COMMAND:
{
DoCast(SPELL_ASSUME_COMMAND);
events.Repeat(90s);
break;
}
case SPELL_CHAOS_PULSE:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_CHAOS_PULSE, false);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_CHAOS_PULSE, false);
events.Repeat(15s);
break;
}
case SPELL_ENTROPIC_MINE:
{
DoCast(SPELL_ENTROPIC_MINE);
for (uint8 i = 0; i < 5; ++i)
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target->GetPosition(), SPELL_CHAOS_PULSE, false);
events.Repeat(10s);
break;
}
}
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override
{
SubDamageTaken(NPC_ADMIRAL_SVIRAX, damage);
SubDamageTaken(NPC_GENERAL_ERODUS, damage);
}
void SubDamageTaken(uint32 dragonid, uint32& damage)
{
if (Creature* target = me->FindNearestCreature(dragonid, 500.0f))
{
uint64 ohealth = target->GetHealth() - damage;
target->SetHealth(ohealth > 0 ? ohealth : 0);
if (ohealth <= 0)
target->setDeathState(JUST_DIED);
}
}
void Initialize()
{
instance = me->GetInstanceScript();
}
private:
InstanceScript* instance;
};
struct npc_general_erodus_122333 : public ScriptedAI
{
npc_general_erodus_122333(Creature* creature) : ScriptedAI(creature) { Initialize(); }
void JustEngagedWith(Unit* /*attacker*/) override
{
events.ScheduleEvent(SPELL_EXPLOIT_WEAKNESS, 8s);
if (IsMythic())
events.ScheduleEvent(SPELL_SHOCK_GRENADE, 15s);
events.ScheduleEvent(SPELL_ASSUME_COMMAND, 90s);
events.ScheduleEvent(SPELL_CHAOS_PULSE, 15s);
//In Pod
events.ScheduleEvent(SPELL_SUMMON_REINFORCEMENTS, 8s);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case SPELL_EXPLOIT_WEAKNESS:
{
DoCast(SPELL_EXPLOIT_WEAKNESS);
events.Repeat(8s, 9s);
break;
}
case SPELL_SHOCK_GRENADE:
{
DoCast(SPELL_SHOCK_GRENADE);
events.Repeat(15s);
break;
}
case SPELL_ASSUME_COMMAND:
{
DoCast(SPELL_ASSUME_COMMAND);
events.Repeat(90s);
break;
}
case SPELL_CHAOS_PULSE:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_CHAOS_PULSE, false);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_CHAOS_PULSE, false);
events.Repeat(15s);
break;
}
case SPELL_SUMMON_REINFORCEMENTS:
{
DoCast(SPELL_SUMMON_REINFORCEMENTS);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_FANATICAL_PYROMANCER, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_CHIEF_ENGINEER_ISHKAR, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->SummonCreature(NPC_FELBLADE_SHOCKTROOPER, target->GetRandomNearPosition(15.0f), TEMPSUMMON_MANUAL_DESPAWN);
events.Repeat(8s, 9s);
break;
}
}
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override
{
SubDamageTaken(NPC_ADMIRAL_SVIRAX, damage);
SubDamageTaken(NPC_CHIEF_ENGINEER_ISHKAR, damage);
}
void SubDamageTaken(uint32 dragonid, uint32& damage)
{
if (Creature* target = me->FindNearestCreature(dragonid, 500.0f))
{
uint64 ohealth = target->GetHealth() - damage;
target->SetHealth(ohealth > 0 ? ohealth : 0);
if (ohealth <= 0)
target->setDeathState(JUST_DIED);
}
}
void Initialize()
{
instance = me->GetInstanceScript();
}
private:
InstanceScript* instance;
};
struct npc_entropic_mine_122992 : public ScriptedAI
{
npc_entropic_mine_122992(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
me->CastSpell(me, SPELL_ENTROPIC_MINE_2, true);
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer() && me->IsWithinDist(who, 5.0f, false))
{
me->CastSpell(who, SPELL_ENTROPIC_BLAST, true);
me->DespawnOrUnsummon();
}
}
};
void AddSC_boss_antoran()
{
RegisterAntorusTheBurningThroneCreatureAI(boss_admiral_svirax);
RegisterAntorusTheBurningThroneCreatureAI(npc_chief_engineer_ishkar_122369);
RegisterAntorusTheBurningThroneCreatureAI(npc_general_erodus_122333);
RegisterAntorusTheBurningThroneCreatureAI(npc_entropic_mine_122992);
}
@@ -0,0 +1,605 @@
/*
* This file is part of Wow Community
*
*/
#include "antorus_the_burning_throne.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellScript.h"
#include "PhasingHandler.h"
enum Spells
{
SPELL_PANTHEON_INTRO_MOVIE = 256945,
SPELL_RAID_ANTORUS_BONUS_ROLL_PROMPT_BOSS11_LOOT = 250608, //SPELL_EFFECT_LOOT A 75888 B 438
//Stage One: Storm and Sky
SPELL_SWEEPING_SCYTHE = 248499,//phase 1 every 5-6s phase2 start 16-17s
SPELL_CONE_OF_DEATH = 248165,// start 30s 19.4-24 256457,
SPELL_SOULBLIGHT_ORB = 248317,// start 35 22-32
SPELL_TORTURED_RAGE = 257296,//12 13-16
SPELL_SKY_AND_SEA = 255594,//10 24.9-27.8
//Stage one Mythic
SPELL_SARGERAS_GAZE = 258068,//8 35
//Stage Two: The Protector Redeemed
SPELL_GOLGANNETHS_WRATH = 255648,
SPELL_SOULBOMB = 251570,//30s 42s
SPELL_SOULBURST = 250669,//30s 42s
SPELL_EDGE_OF_OBLITERATION = 255826,//21s 34s
//Aggramar's Aid BUFF
SPELL_AVTAR_OF_AGGRAMAR = 255199,//21s 60S
SPELL_AGGRAMARS_BOON = 255200,// player buff nearby
//Stage Three: The Arcane Masters
SPELL_CLEARALLDEBUFFS = 34098,
SPELL_COSMIC_RAY = 252729,//30s 20s
SPELL_COSMIC_BEACON = 252616,//40s 20s 14S NEXT
//257645/Aman'thul will cast on Argu
NPC_AMANTHUL = 125885,
SPELL_TEMPORAL_BLAST = 257645,
//Norgannon's Aid 15 seconds after all the adds have spawned, Norgannon casts .
NPC_NORGANNON = 126266,
SPELL_THE_DISCS_OF_NORGANNNON = 252516, //15s
//Stage Three Mythic
SPELL_SOULRENDING_SCYTHE = 258838,// 8-9s
SPELL_SENTENCE_OF_SARGERAS = 257966,//35s
SPELL_EDGE_OF_ANNIHILATION = 258834, // 5-6s
//Stage Four: The Gift of Life, The Forge of Loss (Non Mythic)
//Argus has replaced with
SPEEL_DEADLY_SCYTHE = 258039, // 5-6s
//256388 Initialization Sequence 258029 Initialization Sequence (Mythic)
SPELL_REORIGINATION_MODULE = 256389, //48s
SPELL_REAP_SOUL = 256542,
SPELL_GIFT_OF_THE_LIFEBINDER = 257619, //8
//PHASE 1
SPELL_DEATH_FOG = 248167, //SPELL_CONE_OF_DEATH SPELL_SOULBLIGHT_ORB
//Golganneth's Aid BUFF
SPELL_STRENGTH_OF_THE_SEA_MARK = 258647,
SPELL_STRENGTH_OF_THE_SKY_MARK = 258646,
SPELL_STRENGTH_OF_THE_SEA_AT = 257306,//253889
SPELL_STRENGTH_OF_THE_SKY_AT = 257313,//253884
SPELL_STRENGTH_OF_THE_SEA = 253901,
SPELL_STRENGTH_OF_THE_SKY = 253903,
//PHASE 2
SPELL_VOLATILE_SOUL = 252280,
SPELL_SOULBURST_DETONATION = 251572,
//PHASE 3
//Constellar Designate adds can not be crowd controlled
NPC_CONSTELLAR_DESIGNATE = 127192,
SPELL_STARBLAST = 253061,// RANDOM
SPELL_COSMIC_SMASH = 252634,
SPELL_SWORD_OF_THE_COSMOS = 255496,
SPELL_COSMIC_POWER = 255935,
//PHASE 4
//Eonar's Aid Shortly after the raid dies, Eonar will create a [Gift of the Lifebinder] tree.
NPC_EONAR = 126267,
NPC_GIFT_OF_THE_LIFEBINDER = 129386,
SPELL_END_OF_ALL_THINGS = 256544,
NPC_SOULBLIGHT_ORB = 125008,
SPELL_BLIGHT_ORB = 248376,
SPELL_SOULBLIGHT = 248396,
NPC_HUNGERING_SOUL = 129635,
NPC_REORIGINATION_MODULE = 127809,
SPELL_INITIALIZATION_SEQUENCE = 256388,
SPELL_REORIGINATION_MODULE_DMG = 256396,
NPC_GOLGANNETH = 126268,
HP_70 = 70,
HP_40 = 40,
HP_30 = 30,
};
enum Events
{
// Intro
EVENT_INTRO = 1,
EVENT_2 = 2,
EVENT_3 = 3,
EVENT_4 = 4,
EVENT_5 = 5,
};
///.go creature id
struct boss_argus_the_unmaker : public BossAI
{
boss_argus_the_unmaker(Creature* creature) : BossAI(creature, DATA_ARGUS_THE_UNMAKER) { Initialize(); }
Position pos1 = { 2877.458f, -4592.133f, 292.0213f, 3.341679f };
Position pos2 = { 3112.8728f, -9635.2373f, 62.25f, 3.137645f };
uint32 _mobsCount = 0;
void Initialize()
{
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
if (IsMythic())
{
instance->DoCompleteAchievement(12002);
}
instance->DoCompleteAchievement(11991);
instance->DoCompleteAchievement(12266);
instance->AddTimedDelayedOperation(5000, [this]() -> void
{
instance->DoStartMovie(688);
});
instance->DoNearTeleportPlayers(pos2, false);
}
void DoAction(int32 action) override
{
if (action == 1)
{
--_mobsCount;
if (_mobsCount <= 0)
{
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
me->SetReactState(REACT_AGGRESSIVE);
me->Attack(me->GetVictim(), true);
me->GetMotionMaster()->MoveChase(me->GetVictim());
DoCastAOE(SPELL_CLEARALLDEBUFFS);
if (IsMythic())
{
events.ScheduleEvent(SPELL_SOULRENDING_SCYTHE, 5s);
events.ScheduleEvent(SPELL_SENTENCE_OF_SARGERAS, 35s);
events.ScheduleEvent(SPELL_EDGE_OF_ANNIHILATION, 5s);
}
events.ScheduleEvent(SPELL_SOULBOMB, 41s);
events.ScheduleEvent(SPELL_SOULBURST, 41s);
}
}
}
void SwitchPhase(uint32 phase)
{
switch (phase)
{
case 1:
PhaseStatus = 1;
events.Reset();
events.ScheduleEvent(SPELL_SWEEPING_SCYTHE, 5s, 6s);
events.ScheduleEvent(SPELL_CONE_OF_DEATH, 30s);
events.ScheduleEvent(SPELL_SOULBLIGHT_ORB, 35s);
events.ScheduleEvent(SPELL_TORTURED_RAGE, 12s);
events.ScheduleEvent(SPELL_SKY_AND_SEA, 10s);
if (IsMythic())
events.ScheduleEvent(SPELL_SARGERAS_GAZE, 8s);
break;
case 2:
PhaseStatus = 2;
events.Reset();
DoCast(SPELL_GOLGANNETHS_WRATH);
if (Creature* target = me->FindNearestCreature(NPC_GOLGANNETH, 150.0f, true))
target->AI()->DoAction(2);
//AREA CLEAR
instance->AddTimedDelayedOperation(2500, [this]() -> void
{
events.ScheduleEvent(SPELL_SWEEPING_SCYTHE, 16s, 17s);
events.ScheduleEvent(SPELL_SOULBOMB, 30s);
events.ScheduleEvent(SPELL_SOULBURST, 30s);
events.ScheduleEvent(SPELL_EDGE_OF_OBLITERATION, 21s);
events.ScheduleEvent(SPELL_AVTAR_OF_AGGRAMAR, 21s);
if (IsMythic())
events.ScheduleEvent(SPELL_SARGERAS_GAZE, 26s);
});
//events.ScheduleEvent(SPELL_TORTURED_RAGE, 15s);
events.ScheduleEvent(SPELL_VOLATILE_SOUL, 15s);
events.ScheduleEvent(SPELL_SOULBURST_DETONATION, 15s);
break;
case 3:
PhaseStatus = 3;
events.Reset();
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(0, me->GetHomePosition());
if (Creature* amanthul = me->FindNearestCreature(NPC_AMANTHUL, 150.0f, true))
{
amanthul->CastSpell(me, SPELL_TEMPORAL_BLAST, true);
instance->AddTimedDelayedOperation(5000, [this, amanthul]() -> void
{
me->SetFacingToObject(amanthul);
});
DoCast(SPELL_TEMPORAL_BLAST);
}
_health = (uint64)(me->GetMaxHealth() * HP_40 / 100);
me->SetHealth(_health);
instance->AddTimedDelayedOperation(10000, [this]() -> void
{
//summon NPC
_mobsCount = 7;
if (Creature* norgannon = me->FindNearestCreature(NPC_NORGANNON, 150.0f, true))
norgannon->CastSpell(me, SPELL_THE_DISCS_OF_NORGANNNON, true);
//PhasingHandler::AddPhase(me, 170);
});
break;
case 4:
//phase4
PhaseStatus = 4;
events.Reset();
instance->SetBossState(DATA_ARGUS_THE_UNMAKER, SPECIAL);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(1, me->GetHomePosition());
instance->DoNearTeleportPlayers(Position(2887.892f, -4567.8f, 291.965f, 3.09f), false);
_health = (uint64)(me->GetMaxHealth() * HP_30 / 100);
me->SetHealth(_health);
//DoAction(SPECIAL);
instance->AddTimedDelayedOperation(12000, [this]() -> void
{
if (Creature* life = me->FindNearestCreature(NPC_EONAR, 150.0f, true))
life->CastSpell(me, SPELL_GIFT_OF_THE_LIFEBINDER, true);
});
//SPELL_REAP_SOUL kill all
if (Creature* amanthul = me->FindNearestCreature(NPC_AMANTHUL, 150.0f, true))
me->SetFacingToObject(amanthul);
DoCast(SPELL_REAP_SOUL);
instance->AddTimedDelayedOperation(20000, [this]() -> void
{
uint64 _health = (uint64)(me->GetMaxHealth() * HP_30 / 100);
me->SetHealth(_health);
if (Creature* life = me->FindNearestCreature(NPC_EONAR, 150.0f, true))
life->SummonCreature(NPC_GIFT_OF_THE_LIFEBINDER, Position(2893.73f, -4545.36f, 292.028f, 3.77829f), TEMPSUMMON_MANUAL_DESPAWN);
instance->DoResurrectPlayers(1.0f);
});
instance->AddTimedDelayedOperation(22000, [this]() -> void
{
me->SetReactState(REACT_AGGRESSIVE);
me->Attack(me->GetVictim(), true);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveChase(me->GetVictim());
events.ScheduleEvent(SPEEL_DEADLY_SCYTHE, 5s);
events.ScheduleEvent(SPELL_REORIGINATION_MODULE, 48s);
events.ScheduleEvent(SPELL_SOULBOMB, 80s);
events.ScheduleEvent(SPELL_SOULBURST, 40s);
});
break;
default:
break;
}
}
void ScheduleTasks() override
{
if (Creature* life = me->FindNearestCreature(NPC_GIFT_OF_THE_LIFEBINDER, 150.0f, true))
life->DespawnOrUnsummon();
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case SPELL_SWEEPING_SCYTHE:
{
DoCast(SPELL_SWEEPING_SCYTHE);
events.Repeat(5s);
break;
}
case SPELL_TORTURED_RAGE:
{
DoCast(SPELL_TORTURED_RAGE);
events.Repeat(13s, 16s);
break;
}
case SPELL_CONE_OF_DEATH:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_CONE_OF_DEATH, false);
events.Repeat(19s, 24s);
break;
}
case SPELL_SOULBLIGHT_ORB:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_SOULBLIGHT_ORB, false);
events.Repeat(22s);
break;
}
case SPELL_SKY_AND_SEA:
{
if (Creature* target = me->FindNearestCreature(NPC_GOLGANNETH, 150.0f, true))
target->AI()->DoAction(1);
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
{
me->CastSpell(target1, SPELL_STRENGTH_OF_THE_SEA_MARK, false);
instance->AddTimedDelayedOperation(4000, [this, target1]() -> void
{
me->CastSpell(target1, SPELL_STRENGTH_OF_THE_SEA_AT, false);
target1->CastSpell(target1, SPELL_STRENGTH_OF_THE_SEA, false);
});
}
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
{
me->CastSpell(target1, SPELL_STRENGTH_OF_THE_SKY_MARK, false);
instance->AddTimedDelayedOperation(4000, [this, target1]() -> void
{
me->CastSpell(target1, SPELL_STRENGTH_OF_THE_SKY_AT, false);
target1->CastSpell(target1, SPELL_STRENGTH_OF_THE_SKY, false);
});
}
events.Repeat(25s, 28s);
break;
}
case SPELL_SARGERAS_GAZE:
{
DoCast(SPELL_SARGERAS_GAZE);
events.Repeat(35s);
break;
}
case SPELL_SOULBOMB:
{
DoCast(SPELL_SOULBOMB);
events.Repeat(42s);
break;
}
case SPELL_SOULBURST:
{
DoCast(SPELL_SOULBURST);//2 Targets
events.Repeat(42s);
break;
}
case SPELL_EDGE_OF_OBLITERATION:
{
DoCast(SPELL_EDGE_OF_OBLITERATION);
events.Repeat(34s);
break;
}
case SPELL_AVTAR_OF_AGGRAMAR:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
target1->CastSpell(target1, SPELL_AVTAR_OF_AGGRAMAR, true);
events.Repeat(60s);
break;
}
case SPELL_SOULRENDING_SCYTHE:
{
DoCast(SPELL_SOULRENDING_SCYTHE);
events.Repeat(8s, 9s);
break;
}
case SPELL_SENTENCE_OF_SARGERAS:
{
DoCast(SPELL_SENTENCE_OF_SARGERAS);
events.Repeat(35s);
break;
}
case SPELL_EDGE_OF_ANNIHILATION:
{
DoCast(SPELL_EDGE_OF_ANNIHILATION);
events.Repeat(5s, 6s);
break;
}
case SPEEL_DEADLY_SCYTHE:
{
DoCast(SPEEL_DEADLY_SCYTHE);
events.Repeat(5s, 6s);
break;
}
case SPELL_REORIGINATION_MODULE:
{
DoCast(SPELL_REORIGINATION_MODULE);
events.Repeat(35s);
break;
}
case SPELL_VOLATILE_SOUL:
{
DoCast(SPELL_VOLATILE_SOUL);
events.Repeat(15s);
break;
}
case SPELL_SOULBURST_DETONATION:
{
DoCast(SPELL_SOULBURST_DETONATION);
events.Repeat(15s);
break;
}
default:
break;
}
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer() && me->IsWithinDist(who, 50.0f, false))
{
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
}
}
void JustSummoned(Creature* summon) override
{
BossAI::JustSummoned(summon);
switch (summon->GetEntry())
{
case NPC_HUNGERING_SOUL:
case NPC_CONSTELLAR_DESIGNATE:
case NPC_REORIGINATION_MODULE:
{
summon->SetFaction(me->GetFaction());
break;
}
case NPC_SOULBLIGHT_ORB:
{
summon->SetFaction(me->GetFaction());
summon->CastSpell(summon, SPELL_BLIGHT_ORB, true);
summon->DespawnOrUnsummon(9s);
break;
}
}
}
uint8 PhaseStatus;
uint8 killCount;
uint64 _health;
};
struct npc_golganneth_126268 : public ScriptedAI
{
npc_golganneth_126268(Creature* creature) : ScriptedAI(creature) { }
Position pos = { 2867.12f, -4567.54f, 292.942f };//center pos
void DoAction(int32 param)
{
switch (param)
{
case 1:
Talk(0);
me->CastSpell(me, SPELL_SKY_AND_SEA, true);
break;
case 2:
if (Creature* boss = me->FindNearestCreature(NPC_ARGUS_THE_UNMAKER, 150.0f, true))
me->CastSpell(boss, SPELL_GOLGANNETHS_WRATH, true);
break;
}
}
};
struct npc_constellar_designate_127192 : public ScriptedAI
{
npc_constellar_designate_127192(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); }
void JustDied(Unit* /*killer*/) override
{
if (Creature* boss = me->FindNearestCreature(NPC_ARGUS_THE_UNMAKER, 150.0f, true))
boss->AI()->DoAction(1);
}
void JustEngagedWith(Unit* /*attacker*/) override
{
events.ScheduleEvent(SPELL_STARBLAST, 8s);
if (!IsMythic())
events.ScheduleEvent(SPELL_COSMIC_RAY, 30s);
events.ScheduleEvent(SPELL_COSMIC_BEACON, 40s);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case SPELL_STARBLAST:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_STARBLAST, false);
events.Repeat(15s);
break;
}
case SPELL_COSMIC_RAY:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_COSMIC_RAY, false);
events.Repeat(20s);
break;
}
case SPELL_COSMIC_BEACON:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_COSMIC_BEACON, false);
events.Repeat(20s);
break;
}
}
DoSpellAttackIfReady(SPELL_STARBLAST);
}
};
struct npc_gift_of_the_lifebinder_129386 : public ScriptedAI
{
npc_gift_of_the_lifebinder_129386(Creature* creature) : ScriptedAI(creature)
{
me->SetReactState(REACT_PASSIVE);
events.ScheduleEvent(SPELL_STARBLAST, 8s);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case SPELL_STARBLAST:
{
if (InstanceScript* instance = me->GetInstanceScript())
instance->DoResurrectPlayers(1.0f);
events.Repeat(8s);
break;
}
}
}
};
struct npc_reorigination_module_127809 : public ScriptedAI
{
npc_reorigination_module_127809(Creature* creature) : ScriptedAI(creature) { SetCombatMovement(false); }
void JustEngagedWith(Unit* /*attacker*/) override
{
events.ScheduleEvent(SPELL_INITIALIZATION_SEQUENCE, 8s);
events.ScheduleEvent(SPELL_REORIGINATION_MODULE_DMG, 45s);
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case SPELL_INITIALIZATION_SEQUENCE:
{
DoCastSelf(SPELL_INITIALIZATION_SEQUENCE);
events.Repeat(30s);
break;
}
case SPELL_REORIGINATION_MODULE_DMG:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.f, true))
me->CastSpell(target, SPELL_REORIGINATION_MODULE_DMG, false);
events.Repeat(45s);
break;
}
}
}
};
void AddSC_boss_argus()
{
RegisterAntorusTheBurningThroneCreatureAI(boss_argus_the_unmaker);
RegisterAntorusTheBurningThroneCreatureAI(npc_golganneth_126268);
RegisterAntorusTheBurningThroneCreatureAI(npc_constellar_designate_127192);
RegisterAntorusTheBurningThroneCreatureAI(npc_gift_of_the_lifebinder_129386);
RegisterAntorusTheBurningThroneCreatureAI(npc_reorigination_module_127809);
}
@@ -0,0 +1,351 @@
/*
* This file is part of Wow Community
*
*/
#include "antorus_the_burning_throne.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellScript.h"
#include "ObjectAccessor.h"
#include "Log.h"
#include "WaypointDefines.h"
enum Spells
{
SPELL_DESTROYERS_BOON = 244049,
SPELL_SARGERAS_BLESSING = 246057,
SPELL_FEL_IMBUEMENT = 253602,
SPELL_TRAMPLE = 252044,
SPELL_DECAY = 245098,
SPELL_CORRUPTING_MAW = 251447,
SPELL_CORRUPTING_MAW_DAMAGE = 254760,
SPELL_SIPHONED = 248819,
SPELL_CONSUMING_SPHERE = 244131,
SPELL_BURNING_MAW = 254747,
SPELL_DESOLATE_GAZE = 244768,
//hero
SPELL_WEIGHT_OF_DARKNESS = 244071,
SPELL_MOLTEN_TOUCH = 244086,
};
struct boss_shatug_fhargAI : public BossAI
{
boss_shatug_fhargAI(Creature* creature) : BossAI(creature, DATA_FELHOUNDS_OF_SAGERAS)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
me->RemoveAurasDueToSpell(SPELL_DESTROYERS_BOON);
DoCastSelf(SPELL_TRAMPLE);
}
InstanceScript* instance;
virtual bool IAmShatug() = 0;
virtual void Reset() override = 0;
void TwinReset()
{
Initialize();
me->ClearUnitState(UNIT_STATE_STUNNED);
}
void TwinDistanceAura()
{
if (!me->IsAlive())
return;
Creature* pOtherBoss = GetOtherBoss();
if (!pOtherBoss)
return;
if (me->GetDistance(pOtherBoss->GetPosition()) <= 40.0f)
{
me->CastSpell(pOtherBoss, SPELL_SARGERAS_BLESSING, true);
me->RemoveAurasDueToSpell(SPELL_FEL_IMBUEMENT);
pOtherBoss->RemoveAurasDueToSpell(SPELL_FEL_IMBUEMENT);
}
else
{
//SPELL_FEL_IMBUEMENT
DoCastSelf(SPELL_FEL_IMBUEMENT);
pOtherBoss->AI()->DoCastSelf(SPELL_FEL_IMBUEMENT);
me->RemoveAurasDueToSpell(SPELL_SARGERAS_BLESSING);
pOtherBoss->RemoveAurasDueToSpell(SPELL_SARGERAS_BLESSING);
}
}
Creature* GetOtherBoss()
{
return IAmShatug() ? me->FindNearestCreature(NPC_FHARG, 500.0f) : me->FindNearestCreature(NPC_SHATUG, 500.0f);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Creature* pOtherBoss = GetOtherBoss();
if (pOtherBoss)
{
pOtherBoss->SetHealth(0);
pOtherBoss->setDeathState(JUST_DIED);
pOtherBoss->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
}
me->SummonCreature(128289, Position(-3224.603f, 10388.73f, -155.3857f, 1.190612f), TEMPSUMMON_MANUAL_DESPAWN);
if (instance)
instance->DoPlayConversation(5523);
}
void JustEngagedWith(Unit* who) override
{
JustEngagedWith(who);
Creature* pOtherBoss = GetOtherBoss();
if (pOtherBoss)
{
/// @todo we should activate the other boss location so he can start attackning even if nobody
// is near I dont know how to do that
if (!pOtherBoss->IsInCombat())
{
CreatureAI* otherAI = pOtherBoss->AI();
otherAI->AttackStart(who);
otherAI->DoZoneInCombat();
}
}
}
};
struct boss_shatug : public boss_shatug_fhargAI
{
bool IAmShatug() override { return true; }
boss_shatug(Creature* creature) : boss_shatug_fhargAI(creature)
{
Initialize();
}
void Initialize()
{
}
void Reset() override
{
TwinReset();
Initialize();
}
void ScheduleTasks() override
{
if (instance)
instance->DoPlayConversation(5522);
events.ScheduleEvent(SPELL_SARGERAS_BLESSING, 1s);
events.ScheduleEvent(SPELL_DECAY, 5s);
events.ScheduleEvent(SPELL_CORRUPTING_MAW, 5s);
events.ScheduleEvent(SPELL_CORRUPTING_MAW_DAMAGE, 5s);
events.ScheduleEvent(SPELL_SIPHONED, 5s);
events.ScheduleEvent(SPELL_CONSUMING_SPHERE, 5s);
if (me->GetMap()->IsHeroic() || me->GetMap()->IsMythic())
events.ScheduleEvent(SPELL_WEIGHT_OF_DARKNESS, 30s, 40s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case SPELL_SARGERAS_BLESSING:
{
TwinDistanceAura();
events.Repeat(1s);
break;
}
case SPELL_DECAY:
{
DoCast(SPELL_DECAY);
events.Repeat(5s);
break;
}
case SPELL_CORRUPTING_MAW:
{
DoCast(SPELL_CORRUPTING_MAW);
events.Repeat(5s);
break;
}
case SPELL_CORRUPTING_MAW_DAMAGE:
{
DoCast(SPELL_CORRUPTING_MAW_DAMAGE);
events.Repeat(5s);
break;
}
case SPELL_SIPHONED:
{
//random
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_SIPHONED, false);
events.Repeat(10s, 15s);
break;
}
case SPELL_CONSUMING_SPHERE:
{
//random
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_CONSUMING_SPHERE, false);
events.Repeat(10s, 15s);
break;
}
case SPELL_WEIGHT_OF_DARKNESS:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_WEIGHT_OF_DARKNESS, false);
events.Repeat(30s, 45s);
break;
}
default:
break;
}
}
};
struct boss_fharg : public boss_shatug_fhargAI
{
bool IAmShatug() override { return false; }
boss_fharg(Creature* creature) : boss_shatug_fhargAI(creature)
{
Initialize();
}
void Initialize()
{
}
void Reset() override
{
TwinReset();
Initialize();
}
void ScheduleTasks() override
{
events.ScheduleEvent(SPELL_SARGERAS_BLESSING, 1s);
events.ScheduleEvent(SPELL_CORRUPTING_MAW, 5s);
events.ScheduleEvent(SPELL_DESOLATE_GAZE, 5s);
events.ScheduleEvent(SPELL_CONSUMING_SPHERE, 5s);
if (me->GetMap()->IsHeroic() || me->GetMap()->IsMythic())
events.ScheduleEvent(SPELL_MOLTEN_TOUCH, 30s, 40s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case SPELL_SARGERAS_BLESSING:
{
TwinDistanceAura();
events.Repeat(1s);
break;
}
case SPELL_CORRUPTING_MAW:
{
DoCast(SPELL_CORRUPTING_MAW);
events.Repeat(5s);
break;
}
case SPELL_DESOLATE_GAZE:
{
DoCast(SPELL_DESOLATE_GAZE);
events.Repeat(5s);
break;
}
case SPELL_CONSUMING_SPHERE:
{
//random
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_CONSUMING_SPHERE, false);
events.Repeat(10s, 15s);
break;
}
case SPELL_MOLTEN_TOUCH:
{
if (Unit* target1 = SelectTarget(SelectTargetMethod::Random, 0.0, 0.0, true))
me->CastSpell(target1, SPELL_MOLTEN_TOUCH, false);
events.Repeat(30s, 45s);
break;
}
default:
break;
}
}
};
enum
{
//SPELL_GATEWAY = 254464,
SPELL_GATEWAY = 253773,
};
enum Points
{
POINT_1,
};
WaypointPath const Path01 =
{
POINT_1,
{
{ 0, -3211.96f, 10384.4f, -155.4712f },
{ 1, -3191.431f, 10370.25f, -108.6854f },
{ 2, -3111.775879f, 10468.264648f, -76.464317f },
{ 3, -3084.96582f, 10496.886719f, -110.809273f }
},
WaypointMoveType::Run,
WaypointPathFlags::FlyingPath
};
struct npc_lightforged_teleport_pod_128289 : public ScriptedAI
{
npc_lightforged_teleport_pod_128289(Creature* creature) : ScriptedAI(creature) { }
void IsSummonedBy(WorldObject* /*summoner*/) override
{
me->SetNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
}
void OnSpellClick(Unit* clicker, bool /*spellClickHandled*/) override
{
if (Player* player = clicker->ToPlayer())
{
player->CastSpell(player, SPELL_GATEWAY, true);
player->GetMotionMaster()->MovePath(Path01, false);
me->GetScheduler().Schedule(Milliseconds(4000), [player](TaskContext context)
{
player->CastSpell(player, SPELL_GATEWAY, true);
if (context.GetRepeatCounter() < 4)
context.Repeat(4s);
});
if (instance)
instance->DoPlayConversation(5524);
}
}
private:
InstanceScript* instance = me->GetInstanceScript();
};
void AddSC_boss_felhounds()
{
RegisterAntorusTheBurningThroneCreatureAI(npc_lightforged_teleport_pod_128289);
RegisterAntorusTheBurningThroneCreatureAI(boss_fharg);
RegisterAntorusTheBurningThroneCreatureAI(boss_shatug);
}
@@ -17,6 +17,10 @@
// This is where scripts' loading functions should be declared:
void AddSC_boss_garothi_worldbreaker();
void AddSC_boss_aggramar();
void AddSC_boss_antoran();
void AddSC_boss_argus();
void AddSC_boss_felhounds();
void AddSC_instance_antorus_the_burning_throne();
// The name of this function should match:
@@ -24,5 +28,9 @@ void AddSC_instance_antorus_the_burning_throne();
void AddArgusScripts()
{
AddSC_boss_garothi_worldbreaker(); // Antorus the Burning Throne
AddSC_boss_aggramar();
AddSC_boss_antoran();
AddSC_boss_argus();
AddSC_boss_felhounds();
AddSC_instance_antorus_the_burning_throne();
}