Esempio n. 1
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!UpdateVictim())
            return;

        events.Update(uiDiff);

        if (me->hasUnitState(UNIT_STAT_CASTING))
            return;

        while(uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_STRIKE:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_GUARD_A:
                        case WG_CREATURE_GUARD_H:
                        case WG_CREATURE_CHAMPION_A:
                        case WG_CREATURE_CHAMPION_H:
                            DoCast(me->getVictim(), SPELL_STRIKE);
                            events.ScheduleEvent(EVENT_STRIKE, 5000);
                            return;
                    }
                case EVENT_ARCANE_MISSILES:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_ENHANCEMENT_A:
                            DoCast(me->getVictim(), SPELL_ARCANE_MISSILES);
                            events.ScheduleEvent(EVENT_ARCANE_MISSILES, 5000);
                            return;
                    }
                case EVENT_SLOW:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_ENHANCEMENT_A:
                            DoCast(me->getVictim(), SPELL_SLOW);
                            events.ScheduleEvent(EVENT_SLOW, 15000);
                            return;
                    }
                case EVENT_HEALING_WAVE:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_ENHANCEMENT_H:
                            if (HealthBelowPct(50))
                                DoCast(me, SPELL_HEALING_WAVE);
                            events.ScheduleEvent(EVENT_HEALING_WAVE, 3000);
                            return;
                    }
                case EVENT_LIGHTNING_BOLT:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_ENHANCEMENT_H:
                            DoCast(me->getVictim(), SPELL_LIGHTNING_BOLT);
                            events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 5000);
                            return;
                    }
                case EVENT_QUICK_FLAME_WARD:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_ENHANCEMENT_H:
                            DoCast(me, SPELL_QUICK_FLAME_WARD);
                            events.ScheduleEvent(EVENT_QUICK_FLAME_WARD, 10000);
                            return;
                    }
                case EVENT_MORTAL_STRIKE:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_QUESTGIVER_1_A:
                        case WG_CREATURE_QUESTGIVER_1_H:
                        case WG_CREATURE_QUESTGIVER_2_A:
                        case WG_CREATURE_QUESTGIVER_2_H:
                        case WG_CREATURE_QUESTGIVER_3_A:
                        case WG_CREATURE_QUESTGIVER_3_H:
                        case WG_CREATURE_QUESTGIVER_4_A:
                        case WG_CREATURE_QUESTGIVER_4_H:
                            DoCast(me->getVictim(), SPELL_MORTAL_STRIKE);
                            events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
                            return;
                    }
                case EVENT_HEAL:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_QUESTGIVER_5_A:
                            if (HealthBelowPct(50))
                                DoCast(me, SPELL_HEAL);
                            events.ScheduleEvent(EVENT_HEAL, 5000);
                            return;
                    }
                case EVENT_HOLY_NOVA:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_QUESTGIVER_5_A:
                            DoCast(me, SPELL_HOLY_NOVA);
                            events.ScheduleEvent(EVENT_HOLY_NOVA, 8000);
                            return;
                    }
                case EVENT_CLEAVE:
                    switch(me->GetEntry())
                    {
                        case WG_CREATURE_QUESTGIVER_5_H:
                        case WG_CREATURE_QUESTGIVER_6_A:
                        case WG_CREATURE_QUESTGIVER_6_H:
                            DoCast(me->getVictim(), SPELL_CLEAVE);
                            events.ScheduleEvent(EVENT_CLEAVE, 10000);
                            return;
                    }
            }
        }

        switch(me->GetEntry())
        {
            case WG_CREATURE_ENHANCEMENT_A:
            case WG_CREATURE_ENHANCEMENT_H:
            case WG_CREATURE_QUESTGIVER_5_A:
                return;
            default:
                DoMeleeAttackIfReady();
                return;
        }
    }
Esempio n. 2
0
        void UpdateAI(const uint32 diff)
        {
            switch (phase)
            {
            case PHASE_CHAINED:
                if (!anchorGUID)
                {
                    if (Creature* anchor = me->FindNearestCreature(29521, 30))
                    {
                        anchor->AI()->SetGUID(me->GetGUID());
                        anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true);
                        anchorGUID = anchor->GetGUID();
                    }
                    else
                        sLog->outError("npc_unworthy_initiateAI: unable to find anchor!");

                    float dist = 99.0f;
                    GameObject* prison = NULL;

                    for (uint8 i = 0; i < 12; ++i)
                    {
                        if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 30))
                        {
                            if (me->IsWithinDist(temp_prison, dist, false))
                            {
                                dist = me->GetDistance2d(temp_prison);
                                prison = temp_prison;
                            }
                        }
                    }

                    if (prison)
                        prison->ResetDoorOrButton();
                    else
                        sLog->outError("npc_unworthy_initiateAI: unable to find prison!");
                }
                break;
            case PHASE_TO_EQUIP:
                if (wait_timer)
                {
                    if (wait_timer > diff)
                        wait_timer -= diff;
                    else
                    {
                        me->GetMotionMaster()->MovePoint(1, anchorX, anchorY, me->GetPositionZ());
                        //sLog->outDebug(LOG_FILTER_TSCR, "npc_unworthy_initiateAI: move to %f %f %f", anchorX, anchorY, me->GetPositionZ());
                        phase = PHASE_EQUIPING;
                        wait_timer = 0;
                    }
                }
                break;
            case PHASE_TO_ATTACK:
                if (wait_timer)
                {
                    if (wait_timer > diff)
                        wait_timer -= diff;
                    else
                    {
                        me->setFaction(14);
                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
                        phase = PHASE_ATTACKING;

                        if (Player* target = Unit::GetPlayer(*me, playerGUID))
                            me->AI()->AttackStart(target);
                        wait_timer = 0;
                    }
                }
                break;
            case PHASE_ATTACKING:
                if (!UpdateVictim())
                    return;

                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                    case EVENT_ICY_TOUCH:
                        DoCast(me->getVictim(), SPELL_ICY_TOUCH);
                        events.DelayEvents(1000, GCD_CAST);
                        events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST);
                        break;
                    case EVENT_PLAGUE_STRIKE:
                        DoCast(me->getVictim(), SPELL_PLAGUE_STRIKE);
                        events.DelayEvents(1000, GCD_CAST);
                        events.ScheduleEvent(SPELL_PLAGUE_STRIKE, 5000, GCD_CAST);
                        break;
                    case EVENT_BLOOD_STRIKE:
                        DoCast(me->getVictim(), SPELL_BLOOD_STRIKE);
                        events.DelayEvents(1000, GCD_CAST);
                        events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST);
                        break;
                    case EVENT_DEATH_COIL:
                        DoCast(me->getVictim(), SPELL_DEATH_COIL);
                        events.DelayEvents(1000, GCD_CAST);
                        events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST);
                        break;
                    }
                }

                DoMeleeAttackIfReady();
                break;
            default:
                break;
            }
        }
Esempio n. 3
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
        {
            if (phase == PHASE_FLIGHT && !me->IsInEvadeMode())
                EnterEvadeMode();
            return;
        }

        events.Update(diff);

        if (me->IsNonMeleeSpellCasted(false))
            return;

        if (phase == PHASE_GROUND)
        {
            switch (events.ExecuteEvent())
            {
                case EVENT_BERSERK:
                    DoScriptText(YELL_BERSERK, me);
                    DoCast(me, SPELL_BERSERK, true);
                    events.ScheduleEvent(EVENT_BERSERK, 10000);
                    break;
                case EVENT_CLEAVE:
                    DoCast(me->getVictim(), SPELL_CLEAVE, false);
                    events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
                    break;
                case EVENT_CORROSION:
                    DoCast(me->getVictim(), SPELL_CORROSION, false);
                    events.ScheduleEvent(EVENT_CORROSION, urand(20000, 30000));
                    break;
                case EVENT_GAS_NOVA:
                    DoCast(me, SPELL_GAS_NOVA, false);
                    events.ScheduleEvent(EVENT_GAS_NOVA, urand(20000, 25000));
                    break;
                case EVENT_ENCAPSULATE:
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
                        DoCast(pTarget, SPELL_ENCAPSULATE_CHANNEL, false);
                    events.ScheduleEvent(EVENT_ENCAPSULATE, urand(25000, 30000));
                    break;
                case EVENT_FLIGHT:
                    EnterPhase(PHASE_FLIGHT);
                    break;
                default:
                    DoMeleeAttackIfReady();
                    break;
            }
        }

        if (phase == PHASE_FLIGHT)
        {
            switch (events.ExecuteEvent())
            {
                case EVENT_BERSERK:
                    DoScriptText(YELL_BERSERK, me);
                    DoCast(me, SPELL_BERSERK, true);
                    break;
                case EVENT_FLIGHT_SEQUENCE:
                    HandleFlightSequence();
                    break;
                case EVENT_SUMMON_FOG:
                    float x, y, z;
                    me->GetPosition(x, y, z);
                    me->UpdateGroundPositionZ(x, y, z);
                    if (Creature *Fog = me->SummonCreature(MOB_VAPOR_TRAIL, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 10000))
                    {
                        Fog->RemoveAurasDueToSpell(SPELL_TRAIL_TRIGGER);
                        Fog->CastSpell(Fog, SPELL_FOG_TRIGGER, true);
                        me->CastSpell(Fog, SPELL_FOG_FORCE, true);
                    }
                    events.ScheduleEvent(EVENT_SUMMON_FOG, 1000);
                    break;
            }
        }
    }
Esempio n. 4
0
            void UpdateAI(uint32 const diff)
            {
                if (!intro)
                {
                    me->SummonCreature(NPC_SLIPPERY_FLOOR, SummonPositions[0]); // floor ambient
                    me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
                    me->SetReactState(REACT_AGGRESSIVE);
                    intro = true;
                }

                if (!UpdateVictim())
                    return;

                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_SWITCH_PHASE:
                            if (events.GetPhaseMask() & PHASE_MASK_ONE)
                            {
                                // Emote: Ahune retreats. His defenses diminish.
                                //                                 me->MonsterTextEmote(EMOTE_SUBMERGE, 0, true); //Hack Fix by jacob


                                events.SetPhase(PHASE_TWO);
                                events.ScheduleEvent(EVENT_SWITCH_PHASE, 30000);

                                DoCast(me, SPELL_MAKE_BONFIRE);

                                me->AttackStop();
                                me->SetReactState(REACT_PASSIVE);
                                me->setFaction(35);
                                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED);
                                me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);

                                me->SummonCreature(NPC_FROZEN_CORE, SummonPositions[0], TEMPSUMMON_CORPSE_DESPAWN);
                            }
                            else
                            {
                                events.SetPhase(PHASE_ONE);
                                events.ScheduleEvent(EVENT_SWITCH_PHASE, 90000);
                                events.ScheduleEvent(EVENT_COLD_SLAP, 500, 0, PHASE_ONE);
                                events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 1000, 0, PHASE_ONE);
                                events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8000, 0, PHASE_ONE);
                                events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 9000, 0, PHASE_ONE);
                                events.ScheduleEvent(EVENT_ICE_SPEAR, 9500, 0, PHASE_ONE);
                                events.ScheduleEvent(EVENT_EARTHEN_RING_ATTACK, 10000, 0, PHASE_ONE);

                                me->SetReactState(REACT_AGGRESSIVE);
                                me->setFaction(14);
                                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
                                me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);

                                DoCastVictim(SPELL_RESURFACE);

                                summons.DespawnEntry(NPC_FROZEN_CORE);
                            }
                            break;
                        case EVENT_COLD_SLAP:
                            if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 8.0f, true))
                            {
                                DoCast(target, SPELL_COLD_SLAP);
                                Position targetPos;
                                target->GetNearPosition(targetPos, float(rand_norm()) * 5.0f + 35.0f, me->GetAngle(target));
                                target->GetMotionMaster()->MoveJump(targetPos.GetPositionX(), targetPos.GetPositionY(), targetPos.GetPositionZ(), target->GetExactDist2d(targetPos.GetPositionX(), targetPos.GetPositionY()), 10.0f);
                            }
                            events.ScheduleEvent(EVENT_COLD_SLAP, 500, 0, PHASE_ONE);
                            break;
                        case EVENT_ICE_SPEAR: 
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 120.0f, true))
                            {
                                target->CastSpell(target, SPELL_ICESPEAR_SUMMON_BUNNY);
                                target->CastSpell(target, SPELL_ICESPEAR_SUMMON_GO);
                                events.ScheduleEvent(EVENT_ICE_SPEAR_KNOCKBACK, 2000);
                            }
                            events.ScheduleEvent(EVENT_ICE_SPEAR, 7000, 0, PHASE_ONE);
                            break;
                        case EVENT_ICE_SPEAR_KNOCKBACK:
                            if (GameObject* go = me->FindNearestGameObject(GO_ICE_SPEAR, 120.0f))
                            {
                                go->UseDoorOrButton();
                                Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
                                if (!playerList.isEmpty())
                                    for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i)
                                        if (i->getSource() && go->GetDistance(i->getSource()) <= 2.0f)
                                            i->getSource()->CastSpell(i->getSource(), SPELL_ICESPEAR_KNOCKBACK);
                                go->Delete();
                            }
                            break;
                        case EVENT_SUMMON_HAILSTONE:
                            me->SummonCreature(NPC_AHUNITE_HAILSTONE, SummonPositions[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                            break;
                        case EVENT_SUMMON_COLDWEAVE: 
                            me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                            me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                            events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 5000, 0, PHASE_ONE);
                            break;
                        case EVENT_SUMMON_FROSTWIND: 
                            me->SummonCreature(NPC_AHUNITE_FROSTWIND, SummonPositions[urand(2,3)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                            events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 7000, 0, PHASE_ONE);
                            break;
                        case EVENT_EARTHEN_RING_ATTACK:
                            if (Creature* totem = me->FindNearestCreature(NPC_EARTHEN_RING_TOTEM, 200.0f))
                            {
                                totem->CastSpell(me, SPELL_BEAM_ATTACK, false);
                                totem->CastSpell(me, SPELL_BEAM_ATTACK_BEAM, false);
                            }
                            events.ScheduleEvent(EVENT_EARTHEN_RING_ATTACK, 10000, 0, PHASE_ONE);
                            break;
                    }
                }

                DoMeleeAttackIfReady();
            }
