diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f9ea720a8..da4a0af99 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15737,9 +15737,9 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u else // For attacker { // Overpower on victim dodge - if (procExtra & PROC_EX_DODGE ) + if (procExtra & PROC_EX_DODGE) { - if (GetTypeId() == TYPEID_PLAYER && getClass() == CLASS_WARRIOR) + if (getClass() == CLASS_WARRIOR) { AddComboPoints(target, 1); StartReactiveTimer(REACTIVE_OVERPOWER); @@ -16530,8 +16530,10 @@ void Unit::UpdateReactives(uint32 p_time) ModifyAuraState(AURA_STATE_HUNTER_PARRY, false); break; case REACTIVE_OVERPOWER: - if (getClass() == CLASS_WARRIOR && GetTypeId() == TYPEID_PLAYER) + if (getClass() == CLASS_WARRIOR) + { ClearComboPoints(); + } break; case REACTIVE_WOLVERINE_BITE: if (IsHunterPet()) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 42f0f1cc6..4a262e2ad 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -142,6 +142,7 @@ public: instance->SetBossState(DATA_OHGAN, NOT_STARTED); me->Mount(MODEL_OHGAN_MOUNT); reviveGUID.Clear(); + _useExecute = false; } void JustDied(Unit* /*killer*/) override @@ -161,14 +162,13 @@ public: void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 8000)); + events.ScheduleEvent(EVENT_OVERPOWER, 1000); events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(14000, 28000)); events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000)); events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 24000)); events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(30000, 40000)); - events.ScheduleEvent(EVENT_EXECUTE, urand(7000, 14000)); - events.ScheduleEvent(EVENT_CLEAVE, urand(10000, 20000)); + events.ScheduleEvent(EVENT_CLEAVE, 1000); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); Talk(SAY_AGGRO); me->Dismount(); @@ -243,6 +243,26 @@ public: } } + void DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType /*damagetype*/) override + { + if (doneTo && doneTo == me->GetVictim()) + { + if (doneTo->HealthBelowPctDamaged(20, damage)) + { + if (!_useExecute) + { + _useExecute = true; + events.ScheduleEvent(EVENT_EXECUTE, 1000); + } + } + else if (_useExecute) + { + _useExecute = false; + events.CancelEvent(EVENT_EXECUTE); + } + } + } + void UpdateAI(uint32 diff) override { events.Update(diff); @@ -285,8 +305,14 @@ public: switch (eventId) { case EVENT_OVERPOWER: - DoCastVictim(SPELL_OVERPOWER); - events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 8000)); + if (DoCastVictim(SPELL_OVERPOWER) == SPELL_CAST_OK) + { + events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 8000)); + } + else + { + events.ScheduleEvent(EVENT_OVERPOWER, 1000); + } break; case EVENT_MORTAL_STRIKE: DoCastVictim(SPELL_MORTAL_STRIKE); @@ -325,10 +351,7 @@ public: events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(30000, 40000)); break; case EVENT_EXECUTE: - if (me->GetVictim() && me->GetVictim()->HealthBelowPct(20)) - { - DoCastVictim(SPELL_EXECUTE, true); - } + DoCastVictim(SPELL_EXECUTE, true); events.ScheduleEvent(EVENT_EXECUTE, urand(7000, 14000)); break; case EVENT_FRIGHTENING_SHOUT: @@ -349,8 +372,12 @@ public: if (meleeRangeTargets.size() >= 5) { DoCastVictim(SPELL_MANDOKIR_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, urand(10000, 20000)); + } + else + { + events.ScheduleEvent(EVENT_CLEAVE, 1000); } - events.ScheduleEvent(EVENT_CLEAVE, urand(10000, 20000)); break; } default: @@ -364,6 +391,7 @@ public: uint8 killCount; ObjectGuid chainedSpiritGUIDs[CHAINED_SPIRIT_COUNT]; ObjectGuid reviveGUID; + bool _useExecute; }; CreatureAI* GetAI(Creature* creature) const override