using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Gley.TrafficSystem.Internal { /// /// Access idle vehicles. /// internal class IdleVehiclesDataHandler { private IdleVehiclesData _idleVehiclesData; internal IdleVehiclesDataHandler(IdleVehiclesData idleVehiclesData) { _idleVehiclesData = idleVehiclesData; } /// /// Get an available vehicle to be instantiated /// /// /// internal VehicleComponent GetAndRemoveVehicle(int vehicleIndex) { VehicleComponent vehicle = GetVehicle(vehicleIndex); RemoveVehicle(vehicleIndex); return vehicle; } internal VehicleComponent PeakIdleVehicle(int vehicleIndex) { return GetVehicle(vehicleIndex); } internal int GetRandomIndex() { if (!HasIdleVehicles()) { return TrafficSystemConstants.INVALID_WAYPOINT_INDEX; } return Random.Range(0, GetNumberOfVehicles()); } /// /// Get a random index of an idle vehicle /// /// internal int GetIdleVehicleIndex(VehicleTypes type) { var possibleVehicles = GetAllVehiclesOfType(type); if (possibleVehicles.Count > 0) { return GetVehicleIndex(possibleVehicles[Random.Range(0, possibleVehicles.Count)]); } return TrafficSystemConstants.INVALID_WAYPOINT_INDEX; } /// /// Get the vehicle type of a given vehicle index /// /// /// internal VehicleTypes GetIdleVehicleType(int vehicleIndex) { return GetVehicle(vehicleIndex).vehicleType; } internal float GetFrontWheelOffset(int vehicleIndex) { return GetVehicle(vehicleIndex).frontTrigger.localPosition.z; } /// /// Get the length of the given vehicle index /// /// /// internal float GetHalfVehicleLength(int vehicleIndex) { return GetVehicle(vehicleIndex).length / 2; } /// /// Get the height of the given vehicle index /// /// /// internal float GetIdleVehicleHeight(int vehicleIndex) { return GetVehicle(vehicleIndex).coliderHeight; } internal float GetIdleVehicleWidth(int vehicleIndex) { return GetVehicle(vehicleIndex).ColliderWidth / 2; } internal void AddVehicle(VehicleComponent vehicle) { if (!GetAllVehicles().Contains(vehicle)) { if (vehicle.gameObject.activeSelf == false) { GetAllVehicles().Add(vehicle); } } } internal void RemoveVehicle(VehicleComponent vehicle) { GetAllVehicles().Remove(vehicle); } private List GetAllVehiclesOfType(VehicleTypes type) { return GetAllVehicles().Where(cond => cond.vehicleType == type).ToList(); } private VehicleComponent GetVehicle(int vehicleIndex) { return GetAllVehicles()[vehicleIndex]; } public int GetVehicleIndex(VehicleComponent vehicle) { return GetAllVehicles().IndexOf(vehicle); } private void RemoveVehicle(int vehicleIndex) { GetAllVehicles().RemoveAt(vehicleIndex); } private bool HasIdleVehicles() { return GetNumberOfVehicles() > 0; } private int GetNumberOfVehicles() { return GetAllVehicles().Count; } private List GetAllVehicles() { return _idleVehiclesData.IdleVehicles; } } }