Ejemplo n.º 1
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_SPEED, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_SPELL_SHIELD:
                {
                    ForceSpellCast(me, SPELL_SPELLSHIELD);
                    events.ScheduleEvent(eventId, 31000);
                    break;
                }
                case EVENT_BLAST_WAVE:
                {
                    if (Unit *pTarget = SelectUnit(SELECT_TARGET_NEAREST, 0, 15.0f, true))
                        ForceSpellCast(SPELL_BLAST_WAVE, CAST_SELF);

                    events.ScheduleEvent(eventId, urand(3000, 5000));
                    break;
                }
            }
        }

        CheckCasterNoMovementInRange(diff, 42.0f);
        CastNextSpellIfAnyAndReady(diff);
    }
Ejemplo n.º 2
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_SPEED, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_HEAL:
                {
                    AddSpellToCast(SPELL_HEAL, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(10000, 35000));
                    break;
                }
                case EVENT_SHIELD:
                {
                    AddSpellToCast(SPELL_GREATER_PW_SHIELD, CAST_SELF);
                    AddSpellToCast(SPELL_PRAYEROFHEALING, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(30000, 40000));
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 3
0
    void UpdateAI(const uint32 diff)
    {
        if (TransitionTimer)
        {
            if (TransitionTimer <= diff)
            {
                if(Unit* Muru = me->GetUnit(pInstance->GetData64(DATA_MURU)))
                {
                    Muru->SetVisibility(VISIBILITY_OFF);
                    Muru->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                }
                me->SetRooted(false);
                AttackStart(me->getVictim());
                DoCast(me, SPELL_NEGATIVE_ENERGY_PERIODIC_E);
                TransitionTimer = 0;
            }
            else
                TransitionTimer -= diff;
            return;
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_EVADE, 100.0f);

        if (EnrageTimer < diff)
        {
            AddSpellToCast(me, SPELL_ENRAGE);
            EnrageTimer = 60000;
        }
        else
            EnrageTimer -= diff;

        if (DarknessTimer < diff)
        {
            if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true))
                AddSpellToCast(target, SPELL_DARKNESS);
            DarknessTimer = 15000;
        }
        else
            DarknessTimer -= diff;

        if (BlackHole < diff)
        {
            if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true, me->getVictimGUID(), 10.0))
                AddSpellToCast(target, SPELL_BLACK_HOLE);
            BlackHole = urand(15000, 18000);
        }
        else
            BlackHole -= diff;

        DoMeleeAttackIfReady();
        CastNextSpellIfAnyAndReady();
    }