Esempio n. 5
0
        void UpdateAI(uint32 diff) override
        {
            events.Update(diff);

            switch (events.ExecuteEvent())
            {
                case EVENT_SPAWN:
                    {
                        if (Creature* Dalfors = DoSummon(NPC_CRUSADER_LORD_DALFORS, DalforsPos[0]))
                        {
                            guidDalfors = Dalfors->GetGUID();
                            Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[1]);
                        }
                        if (Creature* Priest1 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest1Pos[0]))
                        {
                            guidPriest[0] = Priest1->GetGUID();
                            Priest1->GetMotionMaster()->MovePoint(0, Priest1Pos[1]);
                        }
                        if (Creature* Priest2 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest2Pos[0]))
                        {
                            guidPriest[1] = Priest2->GetGUID();
                            Priest2->GetMotionMaster()->MovePoint(0, Priest2Pos[1]);
                        }
                        if (Creature* Priest3 = DoSummon(NPC_ARGENT_BATTLE_PRIEST, Priest3Pos[0]))
                        {
                            guidPriest[2] = Priest3->GetGUID();
                            Priest3->GetMotionMaster()->MovePoint(0, Priest3Pos[1]);
                        }
                        if (Creature* Mason1 = DoSummon(NPC_ARGENT_MASON, Mason1Pos[0]))
                        {
                            guidMason[0] = Mason1->GetGUID();
                            Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[1]);
                        }
                        if (Creature* Mason2 = DoSummon(NPC_ARGENT_MASON, Mason2Pos[0]))
                        {
                            guidMason[1] = Mason2->GetGUID();
                            Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[1]);
                        }
                        if (Creature* Mason3 = DoSummon(NPC_ARGENT_MASON, Mason3Pos[0]))
                        {
                            guidMason[2] = Mason3->GetGUID();
                            Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[1]);
                        }
                        events.ScheduleEvent(EVENT_INTRO_1, 15000);
                    }
                    break;
                case EVENT_INTRO_1:
                    {
                        if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors))
                            Dalfors->AI()->Talk(DALFORS_SAY_PRE_1);
                        events.ScheduleEvent(EVENT_INTRO_2, 5000);
                    }
                    break;
                case EVENT_INTRO_2:
                    {
                        if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors))
                        {
                            Dalfors->SetFacingTo(6.215f);
                            Dalfors->AI()->Talk(DALFORS_SAY_PRE_2);
                        }
                    events.ScheduleEvent(EVENT_INTRO_3, 5000);
                    }
                    break;
                case EVENT_INTRO_3:
                    {
                        if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors))
                        {
                            Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]);
                            Dalfors->SetHomePosition(DalforsPos[2]);
                        }
                        if (Creature* Priest1 = ObjectAccessor::GetCreature(*me, guidPriest[0]))
                        {
                            Priest1->SetFacingTo(5.7421f);
                            Priest1->SetHomePosition(Priest1Pos[1]);
                        }
                        if (Creature* Priest2 = ObjectAccessor::GetCreature(*me, guidPriest[1]))
                        {
                            Priest2->SetFacingTo(5.7421f);
                            Priest2->SetHomePosition(Priest2Pos[1]);
                        }
                        if (Creature* Priest3 = ObjectAccessor::GetCreature(*me, guidPriest[2]))
                        {
                            Priest3->SetFacingTo(5.7421f);
                            Priest3->SetHomePosition(Priest3Pos[1]);
                        }
                        if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0]))
                        {
                            Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]);
                            Mason1->SetHomePosition(Mason1Pos[2]);
                        }
                        if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1]))
                        {
                            Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]);
                            Mason2->SetHomePosition(Mason2Pos[2]);
                        }
                        if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2]))
                        {
                            Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]);
                            Mason3->SetHomePosition(Mason3Pos[2]);
                        }
                        events.ScheduleEvent(EVENT_START_FIGHT, 5000);
                        events.ScheduleEvent(EVENT_MASON_ACTION, 15000);
                    }
                    break;
                case EVENT_MASON_ACTION:
                    {
                        if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0]))
                        {
                            Mason1->SetFacingTo(2.8972f);
                            Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc
                        }
                        if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1]))
                        {
                            Mason2->SetFacingTo(3.1241f);
                            Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc
                        }
                        if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2]))
                        {
                            Mason3->SetFacingTo(3.6651f);
                            Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc
                        }
                    }
                    break;
                case EVENT_START_FIGHT:
                    {
                        if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
                            LK->AI()->Talk(LK_TALK_1);
                        if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors))
                            Dalfors->AI()->Talk(DALFORS_SAY_START);
                        events.ScheduleEvent(EVENT_WAVE_SPAWN, 1000);
                    }
                    break;
                case EVENT_WAVE_SPAWN:
                    {
                        if (PhaseCount == 3)
                        {
                            if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
                                LK->AI()->Talk(LK_TALK_2);
                        }
                        else if (PhaseCount == 6)
                        {
                            if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
                                LK->AI()->Talk(LK_TALK_3);
                        }
                        if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0]))
                            {
                                tempsum->SetHomePosition(DalforsPos[2]);
                                tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                            }
                        if (urand(0, 1) == 0)
                        {
                            if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0]))
                            {
                                tempsum->SetHomePosition(DalforsPos[2]);
                                tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                            }
                            if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason2Pos[0]))
                            {
                                tempsum->SetHomePosition(DalforsPos[2]);
                                tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                            }
                        }
                        else
                        {
                            if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason1Pos[0]))
                            {
                                tempsum->SetHomePosition(DalforsPos[2]);
                                tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                            }
                            if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason2Pos[0]))
                            {
                                tempsum->SetHomePosition(DalforsPos[2]);
                                tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                            }
                        }

                        PhaseCount++;

                        if (PhaseCount < 8)
                            events.ScheduleEvent(EVENT_WAVE_SPAWN, urand(10000, 20000));
                        else
                            events.ScheduleEvent(EVENT_HALOF, urand(10000, 20000));
                    }
                    break;
                case EVENT_HALOF:
                    {
                        if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
                            LK->AI()->Talk(LK_TALK_4);
                        if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason1Pos[0]))
                        {
                            tempsum->SetHomePosition(DalforsPos[2]);
                            tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                        }
                        if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason2Pos[0]))
                        {
                            tempsum->SetHomePosition(DalforsPos[2]);
                            tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                        }
                        if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER, DalforsPos[0]))
                        {
                            HalofSpawned = true;
                            guidHalof = tempsum->GetGUID();
                            tempsum->SetHomePosition(DalforsPos[2]);
                            tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
                        }
                    }
                    break;
                case EVENT_ENDED:
                    {
                        Summons.DespawnAll();
                        me->DespawnOrUnsummon();
                    }
                    break;
            }

            if (PhaseCount == 8)
                if (Creature* Halof = ObjectAccessor::GetCreature(*me, guidHalof))
                    if (Halof->isDead())
                    {
                        DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true);
                        Summons.DespawnEntry(NPC_HIDEOUS_PLAGEBRINGER);
                        Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN);
                        Summons.DespawnEntry(NPC_SCOURGE_DRUDGE);
                        Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER);
                        if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors))
                            Dalfors->AI()->Talk(DALFORS_YELL_FINISHED);
                        events.ScheduleEvent(EVENT_ENDED, 10000);
                    }
        }
Esempio n. 6
0
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                {
                    if (pInstance && pInstance->GetData(SPELL_RITUAL_OF_PURIFICATION) == false)
                        me->RemoveAura(SPELL_RITUAL_OF_PURIFICATION);

                    return;
                }

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;
 
                events.Update(diff);
 
                switch (events.ExecuteEvent())
                {
                    case EVENT_CHECK_MELEE:
                    {
                        if (!me->IsWithinMeleeRange(me->getVictim(), 2.0f))
                        {
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f))
                                me->CastSpell(target, SPELL_REACHING_ATTACK, false);
                        }
                        else
                        {
                            // Always attack champion of light
                            if (Player* target = GetChampionOfLight(me))
                                if (me->getVictim() && me->getVictim()->GetGUID() != target->GetGUID())
                                    AttackStart(target);
                        }
                        events.ScheduleEvent(EVENT_CHECK_MELEE, 1000);
                        break;
                    }
                    case EVENT_EERIE_SKULL:
                    {
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 60.0f))
                            me->CastSpell(target, SPELL_EERIE_SKULL, false);
                        events.ScheduleEvent(EVENT_EERIE_SKULL, 5000);
                        break;
                    }
                    case EVENT_CHECK_ENERGY:
                    {
                        if (!pInstance)
                        {
                            events.ScheduleEvent(EVENT_CHECK_ENERGY, 1000);
                            break;
                        }

                        if (me->GetPower(POWER_ENERGY) >= me->GetMaxPower(POWER_ENERGY))
                        {
                            if (Creature* pureLight = Creature::GetCreature(*me, pInstance->GetData64(NPC_PURE_LIGHT_TERRACE)))
                                me->CastSpell(pureLight, SPELL_BREATH_OF_FEAR, false);
                            Talk(TALK_BREATH_OF_FEAR);
                            me->SetPower(POWER_ENERGY, 0);
                            me->SetInt32Value(UNIT_FIELD_POWER1, 0);
                        }

                        events.ScheduleEvent(EVENT_CHECK_ENERGY, 1000);
                        break;
                    }
                    case EVENT_FIRST_TERRORS:
                    {
                        me->CastSpell(me, SPELL_CONJURE_TERROR_SPAWN_TICK, true);
                        break;
                    }
                    default:
                        break;
                }

                DoMeleeAttackIfReady();
            }
Esempio n. 7
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
                return;

            if (me->HealthBelowPct(81) && !firstSelection)
            {
                events.CancelEvent(EVENT_WHIRLWIND);
                events.CancelEvent(EVENT_GRIEVOUS_THROW);
                EnterPhase(RAND(PHASE_BEAR, PHASE_LYNX));
                firstSelection = true;
            }

            if (me->HealthBelowPct(41) && !secondSelection)
            {
                if (Phase == PHASE_BEAR)
                {
                    events.CancelEvent(EVENT_SURGE);
                    events.CancelEvent(EVENT_OVERPOWER);
                    events.CancelEvent(EVENT_CREEPING_PARALYSIS);
                }
                else if (Phase == PHASE_LYNX)
                {
                    events.CancelEvent(EVENT_CLAW_RAGE);
                    events.CancelEvent(EVENT_LYNX_RUSH);
                }

                EnterPhase(RAND(PHASE_EAGLE, PHASE_DRAGONHAWK));
                secondSelection = true;
            }

            if (isFlameBreathing)
            {
                if (!me->IsNonMeleeSpellCasted(false))
                    isFlameBreathing = false;
                else
                    return;
            }

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch(eventId)
                {
                    //====== Troll Form
                    case EVENT_WHIRLWIND:
                        DoCast(me, SPELL_WHIRLWIND);
                        events.ScheduleEvent(EVENT_WHIRLWIND, urand(15000, 20000));
                        break;

                    case EVENT_GRIEVOUS_THROW:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                            DoCast(target, SPELL_GRIEVOUS_THROW, false);
                        events.ScheduleEvent(EVENT_GRIEVOUS_THROW, urand(10000, 11000));
                        break;

                    //====== Bear Form
                    case EVENT_SURGE:
                        if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 80.0f, true)) // Try to select farthest target.
                            DoCast(target, SPELL_SURGE);
                        events.ScheduleEvent(EVENT_SURGE, urand(15000, 20000));
                        break;

                    case EVENT_OVERPOWER:
                        DoCastVictim(SPELL_OVERPOWER);
                        events.ScheduleEvent(EVENT_OVERPOWER, urand(11000, 15000));
                        break;

                    case EVENT_CREEPING_PARALYSIS:
                        {
                            Map::PlayerList const& players = me->GetMap()->GetPlayers();
                            for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
                                if (Player* player = itr->getSource())
                                    DoCast(player, SPELL_CREEPING_PARALYSIS);

                            events.ScheduleEvent(EVENT_CREEPING_PARALYSIS, urand(19000, 21000));
                        }
                        break;

                    //====== Lynx Form
                    case EVENT_SUMMON_LYNX:
                        DoCast(me, SPELL_SUMMON_LYNX);
                        break;

                    case EVENT_CLAW_RAGE:
                        if (canCastClaw && clawRageTicks < 10)
                        {
                            if(!hasclawTarget)
                            {
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                                {
                                    DoCast(target, SPELL_CLAW_RAGE_CHARGE, false);
                                    DoCast(target, SPELL_CLAW_RAGE_DAMAGE, false);
                                    clawTarget = target;
                                    hasclawTarget = true;
                                }
                            }
                            else
                            {
                                DoCast(clawTarget, SPELL_CLAW_RAGE_DAMAGE, false);
                            }

                            clawRageTicks++;
                            events.ScheduleEvent(EVENT_CLAW_RAGE, 500);
                        }
                        else
                        {
                            canCastClaw = false;
                            clawRageTicks = 0;
                            hasclawTarget = false;
                            canCastRush = true;
                            events.ScheduleEvent(EVENT_CLAW_RAGE, urand(15000, 20000));
                        }
                        break;

                    case EVENT_LYNX_RUSH:
                        if (canCastRush && lynxRushes < 4)
                        {
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                                DoCast(target, SPELL_LYNX_RUSH);

                            lynxRushes++;
                            events.ScheduleEvent(EVENT_LYNX_RUSH, 1000);
                        }
                        else
                        {
                            canCastRush = false;
                            lynxRushes = 0;
                            events.ScheduleEvent(EVENT_LYNX_RUSH, urand(15000, 20000));
                            canCastClaw = true;
                        }
                        break;

                    //====== Eagle Form
                    case EVENT_LIGHTNING_TOTEM:
                        DoCast(me, SPELL_SUMMON_LIGHT_TOTEM);
                        events.ScheduleEvent(EVENT_LIGHTNING_TOTEM, urand(15000, 18000));
                        break;

                    case EVENT_SWEEPING_WINDS:
                        DoCast(me, SPELL_SWEEPING_WINDS);
                        events.ScheduleEvent(EVENT_TORNADO_MOVE, 1000);
//                        events.ScheduleEvent(EVENT_SWEEPING_WINDS, urand(9000, 11000));
                        break;

                    case EVENT_TORNADO_MOVE:
                        {
                            std::list<Creature*> creatures;
                            GetCreatureListWithEntryInGrid(creatures, me, 52865, 1000.0f);
                            
                            if (creatures.empty())
                                return;
                            
                            for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter)
                            {
                                (*iter)->SetWalk(false);
                                (*iter)->SetSpeed(MOVE_RUN, 2.5f);
                                (*iter)->GetMotionMaster()->MoveRandom(20.0f);
                            }

                            events.ScheduleEvent(EVENT_TORNADO_STOP, 2000);
                        }
                        break;

                    case EVENT_TORNADO_STOP:
                        {
                            std::list<Creature*> creatures;
                            GetCreatureListWithEntryInGrid(creatures, me, 52865, 1000.0f);
                            
                            if (creatures.empty())
                                return;
                            
                            for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter)
                            {
                                (*iter)->GetMotionMaster()->MovementExpired();
                                (*iter)->GetMotionMaster()->Clear();
                            }
                        }
                        break;

                    //====== Dragonhawk Form
                    case EVENT_FLAME_BREATH:
                        Talk(YELL_FIRE_BREATH);
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        {
                            me->AttackStop();
                            me->GetMotionMaster()->Clear();
                            
                            for (uint8 i = 0; i < 7; i++)
                            {
                                float x, y, z;
                                me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 1.0f + (4 * i));
                                me->CastSpell(x, y, z, SPELL_SUMMON_BREATH_LINE, true);
                            }
                            
                            DoCast(target, SPELL_FLAME_BREATH);
                            me->StopMoving();
                            isFlameBreathing = true;
                        }

                        events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 15000));
                        break;

                    case EVENT_FLAME_WHIRL:
                        DoCast(me, SPELL_FLAME_WHIRL);
                        events.ScheduleEvent(EVENT_FLAME_WHIRL, urand(10000, 12000));
                        break;

                    case EVENT_PILLAR_OF_FIRE:
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                            DoCast(target, SPELL_SUMMON_PILLAR);
                        events.ScheduleEvent(EVENT_PILLAR_OF_FIRE, urand(8000, 11000));
                        break;

                    case EVENT_BERSERK:
                        Talk(YELL_BERSERK);
                        DoCast(me, SPELL_BERSERK);
                        break;
                }
            }

            if (Phase != PHASE_EAGLE)
                DoMeleeAttackIfReady();
        }
