public static bool segmentIsIncomingOneWay(int segmentid, ushort nodeID)
        {
            NetManager instance = Singleton <NetManager> .instance;

            var segment = instance.m_segments.m_buffer[segmentid];
            var info    = segment.Info;

            uint num2 = segment.m_lanes;
            int  num3 = 0;

            NetInfo.Direction dir = NetInfo.Direction.Forward;
            if (segment.m_startNode == nodeID)
            {
                dir = NetInfo.Direction.Backward;
            }
            var dir2 = ((segment.m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? dir : NetInfo.InvertDirection(dir);
            var dir3 = TrafficPriority.leftHandDrive ? NetInfo.InvertDirection(dir2) : dir2;

            var isOneWay = true;

            while (num3 < info.m_lanes.Length && num2 != 0u)
            {
                if (info.m_lanes[num3].m_laneType != NetInfo.LaneType.Pedestrian &&
                    (info.m_lanes[num3].m_direction == dir3))
                {
                    isOneWay = false;
                }

                num2 = instance.m_lanes.m_buffer[(int)((UIntPtr)num2)].m_nextLane;
                num3++;
            }

            return(isOneWay);
        }
示例#2
0
        public bool SetParkingAllowed(ushort segmentId, NetInfo.Direction finalDir, bool flag)
        {
            if (!MayHaveParkingRestriction(segmentId))
            {
                return(false);
            }
            int dirIndex = GetDirIndex(finalDir);

            parkingAllowed[segmentId][dirIndex] = flag;
            if (flag && parkingAllowed[segmentId][1 - dirIndex])
            {
                UnsubscribeFromSegmentGeometry(segmentId);
            }
            else
            {
                if (!flag)
                {
                    // force relocation of illegaly parked vehicles
                    Services.NetService.ProcessSegment(segmentId, delegate(ushort segId, ref NetSegment segment) {
                        segment.UpdateSegment(segmentId);
                        return(true);
                    });
                }

                SubscribeToSegmentGeometry(segmentId);
            }
            return(true);
        }
示例#3
0
 internal bool IsOutGoing(ushort segmentId, bool startNode, NetInfo.Lane laneInfo)
 {
     NetInfo.Direction direction = ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? laneInfo.m_finalDirection : NetInfo.InvertDirection(laneInfo.m_finalDirection);
     if (startNode)
     {
         if ((direction & NetInfo.Direction.Backward) != 0)
         {
             return(true);
         }
         if ((direction & NetInfo.Direction.Forward) != 0)
         {
             return(false);
         }
     }
     else
     {
         if ((direction & NetInfo.Direction.Forward) != 0)
         {
             return(true);
         }
         if ((direction & NetInfo.Direction.Backward) != 0)
         {
             return(false);
         }
     }
     DebugLog.LogToFileOnly("Error: unknow lane direction");
     return(false);
 }
        public bool SetParkingAllowed(ushort segmentId, NetInfo.Direction finalDir, bool flag)
        {
            if (!MayHaveParkingRestriction(segmentId))
            {
                return(false);
            }

            int dirIndex = GetDirIndex(finalDir);

            parkingAllowed[segmentId][dirIndex] = flag;

            if (!flag || !parkingAllowed[segmentId][1 - dirIndex])
            {
                Services.SimulationService.AddAction(
                    () => {
                    // force relocation of illegaly parked vehicles
                    Services.NetService.ProcessSegment(
                        segmentId,
                        delegate(ushort segId, ref NetSegment segment) {
                        segment.UpdateSegment(segmentId);
                        return(true);
                    });
                });
            }

            return(true);
        }
        /// <summary>
        /// Determines the average default speed limit for a given NetInfo object in terms of discrete speed limit levels.
        /// An in-game speed limit of 2.0 (e.g. on highway) is hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentInfo"></param>
        /// <param name="finalDir"></param>
        /// <returns></returns>
        public ushort GetAverageDefaultCustomSpeedLimit(NetInfo segmentInfo, NetInfo.Direction?finalDir = null)
        {
#if TRACE
            Singleton <CodeProfiler> .instance.Start("SpeedLimitManager.GetAverageDefaultCustomSpeedLimit");
#endif

            // calculate the currently set mean speed limit
            float meanSpeedLimit = 0f;
            uint  validLanes     = 0;
            for (int i = 0; i < segmentInfo.m_lanes.Length; ++i)
            {
                NetInfo.Direction d = segmentInfo.m_lanes[i].m_finalDirection;
                if ((segmentInfo.m_lanes[i].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None || (finalDir != null && d != finalDir))
                {
                    continue;
                }

                meanSpeedLimit += segmentInfo.m_lanes[i].m_speedLimit;
                ++validLanes;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= (float)validLanes;
            }
            ushort ret = LaneToCustomSpeedLimit(meanSpeedLimit);
#if TRACE
            Singleton <CodeProfiler> .instance.Stop("SpeedLimitManager.GetAverageDefaultCustomSpeedLimit");
#endif
            return(ret);
        }
示例#6
0
        private int RenderSegmentSideOverlay(
            RenderManager.CameraInfo cameraInfo,
            ushort segmentId,
            NetInfo.Direction finalDirection)
        {
            int   count   = 0;
            bool  pressed = Input.GetMouseButton(0);
            Color color   = MainTool.GetToolColor(pressed, false);

            netService.IterateSegmentLanes(
                segmentId,
                (uint laneId,
                 ref NetLane lane,
                 NetInfo.Lane laneInfo,
                 ushort _,
                 ref NetSegment segment,
                 byte laneIndex) => {
                bool render = (laneInfo.m_laneType & SpeedLimitManager.LANE_TYPES) != 0;
                render     &= (laneInfo.m_vehicleType & SpeedLimitManager.VEHICLE_TYPES) != 0;
                render     &= laneInfo.m_finalDirection == finalDirection;
                if (render)
                {
                    RenderLaneOverlay(cameraInfo, laneId);
                    count++;
                }
                return(true);
            });
            return(count);
        }
示例#7
0
        /// <summary>
        /// Determines the average default speed limit for a given NetInfo object in terms of discrete speed limit levels.
        /// An in-game speed limit of 2.0 (e.g. on highway) is hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentInfo"></param>
        /// <param name="finalDir"></param>
        /// <returns></returns>
        public ushort GetAverageDefaultCustomSpeedLimit(NetInfo segmentInfo, NetInfo.Direction?finalDir = null)
        {
            float meanSpeedLimit = 0f;
            uint  validLanes     = 0;

            for (int i = 0; i < segmentInfo.m_lanes.Length; ++i)
            {
                NetInfo.Lane      laneInfo = segmentInfo.m_lanes[i];
                NetInfo.Direction d        = laneInfo.m_finalDirection;
                if (finalDir != null && d != finalDir)
                {
                    continue;
                }
                if (!MayHaveCustomSpeedLimits(laneInfo))
                {
                    continue;
                }

                meanSpeedLimit += laneInfo.m_speedLimit;
                ++validLanes;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= (float)validLanes;
            }
            ushort ret = LaneToCustomSpeedLimit(meanSpeedLimit);

            return(ret);
        }
示例#8
0
        /// <summary>
        /// Determines the average custom speed limit for a given NetInfo object in terms of discrete speed limit levels.
        /// An in-game speed limit of 2.0 (e.g. on highway) is hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentInfo"></param>
        /// <param name="finalDir"></param>
        /// <returns></returns>
        public ushort GetAverageCustomSpeedLimit(ushort segmentId, ref NetSegment segment, NetInfo segmentInfo, NetInfo.Direction?finalDir = null)
        {
            // calculate the currently set mean speed limit
            float meanSpeedLimit = 0f;
            uint  validLanes     = 0;
            uint  curLaneId      = segment.m_lanes;

            for (uint laneIndex = 0; laneIndex < segmentInfo.m_lanes.Length; ++laneIndex)
            {
                NetInfo.Lane      laneInfo = segmentInfo.m_lanes[laneIndex];
                NetInfo.Direction d        = laneInfo.m_finalDirection;
                if (finalDir != null && d != finalDir)
                {
                    continue;
                }
                if (!MayHaveCustomSpeedLimits(laneInfo))
                {
                    continue;
                }

                meanSpeedLimit += GetLockFreeGameSpeedLimit(segmentId, laneIndex, curLaneId, laneInfo);
                curLaneId       = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                ++validLanes;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= (float)validLanes;
            }
            return((ushort)Mathf.Round(meanSpeedLimit));
        }
示例#9
0
            bool FindNode(NetSegment segment)
            {
                uint    laneId    = segment.m_lanes;
                NetInfo info      = segment.Info;
                int     laneCount = info.m_lanes.Length;
                int     laneIndex = 0;

                for (; laneIndex < laneCount && laneId != 0; laneIndex++)
                {
                    if (laneId == m_laneId)
                    {
                        break;
                    }
                    laneId = NetManager.instance.m_lanes.m_buffer[laneId].m_nextLane;
                }

                if (laneIndex < laneCount)
                {
                    NetInfo.Direction laneDir = ((segment.m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? info.m_lanes[laneIndex].m_finalDirection : NetInfo.InvertDirection(info.m_lanes[laneIndex].m_finalDirection);

                    if ((laneDir & (NetInfo.Direction.Forward | NetInfo.Direction.Avoid)) == NetInfo.Direction.Forward)
                    {
                        m_nodeId = segment.m_endNode;
                    }
                    else if ((laneDir & (NetInfo.Direction.Backward | NetInfo.Direction.Avoid)) == NetInfo.Direction.Backward)
                    {
                        m_nodeId = segment.m_startNode;
                    }

                    return(true);
                }

                return(false);
            }
示例#10
0
        public static bool hasRightLane(ushort nodeID, int segmentID)
        {
            var instance = Singleton <NetManager> .instance;
            var segment  = Singleton <NetManager> .instance.m_segments.m_buffer[segmentID];

            NetInfo.Direction dir = NetInfo.Direction.Forward;
            if (segment.m_startNode == nodeID)
            {
                dir = NetInfo.Direction.Backward;
            }
            var dir2 = ((segment.m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? dir : NetInfo.InvertDirection(dir);
            var dir3 = TrafficPriority.leftHandDrive ? NetInfo.InvertDirection(dir2) : dir2;

            var info = segment.Info;

            var maxValue = 0f;

            var num2 = segment.m_lanes;
            var num3 = 0;

            while (num3 < info.m_lanes.Length && num2 != 0u)
            {
                var flags = (NetLane.Flags)Singleton <NetManager> .instance.m_lanes.m_buffer[(int)num2].m_flags;

                if (info.m_lanes[num3].m_direction == dir3 && (flags & NetLane.Flags.Left) != NetLane.Flags.Right)
                {
                    return(true);
                }

                num2 = instance.m_lanes.m_buffer[(int)((UIntPtr)num2)].m_nextLane;
                num3++;
            }

            return(false);
        }
示例#11
0
        public float GetAverageDefaultCustomSpeedLimit(NetInfo segmentInfo,
                                                       NetInfo.Direction?finalDir = null)
        {
            var  meanSpeedLimit = 0f;
            uint validLanes     = 0;

            foreach (NetInfo.Lane laneInfo in segmentInfo.m_lanes)
            {
                NetInfo.Direction d = laneInfo.m_finalDirection;
                if (finalDir != null && d != finalDir)
                {
                    continue;
                }

                if (!MayHaveCustomSpeedLimits(laneInfo))
                {
                    continue;
                }

                meanSpeedLimit += laneInfo.m_speedLimit;
                ++validLanes;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= validLanes;
            }

            return(meanSpeedLimit);
        }
示例#12
0
        private bool PathContainsSegment(uint pathID, ushort segmentID, NetInfo.Direction dir)
        {
            PathUnit path = this.getPath(pathID);

            while (true)
            {
                // HACK: Dont inlude last segment as it will show vechicles arriving for both directions
                for (int i = 0; i < path.m_positionCount - 1; i++)
                {
                    PathUnit.Position p       = path.GetPosition(i);
                    NetSegment        segment = netMan.m_segments.m_buffer[(int)p.m_segment];

                    // Exclude paths with deleted segments
                    if (PathManager.GetLaneID(p) == 0 || (segment.m_flags & NetSegment.Flags.Deleted) != 0)
                    {
                        return(false);
                    }

                    if (p.m_segment == segmentID)
                    {
                        if (dir == NetInfo.Direction.Both)
                        {
                            return(true);
                        }

                        NetInfo           info    = netMan.m_segments.m_buffer[(int)p.m_segment].Info;
                        NetInfo.Direction laneDir = NetInfo.Direction.None;

                        if (info.m_lanes.Length > (int)p.m_lane)
                        {
                            laneDir = info.m_lanes[(int)p.m_lane].m_finalDirection;
                            if ((segment.m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None)
                            {
                                laneDir = NetInfo.InvertDirection(laneDir);
                            }
                        }
                        else
                        {
                            Log.error("bad lane count");
                        }

                        if (laneDir == dir)
                        {
                            return(true);
                        }
//						} else if ((laneDir != NetInfo.Direction.Forward) && (laneDir != NetInfo.Direction.Backward)) {
                        //					Log.debug("laneDir = " + laneDir);
                        //				}
                    }
                }

                if (path.m_nextPathUnit == 0)
                {
                    return(false);
                }

                path = this.getPath(path.m_nextPathUnit);
            }
        }
示例#13
0
        internal bool GetLaneEndPoint(ushort segmentId, bool startNode, byte laneIndex, uint?laneId, NetInfo.Lane laneInfo, out bool outgoing, out Vector3?pos)
        {
            NetManager netManager = Singleton <NetManager> .instance;

            pos      = null;
            outgoing = false;

            if ((netManager.m_segments.m_buffer[segmentId].m_flags & (NetSegment.Flags.Created | NetSegment.Flags.Deleted)) != NetSegment.Flags.Created)
            {
                return(false);
            }

            if (laneId == null)
            {
                laneId = FindLaneId(segmentId, laneIndex);
                if (laneId == null)
                {
                    return(false);
                }
            }

            if ((netManager.m_lanes.m_buffer[(uint)laneId].m_flags & ((ushort)NetLane.Flags.Created | (ushort)NetLane.Flags.Deleted)) != (ushort)NetLane.Flags.Created)
            {
                return(false);
            }

            if (laneInfo == null)
            {
                if (laneIndex < netManager.m_segments.m_buffer[segmentId].Info.m_lanes.Length)
                {
                    laneInfo = netManager.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex];
                }
                else
                {
                    return(false);
                }
            }

            NetInfo.Direction laneDir = ((NetManager.instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? laneInfo.m_finalDirection : NetInfo.InvertDirection(laneInfo.m_finalDirection);

            if (startNode)
            {
                if ((laneDir & (NetInfo.Direction.Backward | NetInfo.Direction.Avoid)) == NetInfo.Direction.Backward)
                {
                    outgoing = true;
                }
                pos = NetManager.instance.m_lanes.m_buffer[(uint)laneId].m_bezier.a;
            }
            else
            {
                if ((laneDir & (NetInfo.Direction.Forward | NetInfo.Direction.Avoid)) == NetInfo.Direction.Forward)
                {
                    outgoing = true;
                }
                pos = NetManager.instance.m_lanes.m_buffer[(uint)laneId].m_bezier.d;
            }

            return(true);
        }
示例#14
0
        /// <summary>
        /// Sets the speed limit of a given segment and lane direction.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="finalDir"></param>
        /// <param name="speedLimit"></param>
        /// <returns></returns>
        public bool SetSpeedLimit(ushort segmentId, NetInfo.Direction finalDir, ushort speedLimit)
        {
            if (!MayHaveCustomSpeedLimits(segmentId, ref Singleton <NetManager> .instance.m_segments.m_buffer[segmentId]))
            {
                return(false);
            }
            if (!AvailableSpeedLimits.Contains(speedLimit))
            {
                return(false);
            }

            NetInfo segmentInfo = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;

            if (segmentInfo == null)
            {
#if DEBUG
                Log.Warning($"SpeedLimitManager.SetSpeedLimit: info is null!");
#endif
                return(false);
            }

            if (segmentInfo.m_lanes == null)
            {
#if DEBUG
                Log.Warning($"SpeedLimitManager.SetSpeedLimit: info.name is null!");
#endif
                return(false);
            }

            uint curLaneId = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int  laneIndex = 0;
            while (laneIndex < segmentInfo.m_lanes.Length && curLaneId != 0u)
            {
                NetInfo.Lane      laneInfo = segmentInfo.m_lanes[laneIndex];
                NetInfo.Direction d        = laneInfo.m_finalDirection;
                if (d != finalDir)
                {
                    goto nextIter;
                }
                if (!MayHaveCustomSpeedLimits(laneInfo))
                {
                    goto nextIter;
                }

#if DEBUG
                Log._Debug($"SpeedLimitManager: Setting speed limit of lane {curLaneId} to {speedLimit}");
#endif
                Flags.setLaneSpeedLimit(curLaneId, speedLimit);
                SubscribeToSegmentGeometry(segmentId);

nextIter:
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

            return(true);
        }
示例#15
0
        /// <summary>
        /// Determines the currently set speed limit for the given segment and lane direction in
        /// terms of discrete speed limit levels. An in-game speed limit of 2.0 (e.g. on highway) is
        /// hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentId">Interested in this segment</param>
        /// <param name="finalDir">Direction</param>
        /// <returns>Mean speed limit, average for custom and default lane speeds</returns>
        public float GetCustomSpeedLimit(ushort segmentId, NetInfo.Direction finalDir)
        {
            // calculate the currently set mean speed limit
            if (segmentId == 0 ||
                (Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags &
                 NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
                return(0f);
            }

            NetInfo segmentInfo =
                Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;
            uint curLaneId      = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            var  laneIndex      = 0;
            var  meanSpeedLimit = 0f;
            uint validLanes     = 0;

            while (laneIndex < segmentInfo.m_lanes.Length && curLaneId != 0u)
            {
                NetInfo.Lane      laneInfo = segmentInfo.m_lanes[laneIndex];
                NetInfo.Direction d        = laneInfo.m_finalDirection;

                if (d != finalDir)
                {
                    goto nextIter;
                }

                if (!MayHaveCustomSpeedLimits(laneInfo))
                {
                    goto nextIter;
                }

                float?setSpeedLimit = Flags.GetLaneSpeedLimit(curLaneId);

                if (setSpeedLimit != null)
                {
                    meanSpeedLimit += ToGameSpeedLimit(setSpeedLimit.Value); // custom speed limit
                }
                else
                {
                    meanSpeedLimit += laneInfo.m_speedLimit; // game default
                }

                ++validLanes;

nextIter:
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= validLanes;
            }

            return(meanSpeedLimit);
        }
示例#16
0
        private void _laneChangePanel()
        {
            if (TrafficLightTool.SelectedSegment != 0)
            {
                NetManager instance = Singleton <NetManager> .instance;

                var segment = instance.m_segments.m_buffer[TrafficLightTool.SelectedSegment];

                var info = segment.Info;

                uint num2 = segment.m_lanes;
                int  num3 = 0;

                int offsetIdx = 0;

                NetInfo.Direction dir = NetInfo.Direction.Forward;
                if (segment.m_startNode == TrafficLightTool.SelectedNode)
                {
                    dir = NetInfo.Direction.Backward;
                }
                var dir3 = ((segment.m_flags & NetSegment.Flags.Invert) == NetSegment.Flags.None) ? dir : NetInfo.InvertDirection(dir);

                while (num3 < info.m_lanes.Length && num2 != 0u)
                {
                    if (info.m_lanes[num3].m_laneType != NetInfo.LaneType.Pedestrian && info.m_lanes[num3].m_direction == dir3)
                    {
                        //segmentLights[num3].Show();
                        //segmentLights[num3].relativePosition = new Vector3(35f, (float)(xPos + (offsetIdx * 40f)));
                        //segmentLights[num3].text = ((NetLane.Flags)instance.m_lanes.m_buffer[num2].m_flags & ~NetLane.Flags.Created).ToString();

                        //if (segmentLights[num3].containsMouse)
                        //{
                        //    if (Input.GetMouseButton(0) && !segmentMouseDown)
                        //    {
                        //        switchLane(num2);
                        //        segmentMouseDown = true;

                        //        if (
                        //            !TrafficPriority.isPrioritySegment(TrafficLightTool.SelectedNode,
                        //                TrafficLightTool.SelectedSegment))
                        //        {
                        //            TrafficPriority.addPrioritySegment(TrafficLightTool.SelectedNode, TrafficLightTool.SelectedSegment, PrioritySegment.PriorityType.None);
                        //        }
                        //    }
                        //}

                        offsetIdx++;
                    }

                    num2 = instance.m_lanes.m_buffer[(int)((UIntPtr)num2)].m_nextLane;
                    num3++;
                }
            }
        }
        /// <summary>
        /// Determines the currently set speed limit for the given segment and lane direction in terms of discrete speed limit levels.
        /// An in-game speed limit of 2.0 (e.g. on highway) is hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="finalDir"></param>
        /// <returns></returns>
        public ushort GetCustomSpeedLimit(ushort segmentId, NetInfo.Direction finalDir)
        {
#if TRACE
            Singleton <CodeProfiler> .instance.Start("SpeedLimitManager.GetCustomSpeedLimit1");
#endif
            // calculate the currently set mean speed limit
            if (segmentId == 0 || (Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
#if TRACE
                Singleton <CodeProfiler> .instance.Stop("SpeedLimitManager.GetCustomSpeedLimit1");
#endif
                return(0);
            }

            var   segmentInfo    = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;
            uint  curLaneId      = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int   laneIndex      = 0;
            float meanSpeedLimit = 0f;
            uint  validLanes     = 0;
            while (laneIndex < segmentInfo.m_lanes.Length && curLaneId != 0u)
            {
                NetInfo.Direction d = segmentInfo.m_lanes[laneIndex].m_finalDirection;
                if ((segmentInfo.m_lanes[laneIndex].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None || d != finalDir)
                {
                    goto nextIter;
                }

                ushort?setSpeedLimit = Flags.getLaneSpeedLimit(curLaneId);
                if (setSpeedLimit != null)
                {
                    meanSpeedLimit += ToGameSpeedLimit((ushort)setSpeedLimit);                     // custom speed limit
                }
                else
                {
                    meanSpeedLimit += segmentInfo.m_lanes[laneIndex].m_speedLimit;                     // game default
                }
                ++validLanes;

nextIter:
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= (float)validLanes;
            }
            ushort ret = LaneToCustomSpeedLimit(meanSpeedLimit);
#if TRACE
            Singleton <CodeProfiler> .instance.Stop("SpeedLimitManager.GetCustomSpeedLimit1");
#endif
            return(ret);
        }
示例#18
0
        public static float GetMaxSpeedLimit(ushort segmentID, NetInfo.Direction direction)
        {
            float ret = -1;

            foreach (var lane in NetUtil.IterateSegmentLanes(segmentID))
            {
                if (lane.IsSpeedLane() && lane.LaneInfo.m_finalDirection == direction)
                {
                    ret = Mathf.Max(ret, lane.GetLaneSpeedLimit());
                }
            }
            return(ret);
        }
 public bool GetTrafficData(ushort segmentId, NetInfo.Direction dir, out SegmentDirTrafficData trafficData)
 {
     if (segmentDirTrafficData[segmentId] == null)
     {
         trafficData = defaultSegmentDirTrafficData;
         return(false);
     }
     else
     {
         trafficData = segmentDirTrafficData[segmentId][GetDirIndex(dir)];
         return(true);
     }
 }
示例#20
0
        public int CountLanes(NetInfo.Direction dir)
        {
            int laneCount = 0;

            for (int i = 0; i < currentSegment.Info.m_lanes.Length; i++)
            {
                if (currentSegment.Info.m_lanes[i].m_laneType == NetInfo.LaneType.Vehicle && currentSegment.Info.m_lanes[i].m_direction == dir)
                {
                    laneCount++;
                }
            }
            return(laneCount);
        }
示例#21
0
        private void RenderRoadParkings(RenderManager.CameraInfo cameraInfo)
        {
            NetLane[] laneBuffer = NetManager.instance.m_lanes.m_buffer;
            bool LaneVisitor(SegmentLaneVisitData data)
            {
                ushort segmentId = data.SegVisitData.CurSeg.segmentId;
                int    laneIndex = data.CurLanePos.laneIndex;

                NetInfo.Lane laneInfo = segmentId.ToSegment().Info.m_lanes[laneIndex];

                NetInfo.Direction finalDirection = laneInfo.m_finalDirection;

                if (!data.SegVisitData.Initial)
                {
                    bool reverse =
                        data.SegVisitData.ViaStartNode ==
                        data.SegVisitData.ViaInitialStartNode;

                    bool invert1 = segmentId.ToSegment().m_flags.IsFlagSet(NetSegment.Flags.Invert);
                    bool invert2 = renderInfo_.SegmentId.ToSegment().m_flags.IsFlagSet(NetSegment.Flags.Invert);
                    bool invert  = invert1 != invert2;

                    if (reverse ^ invert)
                    {
                        finalDirection = NetInfo.InvertDirection(finalDirection);
                    }
                }
                if (finalDirection == renderInfo_.FinalDirection)
                {
                    bool  pressed     = Input.GetMouseButton(0);
                    Color color       = MainTool.GetToolColor(pressed, false);
                    uint  otherLaneId = data.CurLanePos.laneId;
                    var   laneMarker  = new SegmentLaneMarker(laneBuffer[otherLaneId].m_bezier);
                    laneMarker.RenderOverlay(cameraInfo, color, enlarge: pressed);
                }

                return(true);
            }

            SegmentLaneTraverser.Traverse(
                renderInfo_.SegmentId,
                SegmentTraverser.TraverseDirection.AnyDirection,
                SegmentTraverser.TraverseSide.AnySide,
                SegmentLaneTraverser.LaneStopCriterion.LaneCount,
                SegmentTraverser.SegmentStopCriterion.Junction,
                ParkingRestrictionsManager.LANE_TYPES,
                ParkingRestrictionsManager.VEHICLE_TYPES,
                LaneVisitor);
        }
        public bool SetParkingAllowed(ushort segmentId, NetInfo.Direction finalDir, bool flag)
        {
#if DEBUG
            if (DebugSwitch.BasicParkingAILog.Get())
            {
                if (finalDir != NetInfo.Direction.Forward &&
                    finalDir != NetInfo.Direction.Backward)
                {
                    Log.Error($"bad parking direction: {finalDir} expected forward or backward");
                }
                foreach (var lane in segmentId.ToSegment().Info.m_lanes)
                {
                    if (lane.m_laneType.IsFlagSet(NetInfo.LaneType.Parking) &&
                        lane.m_finalDirection != NetInfo.Direction.Forward &&
                        lane.m_finalDirection != NetInfo.Direction.Backward)
                    {
                        Log.Error($"parking lane with bad m_finalDirection:{lane.m_finalDirection}, expected forward or backward");
                    }
                }
            }
#endif

            if (!MayHaveParkingRestriction(segmentId))
            {
                return(false);
            }

            int dirIndex = GetDirIndex(finalDir);
            parkingAllowed[segmentId][dirIndex] = flag;

            if (!flag || !parkingAllowed[segmentId][1 - dirIndex])
            {
                Services.SimulationService.AddAction(
                    () => {
                    // force relocation of illegaly parked vehicles
                    Services.NetService.ProcessSegment(
                        segmentId,
                        (ushort segId, ref NetSegment segment) => {
                        segment.UpdateSegment(segmentId);
                        return(true);
                    });
                });
            }

            return(true);
        }
示例#23
0
        private static void UpdateLaneMarker(NetLane.Flags flag, NetInfo.Direction direction, NetSegment segment)
        {
            NetManager netManager  = NetManager.instance;
            NetLane    currentLane = netManager.m_lanes.m_buffer[segment.m_lanes];
            ulong      laneID      = segment.m_lanes;

            for (int i = 0; i < segment.Info.m_lanes.Length; i++)
            {
                if (segment.Info.m_lanes[i].m_direction == direction && segment.Info.m_lanes[i].m_laneType == NetInfo.LaneType.Vehicle && ((NetLane.Flags)currentLane.m_flags & flag) == flag)
                {
                    NetLane.Flags newFlags = (NetLane.Flags)currentLane.m_flags;
                    newFlags &= ~flag;
                    newFlags |= NetLane.Flags.Forward;
                    netManager.m_lanes.m_buffer[laneID].m_flags = (ushort)newFlags;
                }
                laneID      = currentLane.m_nextLane;
                currentLane = netManager.m_lanes.m_buffer[currentLane.m_nextLane];
            }
        }
        internal static void CalculateSegmentCenterByDir(ushort segmentId, Dictionary <NetInfo.Direction, Vector3> segmentCenterByDir)
        {
            segmentCenterByDir.Clear();

            NetInfo segmentInfo = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;
            uint    curLaneId   = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            Dictionary <NetInfo.Direction, int> numCentersByDir = new Dictionary <NetInfo.Direction, int>();
            uint laneIndex = 0;

            while (laneIndex < segmentInfo.m_lanes.Length && curLaneId != 0u)
            {
                if ((segmentInfo.m_lanes[laneIndex].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None)
                {
                    goto nextIter;
                }

                NetInfo.Direction dir          = segmentInfo.m_lanes[laneIndex].m_finalDirection;
                Vector3           bezierCenter = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_bezier.Position(0.5f);

                if (!segmentCenterByDir.ContainsKey(dir))
                {
                    segmentCenterByDir[dir] = bezierCenter;
                    numCentersByDir[dir]    = 1;
                }
                else
                {
                    segmentCenterByDir[dir] += bezierCenter;
                    numCentersByDir[dir]++;
                }

nextIter:

                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

            foreach (KeyValuePair <NetInfo.Direction, int> e in numCentersByDir)
            {
                segmentCenterByDir[e.Key] /= (float)e.Value;
            }
        }
示例#25
0
        public void DirectionSelectButtons(NetSegment currentSegment, NetInfo.Direction dir, float y)
        {
            float columnOffset = 0f;
            uint  currentLane  = currentSegment.m_lanes;

            for (int i = 0; i < currentSegment.Info.m_lanes.Length; i++)
            {
                if (currentSegment.Info.m_lanes[i].m_laneType == NetInfo.LaneType.Vehicle && currentSegment.Info.m_lanes[i].m_direction == dir)
                {
                    LaneDirectionToggleButton leftToggleButton = this.AddUIComponent <LaneDirectionToggleButton>();
                    leftToggleButton.DrawButton(currentLane, NetLane.Flags.Left, new Vector3(5f + columnOffset, 5f + y));

                    LaneDirectionToggleButton forwardToggleButton = this.AddUIComponent <LaneDirectionToggleButton>();
                    forwardToggleButton.DrawButton(currentLane, NetLane.Flags.Forward, new Vector3(40f + columnOffset, 5f + y));

                    LaneDirectionToggleButton rightToggleButton = this.AddUIComponent <LaneDirectionToggleButton>();
                    rightToggleButton.DrawButton(currentLane, NetLane.Flags.Right, new Vector3(75f + columnOffset, 5f + y));
                    columnOffset += 120f;
                }
                currentLane = NetManager.instance.m_lanes.m_buffer[currentLane].m_nextLane;
            }
        }
        /// <summary>
        /// Sets the speed limit of a given segment and lane direction.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="finalDir"></param>
        /// <param name="speedLimit"></param>
        /// <returns></returns>
        public bool SetSpeedLimit(ushort segmentId, NetInfo.Direction finalDir, ushort speedLimit)
        {
#if TRACE
            Singleton <CodeProfiler> .instance.Start("SpeedLimitManager.SetSpeedLimit");
#endif
            if (segmentId == 0 || !AvailableSpeedLimits.Contains(speedLimit) || (Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
#if TRACE
                Singleton <CodeProfiler> .instance.Stop("SpeedLimitManager.SetSpeedLimit");
#endif
                return(false);
            }

            uint curLaneId = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int  laneIndex = 0;
            while (laneIndex < Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes.Length && curLaneId != 0u)
            {
                NetInfo.Direction d = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_finalDirection;
                if ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None || d != finalDir)
                {
                    goto nextIter;
                }

#if DEBUG
                Log._Debug($"SpeedLimitManager: Setting speed limit of lane {curLaneId} to {speedLimit}");
#endif
                Flags.setLaneSpeedLimit(curLaneId, speedLimit);

nextIter:
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

#if TRACE
            Singleton <CodeProfiler> .instance.Stop("SpeedLimitManager.SetSpeedLimit");
#endif
            return(true);
        }
示例#27
0
        /// <summary>
        /// Determines the average default speed limit for a given NetInfo object in terms of discrete speed limit levels.
        /// An in-game speed limit of 2.0 (e.g. on highway) is hereby translated into a discrete speed limit value of 100 (km/h).
        /// </summary>
        /// <param name="segmentInfo"></param>
        /// <param name="dir"></param>
        /// <returns></returns>
        public static ushort GetAverageDefaultCustomSpeedLimit(NetInfo segmentInfo, NetInfo.Direction?dir = null)
        {
            // calculate the currently set mean speed limit
            float meanSpeedLimit = 0f;
            uint  validLanes     = 0;

            for (int i = 0; i < segmentInfo.m_lanes.Length; ++i)
            {
                NetInfo.Direction d = segmentInfo.m_lanes[i].m_direction;
                if ((segmentInfo.m_lanes[i].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None || (dir != null && d != dir))
                {
                    continue;
                }

                meanSpeedLimit += segmentInfo.m_lanes[i].m_speedLimit;
                ++validLanes;
            }

            if (validLanes > 0)
            {
                meanSpeedLimit /= (float)validLanes;
            }
            return(ToCustomSpeedLimit(meanSpeedLimit));
        }
示例#28
0
        /// <summary>
        /// Sets the speed limit of a given segment and lane direction.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="dir"></param>
        /// <param name="speedLimit"></param>
        /// <returns></returns>
        public static bool SetSpeedLimit(ushort segmentId, NetInfo.Direction dir, ushort speedLimit)
        {
            if (segmentId == 0)
            {
                return(false);
            }
            if (!AvailableSpeedLimits.Contains(speedLimit))
            {
                return(false);
            }
            if ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
                return(false);
            }

            uint curLaneId = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int  laneIndex = 0;

            while (laneIndex < Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes.Length && curLaneId != 0u)
            {
                NetInfo.Direction d = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_direction;
                if ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) == NetInfo.LaneType.None || d != dir)
                {
                    goto nextIter;
                }

                Log._Debug($"SpeedLimitManager: Setting speed limit of lane {curLaneId} to {speedLimit}");
                Flags.setLaneSpeedLimit(curLaneId, speedLimit);

nextIter:
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                laneIndex++;
            }

            return(true);
        }
示例#29
0
 private void RenderSegmentsSide(RenderManager.CameraInfo cameraInfo)
 {
     if (!MultiSegmentMode)
     {
         RenderSegmentSideOverlay(cameraInfo, renderData_.SegmentId, renderData_.FinalDirection);
     }
     else
     {
         SegmentTraverser.Traverse(
             renderData_.SegmentId,
             SegmentTraverser.TraverseDirection.AnyDirection,
             SegmentTraverser.TraverseSide.AnySide,
             SegmentTraverser.SegmentStopCriterion.Junction,
             data => {
             NetInfo.Direction finalDirection = renderData_.FinalDirection;
             if (data.IsReversed(renderData_.SegmentId))
             {
                 finalDirection = NetInfo.InvertDirection(finalDirection);
             }
             RenderSegmentSideOverlay(cameraInfo, data.CurSeg.segmentId, finalDirection);
             return(true);
         });
     }
 }
示例#30
0
        static void Postfix(Vector3 position, ref PathUnit.Position pathPosA, VehicleInfo.VehicleType stopType)
        {
            NetSegment segment = Singleton <NetManager> .instance.m_segments.m_buffer[pathPosA.m_segment];
            int        stop    = pathPosA.m_lane;

            if (stopType == VehicleInfo.VehicleType.Car && stop > 1)
            {
                segment.GetClosestLanePosition(position, NetInfo.LaneType.Vehicle, stopType, out Vector3 pos, out uint laneID, out int laneindex, out float laneOffset);

                NetInfo.Direction dir = segment.Info.m_lanes[laneindex].m_direction;

                int stopLane    = Array.FindIndex(segment.Info.m_sortedLanes, s => s == stop);
                int drivingLane = Array.FindIndex(segment.Info.m_sortedLanes, s => s == laneindex);

                if (dir == NetInfo.Direction.Backward && stopLane > drivingLane)
                {
                    pathPosA.m_lane = (byte)segment.Info.m_sortedLanes[drivingLane - 1];
                }
                else if (dir == NetInfo.Direction.Forward && stopLane < drivingLane)
                {
                    pathPosA.m_lane = (byte)segment.Info.m_sortedLanes[drivingLane + 1];
                }
            }
        }
 public LaneRestrictions(uint laneid, int laneNum, NetInfo.Direction dir)
 {
     this.laneID = laneid;
     this.laneNum = laneNum;
     this.direction = dir;
 }
 public LaneRestrictions(uint laneid, int laneNum, NetInfo.Direction dir)
 {
     LaneId = laneid;
     LaneNum = laneNum;
     Direction = dir;
 }