protected IEnumerator ArriveBathroom(Bathroom place) { UpdateHeader(" entering bathroom"); // Get toilet. Waitpoint toilet = FindRandomWaitpoint(place.toilets, true); yield return(StartCoroutine(WaitpointQueue(toilet))); PlaySFX(fX.pee); yield return(StartCoroutine("UseHands")); toilet.IsBusy = false; // Get sink. Waitpoint sink = FindRandomWaitpoint(place.sinks, true); yield return(StartCoroutine(WaitpointQueue(sink))); PlaySFX(fX.tap); yield return(StartCoroutine("UseHands")); sink.IsBusy = false; isBusy = false; SetIdle(); }
void CheckTrayPoints() { // Ensure waitpoints are assigned. if (!trayPickup || !trayDropoff || !foodPoint) { foreach (Waitpoint wp in GetComponentsInChildren <Waitpoint>()) { if (wp.name == "TrayPickup") { trayPickup = wp; } else if (wp.name == "TrayDropoff") { trayDropoff = wp; } else if (wp.name == "FoodPickup") { foodPoint = wp; } } } }
IEnumerator Task0(MissionTriggerNPC tt) { UpdateState(GuardState.guarding); tt.onoff = false; // Third trigger if (GameManager.instance.missionCheckpoints[1] == 2) { GameManager.instance.mission0Checkpoints[2].SetActive(true); } // Go to the sink. Waitpoint sink = FindRandomWaitpoint(Map.instance.bathroomCentre.sinks, true); yield return(StartCoroutine(WaitpointQueue(sink))); // Drop baton in sink. yield return(StartCoroutine("UseHands")); PlaySFX(fX.tap); GameObject bt = null; if (GameManager.instance.missionCheckpoints[1] == 2) { bt = Instantiate(baton, sink.transform.position + new Vector3(-0.5f, 0, 0), Quaternion.Euler(90, 0, 0)); } sink.IsBusy = false; isBusy = false; // Go to a toilet. Waitpoint toilet = FindRandomWaitpoint(Map.instance.bathroomCentre.toilets, true); yield return(StartCoroutine(WaitpointQueue(toilet))); StartCoroutine("UseHands"); // Delay so player can retrieve baton. yield return(sec5); yield return(sec5); toilet.IsBusy = false; PlaySFX(fX.pee); // Retrieve baton from sink. yield return(StartCoroutine(WaitpointQueue(sink))); PlaySFX(fX.tap); yield return(StartCoroutine("UseHands")); sink.IsBusy = false; // If player retrieved baton. if (GameManager.instance.missionCheckpoints[1] == 3 && !bt) { PlaySFX(fX.whatTheHell); yield return(sec2); // Routine broken! GameManager.instance.Checkpoint(0); // Look for baton. navMeshAgent.SetDestination(toilet.transform.position); yield return(sec3); navMeshAgent.SetDestination(toilet.transform.position); yield return(sec3); // Move on UpdateState(GuardState.patrolling); yield break; } GameManager.instance.mission0Checkpoints[2].SetActive(false); // Go to cell. Vector3 target = Map.instance.cells[7].door.transform.position; navMeshAgent.SetDestination(target); yield return(new WaitUntil(() => Vector3.Distance(transform.position, target) <= 2)); // Open door. Map.instance.cells[7].door.InteractHands(); yield return(sec2); target = Map.instance.cells[7].transform.position; navMeshAgent.SetDestination(target); yield return(new WaitUntil(() => Vector3.Distance(transform.position, target) <= 1)); // Lock door. Map.instance.cells[7].door.InteractHands(); Map.instance.cells[7].door.isLocked = true; // First trigger. if (GameManager.instance.missionCheckpoints[1] == 0) { GameManager.instance.mission0Checkpoints[0].SetActive(true); } //// Beating event for 1min. //for (int i = 0; i < 12; i++) //{ // audioS.clip = fX.beating; // audioS.loop = true; // audioS.Play(); // //PlaySFX(fX.beating); // yield return sec5; //} //audioS.loop = false; yield return(sec5); UpdateState(GuardState.patrolling); tt.onoff = true; if (GameManager.instance.missionCheckpoints[1] == 0) { GameManager.instance.mission0Checkpoints[0].SetActive(false); } // Second trigger if (GameManager.instance.missionCheckpoints[1] == 1) { GameManager.instance.mission0Checkpoints[1].SetActive(true); yield return(sec5); GameManager.instance.mission0Checkpoints[1].SetActive(false); } }
// NPCs start queuing as soon as they enter. protected IEnumerator WaitpointQueue(Waitpoint waitpoint) { bool wasBusy = false; // Loop control variable. bool imFirst = false; navMeshAgent.stoppingDistance = 0.5f; navMeshAgent.autoBraking = true; Vector3 destination = new Vector3(waitpoint.transform.position.x, transform.position.y, waitpoint.transform.position.z); // Check if waitpoint is free and move to them. if (!waitpoint.IsBusy && waitpoint.queue.Count == 0) { imFirst = true; waitpoint.IsBusy = true; navMeshAgent.SetDestination(destination); // If there is no queue, create one; if (!wasBusy) { waitpoint.current = this.gameObject; } } // Continue checking if someone else is picking up a tray until close. do { // If someone reaches point before self: if (waitpoint.IsBusy && !imFirst || !waitpoint.IsBusy && waitpoint.queue.Count != 0 && !imFirst) { wasBusy = true; // Prevent AI pushing. navMeshAgent.stoppingDistance = 0.8f; navMeshAgent.radius = 0.3f; // Queue behind them. currentQueue = waitpoint.current; // Set queue point to self. waitpoint.current = this.gameObject; // Add self to queue. waitpoint.queue.Enqueue(this.gameObject); waitpoint.queueLenght = waitpoint.queue.Count; while (true) { // Wait until waitpoint is free, keep in queue. if (waitpoint.IsBusy) { // If self is first in queue and there is a queuepoint, move to queuepoint. if (waitpoint.queue.Peek() == this.gameObject && waitpoint.queuePoint != null) { navMeshAgent.SetDestination(waitpoint.queuePoint.transform.position); } // Else move behind queue else { navMeshAgent.SetDestination(currentQueue.transform.position); } } // If free and self is next in queue, dequeue self, set waitpoint as busy and break. else if (!waitpoint.IsBusy && waitpoint.queue.Peek() == this.gameObject) { UpdateHeader(" going to " + waitpoint.name); waitpoint.queue.Dequeue(); waitpoint.queueLenght = waitpoint.queue.Count; waitpoint.IsBusy = true; navMeshAgent.SetDestination(destination); navMeshAgent.stoppingDistance = 0.5f; navMeshAgent.radius = 0.4f; break; } yield return(sec025); } break; } navMeshAgent.autoBraking = false; yield return(1); } while (Vector3.Distance(transform.position, destination) > 0.55f); Vector3 target = new Vector3(waitpoint.transform.parent.position.x, transform.position.y, waitpoint.transform.parent.position.z); if (waitpoint.waitTime > 0) { yield return(new WaitForSeconds(waitpoint.waitTime)); } }
protected IEnumerator WaitForWaitpoint(Waitpoint waitpoint) { yield return(waitpoint.IsBusy = false); yield return(StartCoroutine(WaitpointQueue(waitpoint))); }