void BossAI::_DoAggroPulse(const uint32 diff) { if(inFightAggroCheck_Timer < diff) { if(me->getVictim()->ToPlayer()) DoAttackerGroupInCombat(me->getVictim()->ToPlayer()); inFightAggroCheck_Timer = MAX_AGGRO_PULSE_TIMER; }else inFightAggroCheck_Timer -= diff; }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ENRAGE: DoScriptText(SAY_MOLGEIM_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_PULSE: if (me->getVictim() && me->getVictim()->ToPlayer()) DoAttackerGroupInCombat(me->getVictim()->ToPlayer()); events.ScheduleEvent(EVENT_PULSE, 5000); break; case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly { Unit* target = DoSelectLowestHpFriendly(60); if (!target || !target->isAlive()) target = me; DoCast(target, SPELL_SUMMON_RUNE_OF_POWER); events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000); break; } case EVENT_SHIELD_OF_RUNES: DoCast(me, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H)); events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000, 34000)); break; case EVENT_RUNE_OF_DEATH: DoScriptText(SAY_MOLGEIM_RUNE_DEATH, me); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_RUNE_OF_DEATH); events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000, 40000)); break; case EVENT_RUNE_OF_SUMMONING: DoScriptText(SAY_MOLGEIM_SUMMON, me); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_RUNE_OF_SUMMONING); events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000, 30000)); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ENRAGE: DoScriptText(SAY_STEELBREAKER_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_PULSE: if (me->getVictim() && me->getVictim()->ToPlayer()) DoAttackerGroupInCombat(me->getVictim()->ToPlayer()); events.ScheduleEvent(EVENT_PULSE, 5000); break; case EVENT_FUSION_PUNCH: DoCastVictim(RAID_MODE(SPELL_FUSION_PUNCH, SPELL_FUSION_PUNCH_H)); events.ScheduleEvent(EVENT_FUSION_PUNCH, urand(13000, 22000)); break; case EVENT_STATIC_DISRUPTION: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, RAID_MODE(SPELL_STATIC_DISRUPTION, SPELL_STATIC_DISRUPTION_H)); events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(20000, 40000)); break; case EVENT_OVERWHELMING_POWER: DoScriptText(SAY_STEELBREAKER_POWER, me); DoCastVictim(RAID_MODE(SPELL_OVERWHELMING_POWER, SPELL_OVERWHELMING_POWER_H)); events.ScheduleEvent(EVENT_OVERWHELMING_POWER, RAID_MODE(60000, 35000)); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_ENRAGE: DoScriptText(SAY_BRUNDIR_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_PULSE: if (me->getVictim() && me->getVictim()->ToPlayer()) DoAttackerGroupInCombat(me->getVictim()->ToPlayer()); events.ScheduleEvent(EVENT_PULSE, 5000); break; case EVENT_CHAIN_LIGHTNING: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, RAID_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H)); events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(3000, 5000), 1); break; case EVENT_OVERLOAD: DoCast(RAID_MODE(SPELL_OVERLOAD, SPELL_OVERLOAD_H)); events.ScheduleEvent(EVENT_OVERLOAD, urand(60000, 80000), 1); break; case EVENT_LIGHTNING_WHIRL: DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL, SPELL_LIGHTNING_WHIRL_H)); events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000, 40000), 1); break; case EVENT_THREAT_WIPE: DoResetThreat(); events.ScheduleEvent(EVENT_THREAT_WIPE, 5000); break; case EVENT_LIGHTNING_TENDRILS_START: me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H)); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->SendMovementFlagUpdate(); events.DelayEvents(35000, 1); events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS_END, 30000); events.ScheduleEvent(EVENT_THREAT_WIPE, 0); break; case EVENT_LIGHTNING_TENDRILS_END: me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->SendMovementFlagUpdate(); me->RemoveAurasDueToSpell(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H)); events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS_START, urand(40000, 80000)); events.CancelEvent(EVENT_THREAT_WIPE); break; } } if (!me->HasAura(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H))) DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(pulse_Timer < diff) { if(me->getVictim() && me->getVictim()->GetTypeId() == TYPEID_PLAYER) DoAttackerGroupInCombat(((Player*)me->getVictim())); else DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 5000; }else pulse_Timer -= diff; if(!me->HasAura(SPELL_BERSERK, 0)) { if(BerserkTimer < diff) DoCast(me, SPELL_BERSERK); else BerserkTimer -= diff; } if(SummonFlameTimer < diff) { DoCast(me, SPELL_MOLTEN_PUNCH); SummonFlameTimer = 10000; }else SummonFlameTimer -= diff; if(Phase1) { if(HatefulStrikeTimer < diff) { if(Unit* target = CalculateHatefulStrikeTarget()) { DoCast(target, SPELL_HATEFUL_STRIKE); HatefulStrikeTimer = 5000; } }else HatefulStrikeTimer -= diff; } if(!Phase1) { if(SwitchTargetTimer < diff) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) { if(me->GetDistance2d(me->getVictim()) < 40) me->CastSpell(me->getVictim(),SPELL_CHARGE,false); DoResetThreat(); me->AddThreat(target, 5000000.0f); DoScriptText(EMOTE_NEW_TARGET, me); SwitchTargetTimer = 10000; } }else SwitchTargetTimer -= diff; if(SummonVolcanoTimer < diff) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true)) { DoCast(target, SPELL_VOLCANIC_SUMMON); DoScriptText(EMOTE_GROUND_CRACK, me); SummonVolcanoTimer = 10000; } }else SummonVolcanoTimer -= diff; } if(PhaseSwitchTimer < diff) { if(!Phase1) { Phase1 = true; DoResetThreat(); PhaseSwitchTimer = 60000; me->SetSpeed(MOVE_RUN, 1.2f); DoZoneInCombat(); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, false); } else { Phase1 = false; DoResetThreat(); SwitchTargetTimer = 10000; SummonVolcanoTimer = 2000; PhaseSwitchTimer = 60000; me->SetSpeed(MOVE_RUN, 0.9f); DoZoneInCombat(); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true); } }else PhaseSwitchTimer -= diff; DoMeleeAttackIfReady(); }