diff options
Diffstat (limited to 'src')
6 files changed, 857 insertions, 932 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index ec969ec9d46..2df55af0b02 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -66,166 +66,155 @@ enum MillhouseSpells SPELL_PYROBLAST = 33975, }; -class npc_millhouse_manastorm : public CreatureScript +struct npc_millhouse_manastorm : public ScriptedAI { - public: - npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { } + npc_millhouse_manastorm(Creature* creature) : ScriptedAI(creature), Init(false) + { + Initialize(); + instance = creature->GetInstanceScript(); + } - struct npc_millhouse_manastormAI : public ScriptedAI - { - npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature), Init(false) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - EventProgress_Timer = 2000; - LowHp = false; - Phase = 1; - - Pyroblast_Timer = 1000; - Fireball_Timer = 2500; - } + void Initialize() + { + EventProgress_Timer = 2000; + LowHp = false; + Phase = 1; - InstanceScript* instance; + Pyroblast_Timer = 1000; + Fireball_Timer = 2500; + } - uint32 EventProgress_Timer; - uint32 Phase; - bool Init; - bool LowHp; - - uint32 Pyroblast_Timer; - uint32 Fireball_Timer; - - void Reset() override - { - Initialize(); - - if (instance->GetData(DATA_WARDEN_2) == DONE) - { - Init = true; - me->SetImmuneToNPC(false); - } + InstanceScript* instance; - if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE) - Talk(SAY_COMPLETE); - } + uint32 EventProgress_Timer; + uint32 Phase; + bool Init; + bool LowHp; - void AttackStart(Unit* who) override - { - if (me->Attack(who, true)) - { - AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - me->GetMotionMaster()->MoveChase(who, 25.0f); - } - } + uint32 Pyroblast_Timer; + uint32 Fireball_Timer; - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } + void Reset() override + { + Initialize(); - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); + if (instance->GetData(DATA_WARDEN_2) == DONE) + { + Init = true; + me->SetImmuneToNPC(false); + } - /*for questId 10886 (heroic mode only) - if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE) - ->FailQuest();*/ - } + if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE) + Talk(SAY_COMPLETE); + } - void UpdateAI(uint32 diff) override + void AttackStart(Unit* who) override + { + if (me->Attack(who, true)) + { + AddThreat(who, 0.0f); + me->SetInCombatWith(who); + who->SetInCombatWith(me); + me->GetMotionMaster()->MoveChase(who, 25.0f); + } + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + + /*for questId 10886 (heroic mode only) + if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE) + ->FailQuest();*/ + } + + void UpdateAI(uint32 diff) override + { + if (!Init) + { + if (EventProgress_Timer <= diff) { - if (!Init) + if (Phase < 8) { - if (EventProgress_Timer <= diff) + switch (Phase) { - if (Phase < 8) - { - switch (Phase) - { - case 1: - Talk(SAY_INTRO_1); - EventProgress_Timer = 18000; - break; - case 2: - Talk(SAY_INTRO_2); - EventProgress_Timer = 18000; - break; - case 3: - Talk(SAY_WATER); - DoCast(me, SPELL_CONJURE_WATER); - EventProgress_Timer = 7000; - break; - case 4: - Talk(SAY_BUFFS); - DoCast(me, SPELL_ICE_ARMOR); - EventProgress_Timer = 7000; - break; - case 5: - Talk(SAY_DRINK); - DoCast(me, SPELL_ARCANE_INTELLECT); - EventProgress_Timer = 7000; - break; - case 6: - Talk(SAY_READY); - EventProgress_Timer = 6000; - break; - case 7: - instance->SetData(DATA_WARDEN_2, DONE); - Init = true; - me->SetImmuneToNPC(false); - break; - } - ++Phase; - } + case 1: + Talk(SAY_INTRO_1); + EventProgress_Timer = 18000; + break; + case 2: + Talk(SAY_INTRO_2); + EventProgress_Timer = 18000; + break; + case 3: + Talk(SAY_WATER); + DoCast(me, SPELL_CONJURE_WATER); + EventProgress_Timer = 7000; + break; + case 4: + Talk(SAY_BUFFS); + DoCast(me, SPELL_ICE_ARMOR); + EventProgress_Timer = 7000; + break; + case 5: + Talk(SAY_DRINK); + DoCast(me, SPELL_ARCANE_INTELLECT); + EventProgress_Timer = 7000; + break; + case 6: + Talk(SAY_READY); + EventProgress_Timer = 6000; + break; + case 7: + instance->SetData(DATA_WARDEN_2, DONE); + Init = true; + me->SetImmuneToNPC(false); + break; } - else - EventProgress_Timer -= diff; + ++Phase; } + } + else + EventProgress_Timer -= diff; + } - if (!UpdateVictim()) - return; - if (!LowHp && HealthBelowPct(20)) - { - Talk(SAY_LOWHP); - LowHp = true; - } - - if (Pyroblast_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; - - Talk(SAY_PYRO); + if (!UpdateVictim()) + return; + if (!LowHp && HealthBelowPct(20)) + { + Talk(SAY_LOWHP); + LowHp = true; + } - DoCastVictim(SPELL_PYROBLAST); - Pyroblast_Timer = 40000; - } - else - Pyroblast_Timer -=diff; + if (Pyroblast_Timer <= diff) + { + if (me->IsNonMeleeSpellCast(false)) + return; - if (Fireball_Timer <= diff) - { - DoCastVictim(SPELL_FIREBALL); - Fireball_Timer = 4000; - } - else - Fireball_Timer -=diff; + Talk(SAY_PYRO); - DoMeleeAttackIfReady(); - } - }; + DoCastVictim(SPELL_PYROBLAST); + Pyroblast_Timer = 40000; + } + else + Pyroblast_Timer -=diff; - CreatureAI* GetAI(Creature* creature) const override + if (Fireball_Timer <= diff) { - return GetArcatrazAI<npc_millhouse_manastormAI>(creature); + DoCastVictim(SPELL_FIREBALL); + Fireball_Timer = 4000; } + else + Fireball_Timer -=diff; + + DoMeleeAttackIfReady(); + } }; /*##### # npc_warden_mellichar @@ -271,255 +260,244 @@ enum WardenSpells SPELL_BUBBLE_VISUAL = 36849, }; -class npc_warden_mellichar : public CreatureScript +struct npc_warden_mellichar : public ScriptedAI { - public: - npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { } + npc_warden_mellichar(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + instance = creature->GetInstanceScript(); + } - struct npc_warden_mellicharAI : public ScriptedAI - { - npc_warden_mellicharAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } + void Initialize() + { + IsRunning = false; + CanSpawn = false; - void Initialize() - { - IsRunning = false; - CanSpawn = false; - - EventProgress_Timer = 22000; - Phase = 1; - } + EventProgress_Timer = 22000; + Phase = 1; + } - InstanceScript* instance; + InstanceScript* instance; - bool IsRunning; - bool CanSpawn; - - uint32 EventProgress_Timer; - uint32 Phase; - - void Reset() override - { - Initialize(); + bool IsRunning; + bool CanSpawn; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - DoCast(me, SPELL_TARGET_OMEGA); + uint32 EventProgress_Timer; + uint32 Phase; - instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED); - } + void Reset() override + { + Initialize(); - void AttackStart(Unit* /*who*/) override { } + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + DoCast(me, SPELL_TARGET_OMEGA); - void MoveInLineOfSight(Unit* who) override - { - if (IsRunning) - return; + instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED); + } - if (!me->GetVictim() && me->CanCreatureAttack(who)) - { - if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) - return; - if (who->GetTypeId() != TYPEID_PLAYER) - return; - - float attackRadius = me->GetAttackDistance(who)/10; - if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who)) - JustEngagedWith(who); - } - } + void AttackStart(Unit* /*who*/) override { } - void JustEngagedWith(Unit* /*who*/) override - { - Talk(YELL_INTRO1); - DoCast(me, SPELL_BUBBLE_VISUAL); + void MoveInLineOfSight(Unit* who) override + { + if (IsRunning) + return; - instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS); + if (!me->GetVictim() && me->CanCreatureAttack(who)) + { + if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + return; + if (who->GetTypeId() != TYPEID_PLAYER) + return; + + float attackRadius = me->GetAttackDistance(who)/10; + if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who)) + JustEngagedWith(who); + } + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(YELL_INTRO1); + DoCast(me, SPELL_BUBBLE_VISUAL); + + instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS); + instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); + IsRunning = true; + } + + void JustSummoned(Creature* summon) override + { + DoZoneInCombat(summon); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + summon->AI()->AttackStart(target); + } + + bool CanProgress() + { + if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE) + return true; + if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE) + return true; + if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE) + return true; + if (Phase == 4) + return true; + if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE) + return true; + if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) + return true; + if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) + return true; + + return false; + } + + void DoPrepareForPhase() + { + me->InterruptNonMeleeSpells(true); + me->RemoveAurasByType(SPELL_AURA_DUMMY); + + switch (Phase) + { + case 2: + DoCast(me, SPELL_TARGET_ALPHA); + instance->SetData(DATA_WARDEN_1, IN_PROGRESS); instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); - IsRunning = true; - } + break; + case 3: + DoCast(me, SPELL_TARGET_BETA); + instance->SetData(DATA_WARDEN_2, IN_PROGRESS); + break; + case 5: + DoCast(me, SPELL_TARGET_DELTA); + instance->SetData(DATA_WARDEN_3, IN_PROGRESS); + break; + case 6: + DoCast(me, SPELL_TARGET_GAMMA); + instance->SetData(DATA_WARDEN_4, IN_PROGRESS); + break; + case 7: + instance->SetData(DATA_WARDEN_5, IN_PROGRESS); + break; + } + CanSpawn = true; + } - void JustSummoned(Creature* summon) override - { - DoZoneInCombat(summon); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - summon->AI()->AttackStart(target); - } + void UpdateAI(uint32 diff) override + { + if (!IsRunning) + return; - bool CanProgress() + if (EventProgress_Timer <= diff) + { + if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL) { - if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE) - return true; - if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE) - return true; - if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE) - return true; - if (Phase == 4) - return true; - if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE) - return true; - if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) - return true; - if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) - return true; - - return false; + Reset(); + return; } - void DoPrepareForPhase() + if (CanSpawn) { - me->InterruptNonMeleeSpells(true); - me->RemoveAurasByType(SPELL_AURA_DUMMY); + //continue beam omega pod, unless we are about to summon skyriss + if (Phase != 7) + DoCast(me, SPELL_TARGET_OMEGA); switch (Phase) { - case 2: - DoCast(me, SPELL_TARGET_ALPHA); - instance->SetData(DATA_WARDEN_1, IN_PROGRESS); - instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); + case 2: + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(ENTRY_TRICKSTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos break; - case 3: - DoCast(me, SPELL_TARGET_BETA); - instance->SetData(DATA_WARDEN_2, IN_PROGRESS); + case 1: + me->SummonCreature(ENTRY_PH_HUNTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos break; - case 5: - DoCast(me, SPELL_TARGET_DELTA); - instance->SetData(DATA_WARDEN_3, IN_PROGRESS); + } + break; + case 3: + me->SummonCreature(ENTRY_MILLHOUSE, 417.242f, -149.795f, 42.6548f, 0.191986f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos + break; + case 4: + Talk(YELL_RELEASE2B); + break; + case 5: + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(ENTRY_AKKIRIS, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos break; - case 6: - DoCast(me, SPELL_TARGET_GAMMA); - instance->SetData(DATA_WARDEN_4, IN_PROGRESS); + case 1: + me->SummonCreature(ENTRY_SULFURON, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos break; - case 7: - instance->SetData(DATA_WARDEN_5, IN_PROGRESS); + } + break; + case 6: + switch (urand(0, 1)) + { + case 0: + me->SummonCreature(ENTRY_TW_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos + break; + case 1: + me->SummonCreature(ENTRY_BL_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos break; + } + break; + case 7: + me->SummonCreature(ENTRY_SKYRISS, 446.086f, -182.506f, 44.0852f, 1.5708f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos + Talk(YELL_WELCOME); + break; } - CanSpawn = true; + CanSpawn = false; + ++Phase; } - - void UpdateAI(uint32 diff) override + if (CanProgress()) { - if (!IsRunning) - return; - - if (EventProgress_Timer <= diff) + switch (Phase) { - if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL) - { - Reset(); - return; - } - - if (CanSpawn) - { - //continue beam omega pod, unless we are about to summon skyriss - if (Phase != 7) - DoCast(me, SPELL_TARGET_OMEGA); - - switch (Phase) - { - case 2: - switch (urand(0, 1)) - { - case 0: - me->SummonCreature(ENTRY_TRICKSTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - case 1: - me->SummonCreature(ENTRY_PH_HUNTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - } - break; - case 3: - me->SummonCreature(ENTRY_MILLHOUSE, 417.242f, -149.795f, 42.6548f, 0.191986f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos - break; - case 4: - Talk(YELL_RELEASE2B); - break; - case 5: - switch (urand(0, 1)) - { - case 0: - me->SummonCreature(ENTRY_AKKIRIS, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - case 1: - me->SummonCreature(ENTRY_SULFURON, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - } - break; - case 6: - switch (urand(0, 1)) - { - case 0: - me->SummonCreature(ENTRY_TW_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - case 1: - me->SummonCreature(ENTRY_BL_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos - break; - } - break; - case 7: - me->SummonCreature(ENTRY_SKYRISS, 446.086f, -182.506f, 44.0852f, 1.5708f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos - Talk(YELL_WELCOME); - break; - } - CanSpawn = false; - ++Phase; - } - if (CanProgress()) - { - switch (Phase) - { - case 1: - Talk(YELL_INTRO2); - EventProgress_Timer = 10000; - ++Phase; - break; - case 2: - Talk(YELL_RELEASE1); - DoPrepareForPhase(); - EventProgress_Timer = 7000; - break; - case 3: - Talk(YELL_RELEASE2A); - DoPrepareForPhase(); - EventProgress_Timer = 10000; - break; - case 4: - DoPrepareForPhase(); - EventProgress_Timer = 15000; - break; - case 5: - Talk(YELL_RELEASE3); - DoPrepareForPhase(); - EventProgress_Timer = 15000; - break; - case 6: - Talk(YELL_RELEASE4); - DoPrepareForPhase(); - EventProgress_Timer = 15000; - break; - case 7: - DoPrepareForPhase(); - EventProgress_Timer = 15000; - break; - } - } + case 1: + Talk(YELL_INTRO2); + EventProgress_Timer = 10000; + ++Phase; + break; + case 2: + Talk(YELL_RELEASE1); + DoPrepareForPhase(); + EventProgress_Timer = 7000; + break; + case 3: + Talk(YELL_RELEASE2A); + DoPrepareForPhase(); + EventProgress_Timer = 10000; + break; + case 4: + DoPrepareForPhase(); + EventProgress_Timer = 15000; + break; + case 5: + Talk(YELL_RELEASE3); + DoPrepareForPhase(); + EventProgress_Timer = 15000; + break; + case 6: + Talk(YELL_RELEASE4); + DoPrepareForPhase(); + EventProgress_Timer = 15000; + break; + case 7: + DoPrepareForPhase(); + EventProgress_Timer = 15000; + break; } - else - EventProgress_Timer -= diff; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetArcatrazAI<npc_warden_mellicharAI>(creature); } + else + EventProgress_Timer -= diff; + } }; void AddSC_arcatraz() { - new npc_millhouse_manastorm(); - new npc_warden_mellichar(); + RegisterArcatrazCreatureAI(npc_millhouse_manastorm); + RegisterArcatrazCreatureAI(npc_warden_mellichar); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 0c5c9d07d2f..9e30c8bb381 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -76,4 +76,6 @@ inline AI* GetArcatrazAI(T* obj) return GetInstanceAI<AI>(obj, ArcatrazScriptName); } +#define RegisterArcatrazCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetArcatrazAI) + #endif // ARCATRAZ_H diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp index 1dda6152612..d445cd2b7e8 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -54,151 +54,140 @@ enum Events EVENT_SOCCOTHRATES_DEATH = 6 }; -class boss_dalliah_the_doomsayer : public CreatureScript +struct boss_dalliah_the_doomsayer : public BossAI { - public: - boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } - - struct boss_dalliah_the_doomsayerAI : public BossAI + boss_dalliah_the_doomsayer(Creature* creature) : BossAI(creature, DATA_DALLIAH) + { + soccothratesTaunt = false; + soccothratesDeath = false; + } + + void Reset() override + { + _Reset(); + soccothratesTaunt = false; + soccothratesDeath = false; + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + soccothrates->AI()->SetData(1, 1); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 1s, 4s); + events.ScheduleEvent(EVENT_WHIRLWIND, 7s, 9s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); + events.ScheduleEvent(EVENT_ME_FIRST, 6s); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } + + void SetData(uint32 /*type*/, uint32 data) override + { + switch (data) { - boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) - { - soccothratesTaunt = false; - soccothratesDeath = false; - } - - void Reset() override - { - _Reset(); - soccothratesTaunt = false; - soccothratesDeath = false; - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->SetData(1, 1); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 1s, 4s); - events.ScheduleEvent(EVENT_WHIRLWIND, 7s, 9s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); - events.ScheduleEvent(EVENT_ME_FIRST, 6s); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* /*victim*/) override - { - Talk(SAY_SLAY); - } - - void SetData(uint32 /*type*/, uint32 data) override - { - switch (data) - { - case 1: - events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6s); - soccothratesDeath = true; - break; - default: - break; - } - } + case 1: + events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6s); + soccothratesDeath = true; + break; + default: + break; + } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + if (soccothratesDeath) { - if (!UpdateVictim()) - { - if (soccothratesDeath) - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SOCCOTHRATES_DEATH: - Talk(SAY_SOCCOTHRATES_DEATH); - break; - default: - break; - } - } - } - - return; - } - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_GIFT_OF_THE_DOOMSAYER: - DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true); - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 16s, 21s); - break; - case EVENT_WHIRLWIND: - DoCast(me, SPELL_WHIRLWIND); - Talk(SAY_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, 19s, 21s); - events.ScheduleEvent(EVENT_HEAL, 6s); - break; - case EVENT_HEAL: - DoCast(me, SPELL_HEAL); - Talk(SAY_HEAL); - break; - case EVENT_SHADOW_WAVE: - DoCastVictim(SPELL_SHADOW_WAVE, true); - events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); - break; - case EVENT_ME_FIRST: - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); + case EVENT_SOCCOTHRATES_DEATH: + Talk(SAY_SOCCOTHRATES_DEATH); break; default: break; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } + } - if (HealthBelowPct(25) && !soccothratesTaunt) - { - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); - soccothratesTaunt = true; - } + return; + } - DoMeleeAttackIfReady(); + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GIFT_OF_THE_DOOMSAYER: + DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true); + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 16s, 21s); + break; + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + Talk(SAY_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, 19s, 21s); + events.ScheduleEvent(EVENT_HEAL, 6s); + break; + case EVENT_HEAL: + DoCast(me, SPELL_HEAL); + Talk(SAY_HEAL); + break; + case EVENT_SHADOW_WAVE: + DoCastVictim(SPELL_SHADOW_WAVE, true); + events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); + break; + case EVENT_ME_FIRST: + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); + break; + default: + break; } - private: - bool soccothratesTaunt; - bool soccothratesDeath; - }; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - CreatureAI* GetAI(Creature* creature) const override + if (HealthBelowPct(25) && !soccothratesTaunt) { - return GetArcatrazAI<boss_dalliah_the_doomsayerAI>(creature); + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) + soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); + soccothratesTaunt = true; } + + DoMeleeAttackIfReady(); + } + +private: + bool soccothratesTaunt; + bool soccothratesDeath; }; void AddSC_boss_dalliah_the_doomsayer() { - new boss_dalliah_the_doomsayer(); + RegisterArcatrazCreatureAI(boss_dalliah_the_doomsayer); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index adb7164d72e..da3ede6991c 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -59,251 +59,229 @@ enum Spells H_SPELL_MIND_REND_IMAGE = 39021 }; -class boss_harbinger_skyriss : public CreatureScript +struct boss_harbinger_skyriss : public BossAI { - public: - boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { } - - struct boss_harbinger_skyrissAI : public BossAI + boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) + { + Initialize(); + Intro = false; + } + + void Initialize() + { + IsImage33 = false; + IsImage66 = false; + + Intro_Phase = 1; + Intro_Timer = 5000; + MindRend_Timer = 3000; + Fear_Timer = 15000; + Domination_Timer = 30000; + ManaBurn_Timer = 25000; + } + + bool Intro; + bool IsImage33; + bool IsImage66; + + uint32 Intro_Phase; + uint32 Intro_Timer; + uint32 MindRend_Timer; + uint32 Fear_Timer; + uint32 Domination_Timer; + uint32 ManaBurn_Timer; + + void Reset() override + { + _Reset(); + + me->SetImmuneToAll(!Intro); + Initialize(); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!Intro) + return; + + ScriptedAI::MoveInLineOfSight(who); + } + + void JustEngagedWith(Unit* /*who*/) override { } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } + + void JustSummoned(Creature* summon) override + { + if (!summon) + return; + if (IsImage66) + summon->SetHealth(summon->CountPctFromMaxHealth(33)); + else + summon->SetHealth(summon->CountPctFromMaxHealth(66)); + if (me->GetVictim()) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + summon->AI()->AttackStart(target); + + summons.Summon(summon); + summon->SetImmuneToAll(false); + } + + void KilledUnit(Unit* victim) override + { + //won't yell killing pet/other unit + if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) + return; + + Talk(SAY_KILL); + } + + void DoSplit(uint32 val) + { + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(false); + + Talk(SAY_IMAGE); + + if (val == 66) + DoCast(me, SPELL_66_ILLUSION); + else + DoCast(me, SPELL_33_ILLUSION); + } + + void UpdateAI(uint32 diff) override + { + if (!Intro) { - boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) - { - Initialize(); - Intro = false; - } - - void Initialize() - { - IsImage33 = false; - IsImage66 = false; - - Intro_Phase = 1; - Intro_Timer = 5000; - MindRend_Timer = 3000; - Fear_Timer = 15000; - Domination_Timer = 30000; - ManaBurn_Timer = 25000; - } - - bool Intro; - bool IsImage33; - bool IsImage66; - - uint32 Intro_Phase; - uint32 Intro_Timer; - uint32 MindRend_Timer; - uint32 Fear_Timer; - uint32 Domination_Timer; - uint32 ManaBurn_Timer; - - void Reset() override - { - _Reset(); - - me->SetImmuneToAll(!Intro); - Initialize(); - } - - void MoveInLineOfSight(Unit* who) override - { - if (!Intro) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void JustDied(Unit* /*killer*/) override + if (Intro_Timer <= diff) { - Talk(SAY_DEATH); - _JustDied(); - } - - void JustSummoned(Creature* summon) override - { - if (!summon) - return; - if (IsImage66) - summon->SetHealth(summon->CountPctFromMaxHealth(33)); - else - summon->SetHealth(summon->CountPctFromMaxHealth(66)); - if (me->GetVictim()) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - summon->AI()->AttackStart(target); - - summons.Summon(summon); - summon->SetImmuneToAll(false); - } - - void KilledUnit(Unit* victim) override - { - //won't yell killing pet/other unit - if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) - return; - - Talk(SAY_KILL); - } - - void DoSplit(uint32 val) - { - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); - - Talk(SAY_IMAGE); - - if (val == 66) - DoCast(me, SPELL_66_ILLUSION); - else - DoCast(me, SPELL_33_ILLUSION); - } - - void UpdateAI(uint32 diff) override - { - if (!Intro) + switch (Intro_Phase) { - if (Intro_Timer <= diff) + case 1: + Talk(SAY_INTRO); + instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true); + ++Intro_Phase; + Intro_Timer = 25000; + break; + case 2: + Talk(SAY_AGGRO); + if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR))) { - switch (Intro_Phase) - { - case 1: - Talk(SAY_INTRO); - instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true); - ++Intro_Phase; - Intro_Timer = 25000; - break; - case 2: - Talk(SAY_AGGRO); - if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR))) - { - //should have a better way to do this. possibly spell exist. - mellic->setDeathState(JUST_DIED); - mellic->SetHealth(0); - instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); - } - ++Intro_Phase; - Intro_Timer = 3000; - break; - case 3: - me->SetImmuneToAll(false); - Intro = true; - break; - } + //should have a better way to do this. possibly spell exist. + mellic->setDeathState(JUST_DIED); + mellic->SetHealth(0); + instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); } - else - Intro_Timer -=diff; + ++Intro_Phase; + Intro_Timer = 3000; + break; + case 3: + me->SetImmuneToAll(false); + Intro = true; + break; } - if (!UpdateVictim()) - return; + } + else + Intro_Timer -=diff; + } + if (!UpdateVictim()) + return; - if (!IsImage66 && !HealthAbovePct(66)) - { - DoSplit(66); - IsImage66 = true; - } - if (!IsImage33 && !HealthAbovePct(33)) - { - DoSplit(33); - IsImage33 = true; - } + if (!IsImage66 && !HealthAbovePct(66)) + { + DoSplit(66); + IsImage66 = true; + } + if (!IsImage33 && !HealthAbovePct(33)) + { + DoSplit(33); + IsImage33 = true; + } - if (MindRend_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_MIND_REND); - else - DoCastVictim(SPELL_MIND_REND); + if (MindRend_Timer <= diff) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_MIND_REND); + else + DoCastVictim(SPELL_MIND_REND); - MindRend_Timer = 8000; - } - else - MindRend_Timer -=diff; + MindRend_Timer = 8000; + } + else + MindRend_Timer -=diff; - if (Fear_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; + if (Fear_Timer <= diff) + { + if (me->IsNonMeleeSpellCast(false)) + return; - Talk(SAY_FEAR); + Talk(SAY_FEAR); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_FEAR); - else - DoCastVictim(SPELL_FEAR); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_FEAR); + else + DoCastVictim(SPELL_FEAR); - Fear_Timer = 25000; - } - else - Fear_Timer -=diff; + Fear_Timer = 25000; + } + else + Fear_Timer -=diff; - if (Domination_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; + if (Domination_Timer <= diff) + { + if (me->IsNonMeleeSpellCast(false)) + return; - Talk(SAY_MIND); + Talk(SAY_MIND); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_DOMINATION); - else - DoCastVictim(SPELL_DOMINATION); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_DOMINATION); + else + DoCastVictim(SPELL_DOMINATION); - Domination_Timer = 16000 + rand32() % 16000; - } - else - Domination_Timer -=diff; + Domination_Timer = 16000 + rand32() % 16000; + } + else + Domination_Timer -=diff; - if (IsHeroic()) - { - if (ManaBurn_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; + if (IsHeroic()) + { + if (ManaBurn_Timer <= diff) + { + if (me->IsNonMeleeSpellCast(false)) + return; - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, H_SPELL_MANA_BURN); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, H_SPELL_MANA_BURN); - ManaBurn_Timer = 16000 + rand32() % 16000; - } - else - ManaBurn_Timer -=diff; - } - DoMeleeAttackIfReady(); + ManaBurn_Timer = 16000 + rand32() % 16000; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetArcatrazAI<boss_harbinger_skyrissAI>(creature); + else + ManaBurn_Timer -=diff; } + DoMeleeAttackIfReady(); + } }; -class boss_harbinger_skyriss_illusion : public CreatureScript +struct boss_harbinger_skyriss_illusion : public ScriptedAI { - public: - boss_harbinger_skyriss_illusion() : CreatureScript("boss_harbinger_skyriss_illusion") { } + boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } - struct boss_harbinger_skyriss_illusionAI : public ScriptedAI - { - boss_harbinger_skyriss_illusionAI(Creature* creature) : ScriptedAI(creature) { } + void Reset() override + { + me->SetImmuneToPC(false); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); + } - void Reset() override - { - me->SetImmuneToPC(false); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); - } - - void JustEngagedWith(Unit* /*who*/) override { } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetArcatrazAI<boss_harbinger_skyriss_illusionAI>(creature); - } + void JustEngagedWith(Unit* /*who*/) override { } }; void AddSC_boss_harbinger_skyriss() { - new boss_harbinger_skyriss(); - new boss_harbinger_skyriss_illusion(); + RegisterArcatrazCreatureAI(boss_harbinger_skyriss); + RegisterArcatrazCreatureAI(boss_harbinger_skyriss_illusion); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp index a735d80f9eb..0af123ae289 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -77,216 +77,205 @@ enum Events EVENT_DALLIAH_DEATH = 13 }; -class boss_wrath_scryer_soccothrates : public CreatureScript +struct boss_wrath_scryer_soccothrates : public BossAI { - public: - boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { } + boss_wrath_scryer_soccothrates(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) + { + preFight = false; + dalliahTaunt = false; + dalliahDeath = false; + } - struct boss_wrath_scryer_soccothratesAI : public BossAI - { - boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) - { - preFight = false; - dalliahTaunt = false; - dalliahDeath = false; - } + void Reset() override + { + _Reset(); + preFight = false; + dalliahTaunt = false; + dalliahDeath = false; + } - void Reset() override - { - _Reset(); - preFight = false; - dalliahTaunt = false; - dalliahDeath = false; - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (dalliah->IsAlive() && !dalliah->IsInCombat()) + dalliah->AI()->SetData(1, 1); + } - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - if (dalliah->IsAlive() && !dalliah->IsInCombat()) - dalliah->AI()->SetData(1, 1); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); + events.ScheduleEvent(EVENT_ME_FIRST, 6s); + Talk(SAY_AGGRO); + preFight = false; + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); - events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); - events.ScheduleEvent(EVENT_ME_FIRST, 6s); - Talk(SAY_AGGRO); - preFight = false; - } + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } - void KilledUnit(Unit* /*victim*/) override - { - Talk(SAY_SLAY); - } + void MoveInLineOfSight(Unit* who) override + { + if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) + { + Talk(SAY_SOCCOTHRATES_CONVO_1); + instance->SetData(DATA_CONVERSATION, DONE); - void MoveInLineOfSight(Unit* who) override - { - if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) - { - Talk(SAY_SOCCOTHRATES_CONVO_1); - instance->SetData(DATA_CONVERSATION, DONE); + preFight = true; + events.ScheduleEvent(EVENT_PREFIGHT_1, 2s); + } + } - preFight = true; - events.ScheduleEvent(EVENT_PREFIGHT_1, 2s); - } - } + void SetData(uint32 /*type*/, uint32 data) override + { + switch (data) + { + case 1: + events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6s); + dalliahDeath = true; + break; + default: + break; + } + } - void SetData(uint32 /*type*/, uint32 data) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + if (preFight) { - switch (data) - { - case 1: - events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6s); - dalliahDeath = true; - break; - default: - break; - } - } + events.Update(diff); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) + while (uint32 eventId = events.ExecuteEvent()) { - if (preFight) - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_PREFIGHT_1: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); - events.ScheduleEvent(EVENT_PREFIGHT_2, 3s); - break; - case EVENT_PREFIGHT_2: - Talk(SAY_SOCCOTHRATES_CONVO_2); - events.ScheduleEvent(EVENT_PREFIGHT_3, 3s); - break; - case EVENT_PREFIGHT_3: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); - events.ScheduleEvent(EVENT_PREFIGHT_4, 6s); - break; - case EVENT_PREFIGHT_4: - Talk(SAY_SOCCOTHRATES_CONVO_3); - events.ScheduleEvent(EVENT_PREFIGHT_5, 2s); - break; - case EVENT_PREFIGHT_5: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); - events.ScheduleEvent(EVENT_PREFIGHT_6, 3s); - break; - case EVENT_PREFIGHT_6: - Talk(SAY_SOCCOTHRATES_CONVO_4); - events.ScheduleEvent(EVENT_PREFIGHT_7, 2s); - break; - case EVENT_PREFIGHT_7: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); - events.ScheduleEvent(EVENT_PREFIGHT_8, 4s); - break; - case EVENT_PREFIGHT_8: - me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); - events.ScheduleEvent(EVENT_PREFIGHT_9, 4s); - break; - case EVENT_PREFIGHT_9: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - { - dalliah->SetFacingToObject(me); - me->SetFacingToObject(dalliah); - dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); - preFight = false; - } - break; - default: - break; - } - } - } - - if (dalliahDeath) + switch (eventId) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_PREFIGHT_1: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); + events.ScheduleEvent(EVENT_PREFIGHT_2, 3s); + break; + case EVENT_PREFIGHT_2: + Talk(SAY_SOCCOTHRATES_CONVO_2); + events.ScheduleEvent(EVENT_PREFIGHT_3, 3s); + break; + case EVENT_PREFIGHT_3: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); + events.ScheduleEvent(EVENT_PREFIGHT_4, 6s); + break; + case EVENT_PREFIGHT_4: + Talk(SAY_SOCCOTHRATES_CONVO_3); + events.ScheduleEvent(EVENT_PREFIGHT_5, 2s); + break; + case EVENT_PREFIGHT_5: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); + events.ScheduleEvent(EVENT_PREFIGHT_6, 3s); + break; + case EVENT_PREFIGHT_6: + Talk(SAY_SOCCOTHRATES_CONVO_4); + events.ScheduleEvent(EVENT_PREFIGHT_7, 2s); + break; + case EVENT_PREFIGHT_7: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); + events.ScheduleEvent(EVENT_PREFIGHT_8, 4s); + break; + case EVENT_PREFIGHT_8: + me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); + events.ScheduleEvent(EVENT_PREFIGHT_9, 4s); + break; + case EVENT_PREFIGHT_9: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) { - case EVENT_DALLIAH_DEATH: - Talk(SAY_DALLIAH_DEATH); - break; - default: - break; + dalliah->SetFacingToObject(me); + me->SetFacingToObject(dalliah); + dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); + preFight = false; } - } + break; + default: + break; } - - return; } + } + if (dalliahDeath) + { events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_FELFIRE_SHOCK: - DoCastVictim(SPELL_FELFIRE_SHOCK, true); - events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); - break; - case EVENT_KNOCK_AWAY: - DoCast(me, SPELL_KNOCK_AWAY); - Talk(SAY_KNOCK_AWAY); - events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); - break; - case EVENT_ME_FIRST: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - if (dalliah->IsAlive() && !dalliah->IsInCombat()) - dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); + case EVENT_DALLIAH_DEATH: + Talk(SAY_DALLIAH_DEATH); break; default: break; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } + } - if (HealthBelowPct(25) && !dalliahTaunt) - { - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); - dalliahTaunt = true; - } + return; + } - DoMeleeAttackIfReady(); + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FELFIRE_SHOCK: + DoCastVictim(SPELL_FELFIRE_SHOCK, true); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); + break; + case EVENT_KNOCK_AWAY: + DoCast(me, SPELL_KNOCK_AWAY); + Talk(SAY_KNOCK_AWAY); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); + break; + case EVENT_ME_FIRST: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (dalliah->IsAlive() && !dalliah->IsInCombat()) + dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); + break; + default: + break; } - private: - bool preFight; - bool dalliahTaunt; - bool dalliahDeath; - }; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - CreatureAI* GetAI(Creature* creature) const override + if (HealthBelowPct(25) && !dalliahTaunt) { - return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature); + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); + dalliahTaunt = true; } + + DoMeleeAttackIfReady(); + } + +private: + bool preFight; + bool dalliahTaunt; + bool dalliahDeath; }; void AddSC_boss_wrath_scryer_soccothrates() { - new boss_wrath_scryer_soccothrates(); + RegisterArcatrazCreatureAI(boss_wrath_scryer_soccothrates); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp index 6f6110445e4..5693d7a32c5 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -41,88 +41,77 @@ enum Events EVENT_SEED_OF_CORRUPTION = 3 }; -class boss_zereketh_the_unbound : public CreatureScript +struct boss_zereketh_the_unbound : public BossAI { - public: - boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { } - - struct boss_zereketh_the_unboundAI : public BossAI + boss_zereketh_the_unbound(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } + + void Reset() override + { + _Reset(); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); + events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } - - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - - void JustEngagedWith(Unit* who) override + switch (eventId) { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); - Talk(SAY_AGGRO); + case EVENT_VOID_ZONE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) + DoCast(target, SPELL_VOID_ZONE); + events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); + break; + case EVENT_SHADOW_NOVA: + DoCastVictim(SPELL_SHADOW_NOVA, true); + Talk(SAY_SHADOW_NOVA); + events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); + break; + case EVENT_SEED_OF_CORRUPTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) + DoCast(target, SPELL_SEED_OF_CORRUPTION); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); + break; + default: + break; } - void KilledUnit(Unit* /*victim*/) override - { - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_VOID_ZONE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) - DoCast(target, SPELL_VOID_ZONE); - events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); - break; - case EVENT_SHADOW_NOVA: - DoCastVictim(SPELL_SHADOW_NOVA, true); - Talk(SAY_SHADOW_NOVA); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); - break; - case EVENT_SEED_OF_CORRUPTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) - DoCast(target, SPELL_SEED_OF_CORRUPTION); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetArcatrazAI<boss_zereketh_the_unboundAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_zereketh_the_unbound() { - new boss_zereketh_the_unbound(); + RegisterArcatrazCreatureAI(boss_zereketh_the_unbound); } |