Example #1
0
        void UpdateEscortAI(const uint32 uiDiff) override
        {
            if (uiPhaseTimer <= uiDiff)
            {
                switch (uiStep)
                {
                    case 1:
                        if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) != NOT_STARTED)
                            return;
                        bIsBattle = false;
                        Talk(SAY_ESCORT_START);
                        SetRun(true);
                        JumpToNextStep(0);
                        break;
                    case 3:
                        SetEscortPaused(false);
                        JumpToNextStep(0);
                        break;
                    case 5:
                        if (Creature* temp = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))))
                            temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED);
                        JumpToNextStep(8500);
                        break;
                    case 6:
                        Talk(SAY_EVENT_A_1);
                        JumpToNextStep(6500);
                        break;
                    case 7:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK)))
                            temp->AI()->Talk(SAY_EVENT_A_2_KADD);
                        JumpToNextStep(12500);
                        break;
                    case 8:
                        Talk(SAY_EVENT_A_3);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), true);
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID))
                            ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true;
                        JumpToNextStep(5000);
                        break;
                    case 9:
                        me->SetReactState(REACT_PASSIVE);
                        SpawnDwarf(1);
                        JumpToNextStep(20000);
                        break;
                    case 10:
                        Talk(SAY_EVENT_B_1);
                        JumpToNextStep(6000);
                        break;
                    case 11:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK)))
                            temp->AI()->Talk(SAY_EVENT_B_2_MARN);
                        SpawnDwarf(1);
                        JumpToNextStep(20000);
                        break;
                    case 12:
                        Talk(SAY_EVENT_B_3);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), true);
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID))
                            ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true;
                        JumpToNextStep(10000);
                        break;
                    case 13:
                        SpawnDwarf(1);
                        JumpToNextStep(10000);
                        break;
                    case 14:
                        SpawnDwarf(2);
                        JumpToNextStep(20000);
                        break;
                    case 15:
                        Talk(SAY_EVENT_C_1);
                        SpawnDwarf(1);
                        JumpToNextStep(10000);
                        break;
                    case 16:
                        SpawnDwarf(2);
                        JumpToNextStep(20000);
                        break;
                    case 17:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_C_2_ABED);
                        SpawnDwarf(1);
                        JumpToNextStep(20000);
                        break;
                    case 18:
                        Talk(SAY_EVENT_C_3);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), true);
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID))
                            ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true;
                        JumpToNextStep(5000);
                        break;
                    case 19:
                        SpawnDwarf(2);
                        JumpToNextStep(10000);
                        break;
                    case 20:
                        SpawnDwarf(1);
                        JumpToNextStep(15000);
                        break;
                    case 21:
                        Talk(SAY_EVENT_D_1);
                        SpawnDwarf(3);
                        JumpToNextStep(20000);
                        break;
                    case 22:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_D_2_ABED);
                        SpawnDwarf(1);
                        JumpToNextStep(5000);
                        break;
                    case 23:
                        SpawnDwarf(2);
                        JumpToNextStep(15000);
                        break;
                    case 24:
                        Talk(SAY_EVENT_D_3);
                        SpawnDwarf(3);
                        JumpToNextStep(5000);
                        break;
                    case 25:
                        SpawnDwarf(1);
                        JumpToNextStep(5000);
                        break;
                    case 26:
                        SpawnDwarf(2);
                        JumpToNextStep(10000);
                        break;
                    case 27:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_D_4_ABED);
                        SpawnDwarf(1);
                        JumpToNextStep(10000);
                        break;
                    case 28:
                        me->SetReactState(REACT_DEFENSIVE);
                        Talk(SAY_EVENT_END_01);
                        me->SetStandState(UNIT_STAND_STATE_STAND);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), true);
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID))
                            temp->DealDamage(temp, temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                        bIsBattle = true;
                        SetEscortPaused(false);
                        JumpToNextStep(6500);
                        break;
                    case 29:
                        Talk(SAY_EVENT_END_02);
                        instance->SetBossState(DATA_TRIBUNAL_OF_AGES, DONE);
                        me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true);
                        JumpToNextStep(5500);
                        break;
                    case 30:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_END_03_ABED);
                        JumpToNextStep(8500);
                        break;
                    case 31:
                        Talk(SAY_EVENT_END_04);
                        JumpToNextStep(11500);
                        break;
                    case 32:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_END_05_ABED);
                        JumpToNextStep(11500);
                        break;
                    case 33:
                        Talk(SAY_EVENT_END_06);
                        JumpToNextStep(4500);
                        break;
                    case 34:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_END_07_ABED);
                        JumpToNextStep(22500);
                        break;
                    case 35:
                        Talk(SAY_EVENT_END_08);
                        JumpToNextStep(7500);
                        break;
                    case 36:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK)))
                            temp->AI()->Talk(SAY_EVENT_END_09_KADD);
                        JumpToNextStep(18500);
                        break;
                    case 37:
                        Talk(SAY_EVENT_END_10);
                        JumpToNextStep(5500);
                        break;
                    case 38:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK)))
                            temp->AI()->Talk(SAY_EVENT_END_11_KADD);
                        JumpToNextStep(20500);
                        break;
                    case 39:
                        Talk(SAY_EVENT_END_12);
                        JumpToNextStep(2500);
                        break;
                    case 40:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK)))
                            temp->AI()->Talk(SAY_EVENT_END_13_KADD);
                        JumpToNextStep(19500);
                        break;
                    case 41:
                        Talk(SAY_EVENT_END_14);
                        JumpToNextStep(10500);
                        break;
                    case 42:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK)))
                            temp->AI()->Talk(SAY_EVENT_END_15_MARN);
                        JumpToNextStep(6500);
                        break;
                    case 43:
                        Talk(SAY_EVENT_END_16);
                        JumpToNextStep(6500);
                        break;
                    case 44:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK)))
                            temp->AI()->Talk(SAY_EVENT_END_17_MARN);
                        JumpToNextStep(25500);
                        break;
                    case 45:
                        Talk(SAY_EVENT_END_18);
                        JumpToNextStep(23500);
                        break;
                    case 46:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK)))
                            temp->AI()->Talk(SAY_EVENT_END_19_MARN);
                        JumpToNextStep(3500);
                        break;
                    case 47:
                        Talk(SAY_EVENT_END_20);
                        JumpToNextStep(8500);
                        break;
                    case 48:
                        if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))
                            temp->AI()->Talk(SAY_EVENT_END_21_ABED);
                        JumpToNextStep(5500);
                        break;
                    case 49:
                    {
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false);
                        instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false);
                        Player* player = GetPlayerForEscort();
                        if (player)
                            player->GroupEventHappens(QUEST_HALLS_OF_STONE, me);
                        me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                        JumpToNextStep(180000);
                        break;
                    }
                    case 50:
                        SetEscortPaused(false);
                        break;
                }
            } else uiPhaseTimer -= uiDiff;

            if (!bIsLowHP && HealthBelowPct(30))
            {
                Talk(SAY_LOW_HEALTH);
                bIsLowHP = true;
            }
            else if (bIsLowHP && !HealthBelowPct(30))
                bIsLowHP = false;

            if (!UpdateVictim())
                return;

            DoMeleeAttackIfReady();
        }
 void Reset() override
 {
     Initialize();
     me->SetStandState(UNIT_STAND_STATE_DEAD);
     instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, NOT_STARTED);
 }
 void JustDied(Unit* /*killer*/) override
 {
     instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, DONE);
 }
        void EnterCombat(Unit* /*who*/) override
        {
            Talk(SAY_AGGRO);

            instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, IN_PROGRESS);
        }
        void JustDied(Unit* /*killer*/) override
        {
            Talk(SAY_DEATH);

            instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, DONE);
        }
        void JustDied(Unit* /*killer*/) override
        {
            instance->SetBossState(DATA_TERON_GOREFIEND, DONE);

            Talk(SAY_DEATH);
        }
