diff options
Diffstat (limited to 'src')
3 files changed, 107 insertions, 99 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 a424de35e51..1fa895824e3 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -16,12 +16,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Grandmaster_Vorpil -SD%Complete: 100 -SDComment: -SDCategory: Auchindoun, Shadow Labyrinth -EndScriptData */ +/* +Name: Boss_Grandmaster_Vorpil +%Complete: 100 +Category: Auchindoun, Shadow Labyrinth +*/ #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -43,13 +42,13 @@ enum GrandmasterVorpil SPELL_SHADOWBOLT_VOLLEY = 33841, SPELL_BANISH = 38791, - MOB_VOID_TRAVELER = 19226, + NPC_VOID_TRAVELER = 19226, SPELL_SACRIFICE = 33587, SPELL_SHADOW_NOVA = 33846, SPELL_EMPOWERING_SHADOWS = 33783, H_SPELL_EMPOWERING_SHADOWS = 39364, - MOB_VOID_PORTAL = 19224, + NPC_VOID_PORTAL = 19224, SPELL_VOID_PORTAL_VISUAL = 33569 }; @@ -64,21 +63,22 @@ float VoidPortalCoords[5][3] = {-261.4533f, -297.3298f, 17.1f} }; -class mob_voidtraveler : public CreatureScript +enum Events { -public: - mob_voidtraveler() : CreatureScript("mob_voidtraveler") { } + EVENT_SHADOWBOLT_VOLLEY = 1, + EVENT_BANISH = 2, + EVENT_DRAW_SHADOWS = 3, + EVENT_SUMMON_TRAVELER = 4 +}; - CreatureAI* GetAI(Creature* creature) const - { - return new mob_voidtravelerAI (creature); - } +class npc_voidtraveler : public CreatureScript +{ +public: + npc_voidtraveler() : CreatureScript("npc_voidtraveler") { } - struct mob_voidtravelerAI : public ScriptedAI + struct npc_voidtravelerAI : public ScriptedAI { - mob_voidtravelerAI(Creature* creature) : ScriptedAI(creature) - { - } + npc_voidtravelerAI(Creature* creature) : ScriptedAI(creature) {} uint64 VorpilGUID; uint32 move; @@ -133,6 +133,11 @@ public: move = 1000; } else move -= diff; } + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_voidtravelerAI (creature); + } }; }; @@ -142,35 +147,15 @@ class boss_grandmaster_vorpil : public CreatureScript public: boss_grandmaster_vorpil() : CreatureScript("boss_grandmaster_vorpil") { } - CreatureAI* GetAI(Creature* creature) const + struct boss_grandmaster_vorpilAI : public BossAI { - return new boss_grandmaster_vorpilAI (creature); - } - - struct boss_grandmaster_vorpilAI : public ScriptedAI - { - boss_grandmaster_vorpilAI(Creature* creature) : ScriptedAI(creature) + boss_grandmaster_vorpilAI(Creature* creature) : BossAI(creature, DATA_GRANDMASTERVORPIL) { - instance = creature->GetInstanceScript(); Intro = false; } - InstanceScript* instance; - bool Intro, HelpYell; - bool sumportals; - - uint32 ShadowBoltVolley_Timer; - uint32 DrawShadows_Timer; - uint32 summonTraveler_Timer; - uint32 banish_Timer; - uint64 PortalsGuid[5]; - void Reset() { - ShadowBoltVolley_Timer = urand(7000, 14000); - DrawShadows_Timer = 45000; - summonTraveler_Timer = 90000; - banish_Timer = 17000; HelpYell = false; sumportals = false; destroyPortals(); @@ -186,7 +171,7 @@ public: for (uint8 i = 0; i < 5; ++i) { Creature* Portal = NULL; - Portal = me->SummonCreature(MOB_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 3000000); + Portal = me->SummonCreature(NPC_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 3000000); if (Portal) { PortalsGuid[i] = Portal->GetGUID(); @@ -194,7 +179,7 @@ public: } } sumportals = true; - summonTraveler_Timer = 5000; + events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5000); } } @@ -216,7 +201,7 @@ public: void spawnVoidTraveler() { int pos = urand(0, 4); - me->SummonCreature(MOB_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + me->SummonCreature(NPC_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); if (!HelpYell) { Talk(SAY_HELP); @@ -226,8 +211,8 @@ public: void JustSummoned(Creature* summoned) { - if (summoned && summoned->GetEntry() == MOB_VOID_TRAVELER) - CAST_AI(mob_voidtraveler::mob_voidtravelerAI, summoned->AI())->VorpilGUID = me->GetGUID(); + if (summoned && summoned->GetEntry() == NPC_VOID_TRAVELER) + CAST_AI(npc_voidtraveler::npc_voidtravelerAI, summoned->AI())->VorpilGUID = me->GetGUID(); } void KilledUnit(Unit* /*victim*/) @@ -246,11 +231,18 @@ public: void EnterCombat(Unit* /*who*/) { + events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, urand(7000, 14000)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_BANISH, 17000); + events.ScheduleEvent(EVENT_DRAW_SHADOWS, 45000); + events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 90000); + Talk(SAY_AGGRO); summonPortals(); if (instance) instance->SetData(DATA_GRANDMASTERVORPILEVENT, IN_PROGRESS); + _EnterCombat(); } void MoveInLineOfSight(Unit* who) @@ -269,50 +261,59 @@ public: if (!UpdateVictim()) return; - if (ShadowBoltVolley_Timer <= diff) - { - DoCast(me, SPELL_SHADOWBOLT_VOLLEY); - ShadowBoltVolley_Timer = urand(15000, 30000); - } else ShadowBoltVolley_Timer -= diff; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (IsHeroic() && banish_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, false); - if (target) + switch (eventId) { - DoCast(target, SPELL_BANISH); - banish_Timer = 16000; + case EVENT_SHADOWBOLT_VOLLEY: + DoCast(me, SPELL_SHADOWBOLT_VOLLEY); + events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, urand(15000, 30000)); + break; + case EVENT_BANISH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, false)) + DoCast(target, SPELL_BANISH); + events.ScheduleEvent(EVENT_BANISH, 16000); + break; + case EVENT_DRAW_SHADOWS: + { + Map* map = me->GetMap(); + Map::PlayerList const &PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* i_pl = i->GetSource()) + if (i_pl->IsAlive() && !i_pl->HasAura(SPELL_BANISH)) + i_pl->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); + + me->SetPosition(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); + DoCast(me, SPELL_DRAW_SHADOWS, true); + DoCast(me, SPELL_RAIN_OF_FIRE); + events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 6000); + events.ScheduleEvent(EVENT_DRAW_SHADOWS, 30000); + break; + } + case EVENT_SUMMON_TRAVELER: + spawnVoidTraveler(); + events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 10000); + //enrage at 20% + if (HealthBelowPct(20)) + events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5000); } - } else banish_Timer -= diff; - - if (DrawShadows_Timer <= diff) - { - Map* map = me->GetMap(); - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* i_pl = i->GetSource()) - if (i_pl->IsAlive() && !i_pl->HasAura(SPELL_BANISH)) - i_pl->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); - - me->SetPosition(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); - DoCast(me, SPELL_DRAW_SHADOWS, true); - - DoCast(me, SPELL_RAIN_OF_FIRE); + } + DoMeleeAttackIfReady(); + } - ShadowBoltVolley_Timer = 6000; - DrawShadows_Timer = 30000; - } else DrawShadows_Timer -= diff; + private: + bool Intro, HelpYell; + bool sumportals; + uint64 PortalsGuid[5]; - if (summonTraveler_Timer <= diff) - { - spawnVoidTraveler(); - summonTraveler_Timer = 10000; - //enrage at 20% - if (HealthBelowPct(20)) - summonTraveler_Timer = 5000; - } else summonTraveler_Timer -=diff; - - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const + { + return new boss_grandmaster_vorpilAI (creature); } }; @@ -321,5 +322,5 @@ public: void AddSC_boss_grandmaster_vorpil() { new boss_grandmaster_vorpil(); - new mob_voidtraveler(); + new npc_voidtraveler(); } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp index 970b78a2cea..e3dec9c0a45 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp @@ -27,11 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "shadow_labyrinth.h" -#define MAX_ENCOUNTER 5 - -#define REFECTORY_DOOR 183296 //door opened when blackheart the inciter dies -#define SCREAMING_HALL_DOOR 183295 //door opened when grandmaster vorpil dies - /* Shadow Labyrinth encounters: 1 - Ambassador Hellmaw event 2 - Blackheart the Inciter event @@ -53,7 +48,7 @@ public: { instance_shadow_labyrinth_InstanceMapScript(Map* map) : InstanceScript(map) {} - uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint32 m_auiEncounter[EncounterCount]; std::string str_data; uint64 m_uiRefectoryDoorGUID; @@ -75,7 +70,7 @@ public: bool IsEncounterInProgress() const { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + for (uint8 i = 0; i < EncounterCount; ++i) if (m_auiEncounter[i] == IN_PROGRESS) return true; @@ -217,7 +212,7 @@ public: std::istringstream loadStream(in); loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> m_auiEncounter[4]; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + for (uint8 i = 0; i < EncounterCount; ++i) if (m_auiEncounter[i] == IN_PROGRESS) m_auiEncounter[i] = NOT_STARTED; diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h index 9c6ca776dea..8fdb60b32a6 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h @@ -19,11 +19,23 @@ #ifndef DEF_SHADOW_LABYRINTH_H #define DEF_SHADOW_LABYRINTH_H -#define TYPE_HELLMAW 1 -#define TYPE_OVERSEER 2 -#define DATA_BLACKHEARTTHEINCITEREVENT 3 -#define DATA_GRANDMASTERVORPILEVENT 4 -#define DATA_MURMUREVENT 5 -#define DATA_GRANDMASTERVORPIL 6 +uint32 const EncounterCount = 5; + +enum DataTypes +{ + TYPE_HELLMAW = 1, + TYPE_OVERSEER = 2, + DATA_BLACKHEARTTHEINCITEREVENT = 3, + DATA_GRANDMASTERVORPILEVENT = 4, + DATA_MURMUREVENT = 5, + DATA_GRANDMASTERVORPIL = 6 +}; + +enum Objects +{ + REFECTORY_DOOR = 183296, // door opened when blackheart the inciter dies + SCREAMING_HALL_DOOR = 183295 // door opened when grandmaster vorpil dies +}; + #endif |