Ejemplo n.º 4
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_CORRUPTED_MIND:
                {
                    AddSpellToCast(SPELL_CORRUPTED_MIND, CAST_NULL);
                    events.ScheduleEvent(EVENT_CORRUPTED_MIND, 62000);
                    break;
                }
                case EVENT_POISON_AURA:
                {
                    AddSpellToCast(SPELL_POISON_AURA, CAST_NULL);
                    events.ScheduleEvent(EVENT_POISON_AURA, 12000);
                    break;
                }
                case EVENT_INEVITABLE_DOOM_5MIN:
                {
                    inevitableTimer = 15000;
                    break;
                }
                case EVENT_INEVITABLE_DOOM:
                {
                    AddSpellToCast(SPELL_INEVITABLE_DOOM, CAST_NULL);
                    events.ScheduleEvent(EVENT_INEVITABLE_DOOM, inevitableTimer);
                    break;
                }
                case EVENT_REMOVE_CURSE:
                {
                    AddSpellToCast(SPELL_REMOVE_CURSE, CAST_SELF);
                    events.ScheduleEvent(EVENT_REMOVE_CURSE, 30000);
                    break;
                }
                case EVENT_SUMMON_SPORE:
                {
                    for (uint8 i = 0; i < 3; ++i)
                        m_creature->SummonCreature(16286, SporesLocations[i][0], SporesLocations[i][1], SporesLocations[i][2], 0, TEMPSUMMON_TIMED_DESPAWN, 12000);
                    break;
                }
                default:
                    break;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 60.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
            case EVENT_BLAU_MARK:
            {
                AddSpellToCast(SPELL_MARK_OF_BLAUMEUX, CAST_NULL);
                events.ScheduleEvent(EVENT_BLAU_MARK, 12000);
                break;
            }
            case EVENT_BLAU_VOID_ZONE:
            {
                if (Unit * tmpUnit = SelectUnit(SELECT_TARGET_RANDOM, 0, 45.0f))
                    AddSpellToCast(tmpUnit, SPELL_VOID_ZONE);
                events.ScheduleEvent(EVENT_BLAU_VOID_ZONE, 12000);
                break;
            }
            default:
                break;
            }
        }

        // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
        if (!ShieldWall1)
        {
            if (HealthBelowPct(50))
            {
                AddSpellToCast(SPELL_SHIELDWALL, CAST_SELF);
                ShieldWall1 = true;
            }
        }
        else
        {
            if (!ShieldWall2 && HealthBelowPct(20))
            {
                AddSpellToCast(SPELL_SHIELDWALL, CAST_SELF);
                ShieldWall2 = true;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 60.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
            case EVENT_ZELIEK_MARK:
            {
                AddSpellToCast(SPELL_MARK_OF_ZELIEK, CAST_NULL);
                events.ScheduleEvent(EVENT_ZELIEK_MARK, 12000);
                break;
            }
            case EVENT_ZELIEK_WRATH:
            {
                AddSpellToCast(SPELL_HOLY_WRATH, CAST_TANK);
                events.ScheduleEvent(EVENT_ZELIEK_WRATH, 12000);
                break;
            }
            default:
                break;
            }
        }

        // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
        if (!ShieldWall1)
        {
            if (HealthBelowPct(50))
            {
                AddSpellToCast(SPELL_SHIELDWALL, CAST_SELF);
                ShieldWall1 = true;
            }
        }
        else
        {
            if (!ShieldWall2 && HealthBelowPct(20))
            {
                AddSpellToCast(SPELL_SHIELDWALL, CAST_SELF);
                ShieldWall2 = true;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 7
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 120.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_IMPALE:
                {
                    //Cast Impale on a random target
                    //Do NOT cast it when we are afflicted by locust swarm
                    if (!m_creature->HasAura(SPELL_LOCUSTSWARM,1))
                        AddSpellToCast(SPELL_IMPALE, CAST_RANDOM);

                    events.ScheduleEvent(EVENT_IMPALE, 15000);
                    break;
                }
                case EVENT_SWARM:
                {
                    AddSpellToCast(SPELL_LOCUSTSWARM, CAST_SELF);
                    events.ScheduleEvent(EVENT_SWARM, 90000);
                    break;
                }
                case EVENT_SUMMON:
                {
                    AddSpellToCast(SPELL_SUMMONGUARD, CAST_SELF);
                    events.ScheduleEvent(EVENT_SUMMON, 45000);
                    break;
                }
                default:
                    break;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 8
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_EVADE, 100.0f);

        events.Update(diff);

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_UNBALANCING_STRIKE:
                {
                    AddSpellToCast(SPELL_UNBALANCINGSTRIKE, CAST_TANK);
                    events.ScheduleEvent(EVENT_UNBALANCING_STRIKE, 30000);
                    break;
                }
                case EVENT_DISTRUPTING_SHOUT:
                {
                    AddSpellToCast(SPELL_DISRUPTINGSHOUT, CAST_NULL);
                    events.ScheduleEvent(EVENT_DISTRUPTING_SHOUT, 25000);
                    break;
                }
                case EVENT_COMMAND_SOUND:
                {
                    DoPlaySoundToSet(m_creature, RAND(SOUND_COMMND1, SOUND_COMMND2, SOUND_COMMND3, SOUND_COMMND4, SOUND_COMMND5));
                    events.ScheduleEvent(EVENT_COMMAND_SOUND, 40000);
                    break;
                }
                default:
                    break;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 9
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 120.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_POISONBOLT_VOLLEY:
                {
                    AddSpellToCast(SPELL_POISONBOLT_VOLLEY, CAST_NULL);
                    events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, 11000);
                    break;
                }
                case EVENT_RAIN_OF_FIRE:
                {
                    AddSpellToCast(SPELL_RAIN_OF_FIRE, CAST_RANDOM);
                    events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 16000);
                    break;
                }
                case EVENT_ENRAGE:
                {
                    AddSpellToCast(SPELL_ENRAGE, CAST_SELF);
                    events.ScheduleEvent(EVENT_ENRAGE, 61000);
                    break;
                }
                default:
                    break;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_SPEED, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_POLYMORPH:
                {
                    AddSpellToCast(SPELL_GREATER_POLYMORPH, CAST_TANK);
                    events.ScheduleEvent(eventId, urand(10000, 20000));
                    break;
                }
                case EVENT_ARCANE_SHOCK:
                {
                    AddSpellToCast(SPELL_ARCANE_SHOCK);
                    events.ScheduleEvent(eventId, urand(15000, 20000));
                    break;
                }
                case EVENT_ARCANE_EXPLO:
                {
                    AddSpellToCast(SPELL_ARCANE_EXPLOSION, CAST_SELF);
                    events.ScheduleEvent(eventId, 30000);
                    break;
                }
            }
        }

        CheckCasterNoMovementInRange(diff, 42.0f);
        CastNextSpellIfAnyAndReady(diff);
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 11
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_SPEED, 200.0f, 2.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_DARK_DECAY:
                {
                    AddSpellToCast(SPELL_DARK_DECAY);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
                case EVENT_SUMMON:
                {
                    AddSpellToCast(SPELL_SUMMON_WFH, CAST_SELF);
                    events.ScheduleEvent(eventId, 50000);
                    break;
                }
                case EVENT_DEATH_COIL:
                {
                    AddSpellToCast(SPELL_DEATH_COIL, CAST_RANDOM);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 12
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 120.0f);

        events.Update(diff);
        uint32 eventId;
        while (eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ICE_BOLT:
                {
                    AddSpellToCast(SPELL_ICEBOLT, CAST_RANDOM);

                    if (++iceboltCount < 5)
                        events.ScheduleEvent(EVENT_ICE_BOLT, 4000);
                    else
                        events.ScheduleEvent(EVENT_FROST_BREATH, 2000);

                    break;
                }
                case EVENT_FROST_BREATH:
                {
                    AddSpellToCastWithScriptText(SPELL_FROST_BREATH, CAST_SELF, EMOTE_BREATH);
                    events.ScheduleEvent(EVENT_PHASE_1, 2000);
                    break;
                }
                case EVENT_LIFE_DRAIN:
                {
                    AddSpellToCast(SPELL_LIFE_DRAIN, CAST_RANDOM);
                    events.ScheduleEvent(EVENT_LIFE_DRAIN, 24000);
                    break;
                }
                case EVENT_BLIZZARD:
                {
                    AddSpellToCast(SPELL_BLIZZARD, CAST_SELF);
                    events.ScheduleEvent(EVENT_BLIZZARD, 20000);
                    break;
                }
                case EVENT_PHASE_2:
                {
                    if (HealthBelowPct(10))
                        break;

                    iceboltCount = 0;
                    phase = SAPPHIRON_AIR_PHASE;
                    events.CancelEvent(EVENT_BLIZZARD);
                    events.CancelEvent(EVENT_LIFE_DRAIN);
                    events.ScheduleEvent(EVENT_ICE_BOLT, 4000);

                    m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                    m_creature->SetLevitate(true);
                    m_creature->GetMotionMaster()->Clear(false);
                    m_creature->GetMotionMaster()->MoveIdle();

                    break;
                }
                case EVENT_PHASE_1:
                {
                    phase = SAPPHIRON_GROUND_PHASE;
                    events.ScheduleEvent(EVENT_BLIZZARD, urand(10000, 20000));
                    events.ScheduleEvent(EVENT_LIFE_DRAIN, urand(12000, 24000));
                    events.ScheduleEvent(EVENT_PHASE_2, 67000);

                    m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
                    m_creature->SetLevitate(false);
                    m_creature->GetMotionMaster()->Clear(false);
                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());

                    break;
                }
            }
        }

        if (!berserk && HealthBelowPct(10))
        {
            berserk = true;
            ForceSpellCastWithScriptText(SPELL_BERSERK, CAST_SELF, EMOTE_ENRAGE);
        }

        CastNextSpellIfAnyAndReady();

        if (phase == SAPPHIRON_GROUND_PHASE)
            DoMeleeAttackIfReady();
    }