Esempio n. 8
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim())
                    return;

                if (me->getVictim()->GetTypeId() != TYPEID_PLAYER)
                {
                    EnterEvadeMode();
                    return;
                }

                // dialog
                if (talkPhase == SAY_AGGRO)
                {
                    Talk(SAY_AGGRO);
                    talkPhase++;
                }
                else if (me->GetHealthPct() <= 80.0f && talkPhase++ == SAY_80PERC)
                    Talk(SAY_80PERC);
                else if (me->GetHealthPct() <= 60.0f && talkPhase++ == SAY_60PERC)
                    Talk(SAY_60PERC);
                else if (me->GetHealthPct() <= 5.0f && talkPhase++ == SAY_5PERC)
                    Talk(SAY_5PERC);

                // Immune-Choosing-Phase
                if (me->GetHealthPct() <= 30 && !wasImmune)
                {
                    me->InterruptNonMeleeSpells(true);
                    DoCastVictim(SPELL_BINDINGS); // has implicit targeting

                    Talk(SAY_30PERC);
                    Talk(EMOTE_SHIELDED);
                    talkPhase += 2;

                    // workaround for SpellHit not being called for implicit targeting
                    if (Creature* zepik = me->FindNearestCreature(NPC_ZEPIK, 60.0f, true))
                        zepik->GetAI()->DoAction(ACTION_BIND);

                    if (Creature* jaloot = me->FindNearestCreature(NPC_JALOOT, 60.0f, true))
                        jaloot->GetAI()->DoAction(ACTION_BIND);

                    wasImmune = true;
                    isBound = true;
                }

                events.Update(diff);

                if (isBound || me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                while (uint32 eventId = events.ExecuteEvent())
                    switch (eventId)
                    {
                        case EVENT_FROSTBOLT:
                            DoCastVictim(SPELL_FROSTBOLT);
                            events.ScheduleEvent(EVENT_FROSTBOLT, 4000);
                            break;
                        case EVENT_ICE_LANCE:
                            DoCastVictim(SPELL_ICE_LANCE);
                            events.ScheduleEvent(EVENT_ICE_LANCE, 7000);
                            break;
                        case EVENT_FROST_NOVA:
                            DoCastVictim(SPELL_FROST_NOVA);
                            events.ScheduleEvent(EVENT_FROST_NOVA, 14000);
                            break;
                        case EVENT_ICY_VEINS:
                            DoCast(me, SPELL_ICY_VEINS);
                            events.ScheduleEvent(EVENT_ICY_VEINS, 25000);
                            break;
                    }
            }
        void UpdateAI(uint32 diff)
        {
            events2.Update(diff);
            switch (events2.ExecuteEvent())
            {
                case EVENT_INIT_COMBAT:
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
                    if (Unit* target = SelectTargetFromPlayerList(50.0f))
                        AttackStart(target);
                    return;
                case EVENT_FINISH_TALK:
                    Unit::Kill(me, me);
                    return;
            }

            if (!UpdateVictim())
                return;

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (uint32 eventId = events.ExecuteEvent())
            {
                case EVENT_SPELL_FIREBALL:
                    me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false);
                    events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500));
                    break;
                case EVENT_SPELL_FLAMESTRIKE:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    {
                        me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true);
                        Talk(SAY_FLAMESTRIKE);
                    }
                    events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
                    break;
                case EVENT_SPELL_SHOCK_BARRIER:
                    me->CastSpell(me, SPELL_SHOCK_BARRIER, true);
                    me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
                    events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
                    break;
                case EVENT_SPELL_PHOENIX:
                    Talk(SAY_PHOENIX);
                    me->CastSpell(me, SPELL_PHOENIX, false);
                    events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000);
                    break;
                case EVENT_CHECK_HEALTH:
                    if (HealthBelowPct(50))
                    {
                        me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
                        me->CastSpell(me, SPELL_TELEPORT_CENTER, true);
                        events.Reset();

                        me->StopMoving();
                        me->GetMotionMaster()->Clear();
                        me->GetMotionMaster()->MoveIdle();

                        events.SetPhase(1);
                        events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0);
                        break;
                    }
                    events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
                    break;
                case EVENT_GRAVITY_LAPSE_1_1:
                case EVENT_GRAVITY_LAPSE_1_2:
                    Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
                    me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false);
                    events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000);
                    break;
                case EVENT_GRAVITY_LAPSE_2:
                    LapseAction(ACTION_TELEPORT_PLAYERS);
                    events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000);
                    break;
                case EVENT_GRAVITY_LAPSE_3:
                    LapseAction(ACTION_KNOCKUP);
                    events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000);
                    break;
                case EVENT_GRAVITY_LAPSE_4:
                    LapseAction(ACTION_ALLOW_FLY);
                    for (uint8 i = 0; i < 3; ++i)
                        me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true);

                    me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false);
                    events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000);
                    break;
                case EVENT_GRAVITY_LAPSE_5:
                    LapseAction(ACTION_REMOVE_FLY);
                    me->InterruptNonMeleeSpells(false);
                    Talk(SAY_TIRED);
                    me->CastSpell(me, SPELL_POWER_FEEDBACK, false);
                    events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000);
                    break;
            }


            if (events.GetPhaseMask() == 0)
                DoMeleeAttackIfReady();
        }
Esempio n. 10
0
        void UpdateAI(uint32 diff)
        {
            if (!(UpdateVictim() && isInManglePhase) || me->HasUnitState(UNIT_STATE_CASTING))
                return; 

            if(me->GetMap()->IsHeroic())
            {
                if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                {
                    if(me->GetHealthPct() < 95 && say1 == false)
                    {
                        nefarian->AI()->Talk(NEF_H_STARTED_C);
                        say1 = true;
                    }

                    if(me->GetHealthPct() < 31 && say2 == false)
                    {
                        nefarian->AI()->Talk(NEF_H_LOW_HP);
                        say2 = true;
                        events.CancelEvent(EVENT_BLAZING_INFERNO);
                        events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(6000, 9000));
                    }
                }
            }

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch(eventId)
                {
                    case EVENT_IGNITION:
                        CastIgnition();
                        break;

                    case EVENT_SHADOW_BREATH:
                        if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                nefarian->CastSpell(target, SPELL_SHADOW_BREATH, false);
                        events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(9000, 13000));
                        break;

                    case EVENT_BLAZING_INFERNO:
                        if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                nefarian->CastSpell(target, SPELL_BLAZING_INFERNO, false);
                        events.ScheduleEvent(EVENT_BLAZING_INFERNO, urand(30000, 35000));
                        break;

                    case EVENT_MAGMA_SPIT:
                        me->AttackStop();
                        CastMagmaSpit();
                        me->Attack(me->GetVictim(), true);
                        events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000));
                        break;

                    case EVENT_LAVA_SPEW:
                        DoCastAOE(SPELL_LAVA_SPEW);
                        events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000));
                        break;

                    case EVENT_BREAK_FREE:
                        if (me->HasAura(SPELL_CUSTOM_STATE_05)) // Check if the second chain hit or not.
                        {
                            Talk(ANN_BREAK_FREE);
                            me->RemoveAura(SPELL_CUSTOM_STATE_05);
                            if (Creature* spikeStalker = me->FindNearestCreature(41767, 50.0f, true))
                                spikeStalker->AI()->DoAction(ACTION_SPIKE_RESET);
                        }
                        break;

                    case EVENT_PILLAR_OF_FLAME:
                        if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 80.0f, true)) // Try to select farthest target.
                        {
                            if (me->GetDistance2d(target) >= 15.0f) // If target is over 15y away, it's ok.
                                DoCast(target, SPELL_PILLAR_OF_FLAME);
                            else
                                if (me->GetDistance2d(target) < 15.0f) // If target is less then 15y away, cast on nearest, as they are hacking the encounter by standing all melee.
                                    if (Unit* target2 = SelectTarget(SELECT_TARGET_NEAREST, 0, 80.0f, true))
                                        DoCast(target2, SPELL_PILLAR_OF_FLAME);
                        }
                        events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, urand(20000, 25000));
                        break;

                    case EVENT_BERSERK:
                        DoCast(me, SPELL_BERSERK);
                        break;

                    case EVENT_MANGLE:
                        if (Unit* victim = me->GetVictim())
                        {
                            if (victim->GetTypeId() == TYPEID_PLAYER)
                            {
                                sTarget = victim;
                                sTar = true;
                                isInManglePhase = true;
                                Talk(ANN_CLOSE_HEAD);
                                me->AddAura(SPELL_MANGLE, victim);
                                DoCast(me, SPELL_CUSTOM_IMPACT_06);
                                if (Unit* magmawHead = vehicle->GetPassenger(0))
                                    victim->CastSpell(magmawHead, SPELL_ENTER_MOUTH, true);
                                //sTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); 
                            }
                        }
                        events.ScheduleEvent(EVENT_MANGLE, 90000);
                        events.ScheduleEvent(EVENT_IGNITION, 5000);
                        events.ScheduleEvent(EVENT_MASSIVE_CRASH, 10000);
                        events.ScheduleEvent(EVENT_KILL_TANK, 30000);
                        break;

                    case EVENT_MASSIVE_CRASH:
                        events.CancelEvent(EVENT_LAVA_SPEW);
                        events.CancelEvent(EVENT_PILLAR_OF_FLAME);
                        events.CancelEvent(EVENT_MAGMA_SPIT);

                        DoCast(me, SPELL_MASSIVE_CRASH);
                        Talk(ANN_EXPOSE_PINCERS);

                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

                        // Enter Head Phase
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0);
                            Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1);

                            // Make pincers visible and right faction.
                            if (pincer1 && pincer2)
                            {
                                pincer1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                pincer2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                pincer1->setFaction(35);
                                pincer2->setFaction(35);
                            }
                        }
                        break;

                    case EVENT_EJECT_PINCERS:
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0);
                            Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1);

                            // Eject pincer passengers and set right faction.
                            if (pincer1 && pincer2)
                            {
                                pincer1->GetVehicleKit()->RemoveAllPassengers();
                                pincer2->GetVehicleKit()->RemoveAllPassengers();
                                pincer1->setFaction(14);
                                pincer2->setFaction(14);
                                pincer1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                pincer2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            }

                            if (sTar)
                            {
                                head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat.
                                sTarget->CastSpell(sTarget, SPELL_SWELTERING_ARMOR, true);
                                if (Unit* hTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                    sTarget->JumpTo(hTarget, 10.0f);
                                isInManglePhase = false;
                                sTar = false;
                            }
                        }
                        break;

                    case EVENT_KILL_TANK:
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        if (sTar)
                        {
                            head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat.
                            sTarget->CastSpell(sTarget, SPELL_MANGLED_LIFELESS, true);
                            me->Kill(sTarget);
                            isInManglePhase = false;
                            sTar = false;
                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        }
                        break;

                    case EVENT_LEAVE_GROUND_PHASE:
                        // Leave Head Phase
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            head->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            head->RemoveAllAuras();
                            me->RemoveAura(SPELL_POINT_OF_VULNERABILITY2);
                            head->RemoveAura(SPELL_POINT_OF_VULNERABILITY);
                            head->RemoveAura(SPELL_POINT_OF_VULNERABILITY2);
                        }

                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        me->RemoveAura(SPELL_CUSTOM_STATE_04);
                    
                        events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000));
                        events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000));
                        events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, 25000);
                        break;
                }
            }

            if(!me->HasAura(SPELL_CUSTOM_STATE_04) && !me->HasAura(SPELL_CUSTOM_STATE_05) && !isInManglePhase)
                DoMeleeAttackIfReady();
        }
Esempio n. 11
0
            void UpdateAI(uint32 diff)
            {
                if (!pInstance || !UpdateVictim())
                    return;

                events.Update(diff);

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                if (me->GetVictim())
                    if (me->GetVictim()->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 55.0f)
                    {
                        DoCastVictim(SPELL_LIGHTNING_BLAST);
                        return;
                    }

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                    case EVENT_CHILLING_BREATH:
                        if (Unit* target  = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
                            DoCast(target, SPELL_CHILLING_BREATH);
                        events.ScheduleEvent(EVENT_CHILLING_BREATH, urand(10000, 16000));
                        break;
                    case EVENT_RESET_WIND:
                        if (_aircurrent)
                            _aircurrent->DespawnOrUnsummon();
                        events.DelayEvents(1000);
                        events.ScheduleEvent(EVENT_CALL_OF_WIND, 800);
                        break;
                    case EVENT_CALL_OF_WIND:
                        _aircurrent = me->SummonCreature(NPC_AIR_CURRENT,
                            me->GetPositionX(),
                            me->GetPositionY(),
                            me->GetPositionZ(),
                            orientations[urand(0, 3)]);
                        events.ScheduleEvent(EVENT_RESET_WIND, 18000);
                        break;
                    case EVENT_CHECK_FACING:
                        if (me->GetMap()->GetPlayers().isEmpty() || !_aircurrent)
                            break;

                        for (Map::PlayerList::const_iterator itr = me->GetMap()->GetPlayers().begin(); itr != me->GetMap()->GetPlayers().end(); ++itr) 
                        {
                            if (CheckOrientation(itr->GetSource()->GetOrientation(), _aircurrent->GetOrientation()))
                            {
                                itr->GetSource()->RemoveAurasDueToSpell(SPELL_DOWNWIND_OF_ALTAIRUS);
                                me->AddAura(SPELL_UPWIND_OF_ALTAIRUS, itr->GetSource());
                            }
                            else
                            {
                                itr->GetSource()->RemoveAurasDueToSpell(SPELL_UPWIND_OF_ALTAIRUS);
                                me->AddAura(SPELL_DOWNWIND_OF_ALTAIRUS, itr->GetSource());
                            }
                        }
                        events.ScheduleEvent(EVENT_CHECK_FACING, 3000);
                        break;
                    }
                }
                DoMeleeAttackIfReady();
            }
        void UpdateAI(uint32 diff)
        {
            if (!me->isActiveObject())
                return;

            events.Update(diff);

            switch (events.ExecuteEvent())
            {
                case 1:
                    if (Creature* c = me->FindNearestCreature(NPC_SUNWELL_HONOR_GUARD, 60.0f, true))
                        c->AI()->Talk(0);
                    break;
                case 2:
                    if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true))
                        c->AI()->Talk(0);
                    break;
                case 3:
                    me->SetWalk(true);
                    me->GetMotionMaster()->MovePath(me->GetEntry()*100, false);
                    if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true))
                    {
                        c->SetWalk(true);
                        c->GetMotionMaster()->MovePath(c->GetEntry()*100, false);
                    }
                    if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true))
                    {
                        c->SetWalk(true);
                        c->GetMotionMaster()->MovePath(c->GetEntry()*100, false);
                    }
                    break;
                case 4:
                    Talk(0);
                    break;
                case 5:
                    if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true))
                        c->AI()->Talk(1);
                    break;
                case 6:
                    if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true))
                        c->AI()->Talk(2, ObjectAccessor::GetPlayer(*me, playerGUID));
                    break;
                case 7:
                    Talk(1, ObjectAccessor::GetPlayer(*me, playerGUID));
                    break;
                case 8:
                    Talk(2);
                    break;
                case 9:
                    Talk(3);
                    break;
                case 10:
                    if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true))
                        c->AI()->Talk(0);
                    break;
                case 11:
                    if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true))
                        c->AI()->Talk(1);
                    break;
                case 12:
                    if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID))
                        Talk(p->GetTeamId() == TEAM_ALLIANCE ? 5 : 4, p);
                    break;
                case 13:
                    me->setActive(false);
                    if (Creature* c = me->FindNearestCreature(NPC_SUNWELL_VISUAL_BUNNY, 60.0f, true))
                        c->DespawnOrUnsummon(1);
                    if (GameObject* go = me->FindNearestGameObject(GO_QUEL_DELAR, 60.0f))
                        go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
                    me->SetWalk(true);
                    if (me->GetCreatureData())
                        me->GetMotionMaster()->MovePoint(0, me->GetCreatureData()->posX, me->GetCreatureData()->posY, me->GetCreatureData()->posZ);
                    if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true))
                    {
                        c->SetWalk(true);
                        if (c->GetCreatureData())
                            c->GetMotionMaster()->MovePoint(0, c->GetCreatureData()->posX, c->GetCreatureData()->posY, c->GetCreatureData()->posZ);
                    }
                    if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true))
                    {
                        c->SetWalk(true);
                        if (c->GetCreatureData())
                            c->GetMotionMaster()->MovePoint(0, c->GetCreatureData()->posX, c->GetCreatureData()->posY, c->GetCreatureData()->posZ);
                    }
                    break;
            }
        }
