Beispiel #1
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        //Sleep_Timer
        if (Sleep_Timer < diff)
        {
            if( Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0) )
                DoCast(target,SPELL_SLEEP);

            Sleep_Timer = 8000 + rand()%7000;
        }
        else
            Sleep_Timer -= diff;

        //NoxiousBreath_Timer
        if (NoxiousBreath_Timer < diff)
        {
            DoCast(m_creature->getVictim(),SPELL_NOXIOUSBREATH);
            NoxiousBreath_Timer = 14000 + rand()%6000;
        }
        else
            NoxiousBreath_Timer -= diff;

        //Tailsweep every 2 seconds
        if (TailSweep_Timer < diff)
        {
            if( Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0) )
                DoCast(target,SPELL_TAILSWEEP);

            TailSweep_Timer = 2000;
        }
        else
            TailSweep_Timer -= diff;

        //MarkOfNature_Timer
        //if (MarkOfNature_Timer < diff)
        //{
        //    DoCast(m_creature->getVictim(),SPELL_MARKOFNATURE);
        //    MarkOfNature_Timer = 45000;
        //}else MarkOfNature_Timer -= diff;

        //LightningWave_Timer
        if (LightningWave_Timer < diff)
        {
            //Cast LIGHTNINGWAVE on a Random target
            if( Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0) )
                DoCast(target,SPELL_LIGHTNINGWAVE);

            LightningWave_Timer = 7000 + rand()%5000;
        }
        else
            LightningWave_Timer -= diff;

        //Summon Druids
        if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75)
        {
            if (SummonDruids1_Timer < diff)
            {
                // summon 10 druids
                Unit* target = NULL;
                for(int i = 0; i < 10;i++)
                {
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    SummonDruids(target);
                }

                SummonDruids1_Timer = 60000;
            }
            else
                SummonDruids1_Timer -= diff;
        }

        //Summon Druids
        if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50)
        {
            if (SummonDruids2_Timer < diff)
            {
                // summon 10 druids
                Unit* target = NULL;
                for(int i = 0; i < 10;i++)
                {
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    SummonDruids(target);
                }

                SummonDruids2_Timer = 60000;
            }
            else
                SummonDruids2_Timer -= diff;
        }

        //Summon Druids
        if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25)
        {
            if (SummonDruids3_Timer < diff)
            {
                // summon 10 druids
                Unit* target = NULL;
                for(int i = 0; i < 10;i++)
                {
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    SummonDruids(target);
                }

                SummonDruids3_Timer = 60000;
            }
            else
                SummonDruids3_Timer -= diff;
        }
        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostilTarget())
            return;

        //Check if we have a current target
        if( m_creature->getVictim() && m_creature->isAlive())
        {

            //Sleep_Timer
            if (Sleep_Timer < diff)
            {
                //Cast
                DoCast(m_creature->getVictim(),SPELL_SLEEP);

                //16 seconds
                Sleep_Timer = 16000;
            }else Sleep_Timer -= diff;

            //NoxiousBreath_Timer
            if (NoxiousBreath_Timer < diff)
            {
                //Cast
                DoCast(m_creature->getVictim(),SPELL_NOXIOUSBREATH);

                //28 seconds until we should cast this agian
                NoxiousBreath_Timer = 28000;
            }else NoxiousBreath_Timer -= diff;


            //TailSweep_Timer
            if (TailSweep_Timer < diff)
            {
                //Cast
                DoCast(m_creature->getVictim(),SPELL_TAILSWEEP);

                //20 seconds until we should cast this agian
                TailSweep_Timer = 20000;
            }else TailSweep_Timer -= diff;

            //             //MarkOfNature_Timer
            //            if (MarkOfNature_Timer < diff)
            //             {
            //                 //Cast
            //                 DoCast(m_creature->getVictim(),SPELL_MARKOFNATURE);
            // 
            //                 //45 seconds until we should cast this agian
            //                 MarkOfNature_Timer = 45000;
            //             }else MarkOfNature_Timer -= diff;

            //LightningWave_Timer
            if (LightningWave_Timer < diff)
            {
                //Cast LIGHTNINGWAVE on a Random target
                Unit* target = NULL;

                target = SelectUnit(SELECT_TARGET_RANDOM,0);
                if (target)DoCast(target,SPELL_LIGHTNINGWAVE);

                //18 seconds until we should cast this agian
                LightningWave_Timer = 18000;
            }else LightningWave_Timer -= diff;


            //SummonDruids_Timer
            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 26 )
            {
                if (SummonDruids_Timer < diff)
                {
                    // summon 6 druids every 45s  
                    SummonDruids(m_creature->getVictim());
                    SummonDruids(m_creature->getVictim());
                    SummonDruids(m_creature->getVictim());
                    SummonDruids(m_creature->getVictim());
                    SummonDruids(m_creature->getVictim());
                    SummonDruids(m_creature->getVictim());

                    //45 seconds until we should cast this agian
                    SummonDruids_Timer = 45000;
                } else SummonDruids_Timer -= diff;
            }

            //If we are within range melee the target
            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
            {
                //Make sure our attack is ready and we arn't currently casting
                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
                {
                    m_creature->AttackerStateUpdate(m_creature->getVictim());
                    m_creature->resetAttackTimer();
                }
            }
        }
    }