Ejemplo n.º 13
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ARCING_SMASH:
                {
                    AddSpellToCast(SPELL_ARCING_SMASH);
                    events.ScheduleEvent(eventId, 10000);
                    break;
                }
                case EVENT_WHIRLWIND:
                {
                    AddSpellToCast(SPELL_WHIRLWIND, CAST_SELF);
                    events.ScheduleEvent(eventId, 55000);
                    break;
                }
                case EVENT_MIGHTY_BLOW:
                {
                    AddSpellToCast(SPELL_MIGHTY_BLOW);
                    events.ScheduleEvent(eventId, urand(30000, 40000));
                    break;
                }
                case EVENT_CHARGE_HKM:
                {
                    AddSpellToCast(SPELL_BERSERKER_C, CAST_RANDOM);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
                case EVENT_ROAR:
                {
                    AddSpellToCast(SPELL_ROAR, CAST_SELF);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
            }
        }

        //Entering Phase 2
        if (_phase == PHASE_ONE && HealthBelowPct(50))
        {
            _phase = PHASE_TWO;

            DoScriptText(SAY_ENRAGE, me);

            events.RescheduleEvent(EVENT_WHIRLWIND, 30000);
            events.ScheduleEvent(EVENT_CHARGE_HKM, 2000);
            events.ScheduleEvent(EVENT_ROAR, 3000);

            ForceSpellCast(me, SPELL_DUAL_WIELD);
            ForceSpellCast(me, SPELL_FLURRY);

            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 14
0
    void UpdateAI(const uint32 diff)
    {
        if (instance->GetData(DATA_STRANGE_POOL) != IN_PROGRESS)
            return;

        if (me->GetVisibility() == VISIBILITY_OFF)
        {
            me->SetVisibility(VISIBILITY_ON);
            me->RemoveAurasDueToSpell(SPELL_SUBMERGE);

            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

            DoZoneInCombat();
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_PULSE_COMBAT);

        Rotate(diff);//always check rotate things

        events.Update(diff);

        if(!m_submerged && RotType == NOROTATE)//is not spouting and not submerged
        {
            if(SpoutTimer < diff)
            {
                if(me->getVictim() && RotType == NOROTATE)
                    StartRotate(me->getVictim());//start spout and random rotate

                SpoutTimer= 35000;
                return;
            } else SpoutTimer -= diff;
        }

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {    
                /*case LURKER_EVENT_SPOUT_EMOTE:
                {
                me->MonsterTextEmote(EMOTE_SPOUT, 0, true);
                ForceSpellCast(me, SPELL_SPOUT_BREATH);
                events.ScheduleEvent(LURKER_EVENT_SPOUT, 3000);
                break;
                }
                case LURKER_EVENT_SPOUT:
                {
                me->SetReactState(REACT_PASSIVE);

                me->SetSelection(0);
                me->GetMotionMaster()->MoveRotate(20000, RAND(ROTATE_DIRECTION_LEFT, ROTATE_DIRECTION_RIGHT));

                ForceSpellCast(me, SPELL_SPOUT_VISUAL, INTERRUPT_AND_CAST_INSTANTLY);

                m_rotating = true;

                events.DelayEvents(20000, 0);
                events.ScheduleEvent(LURKER_EVENT_SPOUT_EMOTE, 45000);
                events.RescheduleEvent(LURKER_EVENT_WHIRL, 21000);
                break;
                }*/
            case LURKER_EVENT_WHIRL:
                {
                    AddSpellToCast(me, SPELL_WHIRL);
                    events.ScheduleEvent(LURKER_EVENT_WHIRL, 18000);
                    break;
                }
            case LURKER_EVENT_GEYSER:
                {
                    AddSpellToCast(SPELL_GEYSER, CAST_RANDOM);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(15000, 20000));
                    break;
                }
            case LURKER_EVENT_SUBMERGE:
                {
                    ForceSpellCast(me, SPELL_SUBMERGE, INTERRUPT_AND_CAST_INSTANTLY);

                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);

                    SummonAdds();
                    m_submerged = true;

                    events.CancelEvent(LURKER_EVENT_SPOUT_EMOTE);
                    SpoutTimer = 4000; // directly cast Spout after emerging!
                    // events.CancelEvent(LURKER_EVENT_SPOUT);
                    events.CancelEvent(LURKER_EVENT_WHIRL);
                    events.CancelEvent(LURKER_EVENT_GEYSER);
                    events.ScheduleEvent(LURKER_EVENT_REEMERGE, 60000);
                    break;
                }
            case LURKER_EVENT_REEMERGE:
                {
                    me->RemoveAurasDueToSpell(SPELL_SUBMERGE);

                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

                    m_submerged = false;

                    events.ScheduleEvent(LURKER_EVENT_SPOUT_EMOTE, 0);
                    events.ScheduleEvent(LURKER_EVENT_WHIRL, 2000);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(5000, 15000));
                    events.ScheduleEvent(LURKER_EVENT_SUBMERGE, 90000);
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 15
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_EVADE, 135.0f);

        if (!evocating && m_creature->GetPower(POWER_MANA) <= 1000)
        {
            evocating = true;
            ForceSpellCastWithScriptText(SPELL_EVOCATION, CAST_SELF, SAY_EVOCATE);
        }

        if (!enraged && !evocating)
        {
            if (addTimer < diff)
            {
                //Summon Astral Flare
                Creature* astralFlare = DoSpawnCreature(17096, rand()%37, rand()%37, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);

                if (astralFlare && target)
                {
                    astralFlare->CastSpell(astralFlare, SPELL_ASTRAL_FLARE_PASSIVE, false);
                    astralFlare->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
                    astralFlare->AI()->AttackStart(target);
                }

                //Reduce Mana by 10%
                int32 mana = (int32)(0.1f*(m_creature->GetMaxPower(POWER_MANA)));
                m_creature->ModifyPower(POWER_MANA, -mana);

                DoScriptText(RAND(SAY_SUMMON1, SAY_SUMMON2, 0, 0), m_creature);

                addTimer = 10000;
            }
            else
                addTimer -= diff;

            if (hatefulBoltTimer < diff)
            {
                AddSpellToCast(SPELL_HATEFUL_BOLT, CAST_THREAT_SECOND);
                hatefulBoltTimer = enraged ? 7000 : 15000;
            }
            else
                hatefulBoltTimer -= diff;

            if (!enraged && HealthBelowPct(15))
            {
                enraged = true;
                ForceSpellCastWithScriptText(SPELL_ENRAGE, CAST_SELF, SAY_ENRAGE);
            }
        }

        if (berserkTimer < diff)
        {
            ForceSpellCastWithScriptText(SPELL_BERSERK, CAST_SELF, SAY_ENRAGE);
            berserkTimer = 60000;
        }
        else
            berserkTimer -= diff;

        CastNextSpellIfAnyAndReady();

        if (!evocating)
            DoMeleeAttackIfReady();
    }
