|
@@ -0,0 +1,126 @@
|
|
|
+using System.Collections;
|
|
|
+using System.Collections.Generic;
|
|
|
+using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
|
|
|
+using Assets.HeroEditor4D.Common.Scripts.Enums;
|
|
|
+using UnityEngine;
|
|
|
+
|
|
|
+public class LostNpc : MonoBehaviour
|
|
|
+{
|
|
|
+ //check if the quest is active on local player
|
|
|
+ public Character4D character;
|
|
|
+ [SerializeField] private bool _isQuestActive;
|
|
|
+ public QuestScriptable[] questData;
|
|
|
+ private playerNetwork player;
|
|
|
+
|
|
|
+ [SerializeField] private float followSpeed = 2f;
|
|
|
+ [SerializeField] private float stopDistance = 1f;
|
|
|
+ [SerializeField] private float maxDistance = 15f;
|
|
|
+
|
|
|
+ public bool _isFollowing;
|
|
|
+ void Update()
|
|
|
+ {
|
|
|
+ if (_isQuestActive)
|
|
|
+ {
|
|
|
+ FollowPlayer();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // if (player != null)
|
|
|
+ // {
|
|
|
+ // isPlayerInRange = Vector3.Distance(transform.position, player.transform.position) < followRadius;
|
|
|
+
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // isPlayerInRange = false;
|
|
|
+
|
|
|
+ // }
|
|
|
+
|
|
|
+ // if (player != null)
|
|
|
+ // {
|
|
|
+ // FollowPlayer();
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ // check if the activequest is for finding the lost npc
|
|
|
+ // if the player is close to the npc - the npc will start following the player
|
|
|
+ // once the player go back to quest npc - the quest will be completed and npc will stop follow / destroy after few minutes
|
|
|
+
|
|
|
+ private void OnTriggerEnter2D(Collider2D other)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (other.CompareTag("Player"))
|
|
|
+ {
|
|
|
+ if (other.transform == playerNetwork.localPlayerTransform)
|
|
|
+ {
|
|
|
+ player = playerNetwork.localPlayerTransform.GetComponent<playerNetwork>();
|
|
|
+
|
|
|
+ //check if the quest match for finding lost npc
|
|
|
+ if (player.currentQuest == questData[0])
|
|
|
+ {
|
|
|
+ _isQuestActive = true;
|
|
|
+ _isFollowing = true;
|
|
|
+ npcFinalCollider.isTrigger = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ float endTimer = 5f;
|
|
|
+ public void FollowPlayer()
|
|
|
+ {
|
|
|
+
|
|
|
+ float distance = Vector2.Distance(transform.position, player.transform.position);
|
|
|
+
|
|
|
+
|
|
|
+ if (distance <= stopDistance || distance >= maxDistance)
|
|
|
+ {
|
|
|
+ character.AnimationManager.SetState(CharacterState.Idle);
|
|
|
+ _isFollowing = false; // Stop following
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(player.currentQuest==null){
|
|
|
+ if(endTimer > 0 ){
|
|
|
+ endTimer -= Time.deltaTime;
|
|
|
+ }else{
|
|
|
+ Destroy(gameObject);
|
|
|
+ }
|
|
|
+ character.AnimationManager.SetState(CharacterState.Idle);
|
|
|
+ _isFollowing = false;
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Move
|
|
|
+ Vector2 direction = (player.transform.position - transform.position).normalized;
|
|
|
+ transform.position = Vector2.MoveTowards(transform.position, player.transform.position, followSpeed * Time.deltaTime);
|
|
|
+
|
|
|
+ //
|
|
|
+ if (direction.x > 0) character.SetDirection(Vector2.right);
|
|
|
+ else if (direction.x < 0) character.SetDirection(Vector2.left);
|
|
|
+ else if (direction.y > 0) character.SetDirection(Vector2.up);
|
|
|
+ else if (direction.y < 0) character.SetDirection(Vector2.down);
|
|
|
+
|
|
|
+ //
|
|
|
+ character.AnimationManager.SetState(CharacterState.Walk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void StopFollowing()
|
|
|
+ {
|
|
|
+ _isFollowing = false;
|
|
|
+ character.AnimationManager.SetState(CharacterState.Idle);
|
|
|
+ }
|
|
|
+ public BoxCollider2D npcFinalCollider;
|
|
|
+ public void SetFinalQuestAction()
|
|
|
+ {
|
|
|
+ //enable npc is trigger
|
|
|
+ npcFinalCollider.isTrigger = true;
|
|
|
+ //StopFollowing();
|
|
|
+ //destroy npc after few minutes
|
|
|
+
|
|
|
+ }
|
|
|
+}
|