Esempio n. 13
0
                void UpdateAI(const uint32 diff)
                {
                    if (!UpdateVictim())
                        return;
					
					if (AggroResetTime)
                    {
                    //Attack random Gamers
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
                        {
                        me->AddThreat(target, 1.0f);
                        me->TauntApply(target);
                        AttackStart(target);
                        }
                    AggroResetTime = false;
					}
					
                    events.Update(diff);

                    if (me->HasUnitState(UNIT_STATE_CASTING))
                        return;

                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_ENERGY_DRAIN:
                                if (me->GetPower(POWER_ENERGY) == 0)
                                {
                                    DoCast(me, SPELL_SMOLDERING_DEVASTATION);
                                    me->SetPower(POWER_ENERGY, 100);
                                    Devastion++;
                                    if (Devastion == 3)
                                    {
                                        events.CancelEvent(EVENT_ENERGY_DRAIN);
                                        events.ScheduleEvent(EVENT_PHASE_LOWER, 10000);
                                        break;
                                    }
                                }
                                else
                                    me->SetPower(POWER_ENERGY, (me->GetPower(POWER_ENERGY) - 1));

                                events.ScheduleEvent(EVENT_ENERGY_DRAIN, 1000, EVENT_GROUP_UP_PHASE);
                                break;
                            case EVENT_EMBER_FLARE:
                                DoCast(me, SPELL_EMBER_FLARE);
                                events.ScheduleEvent(EVENT_EMBER_FLARE, urand(10000, 15000));
                                break;
                            case EVENT_METEOR_FALL:
                                if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true))
                                {
                                    DoCast(target, SPELL_METEOR_FALL);
                                    events.ScheduleEvent(EVENT_METEOR_FALL, urand(20000, 30000));
                                }
                                else
                                    events.ScheduleEvent(EVENT_METEOR_FALL, 5000);
                                break;
                            case EVENT_PHASE_UPPER:
                                me->SetCanFly(true);
                                me->SetDisableGravity(true);
								AggroResetTime = true;
                                me->AddAura(SPELL_WEB_SILK, me);
                                me->GetMotionMaster()->MovePoint(POINT_UP, upPos);
                                _moveup = true;
                                me->SetReactState(REACT_PASSIVE);
                                me->SetPower(POWER_ENERGY, 100);
                                DoCast(me, SPELL_NO_REGEN);
                                events.ScheduleEvent(EVENT_ENERGY_DRAIN, 3000, EVENT_GROUP_UP_PHASE);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPINNER, 10000, EVENT_GROUP_UP_PHASE);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_DRONE, 44500, EVENT_GROUP_UP_PHASE);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING, 12000, EVENT_GROUP_UP_PHASE);
                                events.ScheduleEvent(EVENT_SMOLDERING_DEVASTATION, 120000, EVENT_GROUP_UP_PHASE);
                                events.ScheduleEvent(EVENT_PHASE_LOWER, 312000);
                                events.ScheduleEvent(EVENT_CHECK_UPPER, 1900);
                                if (me->GetMap()->IsHeroic())
                                    events.ScheduleEvent(EVENT_SUMMON_ENGORGED_BROODLING, 45000, EVENT_GROUP_UP_PHASE);
                                break;
                            case EVENT_PHASE_LOWER:
                                events.CancelEvent(EVENT_SUMMON_CINDERWEB_SPINNER);
                                events.CancelEvent(EVENT_SUMMON_CINDERWEB_DRONE);
                                events.CancelEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING);
                                events.CancelEvent(EVENT_SUMMON_ENGORGED_BROODLING);
                                events.CancelEvent(EVENT_SMOLDERING_DEVASTATION);
                                events.CancelEvent(EVENT_CHECK_UPPER);
                                events.CancelEvent(EVENT_METEOR_FALL);
                                me->GetMotionMaster()->MovePoint(POINT_DOWN, 67.888f, 387.82f, 74.042f);
                                me->SetPower(POWER_ENERGY, 0);
                                events.ScheduleEvent(EVENT_ATTACK_START, 12000);
                                events.ScheduleEvent(EVENT_FRENZY, 13000);
                                events.ScheduleEvent(EVENT_WIDOWS_KISS, 15000);
                                break;
                            case EVENT_SUMMON_CINDERWEB_SPINNER:
                                for (int i = 0; i < 5; i++)
                                    me->SummonCreature(NPC_LIFT_CONTROLLER, CinderwebSummonPos[i].GetPositionX(),
                                            CinderwebSummonPos[i].GetPositionY(), CinderwebSummonPos[i].GetPositionZ(),
                                            0, TEMPSUMMON_TIMED_DESPAWN, 120000);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPINNER, 55000, EVENT_GROUP_UP_PHASE);
                                break;
                            case EVENT_SUMMON_CINDERWEB_DRONE:
                                me->SummonCreature(NPC_CINDERWEB_DRONE, DronePositionSummon[urand(0, 1)],
                                        TEMPSUMMON_CORPSE_DESPAWN);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_DRONE, 60000, EVENT_GROUP_UP_PHASE);
                                break;
                            case EVENT_SUMMON_CINDERWEB_SPIDERLING:
                            {
                                int8 position = urand(0, 4);
                                for (int i = 1; i < 8; i++)
                                    me->SummonCreature(NPC_CINDERWEB_SPIDERLING,
                                            SpinderlingsPos[position].GetPositionX() + urand(1, 4),
                                            SpinderlingsPos[position].GetPositionY() + urand(1, 4),
                                            SpinderlingsPos[position].GetPositionZ(), TEMPSUMMON_CORPSE_DESPAWN);
                                events.ScheduleEvent(EVENT_SUMMON_CINDERWEB_SPIDERLING, urand(25000, 35000),
                                        EVENT_GROUP_UP_PHASE);
                            }
                                break;
                            case EVENT_SUMMON_ENGORGED_BROODLING:
                                for (int i = 4; i < 8; i++)
                                    me->SummonCreature(NPC_ENGORGED_BROODLING, CinderwebSummonPos[i].GetPositionX(),
                                            CinderwebSummonPos[i].GetPositionY(), 74.042f, TEMPSUMMON_CORPSE_DESPAWN);
                                events.ScheduleEvent(EVENT_SUMMON_ENGORGED_BROODLING, urand(30000, 40000),
                                        EVENT_GROUP_UP_PHASE);
                                break;
                            case EVENT_ATTACK_START:
                                me->GetMotionMaster()->MoveChase(me->GetVictim());
                                break;
                            case EVENT_FRENZY:
                                DoCast(me, SPELL_FRENZY);
                                events.ScheduleEvent(EVENT_FRENZY, 15000);
                                break;
                            case EVENT_WIDOWS_KISS:
                                if (Unit* target = me->GetVictim())
                                    me->AddAura(SPELL_THE_WIDOWS_KISS, target);
                                events.ScheduleEvent(EVENT_WIDOWS_KISS, 20000);
                                break;
                            case EVENT_CHECK_UPPER:
                                Map* map = me->GetMap();
                                if (map && map->IsDungeon() && Devastion != 3)
                                {
                                    //Players part
                                    std::list<Player*> TargetList;
                                    Map::PlayerList const& Players = map->GetPlayers();
                                    for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end();
                                            ++itr)
                                    {
                                        if (Player* player = itr->getSource())
                                        {
                                            if (player->GetPositionZ() > 108.0f)
                                                TargetList.push_back(player);
                                            else
                                                continue;
                                        }
                                    }
                                    if (TargetList.empty())
                                    {
                                        me->SetReactState(REACT_PASSIVE);
                                        me->AddAura(SPELL_WEB_SILK, me);
                                        //me->GetMotionMaster()->MoveJumpTo(67.888f, 387.82f, 111.767f);
                                        me->GetMotionMaster()->MovePoint(POINT_UP, upPos);
                                        DoCast(me, SPELL_VENOM_RAIN);
                                    }
                                    else
                                    {
                                        for (std::list<Player*>::const_iterator itr = TargetList.begin();
                                                itr != TargetList.end(); ++itr)
                                        {
                                            if (!me->HasReactState(REACT_AGGRESSIVE))
                                            {
                                                me->SetReactState(REACT_AGGRESSIVE);
                                                me->Attack((*itr), true);
                                                me->GetMotionMaster()->MoveChase((*itr));
                                            }
                                            me->AddAura(SPELL_WEB_SILK, *itr);
                                        }
                                    }

                                    //Creatures part
                                    std::list<Creature*> DroneList;
                                    GetCreatureListWithEntryInGrid(DroneList, me, NPC_CINDERWEB_DRONE, 1000.0f);
                                    for (std::list<Creature*>::const_iterator itr = DroneList.begin();
                                            itr != DroneList.end(); ++itr)
                                        if ((*itr)->GetPositionZ() > 108.0f)
                                            me->AddAura(SPELL_WEB_SILK, *itr);
                                }
                                events.ScheduleEvent(EVENT_CHECK_UPPER, 2500);
                                break;
                        }

                    }
                    DoMeleeAttackIfReady();
                }
        void UpdateAI(uint32 const diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
                return;

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                case EVENT_BLOOD_SUMMON:
                    switch (urand(0, 1))
                    {
                    case 0:
                        me->SummonCreature(NPC_BLACK_BLOOD, SummonPositions[0], TEMPSUMMON_MANUAL_DESPAWN);
                        me->SummonCreature(NPC_COBLAT_BLOOD, SummonPositions[1], TEMPSUMMON_MANUAL_DESPAWN);
                        me->SummonCreature(NPC_CRIMSON_BLOOD, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN);
                        if(IsHeroic())
                            me->SummonCreature(NPC_GLOWING_BLOOD, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN);
                        Talk(YELL);
                        break;
                    case 1:
                        me->SummonCreature(NPC_GLOWING_BLOOD, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN);
                        me->SummonCreature(NPC_ACIDIC_BLOOD, SummonPositions[4], TEMPSUMMON_MANUAL_DESPAWN);
                        me->SummonCreature(NPC_SHADOWED_BLOOD, SummonPositions[5], TEMPSUMMON_MANUAL_DESPAWN);
                        if(IsHeroic())
                            me->SummonCreature(NPC_CRIMSON_BLOOD, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN);
                        Talk(YELL);
                        break;
                    }
                    events.ScheduleEvent(EVENT_BLOOD_SUMMON, 82000);
                    break;

                case EVENT_COID_BOLT:
                    if(me->HasAura(SPELL_GLOWING_BLOOD_OF_SHUMA))
                    {
                        if(Unit* target = me->FindNearestPlayer(100.0f))
                            DoCast(target, SPELL_COID_BOLT);
                    }
                    else if(Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
                        DoCast(target, SPELL_COID_BOLT);

                    if(me->HasAura(SPELL_GLOWING_BLOOD_OF_SHUMA))
                        events.ScheduleEvent(EVENT_COID_BOLT, urand(2500, 15000));
                    else
                        events.ScheduleEvent(EVENT_COID_BOLT, urand(5000, 30000));
                    break;

                case EVENT_SEARING_BLOOD:
                    if(me->HasAura(SPELL_CRIMSON_BLOOD_OF_SHUMA))
                    {
                        if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                           DoCast(target, SPELL_SEARING_BLOOD);
                        events.ScheduleEvent(EVENT_SEARING_BLOOD, urand(5000,30000));
                    }
                    else
                        events.ScheduleEvent(EVENT_SEARING_BLOOD, 1000);
                    break;

                case EVENT_MANA_VOID:
                    if (me->HasAura(SPELL_COBALT_BLOOD_OF_SHUMA) && !mana_void)
                    {
                        me->SummonCreature(NPC_MANA_VOID, SummonMvPositions[urand(0,5)], TEMPSUMMON_MANUAL_DESPAWN);
                        mana_void = true;
                    }
                    if (!me->HasAura(SPELL_COBALT_BLOOD_OF_SHUMA) && mana_void)
                        mana_void = false;
                    events.ScheduleEvent(EVENT_MANA_VOID, 1000);
                    break;

                case EVENT_FORGOTTEN_ONE:
                    if(me->HasAura(SPELL_BLACK_BLOOD_OF_SHUMA))
                    {
                        switch(urand(0,2))
                        {
                        case 1:
                            for (int8 i = 0; i < 3; i++)
                            me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten[i], TEMPSUMMON_TIMED_DESPAWN, 60000);
                            break;
                        case 2:
                            for (int8 i = 0; i < 3; i++)
                            me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten2[i], TEMPSUMMON_TIMED_DESPAWN, 60000);
                            break;
                        case 3:
                            for (int8 i = 0; i < 3; i++)
                            me->SummonCreature(NPC_FORGOTTEN_ONE, forgotten3[i], TEMPSUMMON_TIMED_DESPAWN, 60000);
                            break;
                        }
                        events.ScheduleEvent(EVENT_FORGOTTEN_ONE, urand(7500,15000));
                    }
                    else
                        events.ScheduleEvent(EVENT_FORGOTTEN_ONE, 1000);
                    break;

                case EVENT_DIGESTIVE_ACID:
                    if(me->HasAura(SPELL_ACIDIC_BLOOD_OF_SHUMA))
                    {
                        Map::PlayerList const &PlList = me->GetMap()->GetPlayers();
                        for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
                        {
                            Unit* target = i->getSource();
                            DoCast(target, SPELL_DIGESTIVE_ACID);
                        }
                        events.ScheduleEvent(EVENT_DIGESTIVE_ACID, urand(5000,15000));
                    }
                    else
                        events.ScheduleEvent(EVENT_DIGESTIVE_ACID, 1000);
                    break;
                default:
                    break;
                }
            }        

            DoMeleeAttackIfReady();
        }