Example #7
0
        void UpdateAI(uint32 diff) override
        {
            switch (Phase)
            {
            case COMBAT:
                //Return since we have no target
                if (!UpdateVictim())
                    return;

                if (!bYelled && HealthBelowPct(30))
                {
                    Talk(SAY_30HEALTH);
                    bYelled = true;
                }

                if (!bYelled2 && HealthBelowPct(15))
                {
                    Talk(SAY_15HEALTH);
                    bYelled2 = true;
                }

                if (HealthBelowPct(1))
                {
                    //Handle Escape Event: Don't forget to add Player::RewardPlayerAndGroupAtEvent
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                    uiOutroStep = 1;
                    Phase = OUTRO;
                    return;
                }

                if (Creature* pArthas = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ARTHAS)))
                    if (pArthas->isDead())
                    {
                        EnterEvadeMode();
                        me->DisappearAndDie();
                        instance->SetBossState(DATA_MAL_GANIS, FAIL);
                    }

                if (uiCarrionSwarmTimer < diff)
                {
                    DoCastVictim(SPELL_CARRION_SWARM);
                    uiCarrionSwarmTimer = 7000;
                } else uiCarrionSwarmTimer -= diff;

                if (uiMindBlastTimer < diff)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        DoCast(target, SPELL_MIND_BLAST);
                    uiMindBlastTimer = 6000;
                } else uiMindBlastTimer -= diff;

                if (uiVampiricTouchTimer < diff)
                {
                    DoCast(me, SPELL_VAMPIRIC_TOUCH);
                    uiVampiricTouchTimer = 32000;
                } else uiVampiricTouchTimer -= diff;

                if (uiSleepTimer < diff)
                {
                    Talk(SAY_SLEEP);
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        DoCast(target, SPELL_SLEEP);
                    uiSleepTimer = urand(15000, 20000);
                } else uiSleepTimer -= diff;

                DoMeleeAttackIfReady();
                break;
            case OUTRO:
                if (uiOutroTimer < diff)
                {
                    switch (uiOutroStep)
                    {
                    case 1:
                        Talk(SAY_OUTRO);
                        me->GetMotionMaster()->MoveTargetedHome();
                        ++uiOutroStep;
                        uiOutroTimer = 8000;
                        break;
                    case 2:
                        me->SetTarget(instance->GetData64(DATA_ARTHAS));
                        me->HandleEmoteCommand(29);
                        Talk(SAY_ESCAPE_SPEECH_2);
                        ++uiOutroStep;
                        uiOutroTimer = 9000;
                        break;
                    case 3:
                        Talk(SAY_OUTRO);
                        ++uiOutroStep;
                        //uiOutroTimer = 16000;
                        break;
                    case 4:
                        me->HandleEmoteCommand(33);
                        ++uiOutroStep;
                        uiOutroTimer = 500;
                        break;
                    case 5:
                        me->SetVisible(false);
                        me->Kill(me);
                        break;

                    }
                } else uiOutroTimer -= diff;
                break;
            }
        }
 void EnterCombat(Unit* /*who*/) override
 {
     instance->SetBossState(DATA_HADRONOX, IN_PROGRESS);
     me->SetInCombatWithZone();
 }
        void Reset() override
        {
            Initialize();

            instance->SetBossState(DATA_WARLORD_KALITHRESH, NOT_STARTED);
        }
        bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/)
        {
            player->PlayerTalkClass->ClearMenus();
            player->CLOSE_GOSSIP_MENU();
            InstanceScript* instance = creature->GetInstanceScript();
            if (!instance)
                return true;

            if (instance->GetBossState(BOSS_BEASTS) != DONE)
            {
                instance->SetData(TYPE_EVENT, 110);
                instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED);
                instance->SetBossState(BOSS_BEASTS, NOT_STARTED);
            }
            else if (instance->GetBossState(BOSS_JARAXXUS) != DONE)
            {
                // if Jaraxxus is spawned, but the raid wiped
                if (Creature* jaraxxus = Unit::GetCreature(*player, instance->GetData64(NPC_JARAXXUS)))
                {
                    jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS);
                    jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    jaraxxus->SetReactState(REACT_DEFENSIVE);
                    jaraxxus->SetInCombatWithZone();
                }
                else
                {
                    instance->SetData(TYPE_EVENT, 1010);
                    instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED);
                }
            }
            else if (instance->GetBossState(BOSS_CRUSADERS) != DONE)
            {
                if (player->GetTeam() == ALLIANCE)
                    instance->SetData(TYPE_EVENT, 3000);
                else
                    instance->SetData(TYPE_EVENT, 3001);
                instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED);
            }
            else if (instance->GetBossState(BOSS_VALKIRIES) != DONE)
            {
                instance->SetData(TYPE_EVENT, 4000);
                instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED);
            }
            else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
            {
                if (GameObject* floor = GameObject::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
                    floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);

                creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false);
                creature->CastSpell(creature, SPELL_DESTROY_FLOOR_KNOCKUP, false);

                Creature* anubArak = Unit::GetCreature(*creature, instance->GetData64(NPC_ANUBARAK));
                if (!anubArak || !anubArak->isAlive())
                    anubArak = creature->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);

                instance->SetBossState(BOSS_ANUBARAK, NOT_STARTED);

                if (creature->IsVisible())
                    creature->SetVisible(false);
            }
            creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
            return true;
        }
 void JustDied(Unit* /*killer*/) override
 {
     instance->SetBossState(DATA_HADRONOX, DONE);
 }
