private void DestroySegmentEnd(ushort segmentId) { if (segmentId <= 0) { return; } TrafficPriority.RemovePrioritySegment(NodeId, segmentId); //CustomTrafficLights.RemoveSegmentLights(segmentId); }
/*public static TimedTrafficLights AddTimedLight(ushort nodeid, List<ushort> nodeGroup, bool vehiclesMayEnterBlockedJunctions) { * TimedScripts.Add(nodeid, new TimedTrafficLights(nodeid, nodeGroup, vehiclesMayEnterBlockedJunctions)); * return TimedScripts[nodeid]; * } * * public static void RemoveTimedLight(ushort nodeid) { * TimedScripts.Remove(nodeid); * } * * public static bool IsTimedLight(ushort nodeid) { * return TimedScripts.ContainsKey(nodeid); * } * * public static TimedTrafficLights GetTimedLight(ushort nodeid) { * if (!IsTimedLight(nodeid)) * return null; * return TimedScripts[nodeid]; * } * * internal static void OnLevelUnloading() { * TimedScripts.Clear(); * }*/ internal void handleNewSegments() { if (NumSteps() <= 0) { // no steps defined, just create live traffic lights for (int s = 0; s < 8; ++s) { ushort segmentId = Singleton <NetManager> .instance.m_nodes.m_buffer[NodeId].GetSegment(s); if (segmentId <= 0) { continue; } CustomTrafficLights.AddLiveSegmentLights(NodeId, segmentId); } return; } for (int s = 0; s < 8; ++s) { ushort segmentId = Singleton <NetManager> .instance.m_nodes.m_buffer[NodeId].GetSegment(s); if (segmentId <= 0) { continue; } List <ushort> invalidSegmentIds = new List <ushort>(); bool isNewSegment = true; foreach (KeyValuePair <ushort, CustomSegmentLights> e in Steps[0].segmentLights) { var fromSegmentId = e.Key; if (fromSegmentId == segmentId) { isNewSegment = false; } if (!TrafficPriority.IsPrioritySegment(NodeId, fromSegmentId)) { invalidSegmentIds.Add(fromSegmentId); } } if (isNewSegment) { Log._Debug($"New segment detected: {segmentId} @ {NodeId}"); // segment was created CustomTrafficLights.AddLiveSegmentLights(NodeId, segmentId); TrafficPriority.AddPrioritySegment(NodeId, segmentId, SegmentEnd.PriorityType.None); if (invalidSegmentIds.Count > 0) { var oldSegmentId = invalidSegmentIds[0]; TrafficPriority.RemovePrioritySegment(NodeId, oldSegmentId); Log._Debug($"Replacing old segment {oldSegmentId} @ {NodeId} with new segment {segmentId}"); // replace the old segment with the newly created one for (int i = 0; i < NumSteps(); ++i) { CustomSegmentLights segmentLights = Steps[i].segmentLights[oldSegmentId]; Steps[i].segmentLights.Remove(oldSegmentId); segmentLights.SegmentId = segmentId; Steps[i].segmentLights.Add(segmentId, segmentLights); Steps[i].calcMaxSegmentLength(); CustomSegmentLights liveSegLights = CustomTrafficLights.GetSegmentLights(NodeId, segmentId); foreach (KeyValuePair <ExtVehicleType, CustomSegmentLight> e in segmentLights.CustomLights) { CustomSegmentLight liveSegLight = liveSegLights.GetCustomLight(e.Key); if (liveSegLight == null) { continue; } liveSegLight.CurrentMode = e.Value.CurrentMode; } } } else { Log._Debug($"Adding new segment {segmentId} to node {NodeId}"); // create a new manual light for (int i = 0; i < NumSteps(); ++i) { Steps[i].addSegment(segmentId, true); Steps[i].calcMaxSegmentLength(); } } } } }
internal void handleNewSegments() { if (NumSteps() <= 0) { // no steps defined, just create live traffic lights /*for (int s = 0; s < 8; ++s) { * ushort segmentId = Singleton<NetManager>.instance.m_nodes.m_buffer[NodeId].GetSegment(s); * if (segmentId <= 0) * continue; * if (! CustomTrafficLights.IsSegmentLight(NodeId, segmentId)) * CustomTrafficLights.AddSegmentLights(NodeId, segmentId); * }*/ return; } for (int s = 0; s < 8; ++s) { ushort segmentId = Singleton <NetManager> .instance.m_nodes.m_buffer[NodeId].GetSegment(s); if (segmentId <= 0) { continue; } List <ushort> invalidSegmentIds = new List <ushort>(); bool isNewSegment = !Steps[0].segmentLights.ContainsKey(segmentId); if (isNewSegment) { // segment was created Log._Debug($"New segment detected: {segmentId} @ {NodeId}"); foreach (KeyValuePair <ushort, CustomSegmentLights> e in Steps[0].segmentLights) { var fromSegmentId = e.Key; if (!TrafficPriority.IsPrioritySegment(NodeId, fromSegmentId)) { Log._Debug($"Identified old segment {fromSegmentId} @ {NodeId}"); invalidSegmentIds.Add(fromSegmentId); } } Log._Debug($"Setting up segment end for new segment {segmentId} @ {NodeId}"); SetupSegmentEnd(segmentId); if (invalidSegmentIds.Count > 0) { var oldSegmentId = invalidSegmentIds[0]; TrafficPriority.RemovePrioritySegment(NodeId, oldSegmentId); Log._Debug($"Replacing old segment {oldSegmentId} @ {NodeId} with new segment {segmentId}"); // replace the old segment with the newly created one for (int i = 0; i < NumSteps(); ++i) { if (!Steps[i].segmentLights.ContainsKey(oldSegmentId)) { Log.Error($"Step {i} at node {NodeId} does not contain step lights for old segment {oldSegmentId}"); Steps[i].addSegment(segmentId, true); Steps[i].calcMaxSegmentLength(); continue; } CustomSegmentLights customLights = Steps[i].segmentLights[oldSegmentId]; Log._Debug($"Removing old segment {oldSegmentId} @ {NodeId} from step {i}"); Steps[i].segmentLights.Remove(oldSegmentId); Log._Debug($"Setting new segment id {segmentId} at custom light from step {i}"); customLights.SegmentId = segmentId; Steps[i].segmentLights.Add(segmentId, customLights); Steps[i].calcMaxSegmentLength(); Log._Debug($"Getting live segment lights of new segment {segmentId} @ {NodeId} and applying mode @ step {i}"); CustomSegmentLights liveSegLights = CustomTrafficLights.GetSegmentLights(NodeId, segmentId); if (liveSegLights == null) { Log.Error($"No live segment lights for seg. {segmentId} @ node {NodeId} found!"); CustomTrafficLights.AddSegmentLights(NodeId, segmentId); liveSegLights = CustomTrafficLights.GetSegmentLights(NodeId, segmentId); } foreach (KeyValuePair <ExtVehicleType, CustomSegmentLight> e in customLights.CustomLights) { CustomSegmentLight liveSegLight = liveSegLights.GetCustomLight(e.Key); if (liveSegLight == null) { continue; } Log._Debug($"Updating live segment light mode of new segment {segmentId} @ {NodeId} for vehicle type {e.Key} @ step {i}"); liveSegLight.CurrentMode = e.Value.CurrentMode; } Log._Debug($"Finished applying new segment {segmentId} @ {NodeId} @ step {i}"); } } else { Log._Debug($"Adding new segment {segmentId} to node {NodeId}"); // create a new manual light for (int i = 0; i < NumSteps(); ++i) { Steps[i].addSegment(segmentId, true); Steps[i].calcMaxSegmentLength(); } } } } }