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); } } } } }
private void FixedUpdate() { if (entity.Sleep < 0.01f) { SetState(BaseNpc.Behaviour.Sleep); action = Act.Sleep; var time = UnityEngine.Time.realtimeSinceStartup; if (owner.player.enabled && nextMessageTime < time) { UserMessage(owner.player, "isTired"); nextMessageTime = time + 60f; } return; } if (entity.Energy.Level < 0.01f) { var time = UnityEngine.Time.realtimeSinceStartup; if (owner.player.enabled && nextMessageTime < time) { UserMessage(owner.player, "isHungry"); nextMessageTime = time + 60f; } } if (action == Act.Idle || action == Act.Follow) { if (entity.IsSleeping) { SetState(BaseNpc.Behaviour.Idle); } if (!stopFollow && Vector3.Distance(entity.transform.position, owner.transform.position) > 10) { entity.UpdateDestination(owner.transform.position + (Vector3.back * 2)); return; } if (action == Act.Idle) { SetState(BaseNpc.Behaviour.Idle); entity.StopMoving(); } return; } if (action == Act.Move) { if (Vector3.Distance(transform.position, targetPos) < 1) { action = Act.Idle; } else { entity.UpdateDestination(targetPos); SetState(BaseNpc.Behaviour.Attack); } } else if (action == Act.Drink) { if (entity.Hydration.Level >= 1) { action = Act.Idle; SetState(BaseNpc.Behaviour.Idle); return; } if (Vector3.Distance(transform.position, targetPos) < 1) { SetState(BaseNpc.Behaviour.Eat); entity.Hydration.Level += 0.005f; entity.Hydration.Level = Mathf.Clamp01(entity.Hydration.Level); } else { entity.UpdateDestination(targetPos); SetState(BaseNpc.Behaviour.Attack); } } else if (action == Act.Sleep) { SetState(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); entity.StopMoving(); } else { if (targetEnt == null) { if (!stopFollow) { targetEnt = owner.player; } action = Act.Idle; SetState(BaseNpc.Behaviour.Idle); } else { var distance = Vector3.Distance(transform.position, targetEnt.transform.position); if (distance > targetIgnoreDistance) { action = Act.Idle; SetState(BaseNpc.Behaviour.Idle); return; } if ((action == Act.Eat || entity.Energy.Level < 0.25f) && targetEnt != owner.player) { if (distance <= attackRange) { entity.FoodTarget = targetEnt; if (distance <= 2) { SetState(BaseNpc.Behaviour.Eat); entity.Eat(); } } else { entity.UpdateDestination(targetEnt.transform.position); } } if (action == Act.Attack && targetEnt != owner.player && distance < targetIgnoreDistance) { if (entity.AttackTarget != targetEnt) { entity.AttackTarget = targetEnt; } SetState(BaseNpc.Behaviour.Attack); entity.UpdateDestination(targetEnt.transform.position); } } } }