Example #12
0
 void JustDied(Unit* /*killer*/) override
 {
     Talk(SAY_DEATH);
     Summons.DespawnAll();
     instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE);
 }
 void JustDied(Unit* /*killer*/) override
 {
     Talk(TEXT_DEATH);
     instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE);
 }
Example #14
0
 void EnterCombat(Unit* attacker)
 {
     pInstance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
     pInstance->SetBossState(DATA_FENG, IN_PROGRESS);
     Talk(TALK_AGGRO);
 }
        void JustDied(Unit* /*killer*/) override
        {
            Talk(SAY_CRONE_DEATH);
            instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
		}
        void EnterCombat(Unit* /*who*/) override
        {
            Talk(SAY_AGGRO);

            instance->SetBossState(DATA_WARLORD_KALITHRESH, IN_PROGRESS);
        }
        void JustDied(Unit* /*killer*/) override
        {
            DoPlaySoundToSet(me, SOUND_WOLF_DEATH);
			instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
           
        }
        void JustDied(Unit* /*killer*/) override
        {
            Talk(SAY_DEATH);

            instance->SetBossState(DATA_WARLORD_KALITHRESH, DONE);
        }
Example #19
0
 void Reset() override
 {
     Initialize();
     instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED);
 }
        void JustDied(Unit* /*killer*/) override
        {
            Talk(SAY_DEATH);

            instance->SetBossState(DATA_MAULGAR, DONE);
        }
            void JustReachedHome()
            {
				instance->SetBossState(DATA_RIMOK, FAIL);
                summons.DespawnAll();
            }
 void EnterCombat(Unit* /*who*/) override
 {
     DoZoneInCombat();
     instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
 }
        void Reset() override
        {
            Initialize();

            instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, NOT_STARTED);
        }