Esempio n. 15
0
        void UpdateAI(uint32 diff)
        {
			events.Update(diff);
			switch (events.ExecuteEvent())
			{
				case EVENT_MAD_1:
					me->SetVisible(true);
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						me->SetTarget(brutallus->GetGUID());
						brutallus->SetReactState(REACT_PASSIVE);
						brutallus->setActive(true);
					}
					me->GetMotionMaster()->MovePoint(1, 1477.94f, 643.22f, 21.21f);
					me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
					events.ScheduleEvent(EVENT_MAD_2, 6000);
					break;
				case EVENT_MAD_2:
					Talk(SAY_MAD_1);
					me->CastSpell(me, SPELL_MADRIGOSA_FREEZE, false);
					events.ScheduleEvent(EVENT_MAD_2_1, 1000);
					break;
				case EVENT_MAD_2_1:
					me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
					me->SetDisableGravity(false);
					me->CastSpell(me, SPELL_MADRIGOSA_FROST_BREATH, false);
					events.ScheduleEvent(EVENT_MAD_3, 7000);
					break;
				case EVENT_MAD_3:
					Talk(SAY_MAD_2);
					events.ScheduleEvent(EVENT_MAD_4, 7000);
					break;
				case EVENT_MAD_4:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
						brutallus->AI()->Talk(YELL_INTRO);
					events.ScheduleEvent(EVENT_MAD_5, 5000);
					break;
				case EVENT_MAD_5:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
						me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
					}
					events.ScheduleEvent(EVENT_MAD_6, 10000);
					break;
				case EVENT_MAD_6:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
						me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
					}
					me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
					me->SetDisableGravity(true);
					events.ScheduleEvent(EVENT_MAD_7, 4000);
					break;
				case EVENT_MAD_7:
					Talk(SAY_MAD_3);
					me->CastSpell(me, SPELL_MADRIGOSA_FROST_BLAST, false);
					events.ScheduleEvent(EVENT_MAD_8, 3000);
					events.ScheduleEvent(EVENT_MAD_8, 5000);
					events.ScheduleEvent(EVENT_MAD_8, 6500);
					events.ScheduleEvent(EVENT_MAD_8, 7500);
					events.ScheduleEvent(EVENT_MAD_8, 8500);
					events.ScheduleEvent(EVENT_MAD_8, 9500);
					events.ScheduleEvent(EVENT_MAD_9, 11000);
					events.ScheduleEvent(EVENT_MAD_8, 12000);
					events.ScheduleEvent(EVENT_MAD_8, 14000);
					break;
				case EVENT_MAD_8:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
						me->CastSpell(brutallus, SPELL_MADRIGOSA_FROSTBOLT, false);
					break;
				case EVENT_MAD_9:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FLAME_RING, true);
						brutallus->RemoveAllAuras();
						brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FEL_FIREBALL, false);
						brutallus->AI()->Talk(YELL_INTRO_BREAK_ICE);
					}
					events.ScheduleEvent(EVENT_MAD_11, 6000);
					break;
				//case EVENT_MAD_10:
				case EVENT_MAD_11:
					me->SetDisableGravity(false);
					me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
					events.ScheduleEvent(EVENT_MAD_13, 2500);
					break;
				case EVENT_MAD_13:
					Talk(SAY_MAD_4);
					me->RemoveAllAuras();
					me->CastSpell(me, SPELL_MADRIGOSA_ENCAPSULATE, false);
					events.ScheduleEvent(EVENT_MAD_14, 2000);
					break;
				case EVENT_MAD_14:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->SetDisableGravity(true);
						brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY()-30.0f, brutallus->GetPositionZ()+15.0f, false, true);
					}
					events.ScheduleEvent(EVENT_MAD_15, 10000);
					break;
				case EVENT_MAD_15:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->RemoveAllAuras();
						brutallus->SetDisableGravity(false);
						brutallus->GetMotionMaster()->MoveFall();
						brutallus->AI()->Talk(YELL_INTRO_CHARGE);
					}
					events.ScheduleEvent(EVENT_MAD_16, 1400);
					break;
				case EVENT_MAD_16:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
						brutallus->CastSpell(me, SPELL_BRUTALLUS_CHARGE, true);
					events.ScheduleEvent(EVENT_MAD_17, 1200);
					break;
				case EVENT_MAD_17:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
						brutallus->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
					events.ScheduleEvent(EVENT_MAD_18, 500);
					break;
				case EVENT_MAD_18:
					Talk(SAY_MAD_5);
					me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
					me->SetStandState(UNIT_STAND_STATE_DEAD);
					events.ScheduleEvent(EVENT_MAD_19, 6000);
					break;
				case EVENT_MAD_19:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
						brutallus->AI()->Talk(YELL_INTRO_KILL_MADRIGOSA);
					events.ScheduleEvent(EVENT_MAD_20, 7000);
					break;
				case EVENT_MAD_20:
					me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					me->setFaction(35);
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->AI()->Talk(YELL_INTRO_TAUNT);
						brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_BREAK_ICE, false);
					}
					events.ScheduleEvent(EVENT_MAD_21, 4000);
					break;
				case EVENT_MAD_21:
					if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
					{
						brutallus->SetReactState(REACT_AGGRESSIVE);
						brutallus->SetHealth(brutallus->GetMaxHealth());
						brutallus->AI()->EnterEvadeMode();
						brutallus->setActive(false);
					}
					break;
				case EVENT_SPAWN_FELMYST:
					me->DespawnOrUnsummon(1);
					if (Creature* felmyst = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_FELMYST)))
						felmyst->AI()->DoAction(ACTION_START_EVENT);
					break;
			}
        }
Esempio n. 16
0
        void UpdateAI(uint32 diff)
        {
            if (phase == PHASE_INTRO)
            {
                if (!instance)
                    return;

                events.Update(diff);
                switch (events.ExecuteEvent())
                {
                    case EVENT_INTRO_1:
                        Talk(SAY_JAINA_INTRO_1);
                        events.ScheduleEvent(EVENT_INTRO_2, 8000);
                        break;

                    case EVENT_INTRO_2:
                        Talk(SAY_JAINA_INTRO_2);
                        events.ScheduleEvent(EVENT_INTRO_3, 8500);
                        break;

                    case EVENT_INTRO_3:
                        Talk(SAY_JAINA_INTRO_3);
                        events.ScheduleEvent(EVENT_INTRO_4, 8000);
                        break;

                    case EVENT_INTRO_4:
                        Talk(SAY_JAINA_INTRO_4);
                        events.ScheduleEvent(EVENT_INTRO_5, 10000);
                        break;

                    case EVENT_INTRO_5:
                        Talk(SAY_JAINA_INTRO_5);
                        events.ScheduleEvent(EVENT_INTRO_6, 8000);
                        break;

                    case EVENT_INTRO_6:
                        Talk(SAY_JAINA_INTRO_6);
                        events.ScheduleEvent(EVENT_INTRO_7, 12000);
                        break;

                    case EVENT_INTRO_7:
                        Talk(SAY_JAINA_INTRO_7);
                        events.ScheduleEvent(EVENT_INTRO_8, 8000);
                        break;

                    case EVENT_INTRO_8:
                        Talk(SAY_JAINA_INTRO_8);
                        // End of Intro
                        phase = PHASE_NORMAL;
                        break;
                }
            }

            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

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

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            if (phase == PHASE_MOVE && !phaseInitiated)
            {
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
                me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD);
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                    me->GetMotionMaster()->MoveFollow(target, 3, 2);
                gravity = 0;
                summon = 0;
                creature = false;
                events.CancelEvent(EVENT_SEISMIC_SHARD);
                events.CancelEvent(EVENT_ENERGY_SHIELD);
                events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 1 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_GRAVITY_WELL, 2 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_PHASE_SHIELD, 35 *IN_MILLISECONDS);
                phaseInitiated = true;
            }

            if (phase == PHASE_SHIELDS && !phaseInitiated)
            {
                me->GetMotionMaster()->MovePoint(1, MeteorPosition[3]);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
                DoCast(me, SPELL_ENERGY_SHIELD);
                DoCast(me, SPELL_SEISMIC_SHARD_DUMMY);
                events.CancelEvent(EVENT_CURSE_OF_BLOOD);
                events.CancelEvent(EVENT_GRAVITY_WELL);
                events.ScheduleEvent(EVENT_SUMMON_GUARDS, 1 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_SEISMIC_SHARD, 2 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_START_METEOR, 12 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_PHASE_MOVE, 35 *IN_MILLISECONDS);
                phaseInitiated = true;
                creature = true;
            }

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                case EVENT_PHASE_SHIELD:
                    phase = PHASE_SHIELDS;
                    phaseInitiated = false;
                    break;
                case EVENT_PHASE_MOVE:
                    phase = PHASE_MOVE;
                    phaseInitiated = false;
                    break;
                case EVENT_CURSE_OF_BLOOD:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        DoCast(target, SPELL_CURSE_OF_BLOOD);
                    events.RescheduleEvent(EVENT_CURSE_OF_BLOOD, 15 *IN_MILLISECONDS);
                    break;
                case EVENT_GRAVITY_WELL:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        DoCast(target, SPELL_GRAVITY_WELL_SUMMON);
                    
                    if (++gravity <= 6)
                        events.RescheduleEvent(EVENT_GRAVITY_WELL, 5 *IN_MILLISECONDS);
                    break;
                case EVENT_SUMMON_GUARDS:
                    for (uint8 i = 0; i < 10; ++i)                                  //summon 10 Guards
                        me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[4], TEMPSUMMON_CORPSE_DESPAWN);
                    for (uint8 i = 0; i < 10; ++i)                                  //summon 10 Guards
                        me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[5], TEMPSUMMON_CORPSE_DESPAWN);
                    break;
                case EVENT_SEISMIC_SHARD:
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[0], TEMPSUMMON_CORPSE_DESPAWN));
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[1], TEMPSUMMON_CORPSE_DESPAWN));
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[2], TEMPSUMMON_CORPSE_DESPAWN));
                    break;
                case EVENT_START_METEOR:
                    if (meteors.size())
                    {
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        {
                            uint8 i = urand(0, meteors.size()-1);
                            if (Unit* trigger = me->SummonCreature(NPC_SEISMIC_SHARD_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_DESPAWN))
                            {
                                meteors[i]->SetSpeed(MOVE_RUN, speed*3.0f, true);
                                meteors[i]->SetSpeed(MOVE_WALK, speed*3.0f, true);
                                meteors[i]->SetSpeed(MOVE_FLIGHT, speed*3.0f, true);
                                meteors[i]->GetMotionMaster()->MovePoint(1, trigger->GetPositionX(), trigger->GetPositionY(), trigger->GetPositionZ());
                                trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE);
                                triggerGUID = trigger->GetGUID();
                                meteorGUID = meteors[i]->GetGUID();
                            }
                            meteors.erase(meteors.begin() + i);

                            if (++summon <= 3)
                                events.ScheduleEvent(EVENT_SEND_NEXT_METEOR, 1 *IN_MILLISECONDS);

                            if (meteors.size())
                                events.RescheduleEvent(EVENT_START_METEOR, 10 *IN_MILLISECONDS);
                        }
                    }
                    break;
                case EVENT_SEND_NEXT_METEOR:
                    if (Unit * cast = Unit::GetCreature(*me, triggerGUID))
                    {
                        cast->setFaction(16);
                        cast->CastSpell(me, SPELL_SEISMIC_SHARD_DAMAGE, true);
                    }
                    if (Unit * despawn = Unit::GetCreature(*me, meteorGUID))
                        despawn->SetVisible(false);
                    break;
                case EVENT_BERSERK:
                    DoCast(me, SPELL_BERSERK);
                    break;
                }
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING))
                return;

            if(phase == PHASE_CASTER_PHASE && !HealthAbovePct(30))
            {
                phase = PHASE_DRAGON_PHASE;
                me->SetSpeed(MOVE_RUN, 1.5f);
                me->SetReactState(REACT_PASSIVE);

                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                me->RemoveAllAuras(); // He should not die when he is jumping down...

                DoCast(me, SPELL_TWILIGHT_PROTECTION, true);

                events.Reset(); // He Should not cast while he is flying
                me->GetMotionMaster()->MovePoint(POINT_DRAHGA_GO_TO_THE_LAVA, position[0]);

                pValiona = me->SummonCreature(NPC_VALIONA,-375.33f,-667.291f,270.0f,3.29545f, TEMPSUMMON_CORPSE_DESPAWN);
            }

            if(phase == PHASE_DRAGON_PHASE && !HealthAbovePct(10))
            {
                phase = PHASE_FINAL_PHASE;

                me->SetReactState(REACT_AGGRESSIVE);
                me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());

                pValiona->GetAI()->DoAction(ACTION_VALIONA_SHOULD_FLY_AWAY);

                pValiona = NULL;

            }

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                case EVENT_BURNING_SHADOWBOLT:

                    if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
                        DoCast(pTarget, RAID_MODE(SPELL_BURNING_SHADOWBOLT,SPELL_BURNING_SHADOWBOLT_H));

                    events.ScheduleEvent(EVENT_BURNING_SHADOWBOLT,4000);
                    break;
                case EVENT_SUMMON_INVOKED_FLAME_SPIRIT:

                    me->MonsterYell(SAY_SUMMON, LANG_UNIVERSAL, NULL);

                    DoCast(SPELL_INVOCATION_OF_FLAME);

                    events.ScheduleEvent(EVENT_SUMMON_INVOKED_FLAME_SPIRIT,20000);
                    break;

                case EVENT_DRAGAH_ENTER_VEHICLE:
                    me->GetMotionMaster()->Clear();

                    // me->EnterVehicle(pValiona, 1);
                    break;

                default:
                    break;
                }
            }

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

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                // Phase 1
                case EVENT_PHASE_1:
                    events.ScheduleEvent(EVENT_ICE_SPEAR, urand(5000,14000));
                    events.ScheduleEvent(EVENT_SHATTERED_ICE, urand(15000,30000));
                    switch (urand(0, 1))
                    {
                    case 0:
                        events.ScheduleEvent(EVENT_PHASE_2, urand(200000, 340000));
                        break;
                    case 1:
                        events.ScheduleEvent(EVENT_PHASE_3, 200000,340000);
                        break;
                    }
                    break;

                case EVENT_ICE_SPEAR:
                    DoCastVictim(SPELL_ICE_SPEAR);
                    events.ScheduleEvent(EVENT_ICE_SPEAR, urand(5000,14000));
                    break;

                case EVENT_SHATTERED_ICE:
                    if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                        DoCast(target, SPELL_SHATTERED_ICE);
                    events.ScheduleEvent(EVENT_SHATTERED_ICE, urand(20000, 40000));
                    break;

                //phase 2
                case EVENT_PHASE_2:
                    events.CancelEvent(EVENT_PHASE_1);
                    events.CancelEvent(EVENT_ICE_SPEAR);
                    events.CancelEvent(EVENT_SHATTERED_ICE);
                    events.ScheduleEvent(HAS_ICE_SPEAR_DEATH, 5000);
                    events.ScheduleEvent(EVENT_DAMAGE_PHASE2_1, 1);
                    events.ScheduleEvent(EVENT_REMOVE_PHASE_2, 310000);
                    if(IsHeroic())
                        events.ScheduleEvent(EVENT_DAMAGE_PHASE2_3, urand(15000,30000));
                    instance->SetBossState(DATA_WAVE, IN_PROGRESS);
                    DoCast(SPELL_ICE_SHIELD);
                    break;

                case HAS_ICE_SPEAR_DEATH:
                    if(me->HasAura(SPELL_AURA_CRYSTAL))
                    {
                        events.ScheduleEvent(HAS_ICE_SPEAR_DEATH, 1000);
                    }
                    else
                    {
                        events.CancelEvent(EVENT_PHASE_2);
                        events.CancelEvent(EVENT_REMOVE_PHASE_2);
                        events.CancelEvent(EVENT_DAMAGE_PHASE2_3);
                        events.CancelEvent(HAS_ICE_SPEAR_DEATH);
                        events.ScheduleEvent(EVENT_PHASE_1, 1);
                        me->RemoveAurasDueToSpell(SPELL_ICE_SHIELD);
                        instance->SetBossState(DATA_WAVE, DONE);
                    }
                    break;

                case EVENT_REMOVE_PHASE_2:
                    events.CancelEvent(EVENT_PHASE_2);
                    events.CancelEvent(EVENT_DAMAGE_PHASE2_3);
                    events.ScheduleEvent(EVENT_PHASE_1, 1);
                    break;

                case EVENT_DAMAGE_PHASE2_1:
                    me->SummonCreature(NPC_ICE_WAVE, 13587.398f, 13581.050f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13587.754f, 13571.093f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13587.528f, 13563.034f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13587.476f, 13559.762f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);

                    me->SummonCreature(NPC_ICE_WAVE, 13555.149f, 13612.340f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13551.117f, 13612.680f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13544.259f, 13612.964f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13537.617f, 13612.762f, 123.479f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);

                    me->SummonCreature(NPC_ICE_WAVE, 13592.307f, 13643.856f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13593.133f, 13649.511f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13594.512f, 13655.144f, 123.484f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13596.036f, 13661.617f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);

                    me->SummonCreature(NPC_ICE_WAVE, 13617.921f, 13612.467f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13622.455f, 13612.219f, 123.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13628.173f, 13612.303f, 124.483f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);
                    me->SummonCreature(NPC_ICE_WAVE, 13635.879f, 13612.416f, 124.480f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);

                    me->SummonCreature(NPC_ICICLE, 13585.291f, 13610.428f, 122.420f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 340000);

                    me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13617.5f, 13580.9f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13557.4f, 13643.1f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13557.7f, 13580.7f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_FORZEN_BINDIG_CRYSTAL, 13617.3f, 13643.5f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    break;

                case EVENT_DAMAGE_PHASE2_3:
                    if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                        me->AddAura(SPELL_FROSTFLAKE, target);
                    events.ScheduleEvent(EVENT_DAMAGE_PHASE2_3, urand(5000,35000));
                    break;

                //Phase 3
                case EVENT_PHASE_3:
                    events.CancelEvent(EVENT_ICE_SPEAR);
                    events.CancelEvent(EVENT_SHATTERED_ICE);
                    events.ScheduleEvent(EVENT_REMOVE_PHASE_3, 310000);
                    events.ScheduleEvent(EVENT_DAMAGE_PHASE3_1, 10000);
                    events.ScheduleEvent(HAS_ARRESTER_RELOAD, 5000);
                    events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 1);
                    DoCast(SPELL_WATER_SHIELD);
                    break;

                case HAS_ARRESTER_RELOAD:
                    if(me->HasAura(SPELL_AURA_CRYSTAL))
                    {
                        events.ScheduleEvent(HAS_ARRESTER_RELOAD, 1000);
                    }
                    else
                    {
                        events.CancelEvent(EVENT_PHASE_3);
                        events.CancelEvent(EVENT_REMOVE_PHASE_3);
                        events.CancelEvent(EVENT_DAMAGE_PHASE3_1);
                        events.CancelEvent(HAS_ARRESTER_RELOAD);
                        events.ScheduleEvent(EVENT_PHASE_1, 1);
                        me->RemoveAurasDueToSpell(SPELL_WATER_SHIELD);
                    }
                    break;

                case EVENT_REMOVE_PHASE_3:
                    events.CancelEvent(EVENT_PHASE_3);
                    events.CancelEvent(EVENT_DAMAGE_PHASE3_1);
                    events.ScheduleEvent(EVENT_PHASE_1, 1);
                    break;

                case EVENT_DAMAGE_PHASE3_1:
                    me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13587.624f, 13653.375f, 123.483f, 0.0f,  TEMPSUMMON_CORPSE_DESPAWN, 130000);
                    me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13621.863f, 13621.847f, 123.483f, 0.0f,  TEMPSUMMON_CORPSE_DESPAWN, 130000);
                    me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13623.250f, 13606.621f, 123.483f, 0.0f,  TEMPSUMMON_CORPSE_DESPAWN, 130000);
                    me->SummonCreature(NPC_BOUND_LIGHTNING_ELEMENTAL, 13587.191f, 13570.221f, 123.483f, 0.0f,  TEMPSUMMON_CORPSE_DESPAWN, 130000);
                    events.ScheduleEvent(EVENT_DAMAGE_PHASE3_1, urand(60000,90000));
                    break;

                case EVENT_SUMMON_CRYSTAL:
                    me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13617.5f, 13580.9f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13557.4f, 13643.1f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13557.7f, 13580.7f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    me->SummonCreature(NPC_CRYSTAL_CONDUCTOR, 13617.3f, 13643.5f, 123.567f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 310000);
                    break;
                default:
                    break;
                }
            }

            DoMeleeAttackIfReady();
        }
