diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp index e9ea9bf9a..8b56e781c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp @@ -21,6 +21,7 @@ enum Spells { + SPELL_THRASH = 3391, SPELL_SNAPKICK = 15618, SPELL_CLEAVE = 15284, SPELL_UPPERCUT = 10966, @@ -32,11 +33,26 @@ enum Spells enum Events { EVENT_SNAP_KICK = 1, - EVENT_CLEAVE = 2, - EVENT_UPPERCUT = 3, - EVENT_MORTAL_STRIKE = 4, - EVENT_PUMMEL = 5, - EVENT_THROW_AXE = 6 + EVENT_CLEAVE, + EVENT_UPPERCUT, + EVENT_MORTAL_STRIKE, + EVENT_PUMMEL, + EVENT_THROW_AXE, + EVENT_THRASH +}; + +enum Phases +{ + PHASE_THRASHER = 1, + PHASE_BRAWLER, + PHASE_WARMASTER, +}; + +enum EventGroups +{ + GROUP_THRASHER = 1, + GROUP_BRAWLER, + GROUP_WARMASTER }; class boss_warmaster_voone : public CreatureScript @@ -48,68 +64,67 @@ public: { boss_warmastervooneAI(Creature* creature) : BossAI(creature, DATA_WARMASTER_VOONE) { } - void Reset() override - { - _Reset(); - } - void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - events.ScheduleEvent(EVENT_SNAP_KICK, 8 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_CLEAVE, 14 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_UPPERCUT, 20 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_PUMMEL, 32 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_THROW_AXE, 1 * IN_MILLISECONDS); + + events.SetPhase(PHASE_BRAWLER); + events.ScheduleEvent(EVENT_THRASH, 3 * IN_MILLISECONDS, GROUP_BRAWLER, PHASE_BRAWLER); + events.ScheduleEvent(EVENT_THROW_AXE, 1 * IN_MILLISECONDS, GROUP_BRAWLER, PHASE_BRAWLER); } - void JustDied(Unit* /*killer*/) override + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override { - _JustDied(); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + if (me->HealthBelowPctDamaged(65, damage) && events.IsInPhase(PHASE_BRAWLER)) { - switch (eventId) - { - case EVENT_SNAP_KICK: - DoCastVictim(SPELL_SNAPKICK); - events.ScheduleEvent(EVENT_SNAP_KICK, 6 * IN_MILLISECONDS); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 12 * IN_MILLISECONDS); - break; - case EVENT_UPPERCUT: - DoCastVictim(SPELL_UPPERCUT); - events.ScheduleEvent(EVENT_UPPERCUT, 14 * IN_MILLISECONDS); - break; - case EVENT_MORTAL_STRIKE: - DoCastVictim(SPELL_MORTALSTRIKE); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10 * IN_MILLISECONDS); - break; - case EVENT_PUMMEL: - DoCastVictim(SPELL_PUMMEL); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 16 * IN_MILLISECONDS); - break; - case EVENT_THROW_AXE: - DoCastVictim(SPELL_THROWAXE); - events.ScheduleEvent(EVENT_THROW_AXE, 8 * IN_MILLISECONDS); - break; - } + events.SetPhase(PHASE_THRASHER); + events.CancelEventGroup(GROUP_BRAWLER); + events.ScheduleEvent(EVENT_CLEAVE, 14 * IN_MILLISECONDS, GROUP_THRASHER, PHASE_THRASHER); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12 * IN_MILLISECONDS, GROUP_THRASHER, PHASE_THRASHER); + } + else if (me->HealthBelowPctDamaged(40, damage) && events.IsInPhase(PHASE_THRASHER)) + { + events.SetPhase(PHASE_WARMASTER); + events.CancelEventGroup(GROUP_THRASHER); + events.ScheduleEvent(EVENT_SNAP_KICK, 8 * IN_MILLISECONDS, GROUP_WARMASTER, PHASE_WARMASTER); + events.ScheduleEvent(EVENT_UPPERCUT, 20 * IN_MILLISECONDS, GROUP_WARMASTER, PHASE_WARMASTER); + events.ScheduleEvent(EVENT_PUMMEL, 32 * IN_MILLISECONDS, GROUP_WARMASTER, PHASE_WARMASTER); + } + } + + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) + { + case EVENT_SNAP_KICK: + DoCastVictim(SPELL_SNAPKICK); + events.RepeatEvent(6 * IN_MILLISECONDS); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.RepeatEvent(12 * IN_MILLISECONDS); + break; + case EVENT_UPPERCUT: + DoCastVictim(SPELL_UPPERCUT); + events.RepeatEvent(14 * IN_MILLISECONDS); + break; + case EVENT_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTALSTRIKE); + events.RepeatEvent(10 * IN_MILLISECONDS); + break; + case EVENT_PUMMEL: + DoCastVictim(SPELL_PUMMEL); + events.RepeatEvent(16 * IN_MILLISECONDS); + break; + case EVENT_THROW_AXE: + DoCastRandomTarget(SPELL_THROWAXE); + events.RepeatEvent(8 * IN_MILLISECONDS); + break; + case EVENT_THRASH: + DoCastSelf(SPELL_THRASH); + events.RepeatEvent(10 * IN_MILLISECONDS); + break; } - DoMeleeAttackIfReady(); } };