public void ChangeLightMain()
        {
            var invertedLight = LightMain == RoadBaseAI.TrafficLightState.Green
                ? RoadBaseAI.TrafficLightState.Red
                : RoadBaseAI.TrafficLightState.Green;

            if (CurrentMode == Mode.Simple)
            {
                LightLeft = invertedLight;
                LightRight = invertedLight;
                LightPedestrian = !PedestrianEnabled ? LightMain : LightPedestrian;
                LightMain = invertedLight;
            }
            else if (CurrentMode == Mode.LeftForwardR)
            {
                LightRight = invertedLight;
                LightMain = invertedLight;
            }
            else if (CurrentMode == Mode.RightForwardL)
            {
                LightLeft = invertedLight;
                LightMain = invertedLight;
            }
            else
            {
                LightMain = invertedLight;
            }

            if (!PedestrianEnabled)
            {
                LightPedestrian = _checkPedestrianLight();
            }

            UpdateVisuals();
        }
        public void ChangeLightMain()
        {
            var invertedLight = LightMain == RoadBaseAI.TrafficLightState.Green
                                ? RoadBaseAI.TrafficLightState.Red
                                : RoadBaseAI.TrafficLightState.Green;

            if (CurrentMode == Mode.Simple)
            {
                LightLeft  = invertedLight;
                LightRight = invertedLight;
                //LightPedestrian = !PedestrianEnabled ? LightMain : LightPedestrian;
                LightMain = invertedLight;
            }
            else if (CurrentMode == Mode.SingleLeft)
            {
                LightRight = invertedLight;
                LightMain  = invertedLight;
            }
            else if (CurrentMode == Mode.SingleRight)
            {
                LightLeft = invertedLight;
                LightMain = invertedLight;
            }
            else
            {
                LightMain = invertedLight;
            }

            UpdateVisuals();
        }
