diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index 43d896ec1..441f6fea0 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -81,6 +81,14 @@ enum DoomrelSpells SPELL_DEMONARMOR = 13787, SPELL_SUMMON_VOIDWALKERS = 15092 }; +enum DoomrelEvents +{ + EVENT_SPELL_SHADOWBOLTVOLLEY = 1, + EVENT_SPELL_IMMOLATE = 2, + EVENT_SPELL_CURSEOFWEAKNESS = 3, + EVENT_SPELL_DEMONARMOR = 4, + EVENT_SPELL_SUMMON_VOIDWALKERS = 5, +}; class boss_doomrel : public CreatureScript { @@ -98,10 +106,8 @@ public: break; case GOSSIP_ACTION_INFO_DEF+2: CloseGossipMenuFor(player); - //start event here - creature->setFaction(FACTION_HOSTILE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->AttackStart(player); + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + // Start encounter InstanceScript* instance = creature->GetInstanceScript(); if (instance) instance->SetData64(DATA_EVENSTARTER, player->GetGUID()); @@ -131,19 +137,14 @@ public: } InstanceScript* instance; - uint32 ShadowVolley_Timer; - uint32 Immolate_Timer; - uint32 CurseOfWeakness_Timer; - uint32 DemonArmor_Timer; + EventMap _events; bool Voidwalkers; void Reset() override { - ShadowVolley_Timer = 10000; - Immolate_Timer = 18000; - CurseOfWeakness_Timer = 5000; - DemonArmor_Timer = 16000; Voidwalkers = false; + // Reset his gossip menu + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->setFaction(FACTION_FRIEND); @@ -158,6 +159,11 @@ public: void EnterCombat(Unit* /*who*/) override { + _events.ScheduleEvent(EVENT_SPELL_SHADOWBOLTVOLLEY, 10000); + _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 18000); + _events.ScheduleEvent(EVENT_SPELL_CURSEOFWEAKNESS, 5000); + _events.ScheduleEvent(EVENT_SPELL_DEMONARMOR, 16000); + _events.ScheduleEvent(EVENT_SPELL_SUMMON_VOIDWALKERS, 1000); } void EnterEvadeMode() override @@ -182,41 +188,40 @@ public: if (!UpdateVictim()) return; - //ShadowVolley_Timer - if (ShadowVolley_Timer <= diff) + _events.Update(diff); + + switch(_events.ExecuteEvent()) { - DoCastVictim(SPELL_SHADOWBOLTVOLLEY); - ShadowVolley_Timer = 12000; - } else ShadowVolley_Timer -= diff; - - //Immolate_Timer - if (Immolate_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_IMMOLATE); - - Immolate_Timer = 25000; - } else Immolate_Timer -= diff; - - //CurseOfWeakness_Timer - if (CurseOfWeakness_Timer <= diff) - { - DoCastVictim(SPELL_CURSEOFWEAKNESS); - CurseOfWeakness_Timer = 45000; - } else CurseOfWeakness_Timer -= diff; - - //DemonArmor_Timer - if (DemonArmor_Timer <= diff) - { - DoCast(me, SPELL_DEMONARMOR); - DemonArmor_Timer = 300000; - } else DemonArmor_Timer -= diff; - - //Summon Voidwalkers - if (!Voidwalkers && HealthBelowPct(51)) - { - DoCastVictim(SPELL_SUMMON_VOIDWALKERS, true); - Voidwalkers = true; + case EVENT_SPELL_SHADOWBOLTVOLLEY: + DoCastVictim(SPELL_SHADOWBOLTVOLLEY); + _events.ScheduleEvent(EVENT_SPELL_SHADOWBOLTVOLLEY, 12000); + break; + case EVENT_SPELL_IMMOLATE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + DoCast(target, SPELL_IMMOLATE); + _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 25000); + } + // Didn't get a target, try again in 1s + _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 1000); + break; + case EVENT_SPELL_CURSEOFWEAKNESS: + DoCastVictim(SPELL_CURSEOFWEAKNESS); + _events.ScheduleEvent(EVENT_SPELL_CURSEOFWEAKNESS, 45000); + break; + case EVENT_SPELL_DEMONARMOR: + DoCast(me, SPELL_DEMONARMOR); + _events.ScheduleEvent(EVENT_SPELL_DEMONARMOR, 300000); + break; + case EVENT_SPELL_SUMMON_VOIDWALKERS: + if (!Voidwalkers && HealthBelowPct(51)) + { + DoCastVictim(SPELL_SUMMON_VOIDWALKERS, true); + Voidwalkers = true; + } + // Not ready yet, try again in 1s + _events.ScheduleEvent(EVENT_SPELL_SUMMON_VOIDWALKERS, 1000); + break; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 401756e04..43af86d7e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -155,13 +155,13 @@ public: case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break; case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break; case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break; - case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break; - case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break; - case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break; - case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break; - case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break; - case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break; - case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break; + case NPC_ANGERREL: TombBossGUIDs[0] = creature->GetGUID(); break; + case NPC_SEETHREL: TombBossGUIDs[1] = creature->GetGUID(); break; + case NPC_DOPEREL: TombBossGUIDs[2] = creature->GetGUID(); break; + case NPC_GLOOMREL: TombBossGUIDs[3] = creature->GetGUID(); break; + case NPC_VILEREL: TombBossGUIDs[4] = creature->GetGUID(); break; + case NPC_HATEREL: TombBossGUIDs[5] = creature->GetGUID(); break; + case NPC_DOOMREL: TombBossGUIDs[6] = creature->GetGUID(); break; case NPC_MAGMUS: MagmusGUID = creature->GetGUID(); if (!creature->IsAlive()) @@ -441,8 +441,8 @@ public: if (TombTimer <= diff) { TombTimer = TIMER_TOMBOFTHESEVEN; - ++TombEventCounter; TombOfSevenEvent(); + ++TombEventCounter; // Check Killed bosses for (uint8 i = 0; i < 7; ++i) {