// Update is called once per frame void Update() { if (enemy == null) { return; } //** //Use the shotgun to avoid flying off edges //** //Don't fly off the Right if (self.transform.position.x > mapWidth && self.GetComponent <Rigidbody>().velocity.x > safeSpeed) { posAdjust(new Vector3(1, 0, 0)); return; } //Don't fly off the Left if (self.transform.position.x < -mapWidth && self.GetComponent <Rigidbody>().velocity.x < safeSpeed) { posAdjust(new Vector3(-1, 0, 0)); return; } //Don't fly off the Top if (self.transform.position.y > mapHeight && self.GetComponent <Rigidbody>().velocity.y > safeSpeed) { posAdjust(new Vector3(0, 1, 0)); return; } //Don't fly off the bottom if (self.transform.position.y < -mapHeight + 1 && self.GetComponent <Rigidbody>().velocity.y < 0) { posAdjust(new Vector3(0, -1, 0)); return; } //** //Check if you are trying to move and have not //Adjust with shotgun and try again //** if (Time.time > previousTime + 1) //If it has been a second { if (frontArm.getFiring() && state != State.attack && Vector3.Magnitude(self.transform.position - previousPos) < stuckDist) { Vector3 stuckAngle = (targetPos - self.transform.position); if (Mathf.Abs(stuckAngle.x) > Mathf.Abs(stuckAngle.y)) { if (self.transform.position.y < 0) { posAdjust(new Vector3(-.5f, -1, 0)); } else { posAdjust(new Vector3(.5f, 1, 0)); } } else { if (self.transform.position.x < 0) { posAdjust(new Vector3(-.5f, -1, 0)); } else { posAdjust(new Vector3(.5f, -1, 0)); } } return; } previousTime = Time.time; previousPos = self.transform.position; } //** //Check if the other player is dead //If so, find safe ground and wait //** else if (!enemy.isActiveAndEnabled) { enemyRespawn = true; state = State.follow; targetPos = GameManager.Instance().getCloseRespawnPoint(self.transform.position); targetPos.y -= 1; if (Vector3.Magnitude(targetPos - self.transform.position) < stoppingDist) { frontArm.SetFiring(false); backArm.SetFiring(false); return; } } //** //Check if the other player has respawned //If so, rest, then hunt //** if (enemy.isActiveAndEnabled && enemyRespawn) { enemyRespawn = false; state = State.rest; restStart = Time.time; restTime = 1; } if (state == State.rest) { frontArm.SetFiring(false); backArm.SetFiring(false); if (Time.time > restStart + restTime) { state = State.follow; } } //** //Reload State //** if (state == State.reload) { if (Vector3.Magnitude(targetPos - self.transform.position) > stoppingDist) { if (Time.time > reloadStart + reloadTime) { targetPos = GameManager.Instance().getRandomRespawnPoint(); reloadStart = Time.time; } followTarget(); } else { frontArm.SetFiring(false); backArm.SetFiring(false); } backArm.Switch(backArm.getWeaponA()); frontArm.Switch(frontArm.getWeaponA()); if (backArm.getAmmo(backArm.getWeaponA()) >= maxSprayerAmmo) { backArm.Switch(backArm.getWeaponB()); frontArm.Switch(frontArm.getWeaponB()); backArm.releaseTrigger(); frontArm.releaseTrigger(); if (backArm.getAmmo(backArm.getWeaponB()) >= maxShotgunAmmo) { backArm.Switch(backArm.getWeaponC()); frontArm.Switch(frontArm.getWeaponC()); backArm.releaseTrigger(); frontArm.releaseTrigger(); if (backArm.getAmmo(backArm.getWeaponC()) >= maxAutoAmmo) { state = State.follow; return; } } } //** //Follow State //** } else if (state == State.follow) { followTarget(); //Check if you need to reload if (backArm.getAmmo(backArm.getWeaponA()) <= lowSprayerAmmo || backArm.getAmmo(backArm.getWeaponB()) <= lowShotgunAmmo || backArm.getAmmo(backArm.getWeaponC()) <= lowAutoAmmo) { targetPos = GameManager.Instance().getCloseRespawnPoint(self.transform.position); targetPos.y -= 1; reloadStart = Time.time; state = State.reload; return; } //Check where you need to follow else if (Vector3.Magnitude(enemy.transform.position - self.transform.position) > attackRange) { float leftPos = enemy.transform.position.x - attackRange / 2; float rightPos = enemy.transform.position.x + attackRange / 2; if (self.transform.position.x > enemy.transform.position.x) { if (rightPos < mapWidth - 1) { targetPos.x = rightPos; } else { targetPos.x = leftPos; } } else { if (leftPos > -mapWidth + 1) { targetPos.x = leftPos; } else { targetPos.x = rightPos; } } /** * if(enemy.transform.position.x < self.transform.position.x){ * targetPos.x = enemy.transform.position.x + attackRange / 2; * } else{ * targetPos.x = enemy.transform.position.x - attackRange / 2; * } */ targetPos.y = enemy.transform.position.y + 1; } //Check if you need to attack else if (Vector3.Magnitude(targetPos - self.transform.position) < stoppingDist) { state = State.attack; return; } } //** //Attack State //** else if (state == State.attack) { //Check if you need to reload if (backArm.getAmmo(backArm.getWeaponA()) <= lowSprayerAmmo || backArm.getAmmo(backArm.getWeaponB()) <= lowShotgunAmmo || backArm.getAmmo(backArm.getWeaponC()) <= lowAutoAmmo) { targetPos = GameManager.Instance().getCloseRespawnPoint(self.transform.position); targetPos.y -= 1; reloadStart = Time.time; state = State.reload; return; } frontArm.SetFiring(true); backArm.SetFiring(true); frontArm.Switch(frontArm.getWeaponC()); backArm.Switch(backArm.getWeaponC()); Vector3 targetAngle = Vector3.Normalize(enemy.transform.position - self.transform.position); targetAngle += new Vector3(0, 0, 0); Vector3.Normalize(targetAngle); frontArm.Aim(targetAngle); backArm.Aim(targetAngle); if (Vector3.Magnitude(enemy.transform.position - self.transform.position) > attackRange) { state = State.follow; return; } } }