private void SetSegmentEndFlags(ushort segmentId, bool startNode, SegmentEndFlags flags)
        {
            if (flags.uturnAllowed != TernaryBool.Undefined)
            {
                SetUturnAllowed(segmentId, startNode, flags.IsUturnAllowed());
            }

            if (flags.nearTurnOnRedAllowed != TernaryBool.Undefined)
            {
                SetNearTurnOnRedAllowed(segmentId, startNode, flags.IsNearTurnOnRedAllowed());
            }

            if (flags.nearTurnOnRedAllowed != TernaryBool.Undefined)
            {
                SetFarTurnOnRedAllowed(segmentId, startNode, flags.IsFarTurnOnRedAllowed());
            }

            if (flags.straightLaneChangingAllowed != TernaryBool.Undefined)
            {
                SetLaneChangingAllowedWhenGoingStraight(segmentId, startNode, flags.IsLaneChangingAllowedWhenGoingStraight());
            }

            if (flags.enterWhenBlockedAllowed != TernaryBool.Undefined)
            {
                //Log.Warning($"JunctionRestrictionsManager.SetSegmentEndFlags({segmentId}, {startNode}, {flags}): flags.enterWhenBlockedAllowed is defined");
                SetEnteringBlockedJunctionAllowed(segmentId, startNode, flags.IsEnteringBlockedJunctionAllowed());
            }

            if (flags.pedestrianCrossingAllowed != TernaryBool.Undefined)
            {
                SetPedestrianCrossingAllowed(segmentId, startNode, flags.IsPedestrianCrossingAllowed());
            }
        }
 public void AddInvalidSegmentEndFlags(ushort segmentId, bool startNode, ref SegmentEndFlags endFlags)
 {
     if (startNode)
     {
         invalidSegmentFlags[segmentId].startNodeFlags = endFlags;
     }
     else
     {
         invalidSegmentFlags[segmentId].endNodeFlags = endFlags;
     }
 }
        protected override void HandleInvalidSegment(SegmentGeometry geometry)
        {
            foreach (bool startNode in Constants.ALL_BOOL)
            {
                SegmentEndFlags flags = startNode
                                                ? SegmentFlags[geometry.SegmentId].startNodeFlags
                                                : SegmentFlags[geometry.SegmentId].endNodeFlags;

                if (!flags.IsDefault())
                {
                    nodeWatcher.AddInvalidSegmentEndFlags(geometry.SegmentId, startNode, ref flags);
                }

                SegmentFlags[geometry.SegmentId].Reset(startNode);
            }
        }
        private void SetSegmentEndFlags(ushort segmentId, bool startNode, SegmentEndFlags flags)
        {
            if (flags.uturnAllowed != TernaryBool.Undefined)
            {
                SetUturnAllowed(segmentId, startNode, flags.IsUturnAllowed());
            }

            if (flags.straightLaneChangingAllowed != TernaryBool.Undefined)
            {
                SetLaneChangingAllowedWhenGoingStraight(segmentId, startNode, flags.IsLaneChangingAllowedWhenGoingStraight());
            }

            if (flags.enterWhenBlockedAllowed != TernaryBool.Undefined)
            {
                SetEnteringBlockedJunctionAllowed(segmentId, startNode, flags.IsEnteringBlockedJunctionAllowed());
            }

            if (flags.pedestrianCrossingAllowed != TernaryBool.Undefined)
            {
                SetPedestrianCrossingAllowed(segmentId, startNode, flags.IsPedestrianCrossingAllowed());
            }
        }
        public List <Configuration.SegmentNodeConf> SaveData(ref bool success)
        {
            List <Configuration.SegmentNodeConf> ret = new List <Configuration.SegmentNodeConf>();

            NetManager netManager = Singleton <NetManager> .instance;

            for (uint segmentId = 0; segmentId < NetManager.MAX_SEGMENT_COUNT; segmentId++)
            {
                try {
                    if (!Services.NetService.IsSegmentValid((ushort)segmentId))
                    {
                        continue;
                    }

                    Configuration.SegmentNodeFlags startNodeFlags = null;
                    Configuration.SegmentNodeFlags endNodeFlags   = null;

                    ushort startNodeId = netManager.m_segments.m_buffer[segmentId].m_startNode;
                    if (Services.NetService.IsNodeValid(startNodeId))
                    {
                        SegmentEndFlags endFlags = SegmentFlags[segmentId].startNodeFlags;

                        if (!endFlags.IsDefault())
                        {
                            startNodeFlags = new Configuration.SegmentNodeFlags();

                            startNodeFlags.uturnAllowed = TernaryBoolUtil.ToOptBool(GetUturnAllowed((ushort)segmentId, true));
                            startNodeFlags.straightLaneChangingAllowed = TernaryBoolUtil.ToOptBool(GetLaneChangingAllowedWhenGoingStraight((ushort)segmentId, true));
                            startNodeFlags.enterWhenBlockedAllowed     = TernaryBoolUtil.ToOptBool(GetEnteringBlockedJunctionAllowed((ushort)segmentId, true));
                            startNodeFlags.pedestrianCrossingAllowed   = TernaryBoolUtil.ToOptBool(GetPedestrianCrossingAllowed((ushort)segmentId, true));
                        }
                    }

                    ushort endNodeId = netManager.m_segments.m_buffer[segmentId].m_endNode;
                    if (Services.NetService.IsNodeValid(endNodeId))
                    {
                        SegmentEndFlags endFlags = SegmentFlags[segmentId].endNodeFlags;

                        if (!endFlags.IsDefault())
                        {
                            endNodeFlags = new Configuration.SegmentNodeFlags();

                            endNodeFlags.uturnAllowed = TernaryBoolUtil.ToOptBool(GetUturnAllowed((ushort)segmentId, false));
                            endNodeFlags.straightLaneChangingAllowed = TernaryBoolUtil.ToOptBool(GetLaneChangingAllowedWhenGoingStraight((ushort)segmentId, false));
                            endNodeFlags.enterWhenBlockedAllowed     = TernaryBoolUtil.ToOptBool(GetEnteringBlockedJunctionAllowed((ushort)segmentId, false));
                            endNodeFlags.pedestrianCrossingAllowed   = TernaryBoolUtil.ToOptBool(GetPedestrianCrossingAllowed((ushort)segmentId, false));
                        }
                    }

                    if (startNodeFlags == null && endNodeFlags == null)
                    {
                        continue;
                    }

                    Configuration.SegmentNodeConf conf = new Configuration.SegmentNodeConf((ushort)segmentId);

                    conf.startNodeFlags = startNodeFlags;
                    conf.endNodeFlags   = endNodeFlags;

                    Log._Debug($"Saving segment-at-node flags for seg. {segmentId}");
                    ret.Add(conf);
                } catch (Exception e) {
                    Log.Error($"Exception occurred while saving segment node flags @ {segmentId}: {e.ToString()}");
                    success = false;
                }
            }
            return(ret);
        }