aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp135
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp141
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp141
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp416
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h2
5 files changed, 390 insertions, 445 deletions
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
index 04611a8be0b..5958ae3f5e6 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
@@ -50,102 +50,91 @@ enum Events
EVENT_FRENZY = 3
};
-class boss_aeonus : public CreatureScript
+struct boss_aeonus : public BossAI
{
-public:
- boss_aeonus() : CreatureScript("boss_aeonus") { }
+ boss_aeonus(Creature* creature) : BossAI(creature, TYPE_AEONUS) { }
- struct boss_aeonusAI : public BossAI
- {
- boss_aeonusAI(Creature* creature) : BossAI(creature, TYPE_AEONUS) { }
-
- void Reset() override { }
+ void Reset() override { }
- void JustEngagedWith(Unit* /*who*/) override
- {
- events.ScheduleEvent(EVENT_SANDBREATH, 15s, 30s);
- events.ScheduleEvent(EVENT_TIMESTOP, 10s, 15s);
- events.ScheduleEvent(EVENT_FRENZY, 30s, 45s);
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ events.ScheduleEvent(EVENT_SANDBREATH, 15s, 30s);
+ events.ScheduleEvent(EVENT_TIMESTOP, 10s, 15s);
+ events.ScheduleEvent(EVENT_FRENZY, 30s, 45s);
- Talk(SAY_AGGRO);
- }
+ Talk(SAY_AGGRO);
+ }
- void MoveInLineOfSight(Unit* who) override
+ void MoveInLineOfSight(Unit* who) override
+ {
+ //Despawn Time Keeper
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
- //Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
+ if (me->IsWithinDistInMap(who, 20.0f))
{
- if (me->IsWithinDistInMap(who, 20.0f))
- {
- Talk(SAY_BANISH);
- Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
- }
+ Talk(SAY_BANISH);
+ Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
}
-
- ScriptedAI::MoveInLineOfSight(who);
}
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ ScriptedAI::MoveInLineOfSight(who);
+ }
- instance->SetData(TYPE_RIFT, DONE);
- instance->SetData(TYPE_MEDIVH, DONE); // FIXME: later should be removed
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
+ instance->SetData(TYPE_RIFT, DONE);
+ instance->SetData(TYPE_MEDIVH, DONE); // FIXME: later should be removed
+ }
- void UpdateAI(uint32 diff) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- events.Update(diff);
+ void UpdateAI(uint32 diff) override
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.Update(diff);
- while (uint32 eventId = events.ExecuteEvent())
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_SANDBREATH:
- DoCastVictim(SPELL_SAND_BREATH);
- events.ScheduleEvent(EVENT_SANDBREATH, 15s, 25s);
- break;
- case EVENT_TIMESTOP:
- DoCastVictim(SPELL_TIME_STOP);
- events.ScheduleEvent(EVENT_TIMESTOP, 20s, 35s);
- break;
- case EVENT_FRENZY:
- Talk(EMOTE_FRENZY);
- DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_FRENZY, 20s, 35s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ case EVENT_SANDBREATH:
+ DoCastVictim(SPELL_SAND_BREATH);
+ events.ScheduleEvent(EVENT_SANDBREATH, 15s, 25s);
+ break;
+ case EVENT_TIMESTOP:
+ DoCastVictim(SPELL_TIME_STOP);
+ events.ScheduleEvent(EVENT_TIMESTOP, 20s, 35s);
+ break;
+ case EVENT_FRENZY:
+ Talk(EMOTE_FRENZY);
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_FRENZY, 20s, 35s);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
- }
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackMorassAI<boss_aeonusAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ DoMeleeAttackIfReady();
}
};
void AddSC_boss_aeonus()
{
- new boss_aeonus();
+ RegisterBlackMorassCreatureAI(boss_aeonus);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
index e68c8ce6e79..752cf85b370 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
@@ -51,107 +51,96 @@ enum Events
EVENT_ATTRACTION = 4
};
-class boss_chrono_lord_deja : public CreatureScript
+struct boss_chrono_lord_deja : public BossAI
{
-public:
- boss_chrono_lord_deja() : CreatureScript("boss_chrono_lord_deja") { }
+ boss_chrono_lord_deja(Creature* creature) : BossAI(creature, TYPE_CRONO_LORD_DEJA) { }
- struct boss_chrono_lord_dejaAI : public BossAI
- {
- boss_chrono_lord_dejaAI(Creature* creature) : BossAI(creature, TYPE_CRONO_LORD_DEJA) { }
-
- void Reset() override { }
+ void Reset() override { }
- void JustEngagedWith(Unit* /*who*/) override
- {
- events.ScheduleEvent(EVENT_ARCANE_BLAST, 18s, 23s);
- events.ScheduleEvent(EVENT_TIME_LAPSE, 10s, 15s);
- events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 20s, 30s);
- if (IsHeroic())
- events.ScheduleEvent(EVENT_ATTRACTION, 25s, 35s);
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, 18s, 23s);
+ events.ScheduleEvent(EVENT_TIME_LAPSE, 10s, 15s);
+ events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 20s, 30s);
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_ATTRACTION, 25s, 35s);
- Talk(SAY_AGGRO);
- }
+ Talk(SAY_AGGRO);
+ }
- void MoveInLineOfSight(Unit* who) override
+ void MoveInLineOfSight(Unit* who) override
+ {
+ //Despawn Time Keeper
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
- //Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
+ if (me->IsWithinDistInMap(who, 20.0f))
{
- if (me->IsWithinDistInMap(who, 20.0f))
- {
- Talk(SAY_BANISH);
- Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
- }
+ Talk(SAY_BANISH);
+ Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
}
-
- ScriptedAI::MoveInLineOfSight(who);
}
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- }
+ ScriptedAI::MoveInLineOfSight(who);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(SAY_SLAY);
+ }
- instance->SetData(TYPE_RIFT, SPECIAL);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ instance->SetData(TYPE_RIFT, SPECIAL);
+ }
- events.Update(diff);
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_ARCANE_BLAST:
- DoCastVictim(SPELL_ARCANE_BLAST);
- events.ScheduleEvent(EVENT_ARCANE_BLAST, 15s, 25s);
- break;
- case EVENT_TIME_LAPSE:
- Talk(SAY_BANISH);
- DoCast(me, SPELL_TIME_LAPSE);
- events.ScheduleEvent(EVENT_TIME_LAPSE, 15s, 25s);
- break;
- case EVENT_ARCANE_DISCHARGE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_ARCANE_DISCHARGE);
- events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 20s, 30s);
- break;
- case EVENT_ATTRACTION: // Only in Heroic
- DoCast(me, SPELL_ATTRACTION);
- events.ScheduleEvent(EVENT_ATTRACTION, 25s, 35s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ case EVENT_ARCANE_BLAST:
+ DoCastVictim(SPELL_ARCANE_BLAST);
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, 15s, 25s);
+ break;
+ case EVENT_TIME_LAPSE:
+ Talk(SAY_BANISH);
+ DoCast(me, SPELL_TIME_LAPSE);
+ events.ScheduleEvent(EVENT_TIME_LAPSE, 15s, 25s);
+ break;
+ case EVENT_ARCANE_DISCHARGE:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_ARCANE_DISCHARGE);
+ events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 20s, 30s);
+ break;
+ case EVENT_ATTRACTION: // Only in Heroic
+ DoCast(me, SPELL_ATTRACTION);
+ events.ScheduleEvent(EVENT_ATTRACTION, 25s, 35s);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackMorassAI<boss_chrono_lord_dejaAI>(creature);
+ DoMeleeAttackIfReady();
}
};
void AddSC_boss_chrono_lord_deja()
{
- new boss_chrono_lord_deja();
+ RegisterBlackMorassCreatureAI(boss_chrono_lord_deja);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
index aa6b11e0347..03ced5fb1ff 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
@@ -50,105 +50,94 @@ enum Events
EVENT_SPELL_REFLECTION = 4
};
-class boss_temporus : public CreatureScript
+struct boss_temporus : public BossAI
{
-public:
- boss_temporus() : CreatureScript("boss_temporus") { }
+ boss_temporus(Creature* creature) : BossAI(creature, TYPE_TEMPORUS) { }
- struct boss_temporusAI : public BossAI
- {
- boss_temporusAI(Creature* creature) : BossAI(creature, TYPE_TEMPORUS) { }
-
- void Reset() override { }
+ void Reset() override { }
- void JustEngagedWith(Unit* /*who*/) override
- {
- events.ScheduleEvent(EVENT_HASTE, 15s, 23s);
- events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s);
- events.ScheduleEvent(EVENT_WING_BUFFET, 25s, 35s);
- if (IsHeroic())
- events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30s);
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ events.ScheduleEvent(EVENT_HASTE, 15s, 23s);
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s);
+ events.ScheduleEvent(EVENT_WING_BUFFET, 25s, 35s);
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30s);
- Talk(SAY_AGGRO);
- }
+ Talk(SAY_AGGRO);
+ }
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- }
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(SAY_SLAY);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
- instance->SetData(TYPE_RIFT, SPECIAL);
- }
+ instance->SetData(TYPE_RIFT, SPECIAL);
+ }
- void MoveInLineOfSight(Unit* who) override
+ void MoveInLineOfSight(Unit* who) override
+ {
+ //Despawn Time Keeper
+ if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
{
- //Despawn Time Keeper
- if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
+ if (me->IsWithinDistInMap(who, 20.0f))
{
- if (me->IsWithinDistInMap(who, 20.0f))
- {
- Talk(SAY_BANISH);
+ Talk(SAY_BANISH);
- Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
- }
+ Unit::DealDamage(me, who, who->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
}
-
- ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(uint32 diff) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ ScriptedAI::MoveInLineOfSight(who);
+ }
- events.Update(diff);
+ void UpdateAI(uint32 diff) override
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.Update(diff);
- while (uint32 eventId = events.ExecuteEvent())
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_HASTE:
- DoCast(me, SPELL_HASTE);
- events.ScheduleEvent(EVENT_HASTE, 20s, 25s);
- break;
- case EVENT_MORTAL_WOUND:
- DoCast(me, SPELL_MORTAL_WOUND);
- events.ScheduleEvent(EVENT_MORTAL_WOUND, 10s, 20s);
- break;
- case EVENT_WING_BUFFET:
- DoCast(me, SPELL_WING_BUFFET);
- events.ScheduleEvent(EVENT_WING_BUFFET, 20s, 30s);
- break;
- case EVENT_SPELL_REFLECTION: // Only in Heroic
- DoCast(me, SPELL_REFLECT);
- events.ScheduleEvent(EVENT_SPELL_REFLECTION, 25s, 35s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ case EVENT_HASTE:
+ DoCast(me, SPELL_HASTE);
+ events.ScheduleEvent(EVENT_HASTE, 20s, 25s);
+ break;
+ case EVENT_MORTAL_WOUND:
+ DoCast(me, SPELL_MORTAL_WOUND);
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, 10s, 20s);
+ break;
+ case EVENT_WING_BUFFET:
+ DoCast(me, SPELL_WING_BUFFET);
+ events.ScheduleEvent(EVENT_WING_BUFFET, 20s, 30s);
+ break;
+ case EVENT_SPELL_REFLECTION: // Only in Heroic
+ DoCast(me, SPELL_REFLECT);
+ events.ScheduleEvent(EVENT_SPELL_REFLECTION, 25s, 35s);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
- }
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackMorassAI<boss_temporusAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ DoMeleeAttackIfReady();
}
};
void AddSC_boss_temporus()
{
- new boss_temporus();
+ RegisterBlackMorassCreatureAI(boss_temporus);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
index b71338014c1..78941da7a3d 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
@@ -103,183 +103,171 @@ enum MedivhBm
C_COUNCIL_ENFORCER = 17023
};
-class npc_medivh_bm : public CreatureScript
+struct npc_medivh_bm : public ScriptedAI
{
-public:
- npc_medivh_bm() : CreatureScript("npc_medivh_bm") { }
-
- CreatureAI* GetAI(Creature* creature) const override
+ npc_medivh_bm(Creature* creature) : ScriptedAI(creature)
{
- return GetBlackMorassAI<npc_medivh_bmAI>(creature);
+ Initialize();
+ instance = creature->GetInstanceScript();
}
- struct npc_medivh_bmAI : public ScriptedAI
+ void Initialize()
{
- npc_medivh_bmAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
+ SpellCorrupt_Timer = 0;
+ Check_Timer = 0;
+ Life75 = true;
+ Life50 = true;
+ Life25 = true;
+ }
- void Initialize()
- {
- SpellCorrupt_Timer = 0;
- Check_Timer = 0;
- Life75 = true;
- Life50 = true;
- Life25 = true;
- }
+ InstanceScript* instance;
- InstanceScript* instance;
+ uint32 SpellCorrupt_Timer;
+ uint32 Check_Timer;
- uint32 SpellCorrupt_Timer;
- uint32 Check_Timer;
+ bool Life75;
+ bool Life50;
+ bool Life25;
- bool Life75;
- bool Life50;
- bool Life25;
+ void Reset() override
+ {
+ Initialize();
- void Reset() override
+ if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
+ DoCast(me, SPELL_CHANNEL, true);
+ else if (me->HasAura(SPELL_CHANNEL))
+ me->RemoveAura(SPELL_CHANNEL);
+ }
+
+ void MoveInLineOfSight(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 10.0f))
{
- Initialize();
+ if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS || instance->GetData(TYPE_MEDIVH) == DONE)
+ return;
- if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
- DoCast(me, SPELL_CHANNEL, true);
- else if (me->HasAura(SPELL_CHANNEL))
- me->RemoveAura(SPELL_CHANNEL);
+ Talk(SAY_INTRO);
+ instance->SetData(TYPE_MEDIVH, IN_PROGRESS);
+ DoCast(me, SPELL_CHANNEL, false);
+ Check_Timer = 5000;
}
-
- void MoveInLineOfSight(Unit* who) override
+ else if (who->GetTypeId() == TYPEID_UNIT && me->IsWithinDistInMap(who, 15.0f))
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 10.0f))
- {
- if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS || instance->GetData(TYPE_MEDIVH) == DONE)
- return;
+ if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
+ return;
- Talk(SAY_INTRO);
- instance->SetData(TYPE_MEDIVH, IN_PROGRESS);
- DoCast(me, SPELL_CHANNEL, false);
- Check_Timer = 5000;
+ uint32 entry = who->GetEntry();
+ 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 (who->GetTypeId() == TYPEID_UNIT && me->IsWithinDistInMap(who, 15.0f))
+ else if (entry == NPC_AEONUS)
{
- if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
- return;
-
- uint32 entry = who->GetEntry();
- 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 == NPC_AEONUS)
- {
- who->StopMoving();
- who->CastSpell(me, SPELL_CORRUPT_AEONUS, false);
- }
+ who->StopMoving();
+ who->CastSpell(me, SPELL_CORRUPT_AEONUS, false);
}
}
+ }
- void AttackStart(Unit* /*who*/) override
- {
- //if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
- // return;
+ void AttackStart(Unit* /*who*/) override
+ {
+ //if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
+ // return;
- //ScriptedAI::AttackStart(who);
- }
+ //ScriptedAI::AttackStart(who);
+ }
- void JustEngagedWith(Unit* /*who*/) override { }
+ void JustEngagedWith(Unit* /*who*/) override { }
- void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
- {
- if (SpellCorrupt_Timer)
- return;
+ void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ if (SpellCorrupt_Timer)
+ return;
- if (spellInfo->Id == SPELL_CORRUPT_AEONUS)
- SpellCorrupt_Timer = 1000;
+ if (spellInfo->Id == SPELL_CORRUPT_AEONUS)
+ SpellCorrupt_Timer = 1000;
- if (spellInfo->Id == SPELL_CORRUPT)
- SpellCorrupt_Timer = 3000;
- }
+ if (spellInfo->Id == SPELL_CORRUPT)
+ SpellCorrupt_Timer = 3000;
+ }
- void JustDied(Unit* killer) override
- {
- if (killer && killer->GetEntry() == me->GetEntry())
- return;
+ void JustDied(Unit* killer) override
+ {
+ if (killer && killer->GetEntry() == me->GetEntry())
+ return;
- Talk(SAY_DEATH);
+ Talk(SAY_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (SpellCorrupt_Timer)
+ {
+ if (SpellCorrupt_Timer <= diff)
+ {
+ instance->SetData(TYPE_MEDIVH, SPECIAL);
+
+ if (me->HasAura(SPELL_CORRUPT_AEONUS))
+ SpellCorrupt_Timer = 1000;
+ else if (me->HasAura(SPELL_CORRUPT))
+ SpellCorrupt_Timer = 3000;
+ else
+ SpellCorrupt_Timer = 0;
+ } else SpellCorrupt_Timer -= diff;
}
- void UpdateAI(uint32 diff) override
+ if (Check_Timer)
{
- if (SpellCorrupt_Timer)
+ if (Check_Timer <= diff)
{
- if (SpellCorrupt_Timer <= diff)
+ uint32 pct = instance->GetData(DATA_SHIELD);
+
+ Check_Timer = 5000;
+
+ if (Life25 && pct <= 25)
{
- instance->SetData(TYPE_MEDIVH, SPECIAL);
-
- if (me->HasAura(SPELL_CORRUPT_AEONUS))
- SpellCorrupt_Timer = 1000;
- else if (me->HasAura(SPELL_CORRUPT))
- SpellCorrupt_Timer = 3000;
- else
- SpellCorrupt_Timer = 0;
- } else SpellCorrupt_Timer -= diff;
- }
+ Talk(SAY_WEAK25);
+ Life25 = false;
+ }
+ else if (Life50 && pct <= 50)
+ {
+ Talk(SAY_WEAK50);
+ Life50 = false;
+ }
+ else if (Life75 && pct <= 75)
+ {
+ Talk(SAY_WEAK75);
+ Life75 = false;
+ }
- if (Check_Timer)
- {
- if (Check_Timer <= diff)
+ //if we reach this it means event was running but at some point reset.
+ if (instance->GetData(TYPE_MEDIVH) == NOT_STARTED)
{
- uint32 pct = instance->GetData(DATA_SHIELD);
-
- Check_Timer = 5000;
-
- if (Life25 && pct <= 25)
- {
- Talk(SAY_WEAK25);
- Life25 = false;
- }
- else if (Life50 && pct <= 50)
- {
- Talk(SAY_WEAK50);
- Life50 = false;
- }
- else if (Life75 && pct <= 75)
- {
- Talk(SAY_WEAK75);
- Life75 = false;
- }
-
- //if we reach this it means event was running but at some point reset.
- if (instance->GetData(TYPE_MEDIVH) == NOT_STARTED)
- {
- me->DespawnOrUnsummon();
- me->Respawn();
- return;
- }
-
- if (instance->GetData(TYPE_RIFT) == DONE)
- {
- Talk(SAY_WIN);
- Check_Timer = 0;
-
- if (me->HasAura(SPELL_CHANNEL))
- me->RemoveAura(SPELL_CHANNEL);
-
- /// @todo start the post-event here
- instance->SetData(TYPE_MEDIVH, DONE);
- }
- } else Check_Timer -= diff;
- }
+ me->DespawnOrUnsummon();
+ me->Respawn();
+ return;
+ }
- //if (!UpdateVictim())
- //return;
+ if (instance->GetData(TYPE_RIFT) == DONE)
+ {
+ Talk(SAY_WIN);
+ Check_Timer = 0;
- //DoMeleeAttackIfReady();
+ if (me->HasAura(SPELL_CHANNEL))
+ me->RemoveAura(SPELL_CHANNEL);
+
+ /// @todo start the post-event here
+ instance->SetData(TYPE_MEDIVH, DONE);
+ }
+ } else Check_Timer -= diff;
}
- };
+ //if (!UpdateVictim())
+ //return;
+
+ //DoMeleeAttackIfReady();
+ }
};
struct Wave
@@ -294,116 +282,104 @@ static Wave PortalWaves[]=
{ {NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_ASSASIN} }
};
-class npc_time_rift : public CreatureScript
+struct npc_time_rift : public ScriptedAI
{
-public:
- npc_time_rift() : CreatureScript("npc_time_rift") { }
-
- CreatureAI* GetAI(Creature* creature) const override
+ npc_time_rift(Creature* creature) : ScriptedAI(creature)
{
- return GetBlackMorassAI<npc_time_riftAI>(creature);
+ Initialize();
+ instance = creature->GetInstanceScript();
}
- struct npc_time_riftAI : public ScriptedAI
+ void Initialize()
{
- npc_time_riftAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
+ TimeRiftWave_Timer = 15000;
+ mRiftWaveCount = 0;
+ mWaveId = 0;
+ }
- void Initialize()
- {
- TimeRiftWave_Timer = 15000;
- mRiftWaveCount = 0;
- mWaveId = 0;
- }
+ InstanceScript* instance;
- InstanceScript* instance;
+ uint32 TimeRiftWave_Timer;
+ uint8 mRiftWaveCount;
+ uint8 mWaveId;
- uint32 TimeRiftWave_Timer;
- uint8 mRiftWaveCount;
- uint8 mWaveId;
+ void Reset() override
+ {
+ Initialize();
- void Reset() override
- {
- Initialize();
+ uint8 mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
- uint8 mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
+ if (mPortalCount < 6)
+ mWaveId = 0;
+ else if (mPortalCount > 12)
+ mWaveId = 2;
+ else mWaveId = 1;
- if (mPortalCount < 6)
- mWaveId = 0;
- else if (mPortalCount > 12)
- mWaveId = 2;
- else mWaveId = 1;
+ }
+ void JustEngagedWith(Unit* /*who*/) override { }
- }
- void JustEngagedWith(Unit* /*who*/) override { }
+ void DoSummonAtRift(uint32 creature_entry)
+ {
+ if (!creature_entry)
+ return;
- void DoSummonAtRift(uint32 creature_entry)
+ if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
{
- if (!creature_entry)
- return;
-
- if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
- {
- me->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- return;
- }
-
- Position pos = me->GetRandomNearPosition(10.0f);
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAllAuras();
+ return;
+ }
- //normalize Z-level if we can, if rift is not at ground level.
- pos.m_positionZ = std::max(me->GetMap()->GetHeight(pos.m_positionX, pos.m_positionY, MAX_HEIGHT), me->GetMap()->GetWaterLevel(pos.m_positionX, pos.m_positionY));
+ Position pos = me->GetRandomNearPosition(10.0f);
- if (Unit* Summon = DoSummon(creature_entry, pos, 30s, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT))
- if (Unit* temp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MEDIVH)))
- AddThreat(temp, 0.0f, Summon);
- }
+ //normalize Z-level if we can, if rift is not at ground level.
+ pos.m_positionZ = std::max(me->GetMap()->GetHeight(pos.m_positionX, pos.m_positionY, MAX_HEIGHT), me->GetMap()->GetWaterLevel(pos.m_positionX, pos.m_positionY));
- void DoSelectSummon()
- {
- if ((mRiftWaveCount > 2 && mWaveId < 1) || mRiftWaveCount > 3)
- mRiftWaveCount = 0;
+ if (Unit* Summon = DoSummon(creature_entry, pos, 30s, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT))
+ if (Unit* temp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MEDIVH)))
+ AddThreat(temp, 0.0f, Summon);
+ }
- uint32 entry = 0;
+ void DoSelectSummon()
+ {
+ if ((mRiftWaveCount > 2 && mWaveId < 1) || mRiftWaveCount > 3)
+ mRiftWaveCount = 0;
- entry = PortalWaves[mWaveId].PortalMob[mRiftWaveCount];
- TC_LOG_DEBUG("scripts", "npc_time_rift: summoning wave Creature (Wave %u, Entry %u).", mRiftWaveCount, entry);
+ uint32 entry = 0;
- ++mRiftWaveCount;
+ entry = PortalWaves[mWaveId].PortalMob[mRiftWaveCount];
+ TC_LOG_DEBUG("scripts", "npc_time_rift: summoning wave Creature (Wave %u, Entry %u).", mRiftWaveCount, entry);
- if (entry == NPC_INFINITE_WHELP)
- {
- for (uint8 i = 0; i < 3; ++i)
- DoSummonAtRift(entry);
- } else DoSummonAtRift(entry);
- }
+ ++mRiftWaveCount;
- void UpdateAI(uint32 diff) override
+ if (entry == NPC_INFINITE_WHELP)
{
- if (TimeRiftWave_Timer <= diff)
- {
- DoSelectSummon();
- TimeRiftWave_Timer = 15000;
- } else TimeRiftWave_Timer -= diff;
+ for (uint8 i = 0; i < 3; ++i)
+ DoSummonAtRift(entry);
+ } else DoSummonAtRift(entry);
+ }
- if (me->IsNonMeleeSpellCast(false))
- return;
+ void UpdateAI(uint32 diff) override
+ {
+ if (TimeRiftWave_Timer <= diff)
+ {
+ DoSelectSummon();
+ TimeRiftWave_Timer = 15000;
+ } else TimeRiftWave_Timer -= diff;
- TC_LOG_DEBUG("scripts", "npc_time_rift: not casting anylonger, i need to die.");
- me->setDeathState(JUST_DIED);
+ if (me->IsNonMeleeSpellCast(false))
+ return;
- if (instance->GetData(TYPE_RIFT) == IN_PROGRESS)
- instance->SetData(TYPE_RIFT, SPECIAL);
- }
- };
+ TC_LOG_DEBUG("scripts", "npc_time_rift: not casting anylonger, i need to die.");
+ me->setDeathState(JUST_DIED);
+ if (instance->GetData(TYPE_RIFT) == IN_PROGRESS)
+ instance->SetData(TYPE_RIFT, SPECIAL);
+ }
};
void AddSC_the_black_morass()
{
- new npc_medivh_bm();
- new npc_time_rift();
+ RegisterBlackMorassCreatureAI(npc_medivh_bm);
+ RegisterBlackMorassCreatureAI(npc_time_rift);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
index 16328a47d19..1fd4bd52625 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
@@ -73,4 +73,6 @@ inline AI* GetBlackMorassAI(T* obj)
return GetInstanceAI<AI>(obj, TBMScriptName);
}
+#define RegisterBlackMorassCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBlackMorassAI)
+
#endif