internal static void FixRulesMinor(ushort segmentId, ushort nodeId) { bool startNode = (bool)netService.IsStartNode(segmentId, nodeId); bool isHighway = ExtNodeManager.JunctionHasOnlyHighwayRoads(nodeId); if (OptionsMassEditTab.RoundAboutQuickFix_NoCrossYieldR) { JunctionRestrictionsManager.Instance.SetPedestrianCrossingAllowed( segmentId, startNode, false); } if (OptionsMassEditTab.RoundAboutQuickFix_PrioritySigns) { TrafficPriorityManager.Instance.SetPrioritySign( segmentId, startNode, PriorityType.Yield); } if (isHighway) { //ignore highway rules: //TODO remove as part of issue #569 JunctionRestrictionsManager.Instance.SetLaneChangingAllowedWhenGoingStraight(segmentId, startNode, true); } // endif if (OptionsMassEditTab.RoundAboutQuickFix_KeepClearYieldR) { JunctionRestrictionsManager.Instance.SetEnteringBlockedJunctionAllowed( segmentId, startNode, false); } }
/// <summary> /// separates turning lanes for all segments attached to nodeId, /// </summary> public static void SeparateNode(ushort nodeId, out SetLaneArrow_Result res, bool alternativeMode = true) { NetNode node = Singleton<NetManager>.instance.m_nodes.m_buffer[nodeId]; if (nodeId == 0) { res = SetLaneArrow_Result.Invalid; return; } if ((node.m_flags & NetNode.Flags.Created) == NetNode.Flags.None) { res = SetLaneArrow_Result.Invalid; return; } if (LaneConnectionManager.Instance.HasNodeConnections(nodeId)) { res = SetLaneArrow_Result.LaneConnection; return; } if (Options.highwayRules && ExtNodeManager.JunctionHasHighwayRules(nodeId)) { res = SetLaneArrow_Result.HighwayArrows; return; } res = SetLaneArrow_Result.Success; for (int i = 0; i < 8; i++) { ushort segmentId = Singleton<NetManager>.instance.m_nodes.m_buffer[nodeId].GetSegment(i); if (segmentId == 0) { continue; } SeparateSegmentLanes(segmentId, nodeId, out res, alternativeMode); } Debug.Assert(res == SetLaneArrow_Result.Success); }
/// <summary> /// creats a sorted list of segmetns connected to nodeId. /// roads without outgoing lanes are excluded as they do not need traffic lights /// the segments are arranged in a clockwise direction (Counter clock wise for LHT). /// </summary> /// <param name="nodeId">the junction</param> /// <returns>a list of segments aranged in counter clockwise direction.</returns> private static List <ushort> ArrangedSegments(ushort nodeId) { ClockDirection clockDirection = Shortcuts.LHT ? ClockDirection.CounterClockwise : ClockDirection.Clockwise; List <ushort> segList = new List <ushort>(); ExtNodeManager extNodeManager = ExtNodeManager.Instance; foreach (var segmentId in extNodeManager.GetNodeSegmentIds(nodeId, clockDirection)) { if (CountOutgoingLanes(segmentId, nodeId) > 0) { segList.Add(segmentId); } } return(segList); }