Esempio n. 20
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if (berserk <= diff)
            {
                me->CastSpell(me, 64238);
                berserk = 32432234;
            }
            else
                berserk -= diff;

            if (swirlhit <= diff)
            {
                Swirl();
                swirlhit = 3000;
            }
            else
                swirlhit -= diff;

            if (sheepingsha <= diff)
            {
                SeepingSha();
                sheepingsha = 4500;
            }
            else
                sheepingsha -= diff;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.ExecuteEvent())
            {
            case EVENT_SHA_BOLT:
            {
                me->CastSpell(me, 143290);

                std::list<Player*> pl_list;
                pl_list.clear();

                me->GetPlayerListInGrid(pl_list, 300.0f);

                if (pl_list.empty())
                    return;

                for (auto itr : pl_list)
                {
                    me->CastSpell(itr, SPELL_SHA_BOLT_COSMETIC);
                }

                events.ScheduleEvent(EVENT_SHA_BOLT, 10000, GROUP_TEARS_OF_THE_VALE);
                break;
            }
            case EVENT_SWIRL_DE:
                swirl = false;
                break;
            case EVENT_SWIRL:
            {
                for (int i = 0; i <= 50; i++)
                {
                    Position pos;
                    me->GetRandomNearPosition(pos, 100.0f);

                    me->SummonCreature(TRIGGER_SHA_SWIRL, pos, TEMPSUMMON_TIMED_DESPAWN, 30000);
                }
                target = NULL;

                swirl = true;

                uint32 rando;

                if(roll_chance_i(50))
                {
                    rando = 1;
                }
                else
                {
                    rando = 4;
                }

                DespawnCreaturesInArea(TRIGGER_SHA_SWIRL_CIRCLE, me);

                Creature* trigger = me->SummonCreature(TRIGGER_SHA_SWIRL_CIRCLE, circleposition[rando], TEMPSUMMON_MANUAL_DESPAWN);
                target = trigger;

                me->CastSpell(trigger, SPELL_SWIRL_DUMMY);
                events.ScheduleEvent(EVENT_SWIRL_DE, 10000);
                events.ScheduleEvent(EVENT_SWIRL, 40000, GROUP_TEARS_OF_THE_VALE);
                break;
            }
            case EVENT_CORRSIVE_BLAST:
                me->SetFacingToObject(me->getVictim());


                me->CastSpell(me->getVictim(), SPELL_CORROSIVE_BLAST);
                events.ScheduleEvent(EVENT_CORRSIVE_BLAST, 42000, GROUP_TEARS_OF_THE_VALE);
                break;
            case EVENT_SEEPING_SHA:
                for (int i = 0; i <= 5; i++)
                {
                    Position pos;
                    me->GetRandomNearPosition(pos, 35.0f); // estimated?

                    me->SummonCreature(TRIGGER_SEEPING_SHA, pos, TEMPSUMMON_TIMED_DESPAWN, 20000);
                }
                events.ScheduleEvent(EVENT_SEEPING_SHA, 20000, GROUP_TEARS_OF_THE_VALE);
                break;
                // 2ND PHASE
            case EVENT_SPLIT_PHASE:
                events.ScheduleEvent(EVENT_SPLIT_PHASE_2, 1000);
                split = false;
                splitphase = true;

                me->SetHealth(me->GetMaxHealth());
                DespawnCreaturesInArea(71544, me);

                me->SummonCreature(CREATURE_SHA_POOL_HC, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);

                me->CastSpell(me, SPELL_SPLIT_DUMMY);   

                if (AuraPtr aura = me->GetAura(SPELL_SPLIT_DUMMY))
                {
                    aura->SetDuration(500000);
                }

                events.CancelEvent(EVENT_SPLIT_PHASE);
                break;
            case EVENT_SPLIT_PHASE_2:
                //me->SetDisplayId(11686);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);

                for (int i = 0; i <= 12; i++)
                {
                    me->CastSpell(me, SPELL_SPLIT_SHA_PUDDLE_THROW, true);
                    me->CastSpell(me, SPELL_SPLIT_CONTEMPLATED_THROW, true);
                }

                count = 0;

                events.CancelEvent(EVENT_SPLIT_PHASE);
                events.Reset();
                break;
            }
            DoMeleeAttackIfReady();
        }
Esempio n. 21
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_UNLEASHED_WRATH:
                        {
                            phase1 = false;

                            for (uint8 i = 0; i < 5; i++)
                            {
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                                {
                                    if (target->GetAuraCount(SPELL_SEETHE_AURA) < 3)
                                    {
                                        me->CastSpell(target, SPELL_SHADOW_BOLT_ANGER, false);
                                        me->AddAura(SPELL_SEETHE_AURA, target);
                                    }
                                }
                            }

                            if (_targetCount < _maxTargetCount)
                            {
                                if (_targetCount == 0)
                                    Talk(TALK_INTRO);

                                _targetCount++;
                                events.ScheduleEvent(EVENT_UNLEASHED_WRATH, 2000);
                            }
                            else
                            {
                                events.ScheduleEvent(EVENT_UNLEASHED_WRATH, 50000);
                                phase1 = true;
                                _targetCount = 0;
                            }

                            break;
                        }
                        case EVENT_GROWING_ANGER_WARNING:
                        {
                            Talk(TALK_ANGER);

                            for (uint8 i = 0; i < _dominateMindCount; ++i)
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                                {
                                    targetedDominationPlayerGuids.push_back(target->GetGUID());
                                    me->CastSpell(target, SPELL_DOMINATE_MIND_WARNING, true);
                                }

                            events.ScheduleEvent(EVENT_GROWING_ANGER, 6000);
                            break;
                        }
                        case EVENT_GROWING_ANGER:
                        {
                            if (!targetedDominationPlayerGuids.empty())
                                for (auto guid : targetedDominationPlayerGuids)
                                    if (Player* target = ObjectAccessor::GetPlayer(*me, guid))
                                        if (!me->GetVictim() || target != me->GetVictim())
                                            me->CastSpell(target, SPELL_DOMINATE_MIND, false);

                            events.ScheduleEvent(EVENT_GROWING_ANGER_WARNING, 19000);
                            break;
                        }
                        case EVENT_SPAWN:
                        {
                            Talk(TALK_SPAWN);

                            for (uint8 i = 0; i < _cloudCount; ++i)
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
                                    me->CastSpell(target, SPELL_ENDLESS_RAGE, false);

                            events.ScheduleEvent(EVENT_SPAWN, 15000);
                            break;
                        }
                        case EVENT_UPDATE_RAGE:
                        {
                            if (phase1)
                                timer = timer + 20;
                            else
                                timer = timer - 20;

                            me->SetPower(POWER_RAGE, timer);
                            events.ScheduleEvent(EVENT_UPDATE_RAGE, 1000);
                            break;
                        }
                        case EVENT_BERSERK:
                        {
                            me->CastSpell(me, SPELL_BERSERK, false);
                            break;
                        }
                        case EVENT_RANGE_ATTACK:
                        {
                            if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
                            {
                                me->CastSpell(target, SPELL_SHADOW_BOLT_ANGER, false);
                                me->AddAura(SPELL_SEETHE_AURA, target);
                            }

                            range = false;
                            break;
                        }
                        default:
                            break;
                    }
                }

                if (me->GetVictim() && !me->IsWithinMeleeRange(me->GetVictim()) && !range)
                {
                    range = true;
                    events.ScheduleEvent(EVENT_RANGE_ATTACK, 2000);
                }

                DoMeleeAttackIfReady();
            }
Esempio n. 22
0
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->isInCombat())
            return;

        if (!m_creature->getVictim() && m_creature->getThreatManager().isThreatListEmpty())
        {
            EnterEvadeMode();
            return;
        }

        events.Update(diff);

        if (m_creature->hasUnitState(UNIT_STAT_CASTING))
            return;

        switch(events.ExecuteEvent())
        {
            case EVENT_PURSUE:
                if (Creature* pKrick = GetKrick())
                    DoScriptText(RAND(SAY_KRICK_CHASE_1,SAY_KRICK_CHASE_2,SAY_KRICK_CHASE_3), pKrick);

                if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
                {
                    m_creature->Attack(pTarget,false);
                    DoScriptText(SAY_ICK_CHASE_1, m_creature, pTarget);
                    DoCast(pTarget, SPELL_PURSUED);
                }

                DoCast(SPELL_CONFUSION);
                events.ScheduleEvent(EVENT_PURSUE, 30000, GCD_1);
                return;

            case EVENT_MIGHTY_KICK:
                DoCast(m_creature->getVictim(), SPELL_MIGHTY_KICK);
                events.ScheduleEvent(EVENT_MIGHTY_KICK, 25000, GCD_1);
                return;

            case EVENT_POISON_NOVA:
                if (Creature* pKrick = GetKrick())
                    DoScriptText(SAY_KRICK_POISON_NOVA, pKrick);

                DoScriptText(SAY_ICK_POISON_NOVA, m_creature);
                DoCastAOE(SPELL_POISON_NOVA);
                events.ScheduleEvent(EVENT_POISON_NOVA, 30000, GCD_1);
                return;

            case EVENT_TOXIC_WASTE:
                DoCast(m_creature->getVictim(), SPELL_TOXIC_WASTE);
                events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000);
                return;

            case EVENT_SHADOW_BOLT:
                DoCast(m_creature->getVictim(), SPELL_SHADOW_BOLT);
                events.ScheduleEvent(EVENT_SHADOW_BOLT, 15000);
                return;

            case EVENT_EXPLOSIVE_BARRAGE:
                if (Creature *pKrick = GetKrick())
                {
                    DoScriptText(SAY_KRICK_BARRAGE_1, pKrick);
                    DoScriptText(SAY_KRICK_BARRAGE_2, pKrick);
                }

                DoCastAOE(SPELL_EXPLOSIVE_BARRAGE);
                m_creature->GetMotionMaster()->MoveIdle();
                events.DelayEvents(20000, GCD_1); // 2 sec cast + 18 sec
                events.ScheduleEvent(EVENT_END_EXPLOSIVE_BARRAGE, 20000);
                return;

            case EVENT_END_EXPLOSIVE_BARRAGE:
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                events.ScheduleEvent(EVENT_EXPLOSIVE_BARRAGE, 25000);
                break;
        }

        DoMeleeAttackIfReady();
    }
Esempio n. 23
0
        void UpdateAI(const uint32 diff)
        {

            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_SPIKE:
                    if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true))
                        DoCast(target, SPELL_ICE_SPIKE);
                        events.ScheduleEvent(EVENT_SPIKE, urand(10000, 15000), 0, PHASE_ONE);
                        break;
                    case EVENT_SUBMERGE:
                        events.Reset();
                        events.SetPhase(PHASE_TWO);
                        events.ScheduleEvent(EVENT_EMERGE, 40000, 0, PHASE_TWO);
                        me->AttackStop();
                        me->SetReactState(REACT_PASSIVE);
                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
                        me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED);
                        me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
                        if (Unit* frozenCore = me->SummonCreature(NPC_FROZEN_CORE, SummonPositions[0], TEMPSUMMON_CORPSE_DESPAWN))
                            {
                                frozenCoreGUID = frozenCore->GetGUID();
                                frozenCore->SetHealth(me->GetHealth()); // sync health on phase change
                            }
                        break;
                    case EVENT_EMERGE:
                        if (Creature* frozenCore = me->GetCreature(*me, frozenCoreGUID))
                            me->SetHealth(frozenCore->GetHealth()); // sync health on phase change

                        events.Reset();
                        events.SetPhase(PHASE_ONE);
                        events.ScheduleEvent(EVENT_SUBMERGE, 90000, 0, PHASE_ONE);
                        events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5000, 0, PHASE_ONE);
                        events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 5000, 0, PHASE_ONE);
                        events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 5000, 0, PHASE_ONE);
                        me->SetReactState(REACT_AGGRESSIVE);
                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
                        me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
                        me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);

                        // despawn core
                        if (Creature* frozenCore = me->GetCreature(*me, frozenCoreGUID))
                            frozenCore->DespawnOrUnsummon(0);
                        break;
                    case EVENT_SUMMON_HAILSTONE:
                        me->SummonCreature(NPC_AHUNITE_HAILSTONE, SummonPositions[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                        events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 20000, 0, PHASE_ONE);
                        break;
                    case EVENT_SUMMON_COLDWEAVE: // they always come in pairs of two
                        me->CastSpell(SummonPositions[2].GetPositionX(), SummonPositions[2].GetPositionY(), SummonPositions[2].GetPositionZ(), SPELL_SUMMON_MINION_VISUAL, false);
                        me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                        me->CastSpell(SummonPositions[3].GetPositionX(), SummonPositions[3].GetPositionY(), SummonPositions[3].GetPositionZ(), SPELL_SUMMON_MINION_VISUAL, false);
                        me->SummonCreature(NPC_AHUNITE_COLDWEAVE, SummonPositions[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                        events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 10000, 0, PHASE_ONE);
                        break;
                    case EVENT_SUMMON_FROSTWIND: // not in first phase 1
                        me->SummonCreature(NPC_AHUNITE_FROSTWIND, SummonPositions[urand(2,3)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
                        events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 10000, 0, PHASE_ONE);
                        break;
                }
            }
            DoMeleeAttackIfReady();
        }
Esempio n. 24
0
    void UpdateAI(const uint32 diff)
    {
        if (phase == PHASE_OUTRO)
        {
            if (!pInstance)
                return;

            events.Update(diff);
            switch(events.ExecuteEvent())
            {
                case EVENT_OUTRO_1:
                {
                    DoScriptText(SAY_KRICK_OUTRO_1, m_creature);
                    events.ScheduleEvent(EVENT_OUTRO_2, 14000);
                    break;
                }
                case EVENT_OUTRO_2:
                {
                    Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog);
                    if (pNpcDialog)
                    {
                        if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
                            DoScriptText(SAY_JAYNA_OUTRO_2, pNpcDialog);
                        else
                            DoScriptText(SAY_SYLVANAS_OUTRO_2, pNpcDialog);
                    }
                    events.ScheduleEvent(EVENT_OUTRO_3, 8500);
                    break;
                }
                case EVENT_OUTRO_3:
                    DoScriptText(SAY_KRICK_OUTRO_3, m_creature);
                    events.ScheduleEvent(EVENT_OUTRO_4, 12000);
                    break;
                case EVENT_OUTRO_4:
                {
                    Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog);
                    if (pNpcDialog)
                    {
                        if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
                            DoScriptText(SAY_JAYNA_OUTRO_4, pNpcDialog);
                        else
                            DoScriptText(SAY_SYLVANAS_OUTRO_4, pNpcDialog);
                    }
                    events.ScheduleEvent(EVENT_OUTRO_5, 8000);
                    break;
                }
                case EVENT_OUTRO_5:
                    DoScriptText(SAY_KRICK_OUTRO_5, m_creature);
                    events.ScheduleEvent(EVENT_OUTRO_6, 4000);
                    break;
                case EVENT_OUTRO_6:
                    // TODO spawn Tyrannus at some distance and MovePoint near-by (flying on rimefang)
                    // store uiTyrannus
                    // Adjust timer so tyrannus has time to come
                    uiTyrannus = (pInstance ? pInstance->GetData64(DATA_TYRANNUS) : 0);
                    events.ScheduleEvent(EVENT_OUTRO_7, 1);
                    break;
                case EVENT_OUTRO_7:
                    if (Creature *pTyrannus = m_creature->GetCreature(*m_creature, uiTyrannus))
                        DoScriptText(SAY_TYRANNUS_OUTRO_7, pTyrannus);
                    events.ScheduleEvent(EVENT_OUTRO_8, 7000);
                    break;
                case EVENT_OUTRO_8:
                    DoScriptText(SAY_KRICK_OUTRO_8, m_creature);
                    // TODO: Tyrannus starts killing Krick.
                    // there shall be some visual spell effect
                    events.ScheduleEvent(EVENT_OUTRO_9, 6000);
                    break;
                case EVENT_OUTRO_9:
                    // tyrannus kills krick
                    m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
                    m_creature->SetHealth(0);

                    if (Creature *pTyrannus = m_creature->GetCreature(*m_creature, uiTyrannus))
                        DoScriptText(SAY_TYRANNUS_OUTRO_9, pTyrannus);

                    events.ScheduleEvent(EVENT_OUTRO_10, 12000);
                    break;
                case EVENT_OUTRO_10:
                {
                    Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog);
                    if (pNpcDialog)
                    {
                        if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
                            DoScriptText(SAY_JAYNA_OUTRO_10, pNpcDialog);
                        else
                            DoScriptText(SAY_SYLVANAS_OUTRO_10, pNpcDialog);
                    }

                    // End of OUTRO. for now...
                    events.ScheduleEvent(EVENT_OUTRO_END, 8000);
                    break;
                }
                case EVENT_OUTRO_END:
                {
                    Creature* pNpcDialog = m_creature->GetCreature(*m_creature, uiNpcOutroDialog);
                    if (pNpcDialog)
                        pNpcDialog->DisappearAndDie();

                    m_creature->DisappearAndDie();
                    break;
                }
            }
            return;
        }
    }
Esempio n. 25
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        events.Update(diff);

        if (me->hasUnitState(UNIT_STAT_CASTING))
            return;

        if (phase == PHASE_1 && HealthBelowPct(30))
        {
            phase = PHASE_2;
            DoCast(me,SPELL_TELEPORT);
            me->GetMotionMaster()->Clear();
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
            events.CancelEvent(EVENT_CORRUPT_SOUL);
            events.ScheduleEvent(EVENT_SOUL_STORM, 1000);
            events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
            return;
        }

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_CORRUPT_SOUL:
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
                    {
                        DoScriptText(SAY_CORRUPT_SOUL, me);
                        DoCast(pTarget,SPELL_CORRUPT_SOUL);
                    }
                    events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000));
                    break;
                case EVENT_SOUL_STORM:
                    DoScriptText(SAY_SOUL_STORM, me);
                    // DoCast(me, SPELL_SOULSTORM); bug: put the aura without the limit of 10 yards.
                    events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
                    break;
                case EVENT_SOUL_STORM_AURA:
                    ApplySoulStorm();
                    events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
                    break;
                case EVENT_FEAR:
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
                        DoCast(pTarget,SPELL_FEAR);
                    events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
                    break;
                case EVENT_SHADOW_BOLT:
                    DoCastVictim(SPELL_SHADOW_BOLT);
                    events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
                    break;
                case EVENT_MAGIC_BANE:
                    DoCastVictim(SPELL_MAGIC_S_BANE);
                    events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000));
                    break;
            }
        }

        DoMeleeAttackIfReady();
    }
            void UpdateAI(uint32 diff)
            {
                if (!pInstance || !UpdateVictim())
                    return;

                Summons.DespawnAll();
                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                    case EVENT_LIGHTNING_BOLT:
                        if (me->HasUnitState(UNIT_STATE_CASTING))
                            return;
                        DoCastVictim(SPELL_LIGHTNING_BOLT);
                        events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2000);
                        break;
                    case EVENT_CALL_VORTEX:
                        for (uint8 i = 0; i < 8; i++)
                            if (_vortexes[i])
                            {
                                float _angle;
                                _angle = me->GetAngle(_vortexes[i]->GetPositionX(), _vortexes[i]->GetPositionY());
                                Position _pos = me->GetNearPosition(5.0f, _angle);
                                _vortexes[i]->GetMotionMaster()->MovementExpired(false);
                                _vortexes[i]->GetMotionMaster()->MovePoint(1, _pos);
                            }
                        
                        events.ScheduleEvent(EVENT_RESET_VORTEX, urand(14000, 17000));
                        break;
                    case EVENT_RESET_VORTEX:
                        for (uint8 i = 0; i < 8; i++)
                            if (_vortexes[i])
                            {
                                _vortexes[i]->GetMotionMaster()->MovementExpired(false);
                                _vortexes[i]->GetMotionMaster()->MovePoint(2, ertanvortexPos_1[i]);
                            }
                        events.ScheduleEvent(EVENT_CALL_VORTEX, urand(20000, 25000));
                        break;
                    case EVENT_STORM_EDGE:
                        _distance = me->GetDistance2d(_vortexes[1]);
                        if (me->GetMap()->GetPlayers().isEmpty())
                            return;
                        for (Map::PlayerList::const_iterator itr = me->GetMap()->GetPlayers().begin(); itr != me->GetMap()->GetPlayers().end(); ++itr)
                        {
                            if (Player* pPlayer = itr->GetSource())
                            {
                                if (me->GetDistance2d(pPlayer) > _distance)
                                {
                                    //uint8 i = urand(0, 7);
                                    //if (_vortexes[i])
                                        //_vortexes[i]->CastSpell(itr->GetSource(), SPELL_STORM_EDGE, true);
                                    DoCast(pPlayer, SPELL_STORM_EDGE, true);
                                }
                            }
                        }
                        events.ScheduleEvent(EVENT_STORM_EDGE, 2000);
                        break;
                    }
                }                    
            }
Esempio n. 27
0
        void UpdateAI(const uint32 diff)
        {
            if (phase == PHASE_INTRO)
            {
                if (!pInstance)
                    return;

                events.Update(diff);
                switch (events.ExecuteEvent())
                {
                    case EVENT_INTRO_1:
                        DoScriptText(SAY_JAINA_INTRO_1, me);
                        events.ScheduleEvent(EVENT_INTRO_2, 8000);
                        break;

                    case EVENT_INTRO_2:
                        DoScriptText(SAY_JAINA_INTRO_2, me);
                        events.ScheduleEvent(EVENT_INTRO_3, 8500);
                        break;

                    case EVENT_INTRO_3:
                        DoScriptText(SAY_JAINA_INTRO_3, me);
                        events.ScheduleEvent(EVENT_INTRO_4, 8000);
                        break;

                    case EVENT_INTRO_4:
                        DoScriptText(SAY_JAINA_INTRO_4, me);
                        events.ScheduleEvent(EVENT_INTRO_5, 10000);
                        break;

                    case EVENT_INTRO_5:
                        DoScriptText(SAY_JAINA_INTRO_5, me);
                        events.ScheduleEvent(EVENT_INTRO_6, 8000);
                        break;

                    case EVENT_INTRO_6:
                        DoScriptText(SAY_JAINA_INTRO_6, me);
                        events.ScheduleEvent(EVENT_INTRO_7, 12000);
                        break;

                    case EVENT_INTRO_7:
                        DoScriptText(SAY_JAINA_INTRO_7, me);
                        events.ScheduleEvent(EVENT_INTRO_8, 8000);
                        break;

                    case EVENT_INTRO_8:
                        DoScriptText(SAY_JAINA_INTRO_8, me);
                        // End of Intro
                        phase = PHASE_NORMAL;
                        break;
                }
            }

            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff) override
        {
            if (HealthBelowPct(75))
            {
                if (PotTimer <= diff)
                {
                    DoCast(me, SPELL_HEALING_POTION, true);
                    PotTimer = 10000;
                } else PotTimer -= diff;
            }

            if (IsActiveAttacker() && UpdateVictim())
                DoMeleeAttackIfReady();

            EscortAI::UpdateAI(diff);

            if (me->IsInCombat())
                return;

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_EMOTE_BEG:
                        me->HandleEmoteCommand(EMOTE_ONESHOT_BEG);
                        events.ScheduleEvent(EVENT_EMOTE_BEG, 25s);
                        break;
                    case EVENT_BEGIN:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_0, player);
                        break;
                    case EVENT_START_ESCORT:
                        events.Reset();
                        me->SetFaction(FACTION_ESCORTEE_H_PASSIVE);
                        me->SetReactState(REACT_AGGRESSIVE);
                        ENSURE_AI(EscortAI, (me->AI()))->Start(true, true, _player);
                        break;
                    case EVENT_TALK_1:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_1, player);
                        break;
                    case EVENT_KNEEL:
                        me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
                        break;
                    case EVENT_TALK_2:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_2, player);
                        me->LoadEquipment(EQUIP_TORCH);
                        me->SetSheath(SHEATH_STATE_MELEE);
                        break;
                    case EVENT_BURN_CRATES:
                        DoCastAOE(SPELL_BURN, true);
                        break;
                    case EVENT_TALK_3:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_3, player);
                        break;
                    case EVENT_TALK_4:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_4, player);
                        break;
                    case EVENT_LAUGH:
                        me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
                        break;
                    case EVENT_TALK_5:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_5, player);
                        me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);
                        break;
                    case EVENT_TALK_6:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_6, player);
                        break;
                    case EVENT_TALK_8:
                        if (Player* player = ObjectAccessor::GetPlayer(*me, _player))
                            Talk(TALK_8, player);
                        break;
                }
            }
        }
