using Gley.UrbanSystem.Internal; using System.Collections.Generic; using UnityEngine; namespace Gley.TrafficSystem.Internal { /// /// Access all traffic vehicles. /// internal class AllVehiclesDataHandler { private readonly AllVehiclesData _allVehiclesData; internal AllVehiclesDataHandler(AllVehiclesData allVehiclesData) { _allVehiclesData = allVehiclesData; } /// /// Get entire vehicle list /// /// internal VehicleComponent[] GetAllVehicles() { return _allVehiclesData.AllVehicles; } internal VehicleComponent GetVehicle(int vehicleIndex) { return GetAllVehicles()[vehicleIndex]; } internal Rigidbody GetRigidbody(int vehicleIndex) { return GetAllVehicles()[vehicleIndex].rb; } internal Rigidbody GetTrailerRigidbody(int vehicleIndex) { return GetAllVehicles()[vehicleIndex].trailer.rb; } internal Vector3 GetTrailerVelocity(int vehicleIndex) { #if UNITY_6000_0_OR_NEWER return GetTrailerRigidbody(vehicleIndex).linearVelocity; #else return GetTrailerRigidbody(vehicleIndex).velocity; #endif } internal List GetExcludedVehicleList() { var result = new List(); for (int i = 0; i < GetAllVehicles().Length; i++) { if (GetVehicle(i).excluded) { result.Add(GetVehicle(i)); } } return result; } internal int GetExcludedVehicleIndex(GameObject vehicle) { for (int i = 0; i < GetAllVehicles().Length; i++) { if (GetVehicle(i).excluded) { if (GetVehicle(i).gameObject == vehicle) { return i; } } } return TrafficSystemConstants.INVALID_VEHICLE_INDEX; } internal bool VehicleIsExcluded(int vehicleIndex) { return GetVehicle(vehicleIndex).excluded; } internal VehicleComponent GetExcludedVehicle(int vehicleIndex) { return GetVehicle(vehicleIndex); } internal void SetExcludedValue(int vehicleIndex, bool excluded) { GetVehicle(vehicleIndex).excluded = excluded; } /// /// Set reverse lights if required on a specific vehicle /// /// /// internal void SetReverseLights(int vehicleIndex, bool active) { GetVehicle(vehicleIndex).SetReverseLights(active); } /// /// Set brake lights if required on a specific vehicle /// /// /// internal void SetBrakeLights(int vehicleIndex, bool active) { GetVehicle(vehicleIndex).SetBrakeLights(active); } internal VehicleTypes GetVehicleType(int vehicleIndex) { return GetVehicle(vehicleIndex).vehicleType; } /// /// Remove the given vehicle from scene /// /// internal void RemoveVehicle(int vehicleIndex) { GetVehicle(vehicleIndex).DeactivateVehicle(); for (int i = 0; i < GetAllVehicles().Length; i++) { GetVehicle(i).ColliderRemoved(GetAllColliders(vehicleIndex)); } } /// /// Check if the given vehicle can be removed from scene /// /// /// internal bool CanBeRemoved(int vehicleIndex) { return GetVehicle(vehicleIndex).CanBeRemoved(); } /// /// Get the current velocity of the given vehicle index /// /// /// internal Vector3 GetVelocity(int vehicleIndex) { return GetVehicle(vehicleIndex).GetVelocity(); } /// /// Get the speed of the given vehicle index /// /// /// internal float GetCurrentSpeed(int vehicleIndex) { return GetVehicle(vehicleIndex).GetCurrentSpeed(); } //if a vehicle has a traffic participant in trigger, it will return the minimum speed of all participants internal float GetFollowSpeed(int vehicleIndex) { return GetVehicle(vehicleIndex).GetFollowSpeed(); } internal float GetVehicleLength(int vehicleIndex) { return GetVehicle(vehicleIndex).length; } internal float GetVehicleWidth(int vehicleIndex) { return GetVehicle(vehicleIndex).ColliderWidth; } /// /// Activate a vehicle on scene /// /// /// /// internal void ActivateVehicle(VehicleComponent vehicle, Vector3 position, Quaternion vehicleRotation, Quaternion trailerRotation) { vehicle.ActivateVehicle(position, vehicleRotation, trailerRotation); } /// /// Get the vehicle collider /// /// /// internal Collider GetCollider(int vehicleIndex) { return GetVehicle(vehicleIndex).GetCollider(); } /// /// Get the vehicle moving direction /// /// /// internal Vector3 GetHeading(int vehicleIndex) { return GetVehicle(vehicleIndex).GetHeading(); } /// /// Get the vehicles forward direction /// /// /// internal Vector3 GetForwardVector(int vehicleIndex) { return GetVehicle(vehicleIndex).GetForwardVector(); } /// /// Set a new action for a vehicle /// /// /// internal void SetCurrentAction(int vehicleIndex, TrafficSystem.DriveActions currentAction) { GetVehicle(vehicleIndex).SetCurrentAction(currentAction); } /// /// The give vehicle has stopped reversing /// /// internal void CurrentVehicleActionDone(int vehicleIndex) { GetVehicle(vehicleIndex).CurrentVehicleActionDone(); } /// /// Get the current action for the given vehicle index /// /// /// internal TrafficSystem.DriveActions GetCurrentAction(int vehicleIndex) { return GetVehicle(vehicleIndex).CurrentAction; } /// /// Get the vehicles max speed /// /// /// internal float GetMaxSpeed(int vehicleIndex) { return GetVehicle(vehicleIndex).MaxSpeed; } /// /// ??? /// /// /// internal float GetPossibleMaxSpeed(int vehicleIndex) { return GetVehicle(vehicleIndex).maxPossibleSpeed; } /// /// Set the corresponding blinker for the vehicle /// /// /// internal void SetBlinkLights(int vehicleIndex, BlinkType blinkType) { GetVehicle(vehicleIndex).SetBlinker(blinkType); } /// /// Get the spring force of the vehicle /// /// /// internal float GetSpringForce(int vehicleIndex) { return GetVehicle(vehicleIndex).SpringForce; } /// /// Get the power step (acceleration) of the vehicle /// /// /// internal float GetPowerStep(int vehicleIndex) { return GetVehicle(vehicleIndex).GetPowerStep(); } /// /// Get the brake power step of the vehicle /// /// /// internal float GetBrakeStep(int vehicleIndex) { return GetVehicle(vehicleIndex).GetBrakeStep(); } /// /// Get ground orientation vector /// /// /// internal Vector3 GetGroundDirection(int vehicleIndex) { return GetVehicle(vehicleIndex).GetGroundDirection(); } /// /// Update additional components from the vehicle if needed /// /// internal void UpdateVehicleScripts(int vehicleIndex, float volume, float realTimeSinceStartup) { GetVehicle(vehicleIndex).UpdateEngineSound(volume); GetVehicle(vehicleIndex).UpdateLights(realTimeSinceStartup); GetVehicle(vehicleIndex).UpdateColliderSize(); } /// /// Update main lights of the vehicle /// /// internal void UpdateVehicleLights(bool on) { for (int i = 0; i < GetAllVehicles().Length; i++) { GetVehicle(i).SetMainLights(on); } } internal void TriggerColliderRemovedEvent(Collider[] colliders) { for (int i = 0; i < GetAllVehicles().Length; i++) { GetVehicle(i).ColliderRemoved(colliders); } } internal float GetTriggerSize(int vehicleIndex) { return GetVehicle(vehicleIndex).GetTriggerSize(); } internal void ModifyTriggerSize(int vehicleIndex, ModifyTriggerSize modifyTriggerSizeDelegate) { if (vehicleIndex < 0) { for (int i = 0; i < GetAllVehicles().Length; i++) { GetVehicle(i).SetTriggerSizeModifierDelegate(modifyTriggerSizeDelegate); } } else { GetVehicle(vehicleIndex).SetTriggerSizeModifierDelegate(modifyTriggerSizeDelegate); } } #if GLEY_TRAFFIC_SYSTEM internal Unity.Mathematics.float3 GetClosestObstacle(int vehicleIndex) { return GetVehicle(vehicleIndex).GetClosestObstacle(); } #endif internal Collider[] GetAllColliders(int vehicleIndex) { return GetVehicle(vehicleIndex).AllColliders; } internal void SetMaxSpeed(int vehicleIndex, float speed) { GetVehicle(vehicleIndex).SetMaxSpeed(speed); } internal void ResetMaxSpeed(int vehicleIndex) { GetVehicle(vehicleIndex).ResetMaxSpeed(); } internal bool HasTrailer(int vehicleIndex) { return GetVehicle(vehicleIndex).trailer != null; } internal int GetTrailerWheels(int vehicleIndex) { return GetVehicle(vehicleIndex).trailer.GetNrOfWheels(); } internal int GetVehicleIndex(GameObject vehicle) { for (int i = 0; i < GetAllVehicles().Length; i++) { if (GetVehicle(i).gameObject == vehicle) { return i; } } return TrafficSystemConstants.INVALID_WAYPOINT_INDEX; } internal int GetTotalWheels() { int totalWheels = 0; for (int i = 0; i < GetAllVehicles().Length; i++) { totalWheels += GetVehicle(i).allWheels.Length; if (GetVehicle(i).trailer != null) { totalWheels += GetVehicle(i).trailer.allWheels.Length; } } return totalWheels; } } }