예제 #1
0
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;
}
예제 #2
0
        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();
        }
예제 #3
0
        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();
        }
예제 #4
0
        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();
        }
예제 #5
0
        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();
        }