Ejemplo n.º 16
0
    void UpdateAI(const uint32 diff)
    {
        if(ResetTimer)
        {
            if(ResetTimer <= diff)
            {
                me->SetVisibility(VISIBILITY_ON);
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                ResetTimer = 0;
            }
            else
                ResetTimer -= diff;
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_EVADE, 80.0f);

        if (me->GetSelection())
            me->SetSelection(NULL);

        if (EnrageTimer < diff)
        {
            DoCast(me, SPELL_ENRAGE, true);
            EnrageTimer = 60000;
        }
        else
            EnrageTimer -= diff;

        if(HumanoidStart)
        {
            if(HumanoidStart <= diff)
            {
                pInstance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
                // if anyone trapped outside front door, evade
                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 400, true, 0, 60))
                {
                    EnterEvadeMode();
                    return;
                }
                DoCast(me, SPELL_SUMMON_BLOOD_ELVES_PERIODIC, true);
                HumanoidStart = 0;
            }
            else
                HumanoidStart -= diff;
        }

        if(TransitionTimer)
        {
            if(TransitionTimer <= diff)
            {
                DoCast(me, SPELL_ENTROPIUS_COSMETIC_SPAWN);
                DoCast(me, SPELL_SUMMON_ENTROPIUS);
                me->RemoveAllAuras();
                TransitionTimer = 0;
            }
            else
                TransitionTimer -= diff;
        }
    }
