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

                if (TreeForm_Timer <= diff)
                {
                    DoScriptText(RAND(SAY_TREE_1,SAY_TREE_2), me);

                    if (me->IsNonMeleeSpellCasted(false))
                        me->InterruptNonMeleeSpells(true);

                    me->RemoveAllAuras();

                    DoCast(me, SPELL_SUMMON_FRAYER, true);
                    DoCast(me, SPELL_TRANQUILITY, true);
                    DoCast(me, SPELL_TREE_FORM, true);

                    me->GetMotionMaster()->MoveIdle();
                    MoveFree = false;

                    TreeForm_Timer = 75000;
                }
                else
                    TreeForm_Timer -= diff;

                if (!MoveFree)
                {
                    if (MoveCheck_Timer <= diff)
                    {
                        if (!Adds_List.empty())
                        {
                            for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr)
                            {
                                if (Unit *temp = Unit::GetUnit(*me,*itr))
                                {
                                    if (!temp->isAlive())
                                    {
                                        Adds_List.erase(itr);
                                        ++DeadAddsCount;
                                        break;
                                    }
                                }
                            }
                        }

                        if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff)
                            DeadAddsCount = 3;

                        if (DeadAddsCount >= 3)
                        {
                            Adds_List.clear();
                            DeadAddsCount = 0;

                            me->InterruptNonMeleeSpells(true);
                            me->RemoveAllAuras();
                            me->GetMotionMaster()->MoveChase(me->getVictim());
                            MoveFree = true;
                        }
                        MoveCheck_Timer = 500;
                    }
                    else
                        MoveCheck_Timer -= diff;

                    return;
                }

                /*if (me->HasAura(SPELL_TREE_FORM,0) || me->HasAura(SPELL_TRANQUILITY,0))
                    return;*/

                //one random seedling every 5 secs, but not in tree form
                if (SummonSeedling_Timer <= diff)
                {
                    DoSummonSeedling();
                    SummonSeedling_Timer = 6000;
                }
                else
                    SummonSeedling_Timer -= diff;

                DoMeleeAttackIfReady();
            }
        void UpdateAI(const uint32 uiDiff) override
        {
            if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            {
                return;
            }

            if (m_uiTreeFormTimer < uiDiff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_TRANQUILITY) == CAST_OK)
                {
                    // Note: This should remove only negative auras
                    m_creature->RemoveAllAuras();

                    DoCastSpellIfCan(m_creature, SPELL_TREE_FORM, CAST_TRIGGERED);
                    DoScriptText(urand(0, 1) ? SAY_TREE_1 : SAY_TREE_2, m_creature);

                    m_creature->GetMotionMaster()->MoveIdle();
                    m_bCanMoveFree = false;
                    m_uiFrayerTimer = 1000;
                    m_uiTreeFormEndTimer = 45000;
                    m_uiTreeFormTimer = 75000;
                }
            }
            else
            {
                m_uiTreeFormTimer -= uiDiff;
            }

            // The Frayer is summoned after one second in the tree phase
            if (m_uiFrayerTimer)
            {
                if (m_uiFrayerTimer <= uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_SUMMON_FRAYER, CAST_TRIGGERED) == CAST_OK)
                    {
                        m_uiFrayerTimer = 0;
                    }
                }
                else
                {
                    m_uiFrayerTimer -= uiDiff;
                }
            }

            // Tree phase will be removed when the timer expires;
            if (m_uiTreeFormEndTimer)
            {
                if (m_uiTreeFormEndTimer <= uiDiff)
                {
                    if (m_creature->getVictim())
                    {
                        m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                    }
                    m_bCanMoveFree = true;
                    m_uiTreeFormEndTimer = 0;
                }
                else
                {
                    m_uiTreeFormEndTimer -= uiDiff;
                }
            }

            // Don't do any other actions during tree form
            if (!m_bCanMoveFree)
            {
                return;
            }

            // one random seedling every 5 secs, but not in tree form
            if (m_uiSummonSeedlingTimer < uiDiff)
            {
                DoSummonSeedling();
                m_uiSummonSeedlingTimer = 6000;
            }
            else
            {
                m_uiSummonSeedlingTimer -= uiDiff;
            }

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

                if (TreeForm_Timer <= diff)
                {
                    Talk(SAY_TREE);

                    if (me->IsNonMeleeSpellCast(false))
                        me->InterruptNonMeleeSpells(true);

                    me->RemoveAllAuras();

                    DoCast(me, SPELL_SUMMON_FRAYER, true);
                    DoCast(me, SPELL_TRANQUILITY, true);
                    DoCast(me, SPELL_TREE_FORM, true);

                    me->GetMotionMaster()->MoveIdle();
                    MoveFree = false;

                    TreeForm_Timer = 75000;
                }
                else
                    TreeForm_Timer -= diff;

                if (!MoveFree)
                {
                    if (MoveCheck_Timer <= diff)
                    {
                        for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
                        {
                            if (Unit* temp = ObjectAccessor::GetUnit(*me, *itr))
                            {
                                if (!temp->IsAlive())
                                {
                                    summons.erase(itr);
                                    ++DeadAddsCount;
                                    break;
                                }
                            }
                        }

                        if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff)
                            DeadAddsCount = 3;

                        if (DeadAddsCount >= 3)
                        {
                            summons.DespawnAll();
                            DeadAddsCount = 0;

                            me->InterruptNonMeleeSpells(true);
                            me->RemoveAllAuras();
                            me->GetMotionMaster()->MoveChase(me->GetVictim());
                            MoveFree = true;
                        }
                        MoveCheck_Timer = 500;
                    }
                    else
                        MoveCheck_Timer -= diff;

                    return;
                }

                /*if (me->HasAura(SPELL_TREE_FORM, 0) || me->HasAura(SPELL_TRANQUILITY, 0))
                    return;*/

                //one random seedling every 5 secs, but not in tree form
                if (SummonSeedling_Timer <= diff)
                {
                    DoSummonSeedling();
                    SummonSeedling_Timer = 6000;
                }
                else
                    SummonSeedling_Timer -= diff;

                DoMeleeAttackIfReady();
            }
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (TreeForm_Timer < diff)
        {
            DoScriptText(urand(0, 1) ? SAY_TREE_1 : SAY_TREE_2, m_creature);

            if (m_creature->IsNonMeleeSpellCasted(false))
                m_creature->InterruptNonMeleeSpells(true);

            m_creature->RemoveAllAuras();

            DoCastSpellIfCan(m_creature, SPELL_SUMMON_FRAYER, CAST_TRIGGERED);
            DoCastSpellIfCan(m_creature, SPELL_TRANQUILITY,   CAST_TRIGGERED);
            DoCastSpellIfCan(m_creature, SPELL_TREE_FORM,     CAST_TRIGGERED);

            m_creature->GetMotionMaster()->MoveIdle();
            MoveFree = false;

            TreeForm_Timer = 75000;
        }else TreeForm_Timer -= diff;

        if (!MoveFree)
        {
            if (MoveCheck_Timer < diff)
            {
                for(GUIDList::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr)
                {
                    if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr))
                    {
                        if (!pTemp->isAlive())
                        {
                            Adds_List.erase(itr);
                            ++DeadAddsCount;
                            break;
                        }
                    }
                }

                if (DeadAddsCount < 3 && TreeForm_Timer-30000 < diff)
                    DeadAddsCount = 3;

                if (DeadAddsCount >= 3)
                {
                    Adds_List.clear();
                    DeadAddsCount = 0;

                    m_creature->InterruptNonMeleeSpells(true);
                    m_creature->RemoveAllAuras();
                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                    MoveFree = true;
                }
                MoveCheck_Timer = 500;
            }
            else MoveCheck_Timer -= diff;

            return;
        }

        /*if (m_creature->HasAura(SPELL_TREE_FORM, EFFECT_INDEX_0) || m_creature->HasAura(SPELL_TRANQUILITY, EFFECT_INDEX_0))
            return;*/

        //one random seedling every 5 secs, but not in tree form
        if (SummonSeedling_Timer < diff)
        {
            DoSummonSeedling();
            SummonSeedling_Timer = 6000;
        }else SummonSeedling_Timer -= diff;

        DoMeleeAttackIfReady();
    }