Example #1
0
        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);
            }

        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }