示例#1
0
        public void UpdateFlags()
        {
            m_flags = m_flags.SetFlags(Flags.HC_Mod, NetworkExtensionManager.Instance.HTC);
            m_flags = m_flags.SetFlags(Flags.DCR_Mod, NetworkExtensionManager.Instance.DCR);
            m_flags = m_flags.SetFlags(Flags.HUT_Mod, NetworkExtensionManager.Instance.HUT);

            if (JRMan != null)
            {
                bool keepClearAll = true;
                foreach (var segmentID in NetUtil.IterateNodeSegments(NodeID))
                {
                    bool startNode = NetUtil.IsStartNode(segmentId: segmentID, nodeId: NodeID);
                    bool keppClear = JRMan.IsEnteringBlockedJunctionAllowed(segmentID, startNode);
                    keepClearAll &= keppClear;
                }
                m_flags = m_flags.SetFlags(Flags.KeepClearAll, keepClearAll);


                bool speedChange = TMPEHelpers.SpeedChanges(NodeID);
                bool twoSegments = NodeID.ToNode().CountSegments() == 2;

                m_flags = m_flags.SetFlags(Flags.SpeedChange, speedChange);
                m_flags = m_flags.SetFlags(Flags.TwoSegments, twoSegments);
            }
        }
示例#2
0
        public void UpdateAllFlags()
        {
            if (!NetUtil.IsSegmentValid(SegmentID))
            {
                if (SegmentID.ToSegment().m_flags.IsFlagSet(NetSegment.Flags.Created))
                {
                    Log.Debug("Skip updating invalid segment:" + SegmentID);
                }
                return;
            }
            if (Log.VERBOSE)
            {
                Log.Debug($"NetSegmentExt.UpdateAllFlags() called. SegmentID={SegmentID}" /*Environment.StackTrace*/, false);
            }
            try {
                bool  parkingLeft  = false;
                bool  parkingRight = false;
                float speed0       = -1;

                bool uniformSpeed = true;
                foreach (LaneData lane in NetUtil.IterateSegmentLanes(SegmentID))
                {
                    ref NetLaneExt laneExt = ref NetworkExtensionManager.Instance.LaneBuffer[lane.LaneID];
                    laneExt.UpdateLane(lane, SegmentID);
                    if (laneExt.m_flags.IsFlagSet(NetLaneExt.Flags.ParkingAllowed))
                    {
                        if (lane.LeftSide)
                        {
                            parkingLeft = true;
                        }
                        else
                        {
                            parkingRight = true;
                        }
                    }
                    if (lane.LaneInfo.m_laneType.IsFlagSet(SpeedLimitManager.LANE_TYPES) &&
                        lane.LaneInfo.m_vehicleType.IsFlagSet(SpeedLimitManager.VEHICLE_TYPES))
                    {
                        if (speed0 == -1)
                        {
                            speed0 = laneExt.SpeedLimit;
                        }
                        else
                        {
                            uniformSpeed &= laneExt.SpeedLimit == speed0;
                        }
                    }
                }

                m_flags = m_flags.SetFlags(Flags.ParkingAllowedLeft, parkingLeft);
                m_flags = m_flags.SetFlags(Flags.ParkingAllowedRight, parkingRight);
                m_flags = m_flags.SetFlags(Flags.UniformSpeedLimit, uniformSpeed);
                m_flags = m_flags.SetFlags(Flags.LeftHandTraffic, NetUtil.LHT);


                TMPEHelpers.GetMaxSpeedLimit(SegmentID, out ForwardSpeedLimit, out BackwardSpeedLimit);

                Curve = CalculateCurve();

                Start.UpdateFlags();
                Start.UpdateDirections();

                End.UpdateFlags();
                End.UpdateDirections();

                if (Log.VERBOSE)
                {
                    Log.Debug($"NetSegmentExt.UpdateAllFlags() succeeded for {this}" /*Environment.StackTrace*/, false);
                }
            } catch (Exception ex) {