using Gley.UrbanSystem.Internal; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Gley.TrafficSystem.Internal { /// /// Access play mode waypoints data. /// internal class TrafficWaypointsDataHandler { private readonly TrafficWaypointsData _trafficWaypointsData; internal TrafficWaypointsDataHandler(TrafficWaypointsData data) { _trafficWaypointsData = data; } #region Set internal void SetTemperaryDisabledValue(int waypointIndex, bool value) { GetWaypoint(waypointIndex).TemporaryDisabled = value; } internal void SetTemperaryDisabledValue(List waypointIndexes, bool value) { for (int i = 0; i < waypointIndexes.Count; i++) { SetTemperaryDisabledValue(waypointIndexes[i], value); } } internal void SetIntersection(int waypointIndex, IIntersection intersection, bool giveWay, bool stop, bool enter, bool exit) { GetWaypoint(waypointIndex).SetIntersection(intersection, giveWay, stop, enter, exit); } internal void SetStopValue(int waypointIndex, bool value) { GetWaypoint(waypointIndex).Stop = value; } private void SetTriggerEventValue(int waypointIndex, bool value) { GetWaypoint(waypointIndex).TriggerEvent = value; } private void SetGiveWayValue(int waypointIndex, bool value) { GetWaypoint(waypointIndex).GiveWay = value; } internal void SetEventData(int waypointIndex, string data) { if (data != null) { SetTriggerEventValue(waypointIndex, true); } else { SetTriggerEventValue(waypointIndex, false); } GetWaypoint(waypointIndex).EventData = data; } #endregion #region Get internal TrafficWaypoint GetWaypointFromIndex(int waypointIndex) { if (IsWaypointIndexValid(waypointIndex)) { return GetWaypoint(waypointIndex); } return null; } internal VehicleTypes[] GetAllowedVehicles(int waypointIndex) { return GetWaypoint(waypointIndex).AllowedVehicles; } internal int[] GetNeighbors(int waypointIndex) { return GetWaypoint(waypointIndex).Neighbors; } internal int[] GetOtherLanes(int waypointIndex) { return GetWaypoint(waypointIndex).OtherLanes; } internal int[] GetPrevs(int waypointIndex) { return GetWaypoint(waypointIndex).Prev; } internal int[] GetGiveWayWaypointList(int waypointIndex) { return GetWaypoint(waypointIndex).GiveWayList; } internal List GetNeighborsWithConditions(int waypointIndex, VehicleTypes vehicleType) { List result = new List(); var allNeighbors = GetNeighbors(waypointIndex); for (int i = 0; i < allNeighbors.Length; i++) { if (GetAllowedVehicles(allNeighbors[i]).Contains(vehicleType) && !IsTemporaryDisabled(allNeighbors[i])) { result.Add(allNeighbors[i]); } } return result; } internal List GetNeighborsWithConditions(int waypointIndex) { List result = new List(); var allNeighbors = GetNeighbors(waypointIndex); for (int i = 0; i < allNeighbors.Length; i++) { if (!IsTemporaryDisabled(allNeighbors[i])) { result.Add(allNeighbors[i]); } } return result; } internal List GetOtherLanesWithConditions(int waypointIndex, VehicleTypes vehicleType) { List result = new List(); var allNeighbors = GetOtherLanes(waypointIndex); for (int i = 0; i < allNeighbors.Length; i++) { if (GetAllowedVehicles(allNeighbors[i]).Contains(vehicleType) && !IsTemporaryDisabled(allNeighbors[i])) { result.Add(allNeighbors[i]); } } return result; } internal List GetOtherLanesWithConditions(int waypointIndex) { List result = new List(); var allNeighbors = GetOtherLanes(waypointIndex); for (int i = 0; i < allNeighbors.Length; i++) { if (!IsTemporaryDisabled(allNeighbors[i])) { result.Add(allNeighbors[i]); } } return result; } internal Vector3 GetPosition(int waypointIndex) { return GetWaypoint(waypointIndex).Position; } internal string GetName(int waypointIndex) { return GetWaypoint(waypointIndex).Name; } internal float GetLaneWidth(int waypointIndex) { return GetWaypoint(waypointIndex).LaneWidth; } internal string GetEventData(int waypointIndex) { return GetWaypoint(waypointIndex).EventData; } internal float GetMaxSpeed(int waypointIndex) { return GetWaypoint(waypointIndex).MaxSpeed; } internal bool HasNeighbors(int waypointIndex) { return GetNeighbors(waypointIndex).Length > 0; } internal bool HasPrevs(int waypointIndex) { return GetPrevs(waypointIndex).Length > 0; } internal List GetAssociatedIntersections(int waypointIndex) { return GetWaypoint(waypointIndex).AssociatedIntersections; } internal bool HasNeighborsForVehicleType(int waypointIndex, VehicleTypes vehicleType) { return GetNeighborsWithConditions(waypointIndex, vehicleType).Count > 0; } internal bool HasWaypointInNeighbors(int waypointIndex, int waypointToCheck) { return GetNeighbors(waypointIndex).Contains(waypointToCheck); } internal bool HasOtherLanes(int waypointIndex) { return GetOtherLanes(waypointIndex).Length > 0; } internal bool IsTemporaryDisabled(int waypointIndex) { return GetWaypoint(waypointIndex).TemporaryDisabled; } internal bool IsInIntersection(int waypointIndex) { return GetAssociatedIntersections(waypointIndex) != null; } internal bool IsComplexGiveWay(int waypointIndex) { return GetWaypoint(waypointIndex).ComplexGiveWay; } internal bool IsZipperGiveWay(int waypointIndex) { return GetWaypoint(waypointIndex).ZipperGiveWay; } internal bool IsStop(int waypointIndex) { return GetWaypoint(waypointIndex).Stop; } internal bool IsGiveWay(int waypointIndex) { return GetWaypoint(waypointIndex).GiveWay; } internal bool IsExit(int waypointIndex) { return GetWaypoint(waypointIndex).Exit; } internal bool IsEnter(int waypointIndex) { return GetWaypoint(waypointIndex).Enter; } internal bool IsTriggerEvent(int waypointIndex) { return GetWaypoint(waypointIndex).TriggerEvent; } #endregion private bool IsWaypointIndexValid(int waypointIndex) { if (waypointIndex < 0) { Debug.LogError($"Waypoint index {waypointIndex} should be >= 0"); return false; } if (waypointIndex >= _trafficWaypointsData.AllTrafficWaypoints.Length) { Debug.LogError($"Waypoint index {waypointIndex} should be < {_trafficWaypointsData.AllTrafficWaypoints.Length}"); return false; } if (_trafficWaypointsData.AllTrafficWaypoints[waypointIndex] == null) { Debug.LogError($"Waypoint at {waypointIndex} is null, Verify the setup"); return false; } return true; } private TrafficWaypoint GetWaypoint(int waypointIndex) { return _trafficWaypointsData.AllTrafficWaypoints[waypointIndex]; } } }