Scriptum/Assets/Scripts/NPCs' Scripts/NPCFollowing.cs
2023-01-05 21:19:05 +01:00

189 lines
5.6 KiB
C#

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<AStarPathfindingAgent>();
}
// Start is called before the first frame update
void Start()
{
isAfterAction = System.Convert.ToBoolean(PlayerPrefs.GetInt(gameObject.GetComponent<NPC>().name + ".FirstDialogue"));
myRigidbody = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
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<NPC>().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<NPC>().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<NPC>().State = NPCStateEnum.Pending;
}
}
}
public void OnTriggerExit2D(Collider2D other)
{
// don't listen when component is disabled
if (!gameObject.GetComponent<NPCFollowing>().enabled)
return;
if (approaching && !isAfterAction)
{
gameObject.GetComponent<NpcDialogueManager>().Dialogue.BreakDialogueStep();
isDuringConversation = false;
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
}
}
public void HandleState()
{
switch (gameObject.GetComponent<NPC>().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<NpcDialogueManager>().CanBeOpened)
{
isDuringConversation = true;
gameObject.GetComponent<NpcDialogueManager>().Dialogue.StartDialogue();
}
}
public void AfterAction()
{
approaching = false;
isAfterAction = true;
isDuringConversation = false;
PlayerPrefs.SetInt(gameObject.name + ".FirstDialogue", System.Convert.ToInt32(isAfterAction));
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
}
}