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

        if (EmpoweredSmiteTimer <= diff)
        {
            if (!me->IsNonMeleeSpellCasted(false))
            {
                DoCast(me->getVictim(), SPELL_EMPOWERED_SMITE);
                EmpoweredSmiteTimer = 30000;
            }
        } else EmpoweredSmiteTimer -= diff;

        if (CircleOfHealingTimer <= diff)
        {
            if (TryDoCast(me, SPELL_CIRCLE_OF_HEALING))
                CircleOfHealingTimer = 30000;
        } else CircleOfHealingTimer -= diff;

        if (DivineWrathTimer <= diff)
        {
            if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
            {
                if (TryDoCast(pTarget, SPELL_DIVINE_WRATH))
                    DivineWrathTimer = 20000 + rand()%20 * 1000;
            }
        } else DivineWrathTimer -= diff;

        if (ReflectiveShieldTimer <= diff)
        {
            if (TryDoCast(me, SPELL_REFLECTIVE_SHIELD))
                ReflectiveShieldTimer = 45000;
        } else ReflectiveShieldTimer -= diff;

        DoMeleeAttackIfReady();
    }
        void UpdateAI(const uint32 diff)
        {
            if(IntroStepCounter < 9)
            {
                if(IntroYellTimer <= diff)
                {
                    IntroYellTimer = IntroStep(++IntroStepCounter);
                }else IntroYellTimer -= diff;
            }

            CheckRadianceAura();

            if(!SisterDeath)
            {
                if (pInstance)
                {
                    Creature* Temp = Creature::GetCreature((*me),pInstance->GetData64(DATA_SACROLASH));
                    if (Temp && Temp->isDead())
                    {
                        DoScriptText(YELL_SISTER_SACROLASH_DEAD, me);
                        me->InterruptSpell(CURRENT_GENERIC_SPELL);
                        if(TryDoCast(me, SPELL_EMPOWER))
                            SisterDeath = true;
                    }
                }
            }

            if (!UpdateVictim())
                return;

            DoAggroPuls(diff);

            if(SisterDeath)
            {
                if(ShadownovaTimer <= diff)
                {
                    me->InterruptSpell(CURRENT_GENERIC_SPELL);
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300, true);
                    if(TryDoCast(target, SPELL_SHADOW_NOVA))
                        ShadownovaTimer= 30000+(rand()%5000);

                }else ShadownovaTimer -=diff;
            }
            else
            {
                if(ConflagrationTimer <= diff)
                {
                        me->InterruptSpell(CURRENT_GENERIC_SPELL);
                        Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300, true);
                        if(TryDoCast(target, SPELL_CONFLAGRATION))
                        {
                            ConflagrationTimer = 30000+(rand()%5000);

                            if(!SisterDeath)
                            {
                                DoScriptText(EMOTE_CONFLAGRATION, me, target);
                                DoScriptText(YELL_CANFLAGRATION, me);
                            }

                            BlazeTimer = 4000;
                        }
                }else ConflagrationTimer -= diff;
            }

            if(FlamesearTimer <= diff)
            {
                 if(TryDoCast(me, SPELL_FLAME_SEAR))
                    FlamesearTimer = 15000;
            }else FlamesearTimer -=diff;

            if (PyrogenicsTimer <= diff)
            {
                if(TryDoCast(me, SPELL_PYROGENICS,true))
                    PyrogenicsTimer = 15000;
            }else PyrogenicsTimer -= diff;

            if (BlazeTimer <= diff)
            {
                if(TryDoCast(me->getVictim(), SPELL_BLAZE))
                    BlazeTimer = 3800;
            }else BlazeTimer -= diff;

            if (EnrageTimer <= diff && !Enraged)
            {
                me->InterruptSpell(CURRENT_GENERIC_SPELL);
                DoScriptText(YELL_BERSERK, me);
                if(TryDoCast(me, SPELL_ENRAGE))
                    Enraged = true;
            }else EnrageTimer -= diff;
        }
        void UpdateAI(const uint32 diff)
        {
            CheckRadianceAura();

            if(!SisterDeath)
            {
                if (pInstance)
                {
                    Creature* Temp = Creature::GetCreature((*me),pInstance->GetData64(DATA_ALYTHESS));
                    if (Temp && Temp->isDead())
                    {
                        DoScriptText(YELL_SISTER_ALYTHESS_DEAD, me);
                        me->InterruptSpell(CURRENT_GENERIC_SPELL);
                        if(TryDoCast(me,SPELL_EMPOWER))
                            SisterDeath = true;
                    }
                }
            }

            if (!UpdateVictim())
                return;

            DoAggroPuls(diff);

            if(SisterDeath)
            {
                if (ConflagrationTimer <= diff)
                {
                    me->InterruptSpell(CURRENT_GENERIC_SPELL);
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300, true);
                    if(TryDoCast(target, SPELL_CONFLAGRATION))
                        ConflagrationTimer = 30000+(rand()%5000);
                }else ConflagrationTimer -= diff;
            }
            else
            {
                if(ShadownovaTimer <= diff)
                {
                    me->InterruptSpell(CURRENT_GENERIC_SPELL);
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300, true);
                    if(TryDoCast(target, SPELL_SHADOW_NOVA))
                    {
                        if(!SisterDeath)
                        {
                            DoScriptText(EMOTE_SHADOW_NOVA, me, target);
                            DoScriptText(YELL_SHADOW_NOVA, me);
                        }
                        ShadownovaTimer = 30000+(rand()%5000);
                    }
                }else ShadownovaTimer -=diff;
            }

            if(ConfoundingblowTimer <= diff)
            {
                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10, true);
                if(TryDoCast(target, SPELL_CONFOUNDING_BLOW))
                    ConfoundingblowTimer = 20000 + (rand()%5000);
            }else ConfoundingblowTimer -=diff;

            if(ShadowimageTimer <= diff)
            {
                Unit* ptarget = NULL;
                Creature* temp = NULL;
                for(int i = 0;i<3;i++)
                {
                    ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                    temp = DoSpawnCreature(MOB_SHADOW_IMAGE,0,0,0,0,TEMPSUMMON_CORPSE_DESPAWN,10000);
                    if(temp && ptarget)
                    {
                        temp->AI()->AttackStart(ptarget);
                        temp->getThreatManager().addThreat(ptarget,500000.0f);
                    }
                }
                ShadowimageTimer = 20000;
            }else ShadowimageTimer -=diff;

            if(ShadowbladesTimer <= diff)
            {
                if(TryDoCast(me, SPELL_SHADOW_BLADES))
                    ShadowbladesTimer = 10000;
            }else ShadowbladesTimer -=diff;

            if (EnrageTimer <= diff && !Enraged)
            {
                me->InterruptSpell(CURRENT_GENERIC_SPELL);
                DoScriptText(YELL_ENRAGE, me);
                DoCast(me,SPELL_ENRAGE);
                if(me->HasAura(SPELL_ENRAGE,0))
                    Enraged = true;
            }else EnrageTimer -= diff;

            if( me->isAttackReady() && !me->IsNonMeleeSpellCasted(false))
            {
                //If we are within range melee the target
                if( me->IsWithinMeleeRange(me->getVictim()))
                {
                    HandleTouchedSpells(me->getVictim(), SPELL_DARK_TOUCHED);
                    me->AttackerStateUpdate(me->getVictim());
                    me->resetAttackTimer();
                }
            }
        }
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if(pulse_Timer < diff)
            {
                DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 10000;
            }else pulse_Timer -= diff;

            if(TidalShieldTimer < diff)
            {
                if(TryDoCast(me, SPELL_TIDAL_SHIELD, true))
                {
                    ResetTimer(45000);
                    TidalShieldTimer = 60000;
                }
            }else TidalShieldTimer -= diff;

            if(!me->HasAura(SPELL_BERSERK,0))
            {
                if(EnrageTimer < diff)
                {
                    DoScriptText(SAY_ENRAGE2, me);
                    DoCast(me, SPELL_BERSERK, true);
                }else EnrageTimer -= diff;
            }

            if(SpecialYellTimer < diff)
            {
                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_SPECIAL1, me); break;
                case 1: DoScriptText(SAY_SPECIAL2, me); break;
                }
                SpecialYellTimer = 25000 + (rand()%76)*1000;
            }else SpecialYellTimer -= diff;

            if(ImpalingSpineTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 80,true);
                    if(!target) target = me->getVictim();
                    if(target)
                    {
                        DoCast(target, SPELL_IMPALING_SPINE);
                        SpineTargetGUID = target->GetGUID();
                        //must let target summon, otherwise you cannot click the spine
                        target->SummonGameObject(GOBJECT_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 0);

                        switch(rand()%2)
                        {
                        case 0: DoScriptText(SAY_NEEDLE1, me); break;
                        case 1: DoScriptText(SAY_NEEDLE2, me); break;
                        }
                        ImpalingSpineTimer = 21000;
                    }
                }
            }else ImpalingSpineTimer -= diff;

            if(NeedleSpineTimer < diff)
            {
                if(TryDoCast(me, SPELL_NEEDLE_SPINE, true))
                {
                    //std::list<Unit*> target;
                    //SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 100, true);
                    //for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
                    //    me->CastSpell(*i, 39835, true);
                    NeedleSpineTimer = 3000;
                }
            }else NeedleSpineTimer -= diff;


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

        if (((me->GetHealth() * 100 / me->GetMaxHealth()) < 10) && !Enraged)
        {
            Enraged = true;
            DoCast(me, SPELL_ENRAGE, true);
            DoScriptText(SAY_ENRAGE, me);
        }

        if (BeamTimer <= diff)
        {
            if (!me->IsNonMeleeSpellCast(false))
            {
                switch (CurrentBeam)
                {
                case 0:
                    DoCast(me, SPELL_BEAM_SINISTER_TRIGGER);
                    break;
                case 1:
                    DoCast(me, SPELL_BEAM_VILE_TRIGGER);
                    break;
                case 2:
                    DoCast(me, SPELL_BEAM_WICKED_TRIGGER);
                    break;
                case 3:
                    DoCast(me, SPELL_BEAM_SINFUL_TRIGGER);
                    break;
                }
                uint32 Beam = CurrentBeam;
                while (CurrentBeam == Beam)
                    CurrentBeam = rand() % 4;

                BeamTimer = 30000;
            }
        }
        else BeamTimer -= diff;

        // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other.
        if (FatalAttractionTimer <= diff)
        {
            TeleportPlayers();

            DoScriptText(RAND(SAY_SPELL2, SAY_SPELL3), me);
            FatalAttractionExplodeTimer = 2000;
            FatalAttractionTimer = 30000;
        }
        else FatalAttractionTimer -= diff;

        if (FatalAttractionExplodeTimer <= diff)
        {
            Player* targets[3];
            for (uint8 i = 0; i < 3; ++i)
            {
                if (TargetGUID[i])
                    targets[i] = Player::GetPlayer(*me, TargetGUID[i]);
                else
                    targets[i] = NULL;
            }

            if (targets[0] && targets[0]->IsAlive())
            {
                bool isNear = false;
                if (targets[1] && targets[1]->IsAlive() && targets[0]->GetDistance2d(targets[1]) < 25)
                    isNear = true;

                if (!isNear)
                    if (targets[2] && targets[2]->IsAlive() && targets[0]->GetDistance2d(targets[2]) < 25)
                        isNear = true;

                if (isNear)
                    targets[0]->CastSpell(targets[0], SPELL_ATTRACTION, true);
                else
                {
                    targets[0]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                    TargetGUID[0] = 0;
                    targets[0] = NULL;
                }
            }


            if (targets[1] && targets[1]->IsAlive())
            {
                bool isNear = false;
                if (targets[0] && targets[0]->IsAlive() && targets[1]->GetDistance2d(targets[0]) < 25)
                    isNear = true;

                if (!isNear)
                    if (targets[2] && targets[2]->IsAlive() && targets[1]->GetDistance2d(targets[2]) < 25)
                        isNear = true;

                if (isNear)
                    targets[1]->CastSpell(targets[1], SPELL_ATTRACTION, true);
                else
                {
                    targets[1]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                    TargetGUID[1] = 0;
                    targets[1] = NULL;
                }
            }

            if (targets[2] && targets[2]->IsAlive())
            {
                bool isNear = false;
                if (targets[0] && targets[0]->IsAlive() && targets[2]->GetDistance2d(targets[0]) < 25)
                    isNear = true;

                if (!isNear)
                    if (targets[1] && targets[1]->IsAlive() && targets[2]->GetDistance2d(targets[1]) < 25)
                        isNear = true;

                if (isNear)
                    targets[2]->CastSpell(targets[1], SPELL_ATTRACTION, true);
                else
                {
                    targets[2]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS);
                    TargetGUID[2] = 0;
                    targets[2] = NULL;
                }
            }

            bool allClear = true;
            for (uint8 i = 0; i < 3; i++)
            {
                if (TargetGUID[i] != 0)
                    allClear = false;
            }

            if (allClear)
                FatalAttractionExplodeTimer = 60000;
            else
                FatalAttractionExplodeTimer = 1000;

        }
        else FatalAttractionExplodeTimer -= diff;

        if (ShriekTimer <= diff)
        {
            if (TryDoCast(me->getVictim(), SPELL_SILENCING_SHRIEK))
                ShriekTimer = 20000;
        }
        else ShriekTimer -= diff;

        //Enrage
        if (!me->HasAura(SPELL_BERSERK, 0))
        {
            if (EnrageTimer <= diff)
            {
                DoCast(me, SPELL_BERSERK);
                DoScriptText(SAY_ENRAGE, me);
            }
            else EnrageTimer -= diff;
        }
        //Random taunts
        if (RandomYellTimer <= diff)
        {
            DoScriptText(RAND(SAY_TAUNT1, SAY_TAUNT2, SAY_TAUNT3), me);
            RandomYellTimer = 60000 + rand() % 91 * 1000;
        }
        else RandomYellTimer -= diff;

        DoMeleeAttackIfReady();
    }
    void boss_kalecgos::boss_kalecgosAI::UpdateAI(const uint32 diff)
    {
        if(TalkTimer)
        {
            if(!TalkSequence)
            {
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
                me->InterruptNonMeleeSpells(true);
                me->RemoveAllAuras();
                me->DeleteThreatList();
                me->CombatStop();
                TalkSequence++;

                if(pInstance)
                {
                    pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_1),true);
                    pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_2),true);
                }
            }
            if(TalkTimer <= diff)
            {
                if(isFriendly)
                    GoodEnding();
                else
                    BadEnding();
                TalkSequence++;
            }else TalkTimer -= diff;
        }
        else
        {
            if (!UpdateVictim())
                return;

            if(!doorClosed)
            {
                if(Close_Timer <= diff)
                {
                    if(pInstance)
                    {
                        pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_1),false);
                        pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_FORECEFIELD_COLL_2),false);
                        doorClosed = true;
                    }
                    Close_Timer = 10000;
                }else Close_Timer -= diff;
            }

            if(ResetThreat <= diff)
            {
                if ( ( me->getVictim()->HasAuraEffect(AURA_SPECTRAL_REALM,0)) && (me->getVictim()->GetTypeId() == TYPEID_PLAYER) )
                {
                    for(std::list<HostileReference*>::iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr)
                    {
                        if(((*itr)->getUnitGuid()) ==  (me->getVictim()->GetGUID()))
                        {
                            (*itr)->removeReference();
                            break;
                        }
                    }
                }

                if(me->getVictim() && (me->getVictim()->HasAuraEffect(AURA_SPECTRAL_REALM,0) || me->GetPositionZ() < DRAGON_REALM_Z-10))
                    me->getThreatManager().modifyThreatPercent(me->getVictim(), -100);

                ResetThreat = 1000;
            }else ResetThreat -= diff;

            if(CheckTimer <= diff)
                {
                    if (((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !isEnraged)
                    {
                        Unit* Sath = Unit::GetUnit(*me, SathGUID);
                        if(Sath)
                        {
                            Sath->CastSpell(Sath, SPELL_ENRAGE, true);
                            CAST_AI(boss_sathrovarr::boss_sathrovarrAI,((Creature*)Sath)->AI())->isEnraged = true;
                        }
                        DoCast(me, SPELL_ENRAGE, true);
                        isEnraged = true;
                    }

                    if(!isBanished && (me->GetHealth()*100)/me->GetMaxHealth() < 1)
                    {
                        if(Unit *Sath = Unit::GetUnit(*me, SathGUID))
                        {
                            if(CAST_AI(boss_sathrovarr::boss_sathrovarrAI,((Creature*)Sath)->AI())->isBanished)
                            {
                                Sath->DealDamage(Sath, Sath->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                                return;
                            }
                            else
                            {
                                DoCast(me, SPELL_BANISH);
                                isBanished = true;
                            }
                        }
                        else
                        {
                            sLog->outError("TSCR: Didn't find Shathrowar. Kalecgos event reseted.");
                            EnterEvadeMode();
                            return;
                        }
                    }
                    CheckTimer = 1000;
            }else CheckTimer -= diff;

            if(ArcaneBuffetTimer <= diff)
            {
                if(TryDoCastAOE(SPELL_ARCANE_BUFFET))
                    ArcaneBuffetTimer = 8000;
            }else ArcaneBuffetTimer -= diff;

            if(FrostBreathTimer <= diff)
            {
                if(TryDoCastAOE(SPELL_FROST_BREATH))
                    FrostBreathTimer = 15000;
            }else FrostBreathTimer -= diff;

            if(TailLashTimer <= diff)
            {
                if(TryDoCastAOE(SPELL_TAIL_LASH))
                    TailLashTimer = 15000;
            }else TailLashTimer -= diff;

            if(WildMagicTimer <= diff)
            {
                if(TryDoCastAOE(WildMagic[rand()%6]))
                    WildMagicTimer = 20000;
            }else WildMagicTimer -= diff;

            if(SpectralBlastTimer <= diff)
            {
                //this is a hack. we need to find a victim without aura in core
                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
                if( target && target->isAlive() && !(target->HasAuraEffect(AURA_SPECTRAL_EXHAUSTION, 0)) )
                {
                    if(TryDoCast(target, SPELL_SPECTRAL_BLAST))
                        SpectralBlastTimer = 20000+(rand()%5000);
                }
                else
                {
                    SpectralBlastTimer = 1000;
                }
            }else SpectralBlastTimer -= diff;

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

            if(CheckTimer <= diff)
            {
                if (((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !isEnraged)
                {
                    Unit* Kalecgos = Unit::GetUnit(*me, KalecgosGUID);
                    if(Kalecgos)
                    {
                        Kalecgos->CastSpell(Kalecgos, SPELL_ENRAGE, true);
                        CAST_AI(boss_kalecgos::boss_kalecgosAI,((Creature*)Kalecgos)->AI())->isEnraged = true;
                    }
                    DoCast(me, SPELL_ENRAGE, true);
                    isEnraged = true;
                }

                if(!isBanished && (me->GetHealth()*100)/me->GetMaxHealth() < 1)
                {
                    if(Unit *Kalecgos = Unit::GetUnit(*me, KalecgosGUID))
                    {
                        if(CAST_AI(boss_kalecgos::boss_kalecgosAI,((Creature*)Kalecgos)->AI())->isBanished)
                        {
                            me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                            return;
                        }
                        else
                        {
                            DoCast(me, SPELL_BANISH);
                            isBanished = true;
                        }
                    }
                    else
                    {
                        sLog->outError("Sathrovarr is unable to find Kalecgos");
                        EnterEvadeMode();
                        return;
                    }
                }
                CheckTimer = 1000;
            }else CheckTimer -= diff;

            if(ResetThreat <= diff)
            {
                if ( ( me->getVictim()->HasAuraEffect(AURA_SPECTRAL_EXHAUSTION,0)) && (me->getVictim()->GetTypeId() == TYPEID_PLAYER) )
                {
                    for(std::list<HostileReference*>::iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr)
                    {
                        if(((*itr)->getUnitGuid()) ==  (me->getVictim()->GetGUID()))
                        {
                            (*itr)->removeReference();
                            break;
                        }
                    }
                }
                ResetThreat = 1000;
            }else ResetThreat -= diff;

            if(ShadowBoltTimer <= diff)
            {
                if(TryDoCast(me, SPELL_SHADOW_BOLT))
                {
                    DoScriptText(SAY_SATH_SPELL1, me);
                    ShadowBoltTimer = 7000+(rand()%3000);
                }
            }else ShadowBoltTimer -= diff;

            if(AgonyCurseTimer <= diff)
            {
                Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                if(!ptarget) ptarget = me->getVictim();
                if(TryDoCast(ptarget, SPELL_AGONY_CURSE))
                    AgonyCurseTimer = 20000;
            }else AgonyCurseTimer -= diff;

            if(CorruptionStrikeTimer <= diff)
            {
                if(TryDoCast(me->getVictim(), SPELL_CORRUPTION_STRIKE))
                {
                    DoScriptText(SAY_SATH_SPELL2, me);
                    CorruptionStrikeTimer = 13000;
                }
            }else CorruptionStrikeTimer -= diff;

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

        if (BlessingTimer <= diff)
        {
            if (!me->IsNonMeleeSpellCasted(false))
            {
                if (Unit* pUnit = SelectCouncilMember())
                {

                    switch (rand()%2)
                    {
                        case 0: DoCast(pUnit, SPELL_BLESS_SPELLWARD);  break;
                        case 1: DoCast(pUnit, SPELL_BLESS_PROTECTION); break;
                    }
                }
                BlessingTimer = 15000;
            }
        } else BlessingTimer -= diff;

        if (JudgeTimer <= diff)
        {
           if (!me->IsNonMeleeSpellCasted(false))
           {
                if (me->HasAura(SPELL_SEAL_OF_COMMAND,0))
                {
                    if (TryDoCast(me->getVictim(),SPELL_JUDGEMENT_OF_COMMAND))
                    {
                        me->RemoveAurasDueToSpell(SPELL_SEAL_OF_COMMAND);
                        JudgeTimer = 45000;
                    }
                }
                if (me->HasAura(SPELL_SEAL_OF_BLOOD,0))
                {
                    if (TryDoCast(me->getVictim(),SPELL_JUDGEMENT_OF_BLOOD))
                    {
                        me->RemoveAurasDueToSpell(SPELL_SEAL_OF_BLOOD);
                        JudgeTimer = 45000;
                    }
                }
                JudgeTimer = 15000;
           }
        } else JudgeTimer -= diff;

        if (ConsecrationTimer <= diff)
        {
            if (TryDoCast(me, SPELL_CONSECRATION))
                ConsecrationTimer = 30000;
        } else ConsecrationTimer -= diff;

        if (HammerOfJusticeTimer <= diff)
        {
            if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
            {
                // is in ~10-40 yd range
                if (me->GetDistance2d(pTarget) > 10)
                {
                    if (TryDoCast(pTarget, SPELL_HAMMER_OF_JUSTICE))
                        HammerOfJusticeTimer = 20000;
                }
            }
        } else HammerOfJusticeTimer -= diff;

        if (SealTimer <= diff)
        {
            if (!me->IsNonMeleeSpellCasted(false))
            {
                switch (rand()%2)
                {
                    case 0: DoCast(me, SPELL_SEAL_OF_COMMAND);  break;
                    case 1: DoCast(me, SPELL_SEAL_OF_BLOOD);    break;
                }
                SealTimer = 30000;
            }
        } else SealTimer -= diff;

        if (AuraTimer <= diff)
        {
            if (!me->IsNonMeleeSpellCasted(false))
            {
                CastAuraOnCouncil();
                AuraTimer = 60000;
            }
        } else AuraTimer -= diff;

        DoMeleeAttackIfReady();
    }
        void UpdateAI(const uint32 diff)
        {
            if(Intro)
            {
                if(AggroTimer < diff)
                {
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    DoScriptText(SAY_AGGRO, me);
                    me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
                    Intro = false;
                    if(AggroTargetGUID)
                    {
                        Unit* pUnit = Unit::GetUnit((*me), AggroTargetGUID);
                        if(pUnit)
                            AttackStart(pUnit);

                        DoZoneInCombat();
                    }
                    else
                    {
                        EnterEvadeMode();
                        return;
                    }
                }else AggroTimer -= diff;
            }

            if(!UpdateVictim() || Intro)
                return;

            if(pulse_Timer < diff)
            {
                DoAttackerAreaInCombat(me->getVictim(),50);
                pulse_Timer = 10000;
            }else pulse_Timer -= diff;

            //if(SummonShadowsTimer < diff)
            //{
            //    MindControlGhost();

            //    for(uint8 i = 0; i < 2; ++i)
            //    {
            //        Creature* Shadow = NULL;
            //        float X = CalculateRandomLocation(me->GetPositionX(), 10);
            //        //Shadow = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, X, me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
            //        if(Shadow)
            //        {
            //            Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 1);
            //            if(!ptarget)
            //                ptarget = me->getVictim();

            //            if(ptarget)
            //                Shadow->AI()->AttackStart(ptarget);
            //        }
            //    }
            //    SummonShadowsTimer = 60000;
            //}else SummonShadowsTimer -= diff;

            if(SummonDoomBlossomTimer < diff)
            {
                if (Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                {
                    if(TryDoCast(ptarget,SPELL_SUMMON_DOOM_BLOSSOM))
                        SummonDoomBlossomTimer = 35000;
                }
            }else SummonDoomBlossomTimer -= diff;

            if(IncinerateTimer < diff)
            {
                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true);
                if(!target)
                    target = me->getVictim();

                if(target)
                {
                    if(TryDoCast(target, SPELL_INCINERATE))
                    {
                        switch(rand()%2)
                        {
                        case 0: DoScriptText(SAY_SPECIAL1, me); break;
                        case 1: DoScriptText(SAY_SPECIAL2, me); break;
                        }
                        IncinerateTimer = 10000 + (rand()%10) * 1000;
                    }
                }
            }else IncinerateTimer -= diff;

            if(CrushingShadowsTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    SpellEntry *spellInfo;
                    spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_CRUSHING_SHADOWS);
                    if(spellInfo)
                    {
                        spellInfo->MaxAffectedTargets = 5;
                        me->CastSpell(me,spellInfo,false);
                    }
                    CrushingShadowsTimer = 10000 + rand()%5000;
                }
            }else CrushingShadowsTimer -= diff;

            if(ShadowOfDeathTimer < diff)
            {
                if(!me->IsNonMeleeSpellCasted(false))
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true);

                    if(!target)
                       target = me->getVictim();

                    if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER && !target->HasAura(SPELL_SHADOW_OF_DEATH,1) )
                    {
                        // Custom ... becaus Effekt is not needed
                        SpellEntry *spellInfo;
                        spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHADOW_OF_DEATH);
                        if(spellInfo)
                        {
                            spellInfo->Effect[0] = 0;
                            me->CastSpell(target,spellInfo,false);
                        }

                        //DoCast(target, SPELL_SHADOW_OF_DEATH);
                    
                        //me->CastCustomSpell(target,SPELL_SHADOW_OF_DEATH,NULL,NULL,NULL,false);
                        /*GhostGUID = target->GetGUID();*/
                        ShadowOfDeathTimer = 30000;
                        //SummonShadowsTimer = 53000; // Make it VERY close but slightly less so that we can check if the aura is still on the player
                    }
                }
            }else ShadowOfDeathTimer -= diff;

            if(SummonShadowsTimer < diff)
            {
                if(!shadowtargets.empty())
                {

                    std::list<uint64> del_player;
                    del_player.clear();
                    for(std::list<uint64>::iterator itr = shadowtargets.begin(); itr != shadowtargets.end(); ++itr)
                    {
                        Player* temp = Unit::GetPlayer(*me,*itr);
                        if(temp)
                        {
                            if(temp->isDead() || !temp->HasAuraEffect(SPELL_SHADOW_OF_DEATH,1))
                            {
                                float x,y,z;
                                temp->GetPosition(x,y,z);
                                Unit *ptarget;
                                Creature* c_temp;

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0);
                                ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
                                if(!ptarget) ptarget = me->getVictim();
                                if(ptarget) c_temp->Attack(ptarget,true);

                                del_player.push_back(*itr);
                            }
                        }/*else
                            del_player.push_back(*itr);*/
                        //Auskommentieren fixt ALT+F4 Exploit 
                    }
                    for(std::list<uint64>::iterator itr = del_player.begin(); itr != del_player.end(); ++itr)
                    {
                        shadowtargets.remove(*itr);
                        Player* sacrifice = Unit::GetPlayer(*me,*itr);
                        if(sacrifice && sacrifice->isAlive())
                        {
                            me->DealDamage(sacrifice,sacrifice->GetHealth());
                        }
                    }
                }
                SummonShadowsTimer = 1000;
            }else SummonShadowsTimer -= diff;

            if(RandomYellTimer < diff)
            {
                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_SPELL1, me); break;
                case 1: DoScriptText(SAY_SPELL2, me); break;
                }
                RandomYellTimer = 50000 + rand()%51 * 1000;
            }else RandomYellTimer -= diff;

            if(!me->HasAura(SPELL_BERSERK, 0))
            {
                if(EnrageTimer < diff)
                {
                    DoCast(me, SPELL_BERSERK);
                    DoScriptText(SAY_ENRAGE, me);
                }else EnrageTimer -= diff;
            }

            DoMeleeAttackIfReady();
        }