Example #24
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                //Shield_Timer
                if (Shield_Timer <= diff)
                {
                    DoCast(me, SPELL_SHIELD);
                    Shield_Timer = 61000;
                } else Shield_Timer -= diff;

                //BloodLust_Timer
                if (BloodLust_Timer <= diff)
                {
                    DoCast(me, SPELL_BLOODLUST);
                    BloodLust_Timer = 20000 + rand32() % 8000;
                } else BloodLust_Timer -= diff;

                //Casting Greaterheal to Thekal or Zath if they are in meele range.
                if (GreaterHeal_Timer <= diff)
                {
                    Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL));
                    Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH));

                    if (!pThekal || !pZath)
                        return;

                    switch (urand(0, 1))
                    {
                        case 0:
                            if (me->IsWithinMeleeRange(pThekal))
                                DoCast(pThekal, SPELL_GREATERHEAL);
                            break;
                        case 1:
                            if (me->IsWithinMeleeRange(pZath))
                                DoCast(pZath, SPELL_GREATERHEAL);
                            break;
                    }

                    GreaterHeal_Timer = 15000 + rand32() % 5000;
                } else GreaterHeal_Timer -= diff;

                //Disarm_Timer
                if (Disarm_Timer <= diff)
                {
                    DoCastVictim(SPELL_DISARM);
                    Disarm_Timer = 15000 + rand32() % 10000;
                } else Disarm_Timer -= diff;

                //Check_Timer for the death of LorKhan and Zath.
                if (!FakeDeath && Check_Timer <= diff)
                {
                    if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
                    {
                        //Resurrect Thekal
                        if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL)))
                        {
                            pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
                            pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            pThekal->setFaction(14);
                            pThekal->SetFullHealth();
                        }
                    }

                    if (instance->GetBossState(DATA_ZATH) == SPECIAL)
                    {
                        //Resurrect Zath
                        if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH)))
                        {
                            pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
                            pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            pZath->setFaction(14);
                            pZath->SetFullHealth();
                        }
                    }

                    Check_Timer = 5000;
                } else Check_Timer -= diff;

                if (!HealthAbovePct(5))
                {
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetStandState(UNIT_STAND_STATE_SLEEP);
                    me->setFaction(35);
                    me->AttackStop();

                    instance->SetBossState(DATA_LORKHAN, SPECIAL);

                    FakeDeath = true;
                }

                DoMeleeAttackIfReady();
            }
