//Normal Update checks void CheckConditions() { //Fix!------------- if (!PetIsAttacking.initialBool) { EnemyLOS = EnemyIsInLOS.initialBool; //Only updates if pet stops attacking } PetTransform.initialPos = transform.position; if (Input.GetKeyDown(KeyCode.LeftShift)) { path.StopFollowPath(); if (!AttackMode) { AttackMode = true; } else { AttackMode = false; currentState = PetStatev2.Idle; } } if (FollowPath) { currentState = PetStatev2.PathFollow; } else { currentState = PetStatev2.Idle; //CHECK IF THIS WORKS WHILE ATTACKING AN ENEMY } }
//When a path can't be created to the enemy... private IEnumerator CantReachEnemyDelay() { CanReachEnemy = false; currentState = PetStatev2.Wait; //Debug.Log("Entered wait state"); yield return(CustomTimer.Timer(.75f)); currentState = PetStatev2.Idle; }
//Hitstun coroutine public IEnumerator HitstunCo() { PetStatev2 lastState = currentState; currentState = PetStatev2.Hitstun; yield return(CustomTimer.Timer(.075f)); currentState = lastState; }
void ResetAttack() { CanAttackDelay = true; JumpMomentum = 0; JumpMomentumScale = 0; currentState = PetStatev2.EnemyFollow; Attacking = false; CanSetRandPos = true; }
//Health void CheckHealth() { Health.initialValue = CurrentHealth; if (CurrentHealth <= 0) { currentState = PetStatev2.Dead; Debug.Log("Pet has died"); } }
void Start() { currentState = PetStatev2.Idle; TargetTransform.initialPos = PlayerTransform.initialPos; CanFollowPath.initialBool = true; PetIsAttacking.initialBool = false; EnemyIsInLOS.initialBool = false; Attacking = false; PetTransform.initialPos = transform.position; CanAttackDelay = true; CanSetRandPos = true; }
void Start() { currentState = PetStatev2.Idle; TargetTransform.initialPos = PlayerTransform.initialPos; CanFollowPath.initialBool = true; PetIsAttacking.initialBool = false; EnemyIsInLOS.initialBool = false; Attacking = false; PetTransform.initialPos = transform.position; CanAttackDelay = true; CanSetRandPos = true; controller = gameObject.GetComponent <CharacterController>(); petCollider = gameObject.GetComponent <Collider>(); }
private IEnumerator AttackEnemy() { Attacking = true; currentState = PetStatev2.AttackAnticipation; yield return(CustomTimer.Timer(.3f)); //Leap forward PetAnim.SetAttack(true); //Temp anim difference = enemyPos.initialPos - transform.position; currentState = PetStatev2.AttackJump; yield return(CustomTimer.Timer(.5f)); //Leap back currentState = PetStatev2.AttackJumpBack; PetAnim.SetAttack(false); //Temp anim JumpMomentum = 0; JumpMomentumScale = 0; yield return(CustomTimer.Timer(1f)); ResetAttack(); }
private IEnumerator IdleWaitTime() //*Fix this to only run once { yield return(new WaitForSeconds(.75f)); currentState = PetStatev2.Walk; }
//Distance and state checking void CheckDistance() { //If pet is too far, teleport float WarpRadius = 18f; if (Vector3.Distance(PlayerTransform.initialPos, transform.position) > WarpRadius) { OutOfRange(); } //Fix!------------- if (AttackMode && EnemyExists.initialBool && EnemyLOS && CanReachEnemy && EnemyIsInRadius) //If attackmode is enabled and an enemy target exists... { //Attack check TargetTransform.initialPos = enemyPos.initialPos; PetIsAttacking.initialBool = true; float AttackRadius = 2f; float RepositionRadius = 1.75f; float PlayerRadius = 4f; if (!Attacking) { if (Vector3.Distance(enemyPos.initialPos, transform.position) <= AttackRadius && Vector3.Distance(enemyPos.initialPos, transform.position) > RepositionRadius) { AttackCoroutine = StartCoroutine(AttackEnemy()); //Debug.Log("Attack"); } else { if (Vector3.Distance(enemyPos.initialPos, transform.position) <= RepositionRadius) { if (CanSetRandPos) { CanSetRandPos = false; currentState = PetStatev2.EnemyRepos; //Runs once from here if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= PlayerRadius) { randX = UnityEngine.Random.Range(-1, 1); //Avoid .net conflict by using UnityEngine randY = UnityEngine.Random.Range(-1, 1); if (randX == 0) { randX = 1f; } if (randY == 0) { randY = 1f; } RepositionDir = new Vector3(transform.position.x + randX, transform.position.y + randY); } else { RepositionDir = PlayerTransform.initialPos; //Reposition towards the player } } else { //Do nothing until an attack } if (CanAttackDelay) //Keeping for now { CanAttackDelay = false; AttackDelay = StartCoroutine(AttackEnemyDelay()); } } else { currentState = PetStatev2.EnemyFollow; RepositionDir = enemyPos.initialPos; //Enemy } } } else { if (AttackDelay != null) { StopCoroutine(AttackDelay); } } } else //FOLLOW PLAYER CHECKS { if (!Attacking) //Lets the attack finish before switching back { TargetTransform.initialPos = PlayerTransform.initialPos; PetIsAttacking.initialBool = false; if (AttackCoroutine != null) { ResetAttack(); StopCoroutine(AttackCoroutine); } if (AttackDelay != null) { StopCoroutine(AttackDelay); } if (!FollowPath) { float ChaseRadius = 18f; float WalkRadius = 3f; float StopRadius = 2.5f; if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= ChaseRadius && Vector3.Distance(PlayerTransform.initialPos, transform.position) > WalkRadius) { currentState = PetStatev2.Run; } if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= WalkRadius && Vector3.Distance(PlayerTransform.initialPos, transform.position) > StopRadius) { if (currentState == PetStatev2.Idle) { StartCoroutine(IdleWaitTime()); //Wait a bit before walking } else { currentState = PetStatev2.Walk; } } if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= StopRadius) { currentState = PetStatev2.Idle; } } } } //How far the pet can keep attacking before returning to the player float DetectionRadiusX = 10f; float DetectionRadiusY = 6f; if (Mathf.Abs(enemyPos.initialPos.x - PlayerTransform.initialPos.x) <= DetectionRadiusX && Mathf.Abs(enemyPos.initialPos.y - PlayerTransform.initialPos.y) <= DetectionRadiusY) { EnemyIsInRadius = true; } else { //Debug.Log("Not within radius"); EnemyIsInRadius = false; } }