diff options
Diffstat (limited to 'src')
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 |