void Reset() override
    {
        if (_instance->GetBossState(DATA_TERON_GOREFIEND) != IN_PROGRESS)
        {
            me->DespawnOrUnsummon();
            return;
        }

        targetGUID.Clear();
        _scheduler.CancelAll();
        _scheduler.Schedule(Seconds(12), [this](TaskContext atrophy)
        {
            DoCastVictim(SPELL_ATROPHY);
            atrophy.Repeat(Seconds(10), Seconds(12));
        });
        _scheduler.Schedule(Milliseconds(200), [this](TaskContext checkPlayer)
        {
            if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID))
            {
                if (!target->IsAlive() || !me->CanCreatureAttack(target))
                    SelectNewTarget();
            }
            else
                SelectNewTarget();

            checkPlayer.Repeat(Seconds(1));
        });

        if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
            teron->AI()->JustSummoned(me);

        SelectNewTarget();
    }
		void UpdateAI(uint32 diff)
		{
			if( TargetGUID )
			{
				Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID);
				if( !target || !target->HasAura(SPELL_MARK) || !me->IsValidAttackTarget(target) || me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE || !me->HasUnitState(UNIT_STATE_CHASE_MOVE) )
				{
					SelectNewTarget(true);
					return;
				}
			}

			events.Update(diff);

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case 1:
					me->CastSpell(me, SPELL_SPIKE_SPEED2, true);
					events.PopEvent();
					events.RescheduleEvent(2, 7000);
					break;
				case 2:
					me->CastSpell(me, SPELL_SPIKE_SPEED3, true);
					events.PopEvent();
					break;
				case 3:
					Reset();
					break;
			}
		}
		void Reset()
		{
			SelectNewTarget(false);
		}
        void UpdateAI(uint32 diff)
        {
            if (me->GetVictim())
                if(!me->HasAura(RAID_MODE(SPELL_FACE_RAGE_10N, SPELL_FACE_RAGE_25N,SPELL_FACE_RAGE_10H, SPELL_FACE_RAGE_25H)) && me->GetVictim()->HasAura(SPELL_FACE_RAGE) && !me->HasAura(CRYSTAL_PRISON_EFFECT))
                {
                    if (Unit* RageTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500.0f, true, SPELL_RAGE))
                    {
                        me->getThreatManager().resetAllAggro();
                        me->AddThreat(RageTarget, 500.0f);

                        if (me->GetDistance(RageTarget) >= 13.0f)
                            me->JumpTo(RageTarget,15);

                        me->GetMotionMaster()->MoveChase(RageTarget);
                        me->AI()->AttackStart(RageTarget);
                    }
                    me->GetVictim()->RemoveAurasDueToSpell(SPELL_FACE_RAGE);
                }

            if(GetShannox() && !me->IsInCombat())
            {
                if (me->GetDistance(GetShannox()) > 20.0f)
                    me->SetPosition(GetShannox()->GetPositionX()+5,GetShannox()->GetPositionY()-5,GetShannox()->GetPositionZ(),0);
                else
                    me->GetMotionMaster()->MoveFollow(GetShannox(), walkRagefaceDistance, walkRagefaceAngle);
            }

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                case EVENT_CHANGE_TARGET:
                    if (!me->GetVictim()->HasAura(SPELL_RAGE) && !me->HasAura(RAID_MODE(SPELL_FACE_RAGE_10N, SPELL_FACE_RAGE_25N,SPELL_FACE_RAGE_10H, SPELL_FACE_RAGE_25H)))
                        SelectNewTarget();

                    events.ScheduleEvent(EVENT_CHANGE_TARGET, urand(9000,15000));
                    break;

                case EVENT_FACE_RAGE:
                    if (Unit *FaceRageTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500, true))
                    {
                        me->getThreatManager().resetAllAggro();
                        me->AddThreat(FaceRageTarget, 500.0f);

                        if (me->GetDistance(FaceRageTarget) >= 13.0f)
                            me->JumpTo(FaceRageTarget,15);

                        me->GetMotionMaster()->MoveChase(FaceRageTarget);
                        me->AI()->AttackStart(FaceRageTarget);
                        DoCast(FaceRageTarget,SPELL_FACE_RAGE);
                    }
                    events.ScheduleEvent(EVENT_FACE_RAGE, 61000);
                    break;

                case EVENT_PRISON_DOG_ATTACK_RAGEFACE:
                    if (Creature* prison = me->FindNearestCreature(NPC_CRYSTAL_PRISON, 50.0f, true))
                    {
                        int32 dmg = prison->GetMaxHealth() * 0.20;
                        me->DealDamage(prison,dmg);
                        if (prison->IsAlive())
                            events.ScheduleEvent(EVENT_PRISON_DOG_ATTACK_RAGEFACE, 1000);
                    }
                    break;

                default:
                    break;
                }
            }

            if (me->HasAura(CRYSTAL_PRISON_EFFECT) && !prisonStartAttack)
                if (me->FindNearestCreature(NPC_CRYSTAL_PRISON, 50.0f, true))
                {
                    events.ScheduleEvent(EVENT_PRISON_DOG_ATTACK_RAGEFACE, 1000);
                    prisonStartAttack = true;
                }

            if(GetShannox())
            {
                if(GetShannox()->GetHealthPct() <= 30 && frenzy == false && !me->GetMap()->IsHeroic())
                {
                    frenzy = true;
                    DoCast(me, SPELL_FRENZIED_DEVOLUTION);
                }

                if(GetShannox()->GetDistance2d(me) >= maxDistanceBetweenShannoxAndDogs && !me->HasAura(SPELL_SEPERATION_ANXIETY)) //TODO Sniff right Distance
                {
                    DoCast(me, SPELL_SEPERATION_ANXIETY);
                }

            }

            if (!UpdateVictim())
                return;

            if(Unit* victim = me->GetVictim()) // DoMeleeAttackIfReady implementation of Feeding Frenzy.
            if (me->isAttackReady() && me->IsWithinMeleeRange(victim))
            {
                me->AttackerStateUpdate(victim);
                me->resetAttackTimer();

                if (me->GetMap()->IsHeroic())
                    me->AddAura(SPELL_FEEDING_FRENZY_H, me);
            }
        }