/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "zulgurub.h" enum Spells { SPELL_AVATAR = 24646, // Enrage Spell SPELL_GROUND_TREMOR = 6524, SPELL_ENTANGLING_ROOTS = 24648, SPELL_SWEEPING_STRIKES = 18765 }; enum Events { EVENT_AVATAR = 1, EVENT_GROUND_TREMOR = 2, EVENT_START_PURSUIT = 3, EVENT_STOP_PURSUIT = 4, EVENT_ENTANGLING_ROOTS = 5, EVENT_SWEEPING_STRIKES = 6 }; class boss_grilek : public CreatureScript // grilek { public: boss_grilek() : CreatureScript("boss_grilek") { } struct boss_grilekAI : public BossAI { boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } void Reset() override { _pursuitTargetGUID.Clear(); BossAI::Reset(); } void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); events.ScheduleEvent(EVENT_AVATAR, 20s, 30s); events.ScheduleEvent(EVENT_GROUND_TREMOR, 15s, 25s); events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 5s, 15s); events.ScheduleEvent(EVENT_SWEEPING_STRIKES, 30s); } void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_AVATAR: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { _pursuitTargetGUID = target->GetGUID(); } DoCast(me, SPELL_AVATAR); me->SetReactState(REACT_PASSIVE); DoResetThreatList(); events.ScheduleEvent(EVENT_START_PURSUIT, 2s); events.ScheduleEvent(EVENT_STOP_PURSUIT, 15s); events.ScheduleEvent(EVENT_AVATAR, 45s, 50s); break; case EVENT_GROUND_TREMOR: DoCastVictim(SPELL_GROUND_TREMOR, true); events.ScheduleEvent(EVENT_GROUND_TREMOR, 12s, 16s); break; case EVENT_START_PURSUIT: me->SetReactState(REACT_AGGRESSIVE); if (Unit* pursuitTarget = ObjectAccessor::GetUnit(*me, _pursuitTargetGUID)) { me->GetThreatMgr().AddThreat(pursuitTarget, 1000000.f); } break; case EVENT_STOP_PURSUIT: if (Unit* pursuitTarget = ObjectAccessor::GetUnit(*me, _pursuitTargetGUID)) { _pursuitTargetGUID.Clear(); me->GetThreatMgr().AddThreat(pursuitTarget, -1000000.f); } break; case EVENT_ENTANGLING_ROOTS: DoCastVictim(SPELL_ENTANGLING_ROOTS); events.ScheduleEvent(EVENT_ENTANGLING_ROOTS, 10s, 20s); break; case EVENT_SWEEPING_STRIKES: DoCastSelf(SPELL_SWEEPING_STRIKES, true); events.ScheduleEvent(EVENT_SWEEPING_STRIKES, 30s); break; default: break; } } DoMeleeAttackIfReady(); } private: ObjectGuid _pursuitTargetGUID; }; CreatureAI* GetAI(Creature* creature) const override { return GetZulGurubAI(creature); } }; void AddSC_boss_grilek() { new boss_grilek(); }