Ejemplo n.º 17
0
    void UpdateAI(const uint32 diff)
    {
        if(!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 125.0f, 1.5f);

        // Void Zone
        if(VoidZoneTimer < diff)
        {
            if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1,GetSpellMaxRange(SPELL_VOIDZONE),true, m_creature->getVictimGUID()))
                AddSpellToCast(target,SPELL_VOIDZONE,true);

            VoidZoneTimer = 15000;
        }
        else
            VoidZoneTimer -= diff;

        // NetherInfusion Berserk
        if(!Berserk && NetherInfusionTimer < diff)
        {
            m_creature->AddAura(SPELL_NETHER_INFUSION, m_creature);
            ForceSpellCast(m_creature, SPELL_NETHERSPITE_ROAR, INTERRUPT_AND_CAST_INSTANTLY);
            Berserk = true;
        }
        else
            NetherInfusionTimer -= diff;

        if(PortalPhase) // PORTAL PHASE
        {
            // Distribute beams and buffs
            if(PortalTimer < diff)
            {
                UpdatePortals();
                PortalTimer = 1000;
            }
            else
                PortalTimer -= diff;

            // Empowerment & Nether Burn
            if(EmpowermentTimer < diff)
            {
                ForceSpellCast(m_creature, SPELL_EMPOWERMENT);
                m_creature->AddAura(SPELL_NETHERBURN_AURA, m_creature);
                EmpowermentTimer = 90000;
            }
            else
                EmpowermentTimer -= diff;

            if(PhaseTimer < diff)
            {
                if(!m_creature->IsNonMeleeSpellCast(false))
                {
                    SwitchToBanishPhase();
                    return;
                }
            }
            else
                PhaseTimer -= diff;

            DoMeleeAttackIfReady();
        }
        else // BANISH PHASE
        {
            if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != IDLE_MOTION_TYPE)
            {
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MoveIdle();
            }

            // Netherbreath
            if(NetherbreathTimer < diff)
            {
                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_NETHERBREATH),true))
                    AddSpellToCast(target,SPELL_NETHERBREATH);

                NetherbreathTimer = 5000+rand()%2000;
            }
            else
                NetherbreathTimer -= diff;

            if(PhaseTimer < diff)
            {
                if(!m_creature->IsNonMeleeSpellCast(false))
                {
                    SwitchToPortalPhase();
                    return;
                }
            }
            else
                PhaseTimer -= diff;
        }
        CastNextSpellIfAnyAndReady();
    }