Example #25
0
        void EnterCombat(Unit* /*who*/) override
        {
            Talk(SAY_AGGRO);

            instance->SetBossState(DATA_IONAR, IN_PROGRESS);
        }
Example #26
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                //SweepingStrikes_Timer
                if (SweepingStrikes_Timer <= diff)
                {
                    DoCastVictim(SPELL_SWEEPINGSTRIKES);
                    SweepingStrikes_Timer = 22000 + rand32() % 4000;
                } else SweepingStrikes_Timer -= diff;

                //SinisterStrike_Timer
                if (SinisterStrike_Timer <= diff)
                {
                    DoCastVictim(SPELL_SINISTERSTRIKE);
                    SinisterStrike_Timer = 8000 + rand32() % 8000;
                } else SinisterStrike_Timer -= diff;

                //Gouge_Timer
                if (Gouge_Timer <= diff)
                {
                    DoCastVictim(SPELL_GOUGE);

                    if (DoGetThreat(me->GetVictim()))
                        DoModifyThreatPercent(me->GetVictim(), -100);

                    Gouge_Timer = 17000 + rand32() % 10000;
                } else Gouge_Timer -= diff;

                //Kick_Timer
                if (Kick_Timer <= diff)
                {
                    DoCastVictim(SPELL_KICK);
                    Kick_Timer = 15000 + rand32() % 10000;
                } else Kick_Timer -= diff;

                //Blind_Timer
                if (Blind_Timer <= diff)
                {
                    DoCastVictim(SPELL_BLIND);
                    Blind_Timer = 10000 + rand32() % 10000;
                } else Blind_Timer -= diff;

                //Check_Timer for the death of LorKhan and Zath.
                if (!FakeDeath && Check_Timer <= diff)
                {
                    if (instance->GetBossState(DATA_LORKHAN) == SPECIAL)
                    {
                        //Resurrect LorKhan
                        if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LORKHAN)))
                        {
                            pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
                            pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            pLorKhan->setFaction(14);
                            pLorKhan->SetFullHealth();
                        }
                    }

                    if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
                    {
                        //Resurrect Thekal
                        if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL)))
                        {
                            pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
                            pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            pThekal->setFaction(14);
                            pThekal->SetFullHealth();
                        }
                    }

                    Check_Timer = 5000;
                } else Check_Timer -= diff;

                if (!HealthAbovePct(5))
                {
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
                    me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetStandState(UNIT_STAND_STATE_SLEEP);
                    me->setFaction(35);
                    me->AttackStop();

                    instance->SetBossState(DATA_ZATH, SPECIAL);

                    FakeDeath = true;
                }

                DoMeleeAttackIfReady();
            }
 void EnterCombat(Unit* /*who*/) override
 {
     me->SetStandState(UNIT_STAND_STATE_STAND);
     instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, IN_PROGRESS);
 }
		void EnterEvadeMode()
		{
			if (instance)
				instance->SetBossState(DATA_BOSS_GU_CLOUDSTRIKE, FAIL);
		}
Example #29
0
 void UpdateAI(uint32 Diff) override
 {
     if (AttackStartTimer <= Diff)
     {
         switch (Phase)
         {
             case 1:
                 instance->SetBossState(BOSS_RAZORSCALE, IN_PROGRESS);
                 summons.DespawnAll();
                 AttackStartTimer = 1000;
                 Phase = 2;
                 break;
             case 2:
                 for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
                 {
                     if (Creature* summonedEngineer = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
                     {
                         summonedEngineer->SetWalk(false);
                         summonedEngineer->SetSpeedRate(MOVE_RUN, 0.5f);
                         summonedEngineer->SetHomePosition(PosEngRepair[n]);
                         summonedEngineer->GetMotionMaster()->MoveTargetedHome();
                         Engineer[n] = summonedEngineer->GetGUID();
                     }
                 }
                 if (Creature* firstSummon = ObjectAccessor::GetCreature(*me, Engineer[0]))
                     firstSummon->AI()->Talk(SAY_AGGRO_3);
                 Phase = 3;
                 AttackStartTimer = 14000;
                 break;
             case 3:
                 for (uint8 n = 0; n < 4; n++)
                 {
                     if (Creature* summonedDefender = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
                     {
                         summonedDefender->SetWalk(false);
                         summonedDefender->SetHomePosition(PosDefCombat[n]);
                         summonedDefender->GetMotionMaster()->MoveTargetedHome();
                         Defender[n] = summonedDefender->GetGUID();
                     }
                 }
                 Phase = 4;
                 break;
             case 4:
                 for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
                     if (Creature* summonedEngineer = ObjectAccessor::GetCreature(*me, Engineer[n]))
                         summonedEngineer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
                 for (uint8 n = 0; n < 4; ++n)
                     if (Creature* summonedDefender = ObjectAccessor::GetCreature(*me, Defender[n]))
                         summonedDefender->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
                 Talk(SAY_AGGRO_2);
                 AttackStartTimer = 16000;
                 Phase = 5;
                 break;
             case 5:
                 if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_RAZORSCALE)))
                 {
                     Razorscale->AI()->DoAction(ACTION_EVENT_START);
                     me->SetInCombatWith(Razorscale);
                 }
                 if (Creature* firstEngineer = ObjectAccessor::GetCreature(*me, Engineer[0]))
                     firstEngineer->AI()->Talk(SAY_AGGRO_1);
                 Phase = 6;
                 break;
         }
     }
     else
         AttackStartTimer -= Diff;
 }
        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();
        }