using System.Collections; using System.Collections.Generic; using UnityEngine; public class FollowingPatrollingEnemy : Enemy { public string name2; public Transform[] path; public int currentPoint; public Transform currentGoal; public Transform target; public float chaseRadius; public float attackRadius; public Transform homePosition; public float roundingDistance; private Rigidbody2D myRigidbody; public Animator anim; public GameObject other; public bool inRange = false; public bool hit = false; public GameObject player; private bool firstAttack = false; private float timerDmg = 0f; private float waitTime = 1.0f; private float timerHit = 0f; private float hitWaitTime = 0.55f; public float thrust; public float knockTime; public int isKilled; //isKilled = 0 - mob ALIVE //isKilled = 1 - mob DEAD public int continued; public int isKilled2; // Start is called before the first frame update void Start() { continued = PlayerPrefs.GetInt("continued"); if (continued == 1) { isKilled = PlayerPrefs.GetInt(name2); } else { isKilled = PlayerPrefs.GetInt(enemyName); } if (isKilled == 1) { gameObject.SetActive(false); } myRigidbody = GetComponent(); anim = GetComponent(); target = GameObject.FindWithTag("Player").transform; } // Update is called once per frame void Update() { CheckDistance(); //StartCoroutine(Timer()); //Code below is for dealing damage to player if (inRange == true) { if (firstAttack == false) { if (timerDmg >= 0.15f) { firstAttack = true; other.GetComponent().TakeDamage(baseAttack); timerDmg = 0f; } } if (timerDmg >= waitTime) { timerDmg = 0f; other.GetComponent().TakeDamage(baseAttack); } timerDmg += Time.deltaTime; } timerHit += Time.deltaTime; if (hit == true) { if (timerHit >= hitWaitTime) { TakeDamage(1.0f); hit = false; timerHit = 0f; TakeKnockback(); } } if (gameObject.active == false) { isKilled = 1; PlayerPrefs.SetInt(enemyName, isKilled); } } void CheckDistance() { if (Vector2.Distance(target.position, transform.position) <= chaseRadius && Vector2.Distance(target.position, transform.position) > attackRadius) { Vector2 temp = Vector2.MoveTowards(transform.position, target.position, moveSpeed * Time.deltaTime); myRigidbody.MovePosition(temp); } else if (Vector2.Distance(target.position, transform.position) > chaseRadius) { Debug.Log(Vector2.Distance(transform.position, path[currentPoint].position)); if (Vector2.Distance(transform.position, path[currentPoint].position) > roundingDistance) { Vector2 temp = Vector2.MoveTowards(transform.position, path[currentPoint].position, moveSpeed * Time.deltaTime); myRigidbody.MovePosition(temp); } else { changeGoal(); } } if (gameObject.active == false) { isKilled = 1; PlayerPrefs.SetInt(enemyName, isKilled); } } void OnTriggerEnter2D(Collider2D collision) { ///For attacking player if (collision.tag == "PlayerHitbox") { inRange = true; firstAttack = false; } if (collision.tag == "AttackHitbox") { hit = true; } } void OnTriggerStay2D(Collider2D collision) { ///For attacking player if (collision.tag == "PlayerHitbox") { inRange = true; } } void OnTriggerExit2D(Collider2D collision) { ///For attacking player inRange = false; timerDmg = 0f; hit = false; } public void TakeDamage(float damage) { health = health - damage; if (health <= 0) { gameObject.SetActive(false); } } public void TakeKnockback() { Rigidbody2D enemy = gameObject.GetComponent(); Rigidbody2D player = other.GetComponent(); if (enemy != null) { enemy.isKinematic = false; Vector2 difference = enemy.transform.position - player.transform.position; difference = difference.normalized * thrust; enemy.AddForce(difference, ForceMode2D.Impulse); StartCoroutine(KnockCo(enemy)); } } private IEnumerator KnockCo(Rigidbody2D enemy) { if (enemy != null) { yield return new WaitForSeconds(knockTime); enemy.velocity = Vector2.zero; enemy.isKinematic = true; } } public void SaveCheckpoint() { PlayerPrefs.SetInt(name2, isKilled); } private void changeGoal() { Debug.Log("cokolweik"); if (currentPoint == path.Length - 1) { currentPoint = 0; currentGoal = path[0]; } else { currentPoint++; currentGoal = path[currentPoint]; } } }