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;
}
}
}