Beispiel #3
0
        public void MakeRedOrGreen()
        {
#if DEBUGTTL
            if (DebugSwitch.TimedTrafficLights.Get() && DebugSettings.NodeId == NodeId)
            {
                Log._Debug($"CustomSegmentLight.MakeRedOrGreen: called for segment {SegmentId} @ {NodeId}");
            }
#endif

            RoadBaseAI.TrafficLightState mainState  = RoadBaseAI.TrafficLightState.Green;
            RoadBaseAI.TrafficLightState leftState  = RoadBaseAI.TrafficLightState.Green;
            RoadBaseAI.TrafficLightState rightState = RoadBaseAI.TrafficLightState.Green;

            if (LightLeft != RoadBaseAI.TrafficLightState.Green)
            {
                leftState = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightMain != RoadBaseAI.TrafficLightState.Green)
            {
                mainState = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightRight != RoadBaseAI.TrafficLightState.Green)
            {
                rightState = RoadBaseAI.TrafficLightState.Red;
            }

            SetStates(mainState, leftState, rightState);
        }
        public CustomSegmentLight(CustomSegmentLights lights, RoadBaseAI.TrafficLightState mainLight)
        {
            this.lights = lights;

            SetStates(mainLight, leftLight, rightLight);
            UpdateVisuals();
        }
 public void invert()
 {
     LightMain  = InvertLight(LightMain);
     LightLeft  = InvertLight(LightLeft);
     LightRight = InvertLight(LightRight);
     //LightPedestrian = invertLight(LightPedestrian);
 }
        public void ChangeLightMain()
        {
            var invertedLight = lightMain == RoadBaseAI.TrafficLightState.Green
                ? RoadBaseAI.TrafficLightState.Red
                : RoadBaseAI.TrafficLightState.Green;

            if (currentMode == Mode.Simple)
            {
                lightLeft       = invertedLight;
                lightRight      = invertedLight;
                lightPedestrian = !pedestrianEnabled ? lightMain : lightPedestrian;
                lightMain       = invertedLight;
            }
            else if (currentMode == Mode.LeftForwardR)
            {
                lightRight = invertedLight;
                lightMain  = invertedLight;
            }
            else if (currentMode == Mode.RightForwardL)
            {
                lightLeft = invertedLight;
                lightMain = invertedLight;
            }
            else
            {
                lightMain = invertedLight;
            }

            if (!pedestrianEnabled)
            {
                lightPedestrian = _checkPedestrianLight();
            }

            UpdateVisuals();
        }
        /*public void invert() {
         *      LightMain = InvertLight(LightMain);
         *      LightLeft = InvertLight(LightLeft);
         *      LightRight = InvertLight(LightRight);
         * }*/

        public static RoadBaseAI.TrafficLightState GetPedestrianLightState(RoadBaseAI.TrafficLightState vehicleLightState)
        {
#if TRACE
            Singleton <CodeProfiler> .instance.Start("CustomSegmentLight.GetPedestrianLightState");
#endif
            RoadBaseAI.TrafficLightState ret = RoadBaseAI.TrafficLightState.Green;
            switch (vehicleLightState)
            {
            case RoadBaseAI.TrafficLightState.Red:
            default:
                ret = RoadBaseAI.TrafficLightState.Green;
                break;

            case RoadBaseAI.TrafficLightState.Green:
                ret = RoadBaseAI.TrafficLightState.Red;
                break;

            case RoadBaseAI.TrafficLightState.RedToGreen:
                ret = RoadBaseAI.TrafficLightState.GreenToRed;
                break;

            case RoadBaseAI.TrafficLightState.GreenToRed:
                ret = RoadBaseAI.TrafficLightState.RedToGreen;
                break;
            }
#if TRACE
            Singleton <CodeProfiler> .instance.Stop("CustomSegmentLight.GetPedestrianLightState");
#endif
            return(ret);
        }
        public void MakeRedOrGreen()
        {
#if DEBUGTTL
            if (GlobalConfig.Instance.Debug.Switches[7] && GlobalConfig.Instance.Debug.NodeId == NodeId)
            {
                Log._Debug($"CustomSegmentLight.MakeRedOrGreen: called for segment {SegmentId} @ {NodeId}");
            }
#endif

            RoadBaseAI.TrafficLightState mainState  = RoadBaseAI.TrafficLightState.Green;
            RoadBaseAI.TrafficLightState leftState  = RoadBaseAI.TrafficLightState.Green;
            RoadBaseAI.TrafficLightState rightState = RoadBaseAI.TrafficLightState.Green;

            if (LightLeft != RoadBaseAI.TrafficLightState.Green)
            {
                leftState = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightMain != RoadBaseAI.TrafficLightState.Green)
            {
                mainState = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightRight != RoadBaseAI.TrafficLightState.Green)
            {
                rightState = RoadBaseAI.TrafficLightState.Red;
            }

            SetStates(mainState, leftState, rightState);
        }
        internal void MakeRedOrGreen()
        {
            if (LightLeft == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightLeft = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightLeft == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightLeft = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightMain == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightMain = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightMain == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightMain = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightRight == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightRight = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightRight == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightRight = RoadBaseAI.TrafficLightState.Red;
            }
        }
        public void SetStates(RoadBaseAI.TrafficLightState?mainLight, RoadBaseAI.TrafficLightState?leftLight, RoadBaseAI.TrafficLightState?rightLight, bool calcAutoPedLight = true)
        {
            if ((mainLight == null || this.mainLight == mainLight) &&
                (leftLight == null || this.leftLight == leftLight) &&
                (rightLight == null || this.rightLight == rightLight))
            {
                return;
            }

            if (mainLight != null)
            {
                this.mainLight = (RoadBaseAI.TrafficLightState)mainLight;
            }
            if (leftLight != null)
            {
                this.leftLight = (RoadBaseAI.TrafficLightState)leftLight;
            }
            if (rightLight != null)
            {
                this.rightLight = (RoadBaseAI.TrafficLightState)rightLight;
            }

#if DEBUGTTL
            if (GlobalConfig.Instance.Debug.Switches[7] && GlobalConfig.Instance.Debug.NodeId == NodeId)
            {
                Log._Debug($"CustomSegmentLight.SetStates({mainLight}, {leftLight}, {rightLight}, {calcAutoPedLight}) for segment {SegmentId} @ {NodeId}: {this.mainLight} {this.leftLight} {this.rightLight}");
            }
#endif

            lights.OnChange(calcAutoPedLight);
        }
Beispiel #11
0
        public void SetStates(RoadBaseAI.TrafficLightState?mainLight, RoadBaseAI.TrafficLightState?leftLight, RoadBaseAI.TrafficLightState?rightLight, bool calcAutoPedLight = true)
        {
            if ((mainLight == null || this.mainLight == mainLight) &&
                (leftLight == null || this.leftLight == leftLight) &&
                (rightLight == null || this.rightLight == rightLight))
            {
                return;
            }

            if (mainLight != null)
            {
                this.mainLight = (RoadBaseAI.TrafficLightState)mainLight;
            }
            if (leftLight != null)
            {
                this.leftLight = (RoadBaseAI.TrafficLightState)leftLight;
            }
            if (rightLight != null)
            {
                this.rightLight = (RoadBaseAI.TrafficLightState)rightLight;
            }

            //Log._Debug($"SetStates for segment {SegmentId} @ {NodeId}: {this.mainLight} {this.leftLight} {this.rightLight}");

            lights.OnChange(calcAutoPedLight);
        }
        internal void MakeRedOrGreen()
        {
#if TRACE
            Singleton <CodeProfiler> .instance.Start("CustomSegmentLight.MakeRedOrGreen");
#endif
            if (LightLeft == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightLeft = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightLeft == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightLeft = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightMain == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightMain = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightMain == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightMain = RoadBaseAI.TrafficLightState.Red;
            }

            if (LightRight == RoadBaseAI.TrafficLightState.RedToGreen)
            {
                LightRight = RoadBaseAI.TrafficLightState.Green;
            }
            else if (LightRight == RoadBaseAI.TrafficLightState.GreenToRed)
            {
                LightRight = RoadBaseAI.TrafficLightState.Red;
            }
#if TRACE
            Singleton <CodeProfiler> .instance.Stop("CustomSegmentLight.MakeRedOrGreen");
#endif
        }
