diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp | 1 | ||||
-rw-r--r-- | src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp | 173 |
2 files changed, 81 insertions, 93 deletions
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index 1fa895824e3..115c75c2f17 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -301,6 +301,7 @@ public: //enrage at 20% if (HealthBelowPct(20)) events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5000); + break; } } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index 786eb662a57..b96418097f3 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -30,53 +30,51 @@ EndScriptData */ enum Murmur { + // Spell SPELL_RESONANCE = 33657, SPELL_MAGNETIC_PULL = 33689, SPELL_SONIC_SHOCK = 38797, SPELL_THUNDERING_STORM = 39365, + SPELL_SONIC_BOOM_CAST = 33923, + SPELL_SONIC_BOOM_EFFECT = 33666, + SPELL_MURMURS_TOUCH = 33711, + // Text EMOTE_SONIC_BOOM = 0 }; -#define SPELL_SONIC_BOOM_CAST DUNGEON_MODE(33923, 38796) -#define SPELL_SONIC_BOOM_EFFECT DUNGEON_MODE(33666, 38795) - -#define SPELL_MURMURS_TOUCH DUNGEON_MODE(33711, 38794) - +enum Events +{ + EVENT_SONIC_BOOM = 1, + EVENT_MURMURS_TOUCH = 2, + EVENT_RESONANCE = 3, + EVENT_MAGNETIC_PULL = 4, + EVENT_THUNDERING_STORM = 5, + EVENT_SONIC_SHOCK = 6 +}; class boss_murmur : public CreatureScript { public: boss_murmur() : CreatureScript("boss_murmur") { } - CreatureAI* GetAI(Creature* creature) const + struct boss_murmurAI : public BossAI { - return new boss_murmurAI (creature); - } - - struct boss_murmurAI : public ScriptedAI - { - boss_murmurAI(Creature* creature) : ScriptedAI(creature) + boss_murmurAI(Creature* creature) : BossAI(creature, DATA_MURMUREVENT) { SetCombatMovement(false); } - uint32 SonicBoom_Timer; - uint32 MurmursTouch_Timer; - uint32 Resonance_Timer; - uint32 MagneticPull_Timer; - uint32 SonicShock_Timer; - uint32 ThunderingStorm_Timer; - bool SonicBoom; - void Reset() { - SonicBoom_Timer = 30000; - MurmursTouch_Timer = urand(8000, 20000); - Resonance_Timer = 5000; - MagneticPull_Timer = urand(15000, 30000); - ThunderingStorm_Timer = 15000; - SonicShock_Timer = 10000; - SonicBoom = false; + events.ScheduleEvent(EVENT_SONIC_BOOM, 30000); + events.ScheduleEvent(EVENT_MURMURS_TOUCH, urand(8000, 20000)); + events.ScheduleEvent(EVENT_RESONANCE, 5000); + events.ScheduleEvent(EVENT_MAGNETIC_PULL, urand(15000, 30000)); + if (IsHeroic()) + { + events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000); + events.ScheduleEvent(EVENT_SONIC_SHOCK, 10000); + } //database should have `RegenHealth`=0 to prevent regen uint32 hp = me->CountPctFromMaxHealth(40); @@ -117,81 +115,65 @@ public: if (!UpdateVictim() || me->IsNonMeleeSpellCasted(false)) return; - // Sonic Boom - if (SonicBoom) - { - DoCast(me, SPELL_SONIC_BOOM_EFFECT, true); - SonicBoomEffect(); - - SonicBoom = false; - Resonance_Timer = 1500; - } - if (SonicBoom_Timer <= diff) - { - Talk(EMOTE_SONIC_BOOM); - DoCast(me, SPELL_SONIC_BOOM_CAST); - SonicBoom_Timer = 30000; - SonicBoom = true; - return; - } else SonicBoom_Timer -= diff; - - // Murmur's Touch - if (MurmursTouch_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true)) - DoCast(target, SPELL_MURMURS_TOUCH); - MurmursTouch_Timer = urand(25000, 35000); - } else MurmursTouch_Timer -= diff; + events.Update(diff); - // Resonance - if (!SonicBoom && !(me->IsWithinMeleeRange(me->GetVictim()))) + while (uint32 eventId = events.ExecuteEvent()) { - if (Resonance_Timer <= diff) + switch (eventId) { - DoCast(me, SPELL_RESONANCE); - Resonance_Timer = 5000; - } else Resonance_Timer -= diff; - } - - // Magnetic Pull - if (MagneticPull_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive()) + case EVENT_SONIC_BOOM: + Talk(EMOTE_SONIC_BOOM); + DoCast(me, SPELL_SONIC_BOOM_CAST); + DoCast(me, SPELL_SONIC_BOOM_EFFECT, true); + SonicBoomEffect(); + events.ScheduleEvent(EVENT_SONIC_BOOM, 30000); + events.ScheduleEvent(EVENT_RESONANCE, 1500); + break; + case EVENT_MURMURS_TOUCH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true)) + DoCast(target, SPELL_MURMURS_TOUCH); + events.ScheduleEvent(EVENT_MURMURS_TOUCH, urand(25000, 35000)); + break; + case EVENT_RESONANCE: + if (!(me->IsWithinMeleeRange(me->GetVictim()))) + { + DoCast(me, SPELL_RESONANCE); + events.ScheduleEvent(EVENT_RESONANCE, 5000); + } + break; + case EVENT_MAGNETIC_PULL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive()) + { + DoCast(target, SPELL_MAGNETIC_PULL); + events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15000+rand()%15000); + break; + } + events.ScheduleEvent(EVENT_MAGNETIC_PULL, 500); + break; + case EVENT_THUNDERING_STORM: { - DoCast(target, SPELL_MAGNETIC_PULL); - MagneticPull_Timer = 15000+rand()%15000; - return; - } - MagneticPull_Timer = 500; - } else MagneticPull_Timer -= diff; - - if (IsHeroic()) - { - // Thundering Storm - if (ThunderingStorm_Timer <= diff) - { - ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) - if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid())) - if (target->IsAlive() && !me->IsWithinDist(target, 35, false)) - DoCast(target, SPELL_THUNDERING_STORM, true); - ThunderingStorm_Timer = 15000; - } else ThunderingStorm_Timer -= diff; - - // Sonic Shock - if (SonicShock_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20, false)) - if (target->IsAlive()) - DoCast(target, SPELL_SONIC_SHOCK); - SonicShock_Timer = 10000+rand()%10000; - } else SonicShock_Timer -= diff; + ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) + if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid())) + if (target->IsAlive() && !me->IsWithinDist(target, 35, false)) + DoCast(target, SPELL_THUNDERING_STORM, true); + events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000); + break; + } + case EVENT_SONIC_SHOCK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20, false)) + if (target->IsAlive()) + DoCast(target, SPELL_SONIC_SHOCK); + events.ScheduleEvent(EVENT_SONIC_SHOCK, 10000+rand()%10000); + break; + } } // Select nearest most aggro target if top aggro too far if (!me->isAttackReady()) return; + if (!me->IsWithinMeleeRange(me->GetVictim())) { ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); @@ -206,6 +188,11 @@ public: DoMeleeAttackIfReady(); } + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_murmurAI (creature); + } }; }; |