aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp104
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp108
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp103
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.h68
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp115
6 files changed, 261 insertions, 249 deletions
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
index 72e1cacbb48..a5ec73cdb30 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
@@ -16,18 +16,18 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Aeonus
-SD%Complete: 80
-SDComment: Some spells not implemented
-SDCategory: Caverns of Time, The Dark Portal
-EndScriptData */
+/*
+Name: Boss_Aeonus
+%Complete: 80
+Comment: Some spells not implemented
+Category: Caverns of Time, The Dark Portal
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "dark_portal.h"
-enum eEnums
+enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
@@ -43,45 +43,37 @@ enum eEnums
H_SPELL_SAND_BREATH = 39049
};
+enum Events
+{
+ EVENT_SANDBREATH = 1,
+ EVENT_TIMESTOP = 2,
+ EVENT_FRENZY = 3
+};
+
class boss_aeonus : public CreatureScript
{
public:
boss_aeonus() : CreatureScript("boss_aeonus") { }
- CreatureAI* GetAI(Creature* creature) const
+ struct boss_aeonusAI : public BossAI
{
- return new boss_aeonusAI (creature);
- }
+ boss_aeonusAI(Creature* creature) : BossAI(creature, TYPE_AEONUS) { }
- struct boss_aeonusAI : public ScriptedAI
- {
- boss_aeonusAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 SandBreath_Timer;
- uint32 TimeStop_Timer;
- uint32 Frenzy_Timer;
-
- void Reset()
- {
- SandBreath_Timer = 15000+rand()%15000;
- TimeStop_Timer = 10000+rand()%5000;
- Frenzy_Timer = 30000+rand()%15000;
- }
+ void Reset() { }
void EnterCombat(Unit* /*who*/)
{
+ events.ScheduleEvent(EVENT_SANDBREATH, urand(15000, 30000));
+ events.ScheduleEvent(EVENT_TIMESTOP, urand(10000, 15000));
+ events.ScheduleEvent(EVENT_FRENZY, urand(30000, 45000));
+
Talk(SAY_AGGRO);
}
void MoveInLineOfSight(Unit* who)
{
//Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
if (me->IsWithinDistInMap(who, 20.0f))
{
@@ -100,7 +92,7 @@ public:
if (instance)
{
instance->SetData(TYPE_RIFT, DONE);
- instance->SetData(TYPE_MEDIVH, DONE);//FIXME: later should be removed
+ instance->SetData(TYPE_MEDIVH, DONE); // FIXME: later should be removed
}
}
@@ -115,32 +107,40 @@ public:
if (!UpdateVictim())
return;
- //Sand Breath
- if (SandBreath_Timer <= diff)
- {
- DoCast(me->GetVictim(), SPELL_SAND_BREATH);
- SandBreath_Timer = 15000+rand()%10000;
- } else SandBreath_Timer -= diff;
+ events.Update(diff);
- //Time Stop
- if (TimeStop_Timer <= diff)
- {
- DoCast(me->GetVictim(), SPELL_TIME_STOP);
- TimeStop_Timer = 20000+rand()%15000;
- } else TimeStop_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Frenzy
- if (Frenzy_Timer <= diff)
- {
- Talk(EMOTE_FRENZY);
- DoCast(me, SPELL_ENRAGE);
- Frenzy_Timer = 20000+rand()%15000;
- } else Frenzy_Timer -= diff;
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SANDBREATH:
+ DoCast(me->GetVictim(), SPELL_SAND_BREATH);
+ events.ScheduleEvent(EVENT_SANDBREATH, urand(15000, 25000));
+ break;
+ case EVENT_TIMESTOP:
+ DoCast(me->GetVictim(), SPELL_TIME_STOP);
+ events.ScheduleEvent(EVENT_TIMESTOP, urand(20000, 35000));
+ break;
+ case EVENT_FRENZY:
+ Talk(EMOTE_FRENZY);
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_FRENZY, urand(20000, 35000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_aeonusAI (creature);
}
};
-
};
void AddSC_boss_aeonus()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
index 03ab0f193f4..e469ba81623 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
@@ -27,7 +27,7 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "dark_portal.h"
-enum eEnums
+enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
@@ -43,47 +43,40 @@ enum eEnums
SPELL_ATTRACTION = 38540 //Not Implemented (Heroic mode)
};
+enum Events
+{
+ EVENT_ARCANE_BLAST = 1,
+ EVENT_TIME_LAPSE = 2,
+ EVENT_ARCANE_DISCHARGE = 3,
+ EVENT_ATTRACTION = 4
+};
+
class boss_chrono_lord_deja : public CreatureScript
{
public:
boss_chrono_lord_deja() : CreatureScript("boss_chrono_lord_deja") { }
- CreatureAI* GetAI(Creature* creature) const
+ struct boss_chrono_lord_dejaAI : public BossAI
{
- return new boss_chrono_lord_dejaAI (creature);
- }
-
- struct boss_chrono_lord_dejaAI : public ScriptedAI
- {
- boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+ boss_chrono_lord_dejaAI(Creature* creature) : BossAI(creature, TYPE_CRONO_LORD_DEJA) { }
- InstanceScript* instance;
-
- uint32 ArcaneBlast_Timer;
- uint32 TimeLapse_Timer;
- uint32 Attraction_Timer;
- uint32 ArcaneDischarge_Timer;
-
- void Reset()
- {
- ArcaneBlast_Timer = 18000+rand()%5000;
- TimeLapse_Timer = 10000+rand()%5000;
- ArcaneDischarge_Timer = 20000+rand()%10000;
- Attraction_Timer = 25000+rand()%10000;
- }
+ void Reset() { }
void EnterCombat(Unit* /*who*/)
{
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(18000, 23000));
+ events.ScheduleEvent(EVENT_TIME_LAPSE, urand(10000, 15000));
+ events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, urand(20000, 30000));
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_ATTRACTION, urand(25000, 35000));
+
Talk(SAY_AGGRO);
}
void MoveInLineOfSight(Unit* who)
{
//Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
if (me->IsWithinDistInMap(who, 20.0f))
{
@@ -114,42 +107,43 @@ public:
if (!UpdateVictim())
return;
- //Arcane Blast
- if (ArcaneBlast_Timer <= diff)
- {
- DoCast(me->GetVictim(), SPELL_ARCANE_BLAST);
- ArcaneBlast_Timer = 15000+rand()%10000;
- } else ArcaneBlast_Timer -= diff;
-
- //Arcane Discharge
- if (ArcaneDischarge_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_ARCANE_DISCHARGE);
- ArcaneDischarge_Timer = 20000+rand()%10000;
- } else ArcaneDischarge_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Time Lapse
- if (TimeLapse_Timer <= diff)
- {
- Talk(SAY_BANISH);
- DoCast(me, SPELL_TIME_LAPSE);
- TimeLapse_Timer = 15000+rand()%10000;
- } else TimeLapse_Timer -= diff;
-
- if (IsHeroic())
- {
- if (Attraction_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me, SPELL_ATTRACTION);
- Attraction_Timer = 25000+rand()%10000;
- } else Attraction_Timer -= diff;
- }
+ switch (eventId)
+ {
+ case EVENT_ARCANE_BLAST:
+ DoCast(me->GetVictim(), SPELL_ARCANE_BLAST);
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(15000, 25000));
+ break;
+ case EVENT_TIME_LAPSE:
+ Talk(SAY_BANISH);
+ DoCast(me, SPELL_TIME_LAPSE);
+ events.ScheduleEvent(EVENT_TIME_LAPSE, urand(15000, 25000));
+ break;
+ case EVENT_ARCANE_DISCHARGE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_ARCANE_DISCHARGE);
+ events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, urand(20000, 30000));
+ break;
+ case EVENT_ATTRACTION: // Only in Heroic
+ DoCast(me, SPELL_ATTRACTION);
+ events.ScheduleEvent(EVENT_ATTRACTION, urand(25000, 35000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_chrono_lord_dejaAI (creature);
}
};
-
};
void AddSC_boss_chrono_lord_deja()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
index e224094b1f9..bf311fe29ca 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
@@ -27,7 +27,7 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "dark_portal.h"
-enum eEnums
+enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
@@ -42,40 +42,33 @@ enum eEnums
SPELL_REFLECT = 38592 //Not Implemented (Heroic mod)
};
+enum Events
+{
+ EVENT_HASTE = 1,
+ EVENT_MORTAL_WOUND = 2,
+ EVENT_WING_BUFFET = 3,
+ EVENT_SPELL_REFLECTION = 4
+};
+
class boss_temporus : public CreatureScript
{
public:
boss_temporus() : CreatureScript("boss_temporus") { }
- CreatureAI* GetAI(Creature* creature) const
+ struct boss_temporusAI : public BossAI
{
- return new boss_temporusAI (creature);
- }
-
- struct boss_temporusAI : public ScriptedAI
- {
- boss_temporusAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 Haste_Timer;
- uint32 SpellReflection_Timer;
- uint32 MortalWound_Timer;
- uint32 WingBuffet_Timer;
+ boss_temporusAI(Creature* creature) : BossAI(creature, TYPE_TEMPORUS) { }
- void Reset()
- {
- Haste_Timer = 15000+rand()%8000;
- SpellReflection_Timer = 30000;
- MortalWound_Timer = 8000;
- WingBuffet_Timer = 25000+rand()%10000;
- }
+ void Reset() { }
void EnterCombat(Unit* /*who*/)
{
+ events.ScheduleEvent(EVENT_HASTE, urand(15000, 23000));
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);
+ events.ScheduleEvent(EVENT_WING_BUFFET, urand(25000, 35000));
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30000);
+
Talk(SAY_AGGRO);
}
@@ -95,7 +88,7 @@ public:
void MoveInLineOfSight(Unit* who)
{
//Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
if (me->IsWithinDistInMap(who, 20.0f))
{
@@ -114,37 +107,41 @@ public:
if (!UpdateVictim())
return;
- //Attack Haste
- if (Haste_Timer <= diff)
- {
- DoCast(me, SPELL_HASTE);
- Haste_Timer = 20000+rand()%5000;
- } else Haste_Timer -= diff;
-
- //MortalWound_Timer
- if (MortalWound_Timer <= diff)
- {
- DoCast(me, SPELL_MORTAL_WOUND);
- MortalWound_Timer = 10000+rand()%10000;
- } else MortalWound_Timer -= diff;
+ events.Update(diff);
- //Wing ruffet
- if (WingBuffet_Timer <= diff)
- {
- DoCast(me, SPELL_WING_BUFFET);
- WingBuffet_Timer = 20000+rand()%10000;
- } else WingBuffet_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (IsHeroic())
- {
- if (SpellReflection_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me, SPELL_REFLECT);
- SpellReflection_Timer = 25000+rand()%10000;
- } else SpellReflection_Timer -= diff;
- }
+ switch (eventId)
+ {
+ case EVENT_HASTE:
+ DoCast(me, SPELL_HASTE);
+ events.ScheduleEvent(EVENT_HASTE, urand(20000, 25000));
+ break;
+ case EVENT_MORTAL_WOUND:
+ DoCast(me, SPELL_MORTAL_WOUND);
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 20000));
+ break;
+ case EVENT_WING_BUFFET:
+ DoCast(me, SPELL_WING_BUFFET);
+ events.ScheduleEvent(EVENT_WING_BUFFET, urand(20000, 30000));
+ break;
+ case EVENT_SPELL_REFLECTION: // Only in Heroic
+ DoCast(me, SPELL_REFLECT);
+ events.ScheduleEvent(EVENT_SPELL_REFLECTION, urand(25000, 35000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_temporusAI (creature);
}
};
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
index ca60a0ca0ef..f49325041f7 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
@@ -125,12 +125,12 @@ public:
return;
uint32 entry = who->GetEntry();
- if (entry == C_ASSAS || entry == C_WHELP || entry == C_CHRON || entry == C_EXECU || entry == C_VANQU)
+ if (entry == NPC_INFINITE_ASSASIN || entry == NPC_INFINITE_WHELP || entry == NPC_INFINITE_CRONOMANCER || entry == NPC_INFINITE_EXECUTIONER || entry == NPC_INFINITE_VANQUISHER)
{
who->StopMoving();
who->CastSpell(me, SPELL_CORRUPT, false);
}
- else if (entry == C_AEONUS)
+ else if (entry == NPC_AEONUS)
{
who->StopMoving();
who->CastSpell(me, SPELL_CORRUPT_AEONUS, false);
@@ -251,9 +251,9 @@ struct Wave
static Wave PortalWaves[]=
{
- { {C_ASSAS, C_WHELP, C_CHRON, 0} },
- { {C_EXECU, C_CHRON, C_WHELP, C_ASSAS} },
- { {C_EXECU, C_VANQU, C_CHRON, C_ASSAS} }
+ { {NPC_INFINITE_ASSASIN, NPC_INFINITE_WHELP, NPC_INFINITE_CRONOMANCER, 0} },
+ { {NPC_INFINITE_EXECUTIONER, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_WHELP, NPC_INFINITE_ASSASIN} },
+ { {NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_ASSASIN} }
};
class npc_time_rift : public CreatureScript
@@ -335,7 +335,7 @@ public:
++mRiftWaveCount;
- if (entry == C_WHELP)
+ if (entry == NPC_INFINITE_WHELP)
{
for (uint8 i = 0; i < 3; ++i)
DoSummonAtRift(entry);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.h b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.h
index 490ac4c2e50..09f693d73f4 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.h
@@ -19,31 +19,49 @@
#ifndef DEF_DARKPORTAL_H
#define DEF_DARKPORTAL_H
-#define TYPE_MEDIVH 1
-#define TYPE_RIFT 2
-
-#define DATA_MEDIVH 10
-#define DATA_PORTAL_COUNT 11
-#define DATA_SHIELD 12
-
-#define WORLD_STATE_BM 2541
-#define WORLD_STATE_BM_SHIELD 2540
-#define WORLD_STATE_BM_RIFT 2784
-
-#define QUEST_OPENING_PORTAL 10297
-#define QUEST_MASTER_TOUCH 9836
-
-#define C_TIME_KEEPER 17918
-#define C_RKEEP 21104
-#define C_RLORD 17839
-#define C_DEJA 17879
-#define C_TEMPO 17880
-#define C_AEONUS 17881
-#define C_ASSAS 17835
-#define C_WHELP 21818
-#define C_CHRON 17892
-#define C_EXECU 18994
-#define C_VANQU 18995
+uint32 const EncounterCount = 2;
+
+enum DataTypes
+{
+ TYPE_MEDIVH = 1,
+ TYPE_RIFT = 2,
+ TYPE_AEONUS = 3,
+ TYPE_TEMPORUS = 4,
+ TYPE_CRONO_LORD_DEJA = 5,
+ DATA_MEDIVH = 10,
+ DATA_PORTAL_COUNT = 11,
+ DATA_SHIELD = 12
+};
+
+enum WorldStateIds
+{
+ WORLD_STATE_BM = 2541,
+ WORLD_STATE_BM_SHIELD = 2540,
+ WORLD_STATE_BM_RIFT = 2784
+};
+
+enum QuestIds
+{
+ QUEST_OPENING_PORTAL = 10297,
+ QUEST_MASTER_TOUCH = 9836
+};
+
+enum CreatureIds
+{
+ NPC_MEDIVH = 15608,
+ NPC_TIME_RIFT = 17838,
+ NPC_TIME_KEEPER = 17918,
+ NPC_RIFT_KEEPER = 21104,
+ NPC_RIFT_LORD = 17839,
+ NPC_CRONO_LORD_DEJA = 17879,
+ NPC_TEMPORUS = 17880,
+ NPC_AEONUS = 17881,
+ NPC_INFINITE_ASSASIN = 17835,
+ NPC_INFINITE_WHELP = 21818,
+ NPC_INFINITE_CRONOMANCER = 17892,
+ NPC_INFINITE_EXECUTIONER = 18994,
+ NPC_INFINITE_VANQUISHER = 18995
+};
#endif
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
index 1278688d7ad..28f16a10ed3 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
@@ -30,16 +30,13 @@ EndScriptData */
#include "TemporarySummon.h"
#include "SpellInfo.h"
-#define MAX_ENCOUNTER 2
-
-#define C_MEDIVH 15608
-#define C_TIME_RIFT 17838
-
-#define SPELL_RIFT_CHANNEL 31387
-
-#define RIFT_BOSS 1
+enum Misc
+{
+ SPELL_RIFT_CHANNEL = 31387,
+ RIFT_BOSS = 1
+};
-inline uint32 RandRiftBoss() { return ((rand()%2) ? C_RKEEP : C_RLORD); }
+inline uint32 RandRiftBoss() { return ((rand()%2) ? NPC_RIFT_KEEPER : NPC_RIFT_LORD); }
float PortalLocation[4][4]=
{
@@ -57,12 +54,17 @@ struct Wave
static Wave RiftWaves[]=
{
- {RIFT_BOSS, 0},
- {C_DEJA, 0},
- {RIFT_BOSS, 120000},
- {C_TEMPO, 140000},
- {RIFT_BOSS, 120000},
- {C_AEONUS, 0}
+ { RIFT_BOSS, 0 },
+ { NPC_CRONO_LORD_DEJA, 0 },
+ { RIFT_BOSS, 120000 },
+ { NPC_TEMPORUS, 140000 },
+ { RIFT_BOSS, 120000 },
+ { NPC_AEONUS, 0 }
+};
+
+enum EventIds
+{
+ EVENT_NEXT_PORTAL = 1
};
class instance_dark_portal : public InstanceMapScript
@@ -77,25 +79,21 @@ public:
struct instance_dark_portal_InstanceMapScript : public InstanceScript
{
- instance_dark_portal_InstanceMapScript(Map* map) : InstanceScript(map)
- {
- }
+ instance_dark_portal_InstanceMapScript(Map* map) : InstanceScript(map) { }
- uint32 m_auiEncounter[MAX_ENCOUNTER];
+ uint32 m_auiEncounter[EncounterCount];
uint32 mRiftPortalCount;
uint32 mShieldPercent;
- uint8 mRiftWaveCount;
- uint8 mRiftWaveId;
-
- uint32 NextPortal_Timer;
+ uint8 mRiftWaveCount;
+ uint8 mRiftWaveId;
- uint64 MedivhGUID;
- uint8 CurrentRiftId;
+ uint64 _medivhGUID;
+ uint8 _currentRiftId;
void Initialize()
{
- MedivhGUID = 0;
+ _medivhGUID = 0;
Clear();
}
@@ -108,9 +106,7 @@ public:
mRiftWaveCount = 0;
mRiftWaveId = 0;
- CurrentRiftId = 0;
-
- NextPortal_Timer = 0;
+ _currentRiftId = 0;
}
void InitWorldState(bool Enable = true)
@@ -138,8 +134,8 @@ public:
void OnCreatureCreate(Creature* creature)
{
- if (creature->GetEntry() == C_MEDIVH)
- MedivhGUID = creature->GetGUID();
+ if (creature->GetEntry() == NPC_MEDIVH)
+ _medivhGUID = creature->GetGUID();
}
//what other conditions to check?
@@ -181,11 +177,11 @@ public:
if (!mShieldPercent)
{
- if (Creature* pMedivh = instance->GetCreature(MedivhGUID))
+ if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
- if (pMedivh->IsAlive())
+ if (medivh->IsAlive())
{
- pMedivh->DealDamage(pMedivh, pMedivh->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ medivh->DealDamage(medivh, medivh->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_auiEncounter[0] = FAIL;
m_auiEncounter[1] = NOT_STARTED;
}
@@ -199,7 +195,7 @@ public:
TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Dark Portal: Starting event.");
InitWorldState();
m_auiEncounter[1] = IN_PROGRESS;
- NextPortal_Timer = 15000;
+ _events.ScheduleEvent(EVENT_NEXT_PORTAL, 15000);
}
if (data == DONE)
@@ -231,7 +227,7 @@ public:
if (data == SPECIAL)
{
if (mRiftPortalCount < 7)
- NextPortal_Timer = 5000;
+ _events.ScheduleEvent(EVENT_NEXT_PORTAL, 5000);
}
else
m_auiEncounter[1] = data;
@@ -258,7 +254,7 @@ public:
uint64 GetData64(uint32 data) const
{
if (data == DATA_MEDIVH)
- return MedivhGUID;
+ return _medivhGUID;
return 0;
}
@@ -287,18 +283,18 @@ public:
void DoSpawnPortal()
{
- if (Creature* pMedivh = instance->GetCreature(MedivhGUID))
+ if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
uint8 tmp = urand(0, 2);
- if (tmp >= CurrentRiftId)
+ if (tmp >= _currentRiftId)
++tmp;
- TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Dark Portal: Creating Time Rift at locationId %i (old locationId was %u).", tmp, CurrentRiftId);
+ TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Dark Portal: Creating Time Rift at locationId %i (old locationId was %u).", tmp, _currentRiftId);
- CurrentRiftId = tmp;
+ _currentRiftId = tmp;
- Creature* temp = pMedivh->SummonCreature(C_TIME_RIFT,
+ Creature* temp = medivh->SummonCreature(NPC_TIME_RIFT,
PortalLocation[tmp][0], PortalLocation[tmp][1], PortalLocation[tmp][2], PortalLocation[tmp][3],
TEMPSUMMON_CORPSE_DESPAWN, 0);
if (temp)
@@ -306,14 +302,14 @@ public:
temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- if (Creature* pBoss = SummonedPortalBoss(temp))
+ if (Creature* boss = SummonedPortalBoss(temp))
{
- if (pBoss->GetEntry() == C_AEONUS)
- pBoss->AddThreat(pMedivh, 0.0f);
+ if (boss->GetEntry() == NPC_AEONUS)
+ boss->AddThreat(medivh, 0.0f);
else
{
- pBoss->AddThreat(temp, 0.0f);
- temp->CastSpell(pBoss, SPELL_RIFT_CHANNEL, false);
+ boss->AddThreat(temp, 0.0f);
+ temp->CastSpell(boss, SPELL_RIFT_CHANNEL, false);
}
}
}
@@ -332,19 +328,26 @@ public:
return;
}
- if (NextPortal_Timer)
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (NextPortal_Timer <= diff)
+ switch (eventId)
{
- ++mRiftPortalCount;
-
- DoUpdateWorldState(WORLD_STATE_BM_RIFT, mRiftPortalCount);
-
- DoSpawnPortal();
- NextPortal_Timer = RiftWaves[GetRiftWaveId()].NextPortalTime;
- } else NextPortal_Timer -= diff;
+ case EVENT_NEXT_PORTAL:
+ ++mRiftPortalCount;
+ DoUpdateWorldState(WORLD_STATE_BM_RIFT, mRiftPortalCount);
+ DoSpawnPortal();
+ _events.ScheduleEvent(EVENT_NEXT_PORTAL, RiftWaves[GetRiftWaveId()].NextPortalTime);
+ break;
+ default:
+ break;
+ }
}
}
+
+ private:
+ EventMap _events;
};
};