Esempio n. 29
0
				void UpdateAI(uint32 const diff)
				 {
				events.Update(diff);
				
					while (uint32 eventId = events.ExecuteEvent())
					 {
					switch (eventId)
						{
						case EVENT_BARADAS_TALK:
							switch (step)
								{
								case 0:
									me->SetFacingTo(1.513286f);
									
										me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
									events.ScheduleEvent(EVENT_BARADAS_TALK, 3000);
									step++;
									break;
									case 1:
										DoCast(SPELL_BARADAS_COMMAND);
										events.ScheduleEvent(EVENT_BARADAS_TALK, 5000);
										step++;
										break;
										case 2:
											Talk(SAY_BARADA_3);
											events.ScheduleEvent(EVENT_BARADAS_TALK, 7000);
											step++;
											break;
											case 3:
												if (jules)
													jules->AI()->Talk(SAY_JULES_2);
												
													events.ScheduleEvent(EVENT_BARADAS_TALK, 18000);
												step++;
												break;
												case 4:
													DoCast(SPELL_BARADA_FALTERS);
													me->HandleEmoteCommand(EMOTE_STAND_STATE_NONE);
													
														if (jules)
														jules->GetAI()->DoAction(ACTION_JULES_HOVER);
													
														events.ScheduleEvent(EVENT_BARADAS_TALK, 11000);
													step++;
													break;
													case 5:
														if (jules)
															jules->AI()->Talk(SAY_JULES_3);
														
															events.ScheduleEvent(EVENT_BARADAS_TALK, 13000);
														step++;
														break;
														case 6:
															Talk(SAY_BARADA_4);
															events.ScheduleEvent(EVENT_BARADAS_TALK, 5000);
															step++;
															break;
															case 7:
																if (jules)
																	jules->AI()->Talk(SAY_JULES_3);
																
																	events.ScheduleEvent(EVENT_BARADAS_TALK, 13000);
																step++;
																break;
																case 8:
																	Talk(SAY_BARADA_4);
																	events.ScheduleEvent(EVENT_BARADAS_TALK, 12000);
																	step++;
																	break;
																	case 9:
																		if (jules)
																			jules->AI()->Talk(SAY_JULES_4);
																		
																			events.ScheduleEvent(EVENT_BARADAS_TALK, 12000);
																		step++;
																		break;
																		case 10:
																			Talk(SAY_BARADA_4);
																			events.ScheduleEvent(EVENT_BARADAS_TALK, 5000);
																			step++;
																			break;
																			case 11:
																				if (jules)
																					jules->GetAI()->DoAction(ACTION_JULES_FLIGH);
																				
																					events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																				step++;
																				break;
																				case 12:
																					if (jules)
																						jules->AI()->Talk(SAY_JULES_4);
																					
																						events.ScheduleEvent(EVENT_BARADAS_TALK, 8000);
																					step++;
																					break;
																					case 13:
																						Talk(SAY_BARADA_5);
																						events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																						step++;
																						break;
																						case 14:
																							if (jules)
																								jules->AI()->Talk(SAY_JULES_4);
																							
																								events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																							step++;
																							break;
																							case 15:
																								Talk(SAY_BARADA_6);
																								events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																								step++;
																								break;
																								case 16:
																									if (jules)
																										jules->AI()->Talk(SAY_JULES_5);
																									
																										events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																									step++;
																									break;
																									case 17:
																										Talk(SAY_BARADA_7);
																										events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																										step++;
																										break;
																										case 18:
																											if (jules)
																												jules->AI()->Talk(SAY_JULES_3);
																											
																												events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																											step++;
																											break;
																											case 19:
																												Talk(SAY_BARADA_7);
																												events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																												step++;
																												break;
																												case 20:
																																														 
																													if (jules)
																														{
																														jules->GetAI()->DoAction(ACTION_JULES_MOVE_HOME);
																														jules->RemoveAura(SPELL_JULES_VOMITS_AURA);
																														}
																													
																														events.ScheduleEvent(EVENT_BARADAS_TALK, 10000);
																													step++;
																													break;
																													case 21:
																														                                //Ende
																															if (playerGUID)
																															{
																															if (Player* player = ObjectAccessor::FindPlayer(playerGUID))
																																player->KilledMonsterCredit(NPC_COLONEL_JULES, 0);
																																me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
																															}
																														
																															if (jules)
																															jules->RemoveAllAuras();
																														
																															me->RemoveAura(SPELL_BARADAS_COMMAND);
																															me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
																														
																															Talk(SAY_BARADA_8);
																														me->GetMotionMaster()->MoveTargetedHome();
																														EnterEvadeMode();
																														break;
																														}
							break;
							}
					}
				}
Esempio n. 30
0
        void UpdateAI(const uint32 diff)
        {
            events.Update(diff);
            switch (events.ExecuteEvent())
            {
                case EVENT_START_INTRO:
                    me->GetMotionMaster()->MovePoint(0, MoveThronePos);
                    // Begining of intro is differents between factions as the speech sequence and timers are differents.
                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
                        events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
                    else
                        events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
                    break;

            // A2 Intro Events
                case EVENT_INTRO_A2_1:
                    DoScriptText(SAY_JAINA_INTRO_3, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_2, 5000);
                    break;
                case EVENT_INTRO_A2_2:
                    DoScriptText(SAY_JAINA_INTRO_4, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
                    break;
                case EVENT_INTRO_A2_3:
                    // TODO: she's doing some kind of spell casting emote
                    instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
                    events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
                    break;
                case EVENT_INTRO_A2_4:
                    // spawn UTHER during speach 2
                    if (Creature* pUther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
                    {
                        pUther->GetMotionMaster()->MoveIdle();
                        pUther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas
                        uiUther = pUther->GetGUID();
                    }
                    events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
                    break;
                case EVENT_INTRO_A2_5:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_1, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
                    break;
                case EVENT_INTRO_A2_6:
                    DoScriptText(SAY_JAINA_INTRO_5, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_7, 6000);
                    break;
                case EVENT_INTRO_A2_7:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_2, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_8, 6500);
                    break;
                case EVENT_INTRO_A2_8:
                    DoScriptText(SAY_JAINA_INTRO_6, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_9, 2000);
                    break;
                case EVENT_INTRO_A2_9:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_3, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_10, 9000);
                    break;
                case EVENT_INTRO_A2_10:
                    DoScriptText(SAY_JAINA_INTRO_7, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_11, 5000);
                    break;
                case EVENT_INTRO_A2_11:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_4, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_12, 11000);
                    break;
                case EVENT_INTRO_A2_12:
                    DoScriptText(SAY_JAINA_INTRO_8, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_13, 4000);
                    break;
                case EVENT_INTRO_A2_13:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_5, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_14, 12500);
                    break;
                case EVENT_INTRO_A2_14:
                    DoScriptText(SAY_JAINA_INTRO_9, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_15, 10000);
                    break;
                case EVENT_INTRO_A2_15:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_6, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_16, 22000);
                    break;
                case EVENT_INTRO_A2_16:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_A2_7, pUther);
                    events.ScheduleEvent(EVENT_INTRO_A2_17, 4000);
                    break;
                case EVENT_INTRO_A2_17:
                    DoScriptText(SAY_JAINA_INTRO_10, me);
                    events.ScheduleEvent(EVENT_INTRO_A2_18, 2000);
                    break;
                case EVENT_INTRO_A2_18:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                    {
                        pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
                        DoScriptText(SAY_UTHER_INTRO_A2_8, pUther);
                    }
                    events.ScheduleEvent(EVENT_INTRO_A2_19, 11000);
                    break;
                case EVENT_INTRO_A2_19:
                    DoScriptText(SAY_JAINA_INTRO_11, me);
                    events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
                    break;

            // H2 Intro Events
                case EVENT_INTRO_H2_1:
                    DoScriptText(SAY_SYLVANAS_INTRO_1, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
                    break;
                case EVENT_INTRO_H2_2:
                    DoScriptText(SAY_SYLVANAS_INTRO_2, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
                    break;
                case EVENT_INTRO_H2_3:
                    DoScriptText(SAY_SYLVANAS_INTRO_3, me);
                    // TODO: she's doing some kind of spell casting emote
                    events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
                    break;
                case EVENT_INTRO_H2_4:
                    // spawn UTHER during speach 2
                    if (Creature* pUther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
                    {
                        pUther->GetMotionMaster()->MoveIdle();
                        pUther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas
                        uiUther = pUther->GetGUID();
                    }
                    events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
                    break;
                case EVENT_INTRO_H2_5:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_H2_1, pUther);
                    events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
                    break;
                case EVENT_INTRO_H2_6:
                    DoScriptText(SAY_SYLVANAS_INTRO_4, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
                    break;
                case EVENT_INTRO_H2_7:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_H2_2, pUther);
                    events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
                    break;
                case EVENT_INTRO_H2_8:
                    DoScriptText(SAY_SYLVANAS_INTRO_5, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
                    break;
                case EVENT_INTRO_H2_9:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_H2_3, pUther);
                    events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
                    break;
                case EVENT_INTRO_H2_10:
                    DoScriptText(SAY_SYLVANAS_INTRO_6, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
                    break;
                case EVENT_INTRO_H2_11:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_H2_4, pUther);
                    events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
                    break;
                case EVENT_INTRO_H2_12:
                    DoScriptText(SAY_SYLVANAS_INTRO_7, me);
                    events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
                    break;
                case EVENT_INTRO_H2_13:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                    {
                        pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
                        DoScriptText(SAY_UTHER_INTRO_H2_5, pUther);
                    }
                    events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
                    break;
                case EVENT_INTRO_H2_14:
                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                        DoScriptText(SAY_UTHER_INTRO_H2_6, pUther);
                    events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
                    break;
                case EVENT_INTRO_H2_15:
                    DoScriptText(SAY_SYLVANAS_INTRO_8, me);
                    events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
                    break;

            // Remaining Intro Events common for both faction
                case EVENT_INTRO_LK_1:
                    // Spawn LK in front of door, and make him move to the sword.
                    if (Creature* pLichKing = me->SummonCreature(NPC_LICH_KING_EVENT, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
                    {
                        pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
                        pLichKing->SetReactState(REACT_PASSIVE);
                        uiLichKing = pLichKing->GetGUID();
                    }

                    if (Creature* pUther = me->GetCreature(*me, uiUther))
                    {
                        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
                            DoScriptText(SAY_UTHER_INTRO_A2_9, pUther);
                        else
                            DoScriptText(SAY_UTHER_INTRO_H2_7, pUther);
                    }

                    events.ScheduleEvent(EVENT_INTRO_LK_2, 11000);
                    break;

                case EVENT_INTRO_LK_2:
                     if (Creature* pLichKing = me->GetCreature(*me, uiLichKing))
                         DoScriptText(SAY_LK_INTRO_1, pLichKing);
                     events.ScheduleEvent(EVENT_INTRO_LK_3, 2000);
                     break;

                case EVENT_INTRO_LK_3:
                     // The Lich King banishes Uther to the abyss.
                     if (Creature* pUther = me->GetCreature(*me, uiUther))
                     {
                         pUther->DisappearAndDie();
                         uiUther = 0;
                     }

                     // He steps forward and removes the runeblade from the heap of skulls.

                     events.ScheduleEvent(EVENT_INTRO_LK_4, 4000);
                     break;

                case EVENT_INTRO_LK_4:
                      if (Creature* pLichKing = me->GetCreature(*me, uiLichKing))
                          DoScriptText(SAY_LK_INTRO_2, pLichKing);
                    events.ScheduleEvent(EVENT_INTRO_LK_5, 10000);
                    break;

                case EVENT_INTRO_LK_5:
                    // summon Falric and Marwyn. then go back to the door
                    if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
                        pFalric->SetVisible(true);
                    if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
                        pMarwyn->SetVisible(true);

                    if (Creature* pLichKing = me->GetCreature(*me, uiLichKing))
                    {
                        pLichKing->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
                        DoScriptText(SAY_LK_INTRO_3, pLichKing);
                    }

                    events.ScheduleEvent(EVENT_INTRO_LK_6, 8000);
                    break;

                case EVENT_INTRO_LK_6:
                    if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
                        DoScriptText(SAY_FALRIC_INTRO_1, pFalric);

                    events.ScheduleEvent(EVENT_INTRO_LK_7, 2000);
                    break;

                case EVENT_INTRO_LK_7:
                    if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
                        DoScriptText(SAY_MARWYN_INTRO_1, pMarwyn);

                    events.ScheduleEvent(EVENT_INTRO_LK_8, 2000);
                    break;

                case EVENT_INTRO_LK_8:
                    if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
                        DoScriptText(SAY_FALRIC_INTRO_2, pFalric);

                    events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
                    break;

                case EVENT_INTRO_LK_9:
                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
                        DoScriptText(SAY_JAINA_INTRO_END, me);
                    else
                        DoScriptText(SAY_SYLVANAS_INTRO_END, me);

                    me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
                    // TODO: Loralen/Koreln shall run also
                    events.ScheduleEvent(EVENT_INTRO_END, 10000);
                    break;

                case EVENT_INTRO_END:
                    if (instance)
                        instance->SetData(DATA_WAVE_COUNT, SPECIAL);   // start first wave

                    // Loralen or Koreln disappearAndDie()
                    me->DisappearAndDie();
                    break;

                case EVENT_SKIP_INTRO:
                    // TODO: implement

                    if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
                        pFalric->SetVisible(true);
                    if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
                        pMarwyn->SetVisible(true);

                    me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
                    // TODO: Loralen/Koreln shall run also

                    events.ScheduleEvent(EVENT_INTRO_END, 15000);
                    break;
            }
        }