using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class NPCController : MonoBehaviour
{
private NavMeshAgent agent;
private Animator animator;
[Header("External References")]
public Animator doorAnimatorExit;
public Animator doorAnimatorEnter;
public Stamping stamping;
public ResumeManager resumeManager;
[Header("Scene Points")]
public GameObject chairCubeTarget;
public GameObject chairCubeSit;
public GameObject exitPoint;
private GameObject npcTorso;
[Header("NPC Data")]
[SerializeField] private List allPersons = new List();
private bool isExiting = false;
private bool resumeSpawned = false;
private void Start()
{
agent = GetComponent();
animator = GetComponent();
npcTorso = transform.GetChild(1).gameObject;
ResetNPCState();
agent.updateRotation = false;
doorAnimatorEnter.SetBool("isEntering", true);
StartCoroutine(CloseEnterDoorAfterDelay());
MoveToChair();
}
private void Update()
{
if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance)
{
if (isExiting)
ReturnToPool();
else
TrySitDown();
}
}
private void MoveToChair()
{
agent.SetDestination(chairCubeTarget.transform.position);
SetAnimationState(walking: true);
Debug.Log("NPC moving to chair.");
}
private void TrySitDown()
{
agent.Warp(chairCubeSit.transform.position);
SetAnimationState(sitting: true);
if (!resumeSpawned && allPersons.Count > 0)
{
int randomIndex = Random.Range(0, allPersons.Count);
Person selectedPerson = allPersons[randomIndex];
resumeManager.SpawnNextResume(selectedPerson);
allPersons.RemoveAt(randomIndex);
resumeSpawned = true;
}
}
public void LeaveRoom()
{
isExiting = true;
agent.SetDestination(exitPoint.transform.position);
Vector3 rotation = npcTorso.transform.eulerAngles;
rotation.z = -90f;
npcTorso.transform.eulerAngles = rotation;
SetAnimationState(walking: true);
doorAnimatorExit.SetBool("isNearby", true);
StartCoroutine(CloseExitDoorAfterDelay());
}
private void ReturnToPool()
{
ResetNPCState();
NPCPool.npcInstance.ReturnToPool(gameObject);
}
public void ResetNPCState()
{
isExiting = false;
resumeSpawned = false;
Stamping.isStamped = false;
SetAnimationState(idle: true);
agent.ResetPath();
}
private void SetAnimationState(bool idle = false, bool walking = false, bool sitting = false)
{
if (idle)
{
animator.SetInteger("legs", 0);
animator.SetInteger("arms", 0);
}
else if (walking)
{
animator.SetInteger("legs", 1);
animator.SetInteger("arms", 1);
}
else if (sitting)
{
animator.SetInteger("legs", 3);
animator.SetInteger("arms", 3);
}
}
private IEnumerator CloseEnterDoorAfterDelay()
{
yield return new WaitForSeconds(2f);
doorAnimatorEnter.SetBool("isEntering", false);
}
private IEnumerator CloseExitDoorAfterDelay()
{
yield return new WaitForSeconds(3f);
doorAnimatorExit.SetBool("isNearby", false);
}
}