Beispiel #13
0
 internal void SetLights(RoadBaseAI.TrafficLightState lightState)
 {
     foreach (KeyValuePair <ExtVehicleType, CustomSegmentLight> e in CustomLights)
     {
         e.Value.SetStates(lightState, lightState, lightState, false);
     }
     CalculateAutoPedestrianLightState();
 }
        public void ChangeMode()
        {
            SegmentGeometry geometry = SegmentGeometry.Get(SegmentId);
            //geometry.Recalculate(true, true);
            bool startNode         = geometry.StartNodeId() == NodeId;
            var  hasLeftSegment    = geometry.HasOutgoingLeftSegment(startNode);
            var  hasForwardSegment = geometry.HasOutgoingStraightSegment(startNode);
            var  hasRightSegment   = geometry.HasOutgoingRightSegment(startNode);

#if DEBUG
            Log._Debug($"ChangeMode. segment {SegmentId} @ node {NodeId}, hasOutgoingLeft={hasLeftSegment}, hasOutgoingStraight={hasForwardSegment}, hasOutgoingRight={hasRightSegment}");
#endif

            if (CurrentMode == Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.SingleRight;
                }
                else
                {
                    CurrentMode = Mode.SingleLeft;
                }
            }
            else if (CurrentMode == Mode.SingleLeft)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.SingleRight;
                }
            }
            else if (CurrentMode == Mode.SingleRight)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.All;
                }
            }
            else
            {
                CurrentMode = Mode.Simple;
            }

            if (CurrentMode == Mode.Simple)
            {
                LightLeft  = LightMain;
                LightRight = LightMain;
                //LightPedestrian = _checkPedestrianLight();
            }
        }
Beispiel #15
0
        public CustomSegmentLights(ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainState, RoadBaseAI.TrafficLightState leftState, RoadBaseAI.TrafficLightState rightState, RoadBaseAI.TrafficLightState pedState)
        {
            this.nodeId          = nodeId;
            this.segmentId       = segmentId;
            PedestrianLightState = null;
            OnChange();

            housekeeping(false, mainState, leftState, rightState, pedState);
        }
        public void ChangeMode()
        {
            SegmentGeometry geometry = CustomRoadAI.GetSegmentGeometry(SegmentId);

            geometry.Recalculate(true, true);
            var hasLeftSegment    = geometry.HasOutgoingLeftSegment(NodeId);
            var hasForwardSegment = geometry.HasOutgoingStraightSegment(NodeId);
            var hasRightSegment   = geometry.HasOutgoingRightSegment(NodeId);

            Log._Debug($"ChangeMode. segment {SegmentId} @ node {NodeId}, hasOutgoingLeft={hasLeftSegment}, hasOutgoingStraight={hasForwardSegment}, hasOutgoingRight={hasRightSegment}");

            if (CurrentMode == Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.SingleRight;
                }
                else
                {
                    CurrentMode = Mode.SingleLeft;
                }
            }
            else if (CurrentMode == Mode.SingleLeft)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.SingleRight;
                }
            }
            else if (CurrentMode == Mode.SingleRight)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.All;
                }
            }
            else
            {
                CurrentMode = Mode.Simple;
            }

            if (CurrentMode == Mode.Simple)
            {
                LightLeft  = LightMain;
                LightRight = LightMain;
                //LightPedestrian = _checkPedestrianLight();
            }
        }
        public void ChangeLightRight()
        {
            var invertedLight = LightRight == RoadBaseAI.TrafficLightState.Green
                                ? RoadBaseAI.TrafficLightState.Red
                                : RoadBaseAI.TrafficLightState.Green;

            LightRight = invertedLight;

            UpdateVisuals();
        }
        AddSegmentLights(ushort segmentId,
                         bool startNode,
                         RoadBaseAI.TrafficLightState lightState =
                         RoadBaseAI.TrafficLightState.Red)
        {
#if DEBUG
            Log._Trace($"CustomTrafficLights.AddSegmentLights: Adding segment light: {segmentId} @ startNode={startNode}");
#endif
            if (!Services.NetService.IsSegmentValid(segmentId))
            {
                return(null);
            }

            CustomSegment customSegment = customSegments_[segmentId];

            if (customSegment == null)
            {
                customSegment = new CustomSegment();
                customSegments_[segmentId] = customSegment;
            }
            else
            {
                ICustomSegmentLights existingLights =
                    startNode ? customSegment.StartNodeLights : customSegment.EndNodeLights;

                if (existingLights != null)
                {
                    existingLights.SetLights(lightState);
                    return(existingLights);
                }
            }

            if (startNode)
            {
                customSegment.StartNodeLights = new CustomSegmentLights(
                    this,
                    segmentId,
                    startNode,
                    false);

                customSegment.StartNodeLights.SetLights(lightState);
                return(customSegment.StartNodeLights);
            }
            else
            {
                customSegment.EndNodeLights = new CustomSegmentLights(
                    this,
                    segmentId,
                    startNode,
                    false);

                customSegment.EndNodeLights.SetLights(lightState);
                return(customSegment.EndNodeLights);
            }
        }
		public ManualSegmentLight(ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight, RoadBaseAI.TrafficLightState leftLight, RoadBaseAI.TrafficLightState rightLight, RoadBaseAI.TrafficLightState pedestrianLight) {
			this.nodeId = nodeId;
			this.segmentId = segmentId;

			LightMain = mainLight;
			LightLeft = leftLight;
			LightRight = rightLight;
			LightPedestrian = pedestrianLight;

			UpdateVisuals();
		}
        public CustomSegmentLight(CustomSegmentLights lights, ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight, RoadBaseAI.TrafficLightState leftLight, RoadBaseAI.TrafficLightState rightLight /*, RoadBaseAI.TrafficLightState pedestrianLight*/)
        {
            this.NodeId    = nodeId;
            this.SegmentId = segmentId;
            this.lights    = lights;

            LightMain  = mainLight;
            LightLeft  = leftLight;
            LightRight = rightLight;

            UpdateVisuals();
        }
        public void ChangeLightPedestrian()
        {
            if (pedestrianEnabled)
            {
                var invertedLight = lightPedestrian == RoadBaseAI.TrafficLightState.Green
                    ? RoadBaseAI.TrafficLightState.Red
                    : RoadBaseAI.TrafficLightState.Green;

                lightPedestrian = invertedLight;
                UpdateVisuals();
            }
        }
Beispiel #22
0
        public void SetLights(RoadBaseAI.TrafficLightState lightState)
        {
            foreach (KeyValuePair <ExtVehicleType, ICustomSegmentLight> e in CustomLights)
            {
                e.Value.SetStates(lightState, lightState, lightState, false);
            }

            Constants.ServiceFactory.NetService.ProcessNode(NodeId, delegate(ushort nId, ref NetNode node) {
                CalculateAutoPedestrianLightState(ref node);
                return(true);
            });
        }
		public CustomSegmentLight(CustomSegmentLights lights, ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight, RoadBaseAI.TrafficLightState leftLight, RoadBaseAI.TrafficLightState rightLight/*, RoadBaseAI.TrafficLightState pedestrianLight*/) {
			this.NodeId = nodeId;
			this.SegmentId = segmentId;
			this.lights = lights;

			LightMain = mainLight;
			LightLeft = leftLight;
			LightRight = rightLight;
			//LightPedestrian = pedestrianLight;

			UpdateVisuals();
		}
Beispiel #24
0
        public ManualSegmentLight(ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight, RoadBaseAI.TrafficLightState leftLight, RoadBaseAI.TrafficLightState rightLight, RoadBaseAI.TrafficLightState pedestrianLight)
        {
            this.nodeId    = nodeId;
            this.segmentId = segmentId;

            LightMain       = mainLight;
            LightLeft       = leftLight;
            LightRight      = rightLight;
            LightPedestrian = pedestrianLight;

            UpdateVisuals();
        }
        public CustomSegmentLight(CustomSegmentLights lights, ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight)
        {
            this.NodeId    = nodeId;
            this.SegmentId = segmentId;
            this.lights    = lights;

            LightMain  = mainLight;
            LightLeft  = mainLight;
            LightRight = mainLight;

            UpdateVisuals();
        }
		public ManualSegmentLight(ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight) {
			this.nodeId = nodeId;
			this.segmentId = segmentId;

			LightMain = mainLight;
			LightLeft = mainLight;
			LightRight = mainLight;
			LightPedestrian = mainLight == RoadBaseAI.TrafficLightState.Green
				? RoadBaseAI.TrafficLightState.Red
				: RoadBaseAI.TrafficLightState.Green;

			UpdateVisuals();
		}
Beispiel #27
0
        public void ChangeMode()
        {
            var hasLeftSegment    = TrafficPriority.HasLeftSegment(segmentId, nodeId) && TrafficPriority.HasLeftLane(nodeId, segmentId);
            var hasForwardSegment = TrafficPriority.HasForwardSegment(segmentId, nodeId) && TrafficPriority.HasForwardLane(nodeId, segmentId);
            var hasRightSegment   = TrafficPriority.HasRightSegment(segmentId, nodeId) && TrafficPriority.HasRightLane(nodeId, segmentId);

            if (CurrentMode == Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.SingleRight;
                }
                else
                {
                    CurrentMode = Mode.SingleLeft;
                }
            }
            else if (CurrentMode == Mode.SingleLeft)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.SingleRight;
                }
            }
            else if (CurrentMode == Mode.SingleRight)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.All;
                }
            }
            else
            {
                CurrentMode = Mode.Simple;
            }

            if (CurrentMode == Mode.Simple)
            {
                LightLeft       = LightMain;
                LightRight      = LightMain;
                LightPedestrian = _checkPedestrianLight();
            }
        }
        public void ChangeMode()
        {
            var hasLeftSegment    = TrafficPriority.HasLeftSegment(this.segment, this.node) && TrafficPriority.hasLeftLane(this.node, this.segment);
            var hasForwardSegment = TrafficPriority.HasForwardSegment(this.segment, this.node) && TrafficPriority.hasForwardLane(this.node, this.segment);
            var hasRightSegment   = TrafficPriority.HasRightSegment(this.segment, this.node) && TrafficPriority.hasRightLane(this.node, this.segment);

            if (currentMode == ManualSegmentLight.Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    currentMode = ManualSegmentLight.Mode.RightForwardL;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.LeftForwardR;
                }
            }
            else if (currentMode == ManualSegmentLight.Mode.LeftForwardR)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    currentMode = ManualSegmentLight.Mode.Simple;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.RightForwardL;
                }
            }
            else if (currentMode == ManualSegmentLight.Mode.RightForwardL)
            {
                if (!hasLeftSegment)
                {
                    currentMode = ManualSegmentLight.Mode.Simple;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.All;
                }
            }
            else
            {
                currentMode = ManualSegmentLight.Mode.Simple;
            }

            if (currentMode == Mode.Simple)
            {
                lightLeft       = lightMain;
                lightRight      = lightMain;
                lightPedestrian = _checkPedestrianLight();
            }
        }
        public ManualSegmentLight(ushort node, int segment, RoadBaseAI.TrafficLightState mainLight)
        {
            Node = node;
            Segment = segment;

            LightMain = mainLight;
            LightLeft = mainLight;
            LightRight = mainLight;
            LightPedestrian = mainLight == RoadBaseAI.TrafficLightState.Green
                ? RoadBaseAI.TrafficLightState.Red
                : RoadBaseAI.TrafficLightState.Green;

            UpdateVisuals();
        }
        GetSegmentLights(ushort segmentId,
                         bool startNode,
                         bool add = true,
                         RoadBaseAI.TrafficLightState lightState = RoadBaseAI.TrafficLightState.Red)
        {
            if (!IsSegmentLight(segmentId, startNode))
            {
                return(add ? AddSegmentLights(segmentId, startNode, lightState) : null);
            }

            CustomSegment customSegment = customSegments_[segmentId];

            return(startNode ? customSegment.StartNodeLights : customSegment.EndNodeLights);
        }
        public void ChangeLightRight()
        {
            var invertedLight = LightRight == RoadBaseAI.TrafficLightState.Green
                                ? RoadBaseAI.TrafficLightState.Red
                                : RoadBaseAI.TrafficLightState.Green;

            LightRight = invertedLight;

            /*if (!PedestrianEnabled) {
             *      LightPedestrian = _checkPedestrianLight();
             * }*/

            UpdateVisuals();
        }
        public ManualSegmentLight(ushort node, int segment, RoadBaseAI.TrafficLightState mainLight)
        {
            this.node    = node;
            this.segment = segment;

            lightMain       = mainLight;
            lightLeft       = mainLight;
            lightRight      = mainLight;
            lightPedestrian = mainLight == RoadBaseAI.TrafficLightState.Green
                ? RoadBaseAI.TrafficLightState.Red
                : RoadBaseAI.TrafficLightState.Green;

            UpdateVisuals();
        }
 public static void AddSegmentLight(ushort nodeID, int segmentID, RoadBaseAI.TrafficLightState light)
 {
     if (ManualSegments.ContainsKey(segmentID))
     {
         ManualSegments[segmentID].node_2     = nodeID;
         ManualSegments[segmentID].instance_2 = new ManualSegmentLight(nodeID, segmentID, light);
     }
     else
     {
         ManualSegments.Add(segmentID, new ManualSegment());
         ManualSegments[segmentID].node_1     = nodeID;
         ManualSegments[segmentID].instance_1 = new ManualSegmentLight(nodeID, segmentID, light);
     }
 }
        public static RoadBaseAI.TrafficLightState InvertLight(RoadBaseAI.TrafficLightState light)           // TODO refactor
        {
            switch (light)
            {
            case RoadBaseAI.TrafficLightState.Red:
            case RoadBaseAI.TrafficLightState.GreenToRed:
                return(RoadBaseAI.TrafficLightState.Green);

            case RoadBaseAI.TrafficLightState.Green:
            case RoadBaseAI.TrafficLightState.RedToGreen:
            default:
                return(RoadBaseAI.TrafficLightState.Red);
            }
        }
		//public bool PedestrianEnabled;

		public CustomSegmentLight(CustomSegmentLights lights, ushort nodeId, ushort segmentId, RoadBaseAI.TrafficLightState mainLight) {
			this.NodeId = nodeId;
			this.SegmentId = segmentId;
			this.lights = lights;

			LightMain = mainLight;
			LightLeft = mainLight;
			LightRight = mainLight;
			/*LightPedestrian = mainLight == RoadBaseAI.TrafficLightState.Green
				? RoadBaseAI.TrafficLightState.Red
				: RoadBaseAI.TrafficLightState.Green;*/

			UpdateVisuals();
		}
 private RoadBaseAI.TrafficLightState calcLightState(RoadBaseAI.TrafficLightState previousState, RoadBaseAI.TrafficLightState currentState, RoadBaseAI.TrafficLightState nextState, bool atStartTransition, bool atEndTransition)
 {
     if (atStartTransition && currentState == RoadBaseAI.TrafficLightState.Green && previousState == RoadBaseAI.TrafficLightState.Red)
     {
         return(RoadBaseAI.TrafficLightState.RedToGreen);
     }
     else if (atEndTransition && currentState == RoadBaseAI.TrafficLightState.Green && nextState == RoadBaseAI.TrafficLightState.Red)
     {
         return(RoadBaseAI.TrafficLightState.GreenToRed);
     }
     else
     {
         return(currentState);
     }
 }
        public void ChangeLightLeft()
        {
            var invertedLight = LightLeft == RoadBaseAI.TrafficLightState.Green
                ? RoadBaseAI.TrafficLightState.Red
                : RoadBaseAI.TrafficLightState.Green;

            LightLeft = invertedLight;

            if (!PedestrianEnabled)
            {
                LightPedestrian = _checkPedestrianLight();
            }

            UpdateVisuals();
        }
        public void ChangeMode()
        {
            var hasLeftSegment = TrafficPriority.HasLeftSegment(this.segment, this.node) && TrafficPriority.hasLeftLane(this.node, this.segment);
            var hasForwardSegment = TrafficPriority.HasForwardSegment(this.segment, this.node) && TrafficPriority.hasForwardLane(this.node, this.segment);
            var hasRightSegment = TrafficPriority.HasRightSegment(this.segment, this.node) && TrafficPriority.hasRightLane(this.node, this.segment);

            if (currentMode == ManualSegmentLight.Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    currentMode = ManualSegmentLight.Mode.RightForwardL;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.LeftForwardR;
                }
            }
            else if (currentMode == ManualSegmentLight.Mode.LeftForwardR)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    currentMode = ManualSegmentLight.Mode.Simple;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.RightForwardL;
                }
            }
            else if (currentMode == ManualSegmentLight.Mode.RightForwardL)
            {
                if (!hasLeftSegment)
                {
                    currentMode = ManualSegmentLight.Mode.Simple;
                }
                else
                {
                    currentMode = ManualSegmentLight.Mode.All;
                }
            }
            else
            {
                currentMode = ManualSegmentLight.Mode.Simple;
            }

            if (currentMode == Mode.Simple)
            {
                lightLeft = lightMain;
                lightRight = lightMain;
                lightPedestrian = _checkPedestrianLight();
            }
        }
        public void ChangeLightPedestrian()
        {
            if (PedestrianEnabled)
            {
                var invertedLight = LightPedestrian == RoadBaseAI.TrafficLightState.Green
                    ? RoadBaseAI.TrafficLightState.Red
                    : RoadBaseAI.TrafficLightState.Green;

                LightPedestrian = invertedLight;
                UpdateVisuals();
            }
        }
		internal void MakeRed() {
			LightLeft = RoadBaseAI.TrafficLightState.Red;
			LightMain = RoadBaseAI.TrafficLightState.Red;
			LightRight = RoadBaseAI.TrafficLightState.Red;
		}
		internal void MakeRedOrGreen() {
			if (LightLeft == RoadBaseAI.TrafficLightState.RedToGreen) {
				LightLeft = RoadBaseAI.TrafficLightState.Green;
			} else if (LightLeft == RoadBaseAI.TrafficLightState.GreenToRed) {
				LightLeft = RoadBaseAI.TrafficLightState.Red;
			}

			if (LightMain == RoadBaseAI.TrafficLightState.RedToGreen) {
				LightMain = RoadBaseAI.TrafficLightState.Green;
			} else if (LightMain == RoadBaseAI.TrafficLightState.GreenToRed) {
				LightMain = RoadBaseAI.TrafficLightState.Red;
			}

			if (LightRight == RoadBaseAI.TrafficLightState.RedToGreen) {
				LightRight = RoadBaseAI.TrafficLightState.Green;
			} else if (LightRight == RoadBaseAI.TrafficLightState.GreenToRed) {
				LightRight = RoadBaseAI.TrafficLightState.Red;
			}
		}
		public void invert() {
			LightMain = InvertLight(LightMain);
			LightLeft = InvertLight(LightLeft);
			LightRight = InvertLight(LightRight);
			//LightPedestrian = invertLight(LightPedestrian);
		}
		/*public void ChangeLightPedestrian() {
			if (PedestrianEnabled) {
				var invertedLight = LightPedestrian == RoadBaseAI.TrafficLightState.Green
					? RoadBaseAI.TrafficLightState.Red
					: RoadBaseAI.TrafficLightState.Green;

				LightPedestrian = invertedLight;
				UpdateVisuals();
			}
		}*/

		/*RoadBaseAI.TrafficLightState lastVehicleLightState = RoadBaseAI.TrafficLightState.Red;
		RoadBaseAI.TrafficLightState lastPedestrianLightState = RoadBaseAI.TrafficLightState.Red;*/

		public void UpdateVisuals() {
			var instance = Singleton<NetManager>.instance;

			uint currentFrameIndex = Singleton<SimulationManager>.instance.m_currentFrameIndex;
			uint num = (uint)(((int)NodeId << 8) / 32768);

			RoadBaseAI.TrafficLightState vehicleLightState;
			RoadBaseAI.TrafficLightState pedestrianLightState;

			RoadBaseAI.TrafficLightState mainLight = LightMain;
			RoadBaseAI.TrafficLightState leftLight = LightLeft;
			RoadBaseAI.TrafficLightState rightLight = LightRight;

			switch (CurrentMode) {
				case Mode.Simple:
					leftLight = mainLight;
					rightLight = mainLight;
					break;
				case Mode.SingleLeft:
					rightLight = mainLight;
					break;
				case Mode.SingleRight:
					leftLight = mainLight;
					break;
				case Mode.All:
				default:
					break;
			}

			// any green?
			if (mainLight == RoadBaseAI.TrafficLightState.Green ||
				leftLight == RoadBaseAI.TrafficLightState.Green ||
				rightLight == RoadBaseAI.TrafficLightState.Green) {
				vehicleLightState = RoadBaseAI.TrafficLightState.Green;
			} else // all red?
			if (mainLight == RoadBaseAI.TrafficLightState.Red &&
				leftLight == RoadBaseAI.TrafficLightState.Red &&
				rightLight == RoadBaseAI.TrafficLightState.Red) {
				vehicleLightState = RoadBaseAI.TrafficLightState.Red;
			} else // any red+yellow?
			if (mainLight == RoadBaseAI.TrafficLightState.RedToGreen ||
				leftLight == RoadBaseAI.TrafficLightState.RedToGreen ||
				rightLight == RoadBaseAI.TrafficLightState.RedToGreen) {
				vehicleLightState = RoadBaseAI.TrafficLightState.RedToGreen;
			} else {
				vehicleLightState = RoadBaseAI.TrafficLightState.GreenToRed;
			}

			//pedestrianLightState = LightPedestrian;
			pedestrianLightState = lights.PedestrianLightState == null ? RoadBaseAI.TrafficLightState.Red : (RoadBaseAI.TrafficLightState)lights.PedestrianLightState;

			uint now = ((currentFrameIndex - num) >> 8) & 1;
			CustomRoadAI.OriginalSetTrafficLightState(true, NodeId, ref instance.m_segments.m_buffer[SegmentId], now << 8, vehicleLightState, pedestrianLightState, false, false);
			CustomRoadAI.OriginalSetTrafficLightState(true, NodeId, ref instance.m_segments.m_buffer[SegmentId], (1u-now) << 8, vehicleLightState, pedestrianLightState, false, false);

			/*if (vehicleLightState != lastVehicleLightState || pedestrianLightState != lastPedestrianLightState) {
				// force rendering
				Singleton<NetManager>.instance.UpdateSegmentRenderer(segmentId, true);
			}

			lastVehicleLightState = vehicleLightState;
			lastPedestrianLightState = pedestrianLightState;*/
		}
		/*public RoadBaseAI.TrafficLightState GetLightPedestrian() {
			return LightPedestrian;
		}*/

		public void ChangeMode() {
			SegmentGeometry geometry = CustomRoadAI.GetSegmentGeometry(SegmentId);
			geometry.Recalculate(true, true);
			var hasLeftSegment = geometry.HasOutgoingLeftSegment(NodeId);
			var hasForwardSegment = geometry.HasOutgoingStraightSegment(NodeId);
			var hasRightSegment = geometry.HasOutgoingRightSegment(NodeId);

			Log._Debug($"ChangeMode. node {NodeId}, hasOutgoingLeft={hasLeftSegment}, hasOutgoingStraight={hasForwardSegment}, hasOutgoingRight={hasRightSegment}");

			if (CurrentMode == Mode.Simple) {
				if (!hasLeftSegment) {
					CurrentMode = Mode.SingleRight;
				} else {
					CurrentMode = Mode.SingleLeft;
				}
			} else if (CurrentMode == Mode.SingleLeft) {
				if (!hasForwardSegment || !hasRightSegment) {
					CurrentMode = Mode.Simple;
				} else {
					CurrentMode = Mode.SingleRight;
				}
			} else if (CurrentMode == Mode.SingleRight) {
				if (!hasLeftSegment) {
					CurrentMode = Mode.Simple;
				} else {
					CurrentMode = Mode.All;
				}
			} else {
				CurrentMode = Mode.Simple;
			}

			if (CurrentMode == Mode.Simple) {
				LightLeft = LightMain;
				LightRight = LightMain;
				//LightPedestrian = _checkPedestrianLight();
			}
		}
        public void ChangeMode()
        {
            var hasLeftSegment = TrafficPriority.HasLeftSegment(Segment, Node) && TrafficPriority.HasLeftLane(Node, Segment);
            var hasForwardSegment = TrafficPriority.HasForwardSegment(Segment, Node) && TrafficPriority.HasForwardLane(Node, Segment);
            var hasRightSegment = TrafficPriority.HasRightSegment(Segment, Node) && TrafficPriority.HasRightLane(Node, Segment);

            if (CurrentMode == Mode.Simple)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.RightForwardL;
                }
                else
                {
                    CurrentMode = Mode.LeftForwardR;
                }
            }
            else if (CurrentMode == Mode.LeftForwardR)
            {
                if (!hasForwardSegment || !hasRightSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.RightForwardL;
                }
            }
            else if (CurrentMode == Mode.RightForwardL)
            {
                if (!hasLeftSegment)
                {
                    CurrentMode = Mode.Simple;
                }
                else
                {
                    CurrentMode = Mode.All;
                }
            }
            else
            {
                CurrentMode = Mode.Simple;
            }

            if (CurrentMode == Mode.Simple)
            {
                LightLeft = LightMain;
                LightRight = LightMain;
                LightPedestrian = _checkPedestrianLight();
            }
        }
		public void ChangeMode() {
			var hasLeftSegment = TrafficPriority.HasLeftSegment(segmentId, nodeId);
			var hasForwardSegment = TrafficPriority.HasStraightSegment(segmentId, nodeId);
			var hasRightSegment = TrafficPriority.HasRightSegment(segmentId, nodeId);

			if (CurrentMode == Mode.Simple) {
				if (!hasLeftSegment) {
					CurrentMode = Mode.SingleRight;
				} else {
					CurrentMode = Mode.SingleLeft;
				}
			} else if (CurrentMode == Mode.SingleLeft) {
				if (!hasForwardSegment || !hasRightSegment) {
					CurrentMode = Mode.Simple;
				} else {
					CurrentMode = Mode.SingleRight;
				}
			} else if (CurrentMode == Mode.SingleRight) {
				if (!hasLeftSegment) {
					CurrentMode = Mode.Simple;
				} else {
					CurrentMode = Mode.All;
				}
			} else {
				CurrentMode = Mode.Simple;
			}

			if (CurrentMode == Mode.Simple) {
				LightLeft = LightMain;
				LightRight = LightMain;
				LightPedestrian = _checkPedestrianLight();
			}
		}