diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp | 214 | ||||
-rw-r--r-- | src/server/scripts/Outland/TempestKeep/Eye/the_eye.h | 2 |
2 files changed, 99 insertions, 117 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 74426a10c9c..91aba64264d 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -15,12 +15,12 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ScriptMgr.h" +#include "the_eye.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" -#include "the_eye.h" +#include "ScriptMgr.h" -enum Yells +enum ReaverTexts { SAY_AGGRO = 0, SAY_SLAY = 1, @@ -28,7 +28,7 @@ enum Yells SAY_POUNDING = 3 }; -enum Spells +enum ReaverSpells { SPELL_POUNDING = 34162, SPELL_ARCANE_ORB = 34172, @@ -36,7 +36,7 @@ enum Spells SPELL_BERSERK = 27680 }; -enum Events +enum ReaverEvents { EVENT_POUNDING = 1, EVENT_ARCANE_ORB, @@ -44,131 +44,111 @@ enum Events EVENT_BERSERK }; -class boss_void_reaver : public CreatureScript +struct boss_void_reaver : public BossAI { - public: - boss_void_reaver() : CreatureScript("boss_void_reaver") { } - - struct boss_void_reaverAI : public BossAI + boss_void_reaver(Creature* creature) : BossAI(creature, DATA_VOID_REAVER), _enraged(false) { } + + void Reset() override + { + _Reset(); + _enraged = false; + } + + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + me->CallForHelp(120.0f); + + events.ScheduleEvent(EVENT_POUNDING, 15s); + events.ScheduleEvent(EVENT_ARCANE_ORB, 3s); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 30s); + events.ScheduleEvent(EVENT_BERSERK, 10min); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_VOID_REAVER) - { - Initialize(); - } - - void Initialize() - { - Enraged = false; - } - - void Reset() override - { - Initialize(); - _Reset(); - } - - void KilledUnit(Unit* /*victim*/) override + switch (eventId) { - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - DoZoneInCombat(); - _JustDied(); - } - - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - me->CallForHelp(120.0f); - - events.ScheduleEvent(EVENT_POUNDING, 15s); - events.ScheduleEvent(EVENT_ARCANE_ORB, 3s); - events.ScheduleEvent(EVENT_KNOCK_AWAY, 30s); - events.ScheduleEvent(EVENT_BERSERK, 10min); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + case EVENT_POUNDING: + DoCastVictim(SPELL_POUNDING); + Talk(SAY_POUNDING); + events.ScheduleEvent(EVENT_POUNDING, 15s); + break; + case EVENT_ARCANE_ORB: { - switch (eventId) + std::vector<Unit*> target_list; + for (auto* ref : me->GetThreatManager().GetUnsortedThreatList()) { - case EVENT_POUNDING: - DoCastVictim(SPELL_POUNDING); - Talk(SAY_POUNDING); - events.ScheduleEvent(EVENT_POUNDING, 15s); - break; - case EVENT_ARCANE_ORB: - { - std::vector<Unit*> target_list; - for (auto* ref : me->GetThreatManager().GetUnsortedThreatList()) - { - Unit* target = ref->GetVictim(); - if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false)) - target_list.push_back(target); - } - - Unit* target; - if (!target_list.empty()) - target = *(target_list.begin() + rand32() % target_list.size()); - else - target = me->GetVictim(); - - if (target) - me->CastSpell(target, SPELL_ARCANE_ORB); - - events.ScheduleEvent(EVENT_ARCANE_ORB, 3s); - break; - } - case EVENT_KNOCK_AWAY: - DoCastVictim(SPELL_KNOCK_AWAY); - // Drop 25% aggro - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(me->GetVictim(), -25); - - events.ScheduleEvent(EVENT_KNOCK_AWAY, 30s); - break; - case EVENT_BERSERK: - if (!Enraged) - { - DoCast(me, SPELL_BERSERK); - Enraged = true; - } - break; - default: - break; + Unit* target = ref->GetVictim(); + if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false)) + target_list.push_back(target); } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + Unit* target; + if (!target_list.empty()) + target = *(target_list.begin() + rand32() % target_list.size()); + else + target = me->GetVictim(); - DoMeleeAttackIfReady(); - } + if (target) + me->CastSpell(target, SPELL_ARCANE_ORB); - private: - bool Enraged; - }; + events.ScheduleEvent(EVENT_ARCANE_ORB, 3s); + break; + } + case EVENT_KNOCK_AWAY: + DoCastVictim(SPELL_KNOCK_AWAY); + // Drop 25% aggro + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -25); + + events.ScheduleEvent(EVENT_KNOCK_AWAY, 30s); + break; + case EVENT_BERSERK: + if (!_enraged) + { + DoCastSelf(SPELL_BERSERK); + _enraged = true; + } + break; + default: + break; + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetTheEyeAI<boss_void_reaverAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } + +private: + bool _enraged; }; void AddSC_boss_void_reaver() { - new boss_void_reaver(); + RegisterTheEyeCreatureAI(boss_void_reaver); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h index 3cc84c659a9..1c37673a85c 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h +++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h @@ -71,4 +71,6 @@ inline AI* GetTheEyeAI(T* obj) return GetInstanceAI<AI>(obj, TheEyeScriptName); } +#define RegisterTheEyeCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetTheEyeAI) + #endif |