Ejemplo n.º 18
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVADE_CHECK, 60.0f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_SHADOW_VOLLEY:
                {
                    AddSpellToCast(SPELL_SHADOWVOLLEY, CAST_NULL);
                    events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 3000);
                    break;
                }
                case EVENT_CLEAVE:
                {
                    AddSpellToCast(SPELL_CLEAVE);
                    events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000));
                    break;
                }
                case EVENT_THUNDER_CLAP:
                {
                    AddSpellToCast(SPELL_THUNDERCLAP, CAST_SELF);
                    events.ScheduleEvent(EVENT_THUNDER_CLAP, urand(10000, 14000));
                    break;
                }
                case EVENT_MARKOFKAZZAK:
                {
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 60.0, true, POWER_MANA))
                        AddSpellToCast(pTarget, SPELL_MARKOFKAZZAK);

                    events.ScheduleEvent(EVENT_MARKOFKAZZAK, 20000);
                    break;
                }
                case EVENT_TWIST_REFLECT:
                {
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                        AddSpellToCast(pTarget, SPELL_TWISTEDREFLECTION);

                    events.ScheduleEvent(EVENT_TWIST_REFLECT, 15000);
                    break;
                }
                case EVENT_VOID_BOLT:
                {
                    AddSpellToCast(SPELL_VOIDBOLT);
                    events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000));
                    break;
                }
                case EVENT_ENRAGE:
                {
                    AddSpellToCastWithScriptText(me, SPELL_ENRAGE, EMOTE_FRENZY);
                    events.ScheduleEvent(EVENT_ENRAGE, 40000);
                    events.RescheduleEvent(EVENT_SHADOW_VOLLEY, 12000);
                    break;
                }
                default:
                    break;
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 200.0f, 1.6f);
        
        //Slow his movement speed while he whirls
        //I'm not proud of this. Should be handled by the dbc, 
        //modaura slow of the spell only applied shortly (and once) in the beginning, afterwards he regains normal speed
        if (me->HasAura(33238)) {
            me->SetSpeed(MOVE_RUN, 0.80f);            
        }
        else {
            me->SetSpeed(MOVE_RUN, 1.71);            
        }
        
        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ARCING_SMASH:
                {                    
                    AddSpellToCast(SPELL_ARCING_SMASH);
                    events.ScheduleEvent(eventId, urand(8000, 12000));
                    break;
                }
                case EVENT_WHIRLWIND:
                {
                    AddSpellToCast(SPELL_WHIRLWIND, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(30000, 40000));
                    events.RescheduleEvent(EVENT_ARCING_SMASH, 16500);
                    break;
                }
                case EVENT_MIGHTY_BLOW:
                {
                    AddSpellToCast(SPELL_MIGHTY_BLOW);
                    events.ScheduleEvent(eventId, urand(20000, 35000));
                    break;
                }
                case EVENT_CHARGE_HKM:
                {
                    AddSpellToCast(SPELL_BERSERKER_C, CAST_RANDOM);
                    events.ScheduleEvent(eventId, urand(14000, 20000));
                    break;
                }
                case EVENT_ROAR:
                {
                    AddSpellToCast(SPELL_ROAR, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(20000, 35000));
                    break;
                }
            }
        }

        //Entering Phase 2
        if (_phase == PHASE_ONE && HealthBelowPct(50))
        {
            _phase = PHASE_TWO;

            DoScriptText(SAY_ENRAGE, me);

            events.RescheduleEvent(EVENT_WHIRLWIND, urand(10000, 20000));
            events.ScheduleEvent(EVENT_CHARGE_HKM, 3000);
            events.ScheduleEvent(EVENT_ROAR, 2000);

            ForceSpellCast(me, SPELL_DUAL_WIELD);
            ForceSpellCast(me, SPELL_FLURRY);

            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 20
0
    void UpdateAI(const uint32 diff)
    {
        if (instance->GetData(DATA_LURKER_FISHING_EVENT) != DONE)
            return;

        //boss is invisible, don't attack
        if (!CanStartEvent)
        {            
                if (m_submerged)
                {
                    m_submerged = false;
                    WaitTimer2 = 500;
                }
                
                //wait 500ms before emerge anim
                if (!m_submerged && WaitTimer2 <= diff)
                {
                    me->SetVisibility(VISIBILITY_ON);
                    me->RemoveAllAuras();
                    me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);                    
                    DoCast(me, SPELL_EMERGE, false);
                    WaitTimer2 = 60000;//never reached
                    WaitTimer = 3000;
                }
                else
                    WaitTimer2 -= diff;

                //wait 3secs for emerge anim, then attack
                if (WaitTimer <= diff)
                {
                    //fresh fished from pool
                    WaitTimer = 3000;                    
                    CanStartEvent = true;
                    me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    DoZoneInCombat();

                    if (ConsecutiveSubmerge)
                    {
                        events.RescheduleEvent(LURKER_EVENT_WHIRL, 2000);
                        events.RescheduleEvent(LURKER_EVENT_GEYSER, urand(5000, 15000));
                        events.RescheduleEvent(LURKER_EVENT_SUBMERGE, 90000);
                    }
                }
                else
                    WaitTimer -= diff;
            return;
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_PULSE_COMBAT);

        Rotate(diff);//always check rotate things

        events.Update(diff);

        if(!m_submerged && RotType == NOROTATE)//is not spouting and not submerged
        {
            if(SpoutTimer < diff)
            {
                if(me->getVictim() && RotType == NOROTATE)
                    StartRotate(me->getVictim());//start spout and random rotate

                SpoutTimer= 35000;
                return;
            } else SpoutTimer -= diff;
        }

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {    
            case LURKER_EVENT_WHIRL:
                {
                    if (m_submerged == false) {
                        AddSpellToCast(me, SPELL_WHIRL);
                    }
                    events.RescheduleEvent(LURKER_EVENT_WHIRL, 18000);                    
                    break;
                }
            case LURKER_EVENT_GEYSER:
                {
                    AddSpellToCast(SPELL_GEYSER, CAST_RANDOM);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(15000, 20000));
                    break;
                }
            case LURKER_EVENT_SUBMERGE:
                {
                    ForceSpellCast(me, SPELL_SUBMERGE, INTERRUPT_AND_CAST_INSTANTLY);

                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->SetVisibility(VISIBILITY_OFF);

                    SummonAdds();
                    m_submerged = true;
                    
                    // directly cast Spout after emerging!                    
                    SpoutTimer = 4000; 
                    events.CancelEvent(LURKER_EVENT_WHIRL);
                    events.CancelEvent(LURKER_EVENT_GEYSER);
                    events.ScheduleEvent(LURKER_EVENT_REEMERGE, 60000);
                    break;
                }
            case LURKER_EVENT_REEMERGE:
                {
                    me->SetVisibility(VISIBILITY_OFF);
                    DoStopAttack();

                    //Time values here is irrelevant, they just need to be set
                    WaitTimer = 60000;
                    WaitTimer2 = 60000;
                    CanStartEvent = false;
                    m_submerged = true;
                    ConsecutiveSubmerge = true;                    
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
Ejemplo n.º 21
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim() )
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 135.0f);

        //Earthquake_Timer
        if (Earthquake_Timer < diff)
        {
            if (!Earthquake)
            {
                AddSpellToCastWithScriptText(SPELL_EARTHQUAKE, CAST_NULL, EMOTE_EARTHQUAKE);
                Earthquake = true;
                Earthquake_Timer = 10000;
            }
            else
            {
                DoScriptText(RAND(SAY_SUMMON1, SAY_SUMMON2), m_creature);

                for (uint8 i = 0; i < 10; ++i)
                {
                    Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
                    Creature* Murloc = m_creature->SummonCreature(MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], MurlocCords[i][4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);

                    if (target && Murloc)
                    {
                        Murloc->setActive(true);
                        Murloc->AI()->AttackStart(target);
                    }
                }

                Earthquake = false;
                Earthquake_Timer = urand(40000, 45000);
            }
        }
        else
            Earthquake_Timer -= diff;

        //TidalWave_Timer
        if (TidalWave_Timer < diff)
        {
            AddSpellToCast(SPELL_TIDAL_WAVE, CAST_NULL);
            TidalWave_Timer = 20000;
        }
        else
            TidalWave_Timer -= diff;

        if (!Phase2)
        {
            //WateryGrave_Timer
            if (WateryGrave_Timer < diff)
            {
                //Teleport 4 players under the waterfalls
                std::list<Unit*> tmpList;
                SelectUnitList(tmpList, 4, SELECT_TARGET_RANDOM, 200.0f, true, me->getVictimGUID());

                int i = 0;
                for (std::list<Unit*>::const_iterator itr = tmpList.begin(); itr != tmpList.end(); ++itr)
                    me->CastSpell(*itr, wateryGraves[i++], true);

                DoScriptText(RAND(SAY_SUMMON_BUBL1, SAY_SUMMON_BUBL2), m_creature);
                DoScriptText(EMOTE_WATERY_GRAVE, m_creature);
                WateryGrave_Timer = 30000;
            }
            else
                WateryGrave_Timer -= diff;

            //Start Phase2
            if (HealthBelowPct(25))
                Phase2 = true;
        }
        else
        {
            //WateryGlobules_Timer
            if (WateryGlobules_Timer < diff)
            {
                std::list<Unit*> tmpList;
                SelectUnitList(tmpList, 4, SELECT_TARGET_RANDOM, 200.0f, true, me->getVictimGUID());

                int i = 0;
                for (std::list<Unit*>::const_iterator itr = tmpList.begin(); itr != tmpList.end(); ++itr)
                    (*itr)->CastSpell((*itr), summonGlobules[i++], true);

                DoScriptText(EMOTE_WATERY_GLOBULES, m_creature);
                WateryGlobules_Timer = 25000;
            }
            else
                WateryGlobules_Timer -= diff;
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }