void Reset()
            {
                _Reset();
                events.Reset();

                SpawnAdds();
            }
Beispiel #2
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim()) return;

        if (spawntimer < diff)
        {
            SpawnAdds();
            spawntimer = urand(35000,40000);
        } else spawntimer -= diff;

        if (roottimer < diff)
        {
            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                m_creature->CastSpell(target, SPELL_ENTANGLING_ROOTS, false);
            roottimer = urand(15000,30000);
        }

        if (bashtimer < diff)
        {
            m_creature->CastSpell(m_creature->getVictim(), SPELL_BASH, false);
            bashtimer = urand(15000,30000);
        } else bashtimer -= diff;

        if (bolttimer < diff)
        {
            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                m_creature->CastSpell(target, SPELL_VENOM_BOLT_VOLLEY, false);
            bolttimer = urand(15000,30000);
        } else bolttimer -= diff;

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

            if (uiSpawnTimer <= diff)
            {
                SpawnAdds();
                uiSpawnTimer = urand(35*IN_MILLISECONDS, 40*IN_MILLISECONDS);
            } else uiSpawnTimer -= diff;

            if (uiRootTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    DoCast(pTarget, SPELL_ENTANGLING_ROOTS);
                uiRootTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
            } else uiRootTimer -= diff;

            if (uiBashTimer <= diff)
            {
                DoCastVictim(SPELL_BASH);
                uiBashTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
            } else uiBashTimer -= diff;

            if (uiBoltTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    DoCast(pTarget, SPELL_VENOM_BOLT_VOLLEY);
                uiBoltTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
            } else uiBoltTimer -= diff;

            DoMeleeAttackIfReady();
        }
Beispiel #4
0
            void EnterCombat(Unit* /*who*/)
            {
                if (instance)
                    instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS);

                DoZoneInCombat();

                Talk(YELL_INTRO);
                SpawnAdds();
                EnterPhase(0);
            }
Beispiel #5
0
            void EnterCombat(Unit * /*who*/)
            {
                if (pInstance)
                    pInstance->SetData(DATA_ZULJINEVENT, IN_PROGRESS);

                DoZoneInCombat();

                me->MonsterYell(YELL_INTRO,LANG_UNIVERSAL,NULL);
                DoPlaySoundToSet(me, SOUND_INTRO);
                SpawnAdds();
                EnterPhase(0);
            }
        void UpdateAI(uint32 const diff)
        {
            if (!UpdateVictim())
                return;

            if (uiSpawnTimer <= diff)
            {
                SpawnAdds();
                uiSpawnTimer = 20*IN_MILLISECONDS;
            } else uiSpawnTimer -= diff;

            if (uiMiniTimer <= diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    DoCast(SPELL_MINI);
                    uiMiniTimer = urand(25*IN_MILLISECONDS, 30*IN_MILLISECONDS);
                }
            } else uiMiniTimer -= diff;

            if (uiRootTimer <= diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    DoCast(target, SPELL_ENTANGLING_ROOTS);
                    uiRootTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
                }
            } else uiRootTimer -= diff;

            if (uiBashTimer <= diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                DoCastVictim(SPELL_BASH);
                    uiBashTimer = urand(7*IN_MILLISECONDS, 12*IN_MILLISECONDS);
                }
            } else uiBashTimer -= diff;

            if (uiBoltTimer <= diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    DoCast(target, SPELL_VENOM_BOLT_VOLLEY);
                    uiBoltTimer = urand(18*IN_MILLISECONDS, 22*IN_MILLISECONDS);
                }
            } else uiBoltTimer -= diff;

            DoMeleeAttackIfReady();
        }
Beispiel #7
0
        void Reset() override
        {
            Vanish_Timer = 30000;
            Blind_Timer = 35000;
            Gouge_Timer = 23000;
            Wait_Timer = 0;
            CheckAdds_Timer = 5000;

            Enrage = false;
            InVanish = false;
            if (me->IsAlive())
                SpawnAdds();

            if (instance)
                instance->SetData(TYPE_MOROES, NOT_STARTED);
        }
Beispiel #8
0
        void Reset() {
            Vanish_Timer = 30000;
            Blind_Timer = 35000;
            Gouge_Timer = 23000;
            Wait_Timer = 0;
            CheckAdds_Timer = 5000;

            Enrage = false;
            InVanish = false;
            if (me->GetHealth() > 0) {
                SpawnAdds();
            }

            if (pInstance)
                pInstance->SetData(TYPE_MOROES, NOT_STARTED);
        }
Beispiel #9
0
		void Reset() {
			if (pInstance)
				pInstance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);

			SpiritBolts_Timer = 20000;
			DrainPower_Timer = 60000;
			SiphonSoul_Timer = 100000;
			PlayerAbility_Timer = 99999;
			CheckAddState_Timer = 5000;
			ResetTimer = 5000;

			SpawnAdds();

			me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916);
			me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
		}
    void Reset()
    {
        if (pInstance)
            pInstance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);

        SpiritBolts_Timer = 20000;
        DrainPower_Timer = 60000;
        SiphonSoul_Timer = 100000;
        PlayerAbility_Timer = 99999;
        CheckAddState_Timer = 5000;
        ResetTimer = 5000;

        SpawnAdds();

        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 46916);
        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 50268674);
        me->SetSheath(SHEATH_STATE_MELEE);
    }
        void UpdateAI(uint32 diff)
        {
            //Return since we have no target
            if (!UpdateVictim())
                return;

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

            switch (events.GetEvent())
            {
                case EVENT_AMANITAR_SPAWN:
                {
                    SpawnAdds();
                    events.RepeatEvent(urand(35000, 40000));
                    break;
                }
                case EVENT_AMANITAR_ROOTS:
                {
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        me->CastSpell(pTarget, SPELL_ENTANGLING_ROOTS, false);

                    events.RepeatEvent(urand(15000, 20000));
                    break;
                }
                case EVENT_AMANITAR_BASH:
                {
                    me->CastSpell(me->GetVictim(), SPELL_BASH, false);
                    events.RepeatEvent(urand(15000, 20000));
                    break;
                }
                case EVENT_AMANITAR_BOLT:
                {
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        me->CastSpell(pTarget, SPELL_VENOM_BOLT_VOLLEY, false);
                    
                    events.RepeatEvent(urand(15000, 20000));
                    break;
                }
            }

            DoMeleeAttackIfReady();
        }
Beispiel #12
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_SPAWN:
                            SpawnAdds();
                            events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
                            break;
                        case EVENT_MINI:
                            DoCast(SPELL_MINI);
                            events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
                            break;
                        case EVENT_ROOT:
                            DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
                            events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
                            break;
                        case EVENT_BASH:
                            DoCastVictim(SPELL_BASH);
                            events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
                            break;
                        case EVENT_BOLT:
                            DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
                            events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
                            break;
                        default:
                            break;
                    }

                    if (me->HasUnitState(UNIT_STATE_CASTING))
                        return;
                }
                DoMeleeAttackIfReady();
            }
Beispiel #13
0
    void Reset()
    {
        Vanish_Timer = 30000;
        Blind_Timer = 35000;
        Gouge_Timer = 23000;
        Wait_Timer = 0;
        NonAttackable_Timer = 0;
        CheckAdds_Timer = 5000;
        Enrage = false;
        InVanish = false;
        NonAttackable = false;
        if(m_creature->GetHealth() > 0)
        {
            SpawnAdds();
        }

        if(m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
        {
            m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
        }

        if(pInstance && pInstance->GetData(DATA_MOROES_EVENT) != DONE)
            pInstance->SetData(DATA_MOROES_EVENT, NOT_STARTED);
    }
            void UpdateAI(const uint32 uiDiff)
            {
                if (!UpdateVictim())
                    return;

                if(phase != PHASE_COMBAT)
                {
                    if(phase == PHASE_FESTERGUT)
                    {
                        if (m_uiMalleableGooTimer < uiDiff)
                        {
                            if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
                                DoCast(pTarget, SPELL_MALLABLE_GOO_H);
                            m_uiMalleableGooTimer = urand(16000, 20000);
                        } else m_uiMalleableGooTimer -= uiDiff;

                        if (m_uiSayDieTimer < uiDiff)
                        {
                            if(fDie)
                            {
                                DoScriptText(SAY_FESTERGUT_DEATH, me);
                                fDie = false;
                            }
                            EnterEvadeMode();
                            m_uiSayDieTimer = 4000;
                        } else m_uiSayDieTimer -= uiDiff;
                    }
                    else
                    {
                        if (m_uiVileGasTimer < uiDiff)
                        {
                            for (uint8 i = 1; i <= 3; i++)
                            {
                                if(Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
                                {
                                    DoCast(pTarget, SPELL_VILE_GAS);
                                }
                            }
                            m_uiVileGasTimer = urand (16000, 20000);
                        } else m_uiVileGasTimer -= uiDiff;

                        if (m_uiSayDieTimer < uiDiff)
                        {
                            if(rDie)
                            {
                                DoScriptText(SAY_ROTFACE_DEATH, me);
                                rDie = false;
                            }
                            EnterEvadeMode();
                            m_uiSayDieTimer = 4000;
                        } else m_uiSayDieTimer -= uiDiff;
                    }
                }

                if(phase == PHASE_COMBAT)
                {
                    if (m_uiBerserkTimer < uiDiff)
                    {
                        DoCast(me, SPELL_BERSERK);
                        DoScriptText(SAY_BERSERK,me);
                        m_uiBerserkTimer = 600000;
                    } else m_uiBerserkTimer -= uiDiff;

                    if((me->GetHealth()*100) / me->GetMaxHealth() < 81 && PhaseSwitch1 == false)
                    {
                        PhaseSwitch();
                        PhaseSwitch1 = true;
                    }

                    if((me->GetHealth()*100) / me->GetMaxHealth() < 36 && PhaseSwitch2 == false)
                    {
                        PhaseSwitch();
                        PhaseSwitch2 = true;
                    }

                    if (m_uiPhase == 1)
                    {
                        if (m_uiUnstableExperimentTimer < uiDiff)
                        {
                            SpawnAdds();
                            DoCast(SPELL_UNSTABLE_EXPERIMENT);
                            me->MonsterTextEmote(EMOTE_UNSTABLE_EXPERIMENT, NULL);
                            m_uiUnstableExperimentTimer = 40000;
                        } else m_uiUnstableExperimentTimer -= uiDiff;

                        if (m_uiPuddleTimer < uiDiff)
                        {
                            Puddle();
                            m_uiPuddleTimer = 17000;
                        } else m_uiPuddleTimer -= uiDiff;
                    }

                    if (m_uiPhase == 2)
                    {
                        if (m_uiUnstableExperimentTimer < uiDiff)
                        {
                            DoCast(me, SPELL_UNSTABLE_EXPERIMENT);
                            me->MonsterTextEmote(EMOTE_UNSTABLE_EXPERIMENT,NULL);
                            TwoAdds();
                            m_uiUnstableExperimentTimer = 40000;
                        } else m_uiUnstableExperimentTimer -= uiDiff;

                        if (m_uiPuddleTimer < uiDiff)
                        {
                            Puddle();
                            m_uiPuddleTimer = 17000;
                        } else m_uiPuddleTimer -= uiDiff;

                        if (m_uiMalleableTimer < uiDiff)
                        {
                            if(Unit* pTarget = SelectUnit(SELECT_TARGET_FARTHEST, 1))
                            {
                                DoCast(pTarget, SPELL_MALLEABLE_GOO);
                                m_uiMalleableTimer = 16000;
                            }
                        } else m_uiMalleableTimer -= uiDiff;

                        if (m_uiBombTimer < uiDiff)
                        {
                            DoCast(SPELL_CHOKING_GAS_BOMB);
                            m_uiBombTimer = 21000;
                        } else m_uiBombTimer -= uiDiff;
                    }
                    if (m_uiPhase == 3)
                    {
                        if(!me->HasAura(SPELL_STRENGTH))
                        {
                            DoCast(me, SPELL_STRENGTH);
                        }

                        if (m_uiPuddleTimer < uiDiff)
                        {
                            Puddle();
                            m_uiPuddleTimer = 17000;
                        } else m_uiPuddleTimer -= uiDiff;

                        if (m_uiMalleableTimer < uiDiff)
                        {
                            if(Unit* pTarget = SelectUnit(SELECT_TARGET_FARTHEST,1))
                            {
                                DoCast(pTarget, SPELL_MALLEABLE_GOO);
                                m_uiMalleableTimer = 16000;
                            }
                        } else m_uiMalleableTimer -= uiDiff;

                        if (m_uiBombTimer < uiDiff)
                        {
                            DoCast(SPELL_CHOKING_GAS_BOMB);
                            m_uiBombTimer = 21000;
                        } else m_uiBombTimer -= uiDiff;
                    }
                }

                DoMeleeAttackIfReady();
            }
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        // corrupted form
        if (m_bCorruptedForm)
        {
            //MarkOfCorruption_Timer
            if (m_uiMarkOfCorruption_Timer < uiDiff)
            {
                if (m_uiMarkOfCorruption_Count <= 5)
                {
                    uint32 uiMarkSpell = 0;

                    switch (m_uiMarkOfCorruption_Count)
                    {
                        case 0: uiMarkSpell = SPELL_MARK_OF_CORRUPTION1; break;
                        case 1: uiMarkSpell = SPELL_MARK_OF_CORRUPTION2; break;
                        case 2: uiMarkSpell = SPELL_MARK_OF_CORRUPTION3; break;
                        case 3: uiMarkSpell = SPELL_MARK_OF_CORRUPTION4; break;
                        case 4: uiMarkSpell = SPELL_MARK_OF_CORRUPTION5; break;
                        case 5: uiMarkSpell = SPELL_MARK_OF_CORRUPTION6; break;
                    }

                    DoCastSpellIfCan(m_creature->getVictim(), uiMarkSpell);

                    if (m_uiMarkOfCorruption_Count < 5)
                        ++m_uiMarkOfCorruption_Count;
                }

                m_uiMarkOfCorruption_Timer = 15000;
            }else m_uiMarkOfCorruption_Timer -= uiDiff;

            //VileSludge_Timer
            if (m_uiVileSludge_Timer < uiDiff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                    DoCastSpellIfCan(pTarget, SPELL_VILE_SLUDGE);

                m_uiVileSludge_Timer = 15000;
            }else m_uiVileSludge_Timer -= uiDiff;

            //PosCheck_Timer
            if (m_uiPosCheck_Timer < uiDiff)
            {
                float fPosX, fPosY, fPosZ;
                m_creature->GetCombatStartPosition(fPosX, fPosY, fPosZ);

                if (m_creature->IsWithinDist2d(fPosX, fPosY, SWITCH_RADIUS))
                {
                    DoScriptText(SAY_SWITCH_TO_CLEAN, m_creature);

                    // switch to clean form
                    m_creature->SetDisplayId(MODEL_CLEAN);
                    m_uiMarkOfHydross_Count = 0;
                    DoResetThreat();

                    // spawn 4 adds
                    SpawnAdds();

                    m_creature->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
                    m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
                    m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);

                    m_bCorruptedForm = false;
                }

                m_uiPosCheck_Timer = 2500;
            }else m_uiPosCheck_Timer -=uiDiff;
        }
        // clean form
        else
        {
            //MarkOfHydross_Timer
            if (m_uiMarkOfHydross_Timer < uiDiff)
            {
                if (m_uiMarkOfHydross_Count <= 5)
                {
                    uint32 uiMarkSpell;

                    switch (m_uiMarkOfHydross_Count)
                    {
                        case 0: uiMarkSpell = SPELL_MARK_OF_HYDROSS1; break;
                        case 1: uiMarkSpell = SPELL_MARK_OF_HYDROSS2; break;
                        case 2: uiMarkSpell = SPELL_MARK_OF_HYDROSS3; break;
                        case 3: uiMarkSpell = SPELL_MARK_OF_HYDROSS4; break;
                        case 4: uiMarkSpell = SPELL_MARK_OF_HYDROSS5; break;
                        case 5: uiMarkSpell = SPELL_MARK_OF_HYDROSS6; break;
                    }

                    DoCastSpellIfCan(m_creature->getVictim(), uiMarkSpell);

                    if (m_uiMarkOfHydross_Count < 5)
                        ++m_uiMarkOfHydross_Count;
                }

                m_uiMarkOfHydross_Timer = 15000;
            }else m_uiMarkOfHydross_Timer -= uiDiff;

            //WaterTomb_Timer
            if (m_uiWaterTomb_Timer < uiDiff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                    DoCastSpellIfCan(pTarget, SPELL_WATER_TOMB);

                m_uiWaterTomb_Timer = 7000;
            }else m_uiWaterTomb_Timer -= uiDiff;

            //PosCheck_Timer
            if (m_uiPosCheck_Timer < uiDiff)
            {
                float fPosX, fPosY, fPosZ;
                m_creature->GetCombatStartPosition(fPosX, fPosY, fPosZ);

                if (!m_creature->IsWithinDist2d(fPosX, fPosY, SWITCH_RADIUS))
                {
                    DoScriptText(SAY_SWITCH_TO_CORRUPT, m_creature);

                    // switch to corrupted form
                    m_creature->SetDisplayId(MODEL_CORRUPT);
                    m_uiMarkOfCorruption_Count = 0;
                    DoResetThreat();

                    // spawn 4 adds
                    SpawnAdds();

                    m_creature->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
                    m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
                    m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);

                    m_bCorruptedForm = true;
                }

                m_uiPosCheck_Timer = 2500;
            }else m_uiPosCheck_Timer -=uiDiff;
        }

        //EnrageTimer
        if (m_uiEnrageTimer < uiDiff)
        {
            DoCastSpellIfCan(m_creature, SPELL_ENRAGE);
            m_uiEnrageTimer = 60000;
        }else m_uiEnrageTimer -= uiDiff;

        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 uiDiff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
        {
            if (Phase == PHASE_INTRO)
            {
                if (m_uiEventTimer <= uiDiff)
                {
                    switch(subevent)
                    {
                        case 0:
                            if (lInitiates.size() < SUMMONS_NUMBER)
                                SpawnAdds(lInitiates, NPC_TWILIGHT_INITIATE);
                            else 
                                ++subevent;
                            m_uiEventTimer = 1500;
                            break;
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                            DoScriptText(SayPreaching[subevent], m_creature);
                            m_uiEventTimer = 10000;
                            ++subevent;
                            break;
                        case 6:
                            if (!lInitiates.empty())
                                for (GuidList::iterator itr = lInitiates.begin(); itr != lInitiates.end(); ++itr)
                                {
                                    if (Unit* pUnit = m_creature->GetMap()->GetUnit(*itr))
                                        pUnit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                }
                            subevent = 0;
                            Phase = PHASE_AFTER_INTRO;
                            m_uiEventTimer = 1500;
                            break;
                        default: break;
                    }
                } else m_uiEventTimer -= uiDiff;
            }
            return;
        }            

        if (Phase == PHASE_SACRIFICE_SEQUENCE)
        {
            if (m_uiEventTimer <= uiDiff)
            {
                if (!m_pInstance)
                {
                    // this should not happen!
                    Phase = PHASE_READY_TO_ATTACK;
                    return;
                }

                Creature* pController = m_pInstance->GetSingleCreatureFromStorage(NPC_JEDOGA_CONTROLLER);
                if (!pController)
                {
                    // this should not happen!
                    Phase = PHASE_READY_TO_ATTACK;
                    return;
                }

                switch(subevent)
                {
                    case 0:
                        MoveToPosition(true);
                        ++subevent;
                        break;
                    case 1:
                        if (lVolunteers.size() < SUMMONS_NUMBER)
                            SpawnAdds(lVolunteers, NPC_TWILIGHT_VOLUNTEER);
                        else
                        {
                            DoScriptText(urand(0, 1) ? SAY_VOLUNTEER_CHOOSEN : SAY_VOLUNTEER_SACRIFICED, m_creature);
                            ++subevent;
                        }
                        break;
                    case 2:
                        pController->CastSpell(pController, SPELL_SACRIFICE_VISUAL, false);
                        DoCastSpellIfCan(m_creature, SPELL_SACRIFICE_BEAM);
                        ++subevent;
                        break;
                    case 3:
                        {
                            GuidList::iterator itr = lVolunteers.begin();
                            advance(itr, (rand()% (lVolunteers.size())));
                            if (Creature* pVolunteer = m_creature->GetMap()->GetCreature(*itr))
                            {
                                pVolunteer->RemoveAurasDueToSpell(SPELL_VOLUNTEER_SPHERE);
                                float x, y, z;
                                pController->GetPosition(x, y, z);
                                pVolunteer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                pVolunteer->GetMotionMaster()->MovePoint(7, SpawnNode[8][0], SpawnNode[8][1], SpawnNode[8][2],false);
                                DoScriptText(SAY_VOLUNTEER_CHOOSEN, pVolunteer);
                            }
                            ++subevent;
                        }
                        break;
                    case 4:
                        if (m_creature->HasAura(SPELL_GIFT_OF_THE_HERALD))
                            m_bSacrifice = true;

                        if (m_bSacrifice)
                        {
                            pController->RemoveAurasDueToSpell(SPELL_SACRIFICE_VISUAL);
                            MoveToPosition(false);
                            Phase = PHASE_READY_TO_ATTACK;
                            subevent = 0;
                            return;
                        }
                        break;
                        default: break;
                }
                m_uiEventTimer = 1500;
            }
            else
                m_uiEventTimer -= uiDiff;

            return;
        }

        if(!m_bSacrifice && m_creature->GetHealthPercent() < 50.0f)
        {
            Phase = PHASE_SACRIFICE_SEQUENCE;
            return;
        }

        if(m_uiCycloneStrikeTimer < uiDiff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_CYCLONE_STRIKE : SPELL_CYCLONE_STRIKE_H);
            m_uiCycloneStrikeTimer = urand(10000, 20000);
        }
        else
            m_uiCycloneStrikeTimer -= uiDiff;

        if(m_uiLightningBoltTimer < uiDiff)
        {
            if(Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_LIGHTNING_BOLT : SPELL_LIGHTNING_BOLT_H);
            m_uiLightningBoltTimer = urand(3000, 8000);
        }
        else
            m_uiLightningBoltTimer -= uiDiff;

        if(m_uiThundershockTimer < uiDiff)
        {
            if(Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_THUNDERSHOCK : SPELL_THUNDERSHOCK_H);
            m_uiThundershockTimer = urand(8000, 16000);
        }
        else
            m_uiThundershockTimer -= uiDiff;

        DoMeleeAttackIfReady();
    }
Beispiel #17
0
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiPhase == 1 || m_uiPhase == 2)
        {
            // tank out of range
            if (m_creature->GetDistance2d(m_creature->getVictim()) > m_creature->GetAttackDistance(m_creature->getVictim()))
            {
                if (m_uiRange_Timer <= uiDiff)
                {
                    DoCast(m_creature, SPELL_FROST_BREATH);
                    m_uiRange_Timer = 10000;
                }m_uiRange_Timer -= uiDiff;
            }else m_uiRange_Timer = 10000;
            
            //Pull
            if (m_uiPullTimer < uiDiff)
            {
                PullAll();
                m_uiPullTimer = 15000;
            }
            else m_uiPullTimer -= uiDiff;

            //Smash
            if (m_uiSmashTimer < uiDiff)
            {
                DoCast(m_creature, SPELL_SMASH);
                m_uiSmashTimer = 17000;
            }
            else m_uiSmashTimer -= uiDiff;

            //Cleave
            if (m_uiCleaveTimer < uiDiff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE);
                m_uiCleaveTimer = urand(5000, 8000);
            }
            else m_uiCleaveTimer -= uiDiff;
            
            if (m_uiPhase == 1 && m_creature->GetHealthPercent() <= 50.0f)
            {
                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                m_creature->RemoveAllAuras();
                m_creature->CastSpell(m_creature, SPELL_ICE_BLOCK, true);
                SpawnAdds();
                m_uiPhase = 2;
                return;
            }
        }
        else if (m_uiPhase == 2)
        {
            if (m_uiAddCheck_Timer <= uiDiff)
            {
                CreatureList adds;
                GetCreatureListWithEntryInGrid(adds, m_creature, NPC_ADD, 5.0f);
                if (!adds.empty())
                {
                    adds.clear();
                    GetCreatureListWithEntryInGrid(adds, m_creature, NPC_ADD, 45.0f);
                    for(CreatureList::iterator iter = adds.begin(); iter != adds.end(); ++iter)
                    {
                        if (!(*iter)->isAlive())
                            continue;
                        (*iter)->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f);
                        m_creature->CastSpell(*iter, SPELL_LINK, true);
                        m_creature->CastSpell(m_creature, SPELL_DMG, true);
                    }
                    m_uiPhase = 3;
                    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    m_creature->RemoveAllAuras();
                    PullAll();
                    m_uiPullTimer = 15000;
                    m_uiSmashTimer = 17000;
                    m_uiCleaveTimer = urand(5000, 8000);
                    m_uiRange_Timer = 10000;
                    return;
                }
                m_uiAddCheck_Timer = 2000;
            }else m_uiAddCheck_Timer -= uiDiff;
            
            if (m_uiBlizzard_Timer <= uiDiff)
            {
                if (Unit* target = m_creature->SelectAttackingPlayer(ATTACKING_TARGET_RANDOM, 0))
                    DoCast(target,SPELL_BLIZZARD);
                m_uiBlizzard_Timer = 10000;
            }else m_uiBlizzard_Timer -= uiDiff;
            
            //we dont wanna melee
            return;
        }
        
        DoMeleeAttackIfReady();
    }