private void Update()
            {
                if (entity.Sleep < 0.01f)
                {
                    SetBehaviour(BaseNpc.Behaviour.Sleep);
                    action = Act.Sleep;

                    float time = Time.realtimeSinceStartup;
                    if (owner.player.enabled && nextMessageTime < time)
                    {
                        UserMessage(owner.player, "isTired");
                        nextMessageTime = time + 60f;
                    }
                    return;
                }

                if (entity.Energy.Level < 0.01f)
                {
                    var time = Time.realtimeSinceStartup;
                    if (owner.player.enabled && nextMessageTime < time)
                    {
                        UserMessage(owner.player, "isHungry");
                        nextMessageTime = time + 60f;
                    }
                }

                if (action == Act.Idle || action == Act.Follow)
                {
                    SetBehaviour(BaseNpc.Behaviour.Idle);

                    if (stopFollow)
                    {
                        StopMoving();
                    }
                    else
                    {
                        if (owner != null)
                        {
                            float distance = Vector3.Distance(transform.position, owner.transform.position);
                            if (distance > 3)
                            {
                                UpdateDestination(owner.transform.position + (-owner.player.eyes.HeadForward() * 2), distance > 10);
                            }
                            else
                            {
                                StopMoving();
                            }
                        }
                    }
                    return;
                }

                if (action == Act.Move)
                {
                    float distance = Vector3.Distance(transform.position, targetPos);

                    if (distance < 1)
                    {
                        action = Act.Idle;
                    }
                    else
                    {
                        SetBehaviour(BaseNpc.Behaviour.Wander);
                        UpdateDestination(targetPos, distance > 5);
                    }
                }
                else if (action == Act.Drink)
                {
                    if (entity.Hydration.Level >= 1)
                    {
                        SetBehaviour(BaseNpc.Behaviour.Idle);
                        action = Act.Idle;
                        return;
                    }

                    float distance = Vector3.Distance(transform.position, targetPos);
                    if (distance < 1)
                    {
                        SetBehaviour(BaseNpc.Behaviour.Eat);
                        entity.Hydration.Level += 0.005f;
                        entity.Hydration.Level  = Mathf.Clamp01(entity.Hydration.Level);
                    }
                    else
                    {
                        UpdateDestination(targetPos, distance > 5);
                    }
                }
                else if (action == Act.Sleep)
                {
                    StopMoving();
                    SetBehaviour(BaseNpc.Behaviour.Sleep);

                    entity.health += 0.003f;
                    entity.health  = Mathf.Clamp(entity.health, 0, entity.MaxHealth());

                    entity.Sleep += 0.003f;
                    entity.Sleep  = Mathf.Clamp01(entity.Sleep);
                }
                else
                {
                    if (targetEnt == null)
                    {
                        if (!stopFollow)
                        {
                            targetEnt = owner.player;
                        }

                        action = Act.Idle;
                    }
                    else
                    {
                        float distance = Vector3.Distance(transform.position, targetEnt.transform.position);
                        if (distance > targetIgnoreDistance)
                        {
                            action = Act.Idle;
                            SetBehaviour(BaseNpc.Behaviour.Idle);
                            return;
                        }

                        if ((action == Act.Eat || entity.Energy.Level < 0.25f) && targetEnt != owner.player)
                        {
                            SetBehaviour(BaseNpc.Behaviour.Eat);

                            if (distance <= attackRange)
                            {
                                entity.FoodTarget = targetEnt;
                                if (distance <= 2)
                                {
                                    entity.Eat();
                                }
                            }
                            else
                            {
                                UpdateDestination(targetEnt.transform.position, distance > 5);
                            }
                        }

                        if (action == Act.Attack && targetEnt != owner.player && distance < targetIgnoreDistance)
                        {
                            if (entity.AttackTarget != targetEnt)
                            {
                                entity.AttackTarget = targetEnt;
                            }

                            SetBehaviour(BaseNpc.Behaviour.Attack);

                            if (distance <= entity.AttackRange)
                            {
                                entity.StartAttack();
                            }
                            else
                            {
                                UpdateDestination(targetEnt.transform.position, true);
                            }
                        }
                    }
                }
            }