using System.Collections; using System.Collections.Generic; using GUI_Scripts.ProceduralGeneration; using UnityEngine; [RequireComponent(typeof(NPC))] [RequireComponent(typeof(NpcDialogueManager))] public class NPCFollowing : MonoBehaviour { private Rigidbody2D myRigidbody; public Animator anim; public Vector3 homePosition; public Transform targetPosition; public AStarPathfindingAgent agent; //public GameObject player; public bool approaching = false; public bool isAfterAction = false; public bool isDuringConversation = false; public float actionRadius = 1.5f; void Awake() { agent = GetComponent(); } // Start is called before the first frame update void Start() { isAfterAction = System.Convert.ToBoolean(PlayerPrefs.GetInt(gameObject.GetComponent().name + ".FirstDialogue")); myRigidbody = GetComponent(); anim = GetComponent(); homePosition = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z); targetPosition = GameObject.FindWithTag("Player").transform; if(!isAfterAction) StartCoroutine(WaitBeforStartingAction(5f)); } // Update is called once per frame public void Update() { HandleState(); } private IEnumerator WaitBeforStartingAction(float waitTime) { while (true) { yield return new WaitForSeconds(waitTime); // Start story approaching = true; gameObject.GetComponent().State = NPCStateEnum.Walking; } } private IEnumerator Wait(float waitTime) { while (true) { yield return new WaitForSeconds(waitTime); } } public void CheckDistance() { anim.SetBool("isRunning", true); StopAllCoroutines(); if (isAfterAction == false) { if (approaching && Vector2.Distance(targetPosition.position, transform.position) >= actionRadius) { agent.FindPath(); StartCoroutine(agent.FollowPath()); } else if (approaching) { //start dialogue here gameObject.GetComponent().State = NPCStateEnum.Talking; if (targetPosition.position.y > transform.position.y) { anim.SetBool("TurnFront",true); anim.SetBool("isRunning", false); } else { anim.SetBool("TurnFront",false); anim.SetBool("isRunning", false); } agent.path.Clear(); // if we are able to talgk we dont want go go further player } } else if (!approaching && isAfterAction) { Debug.Log(Vector2.Distance(transform.position, homePosition)); Debug.Log(homePosition); if (Vector2.Distance(transform.position, homePosition) > 0.95) { //transform.position = Vector2.MoveTowards(transform.position, homePosition, 2 * Time.deltaTime); agent.point = homePosition; agent.FindPoint(); StartCoroutine(agent.FollowPath()); } else { anim.SetBool("isRunning", false); anim.SetBool("TurnFront", false); gameObject.GetComponent().State = NPCStateEnum.Pending; } } } public void OnTriggerExit2D(Collider2D other) { // don't listen when component is disabled if (!gameObject.GetComponent().enabled) return; if (approaching && !isAfterAction) { gameObject.GetComponent().Dialogue.BreakDialogueStep(); isDuringConversation = false; gameObject.GetComponent().State = NPCStateEnum.Walking; } } public void HandleState() { switch (gameObject.GetComponent().State) { case NPCStateEnum.Walking: { CheckDistance(); break; } case NPCStateEnum.Talking: { DoAction(); break; } case NPCStateEnum.Pending: { break; } case NPCStateEnum.Attacking: { break; } default: { Debug.Log("fancy text nie wiem co zrobic"); break; } } } public void DoAction() { if (approaching == true && isDuringConversation == false && gameObject.GetComponent().CanBeOpened) { isDuringConversation = true; gameObject.GetComponent().Dialogue.StartDialogue(); } } public void AfterAction() { approaching = false; isAfterAction = true; isDuringConversation = false; PlayerPrefs.SetInt(gameObject.name + ".FirstDialogue", System.Convert.ToInt32(isAfterAction)); gameObject.GetComponent().State = NPCStateEnum.Walking; } }