@@ -241,7 +241,7 @@ protected bool MayChangeSegment(ushort frontVehicleId, ref VehicleState vehicleS
241241
242242 ITrafficPriorityManager prioMan = TrafficPriorityManager . Instance ;
243243 ICustomSegmentLightsManager segLightsMan = CustomSegmentLightsManager . Instance ;
244- if ( ( vehicleData . m_flags & Vehicle . Flags . Emergency2 ) == 0 ) {
244+ if ( ( vehicleData . m_flags & Vehicle . Flags . Emergency2 ) == 0 || isLevelCrossing ) {
245245 if ( hasTrafficLight && checkTrafficLights ) {
246246#if DEBUG
247247 if ( debug ) {
@@ -268,7 +268,7 @@ protected bool MayChangeSegment(ushort frontVehicleId, ref VehicleState vehicleS
268268#endif
269269 targetNodeId , prevPos . m_segment , prevPos . m_lane , position . m_segment , ref prevSegment , currentFrameIndex - targetNodeLower8Bits , out vehicleLightState , out pedestrianLightState , out vehicles , out pedestrians ) ;
270270
271- if ( vehicleData . Info . m_vehicleType == VehicleInfo . VehicleType . Car && isRecklessDriver ) { // TODO no reckless driving at railroad crossings
271+ if ( vehicleData . Info . m_vehicleType == VehicleInfo . VehicleType . Car && isRecklessDriver && ! isLevelCrossing ) {
272272 vehicleLightState = RoadBaseAI . TrafficLightState . Green ;
273273 }
274274
@@ -598,25 +598,25 @@ public bool MayChangeSegment(ushort frontVehicleId, ref Vehicle vehicleData, flo
598598 /// <param name="isRecklessDriver">reckless driver?</param>
599599 /// <returns></returns>
600600 protected bool MustCheckSpace ( ushort segmentId , bool startNode , ref NetNode node , bool isRecklessDriver ) {
601+ bool checkSpace ;
601602 if ( isRecklessDriver ) {
602- return false ;
603+ checkSpace = ( node . m_flags & NetNode . Flags . LevelCrossing ) != NetNode . Flags . None ;
603604 } else {
604- bool checkSpace ;
605605 if ( Options . junctionRestrictionsEnabled ) {
606606 checkSpace = ! JunctionRestrictionsManager . Instance . IsEnteringBlockedJunctionAllowed ( segmentId , startNode ) ;
607607 } else {
608608 checkSpace = ( node . m_flags & ( NetNode . Flags . Junction | NetNode . Flags . OneWayOut | NetNode . Flags . OneWayIn ) ) == NetNode . Flags . Junction && node . CountSegments ( ) != 2 ;
609609 }
610-
611- return checkSpace ;
612610 }
611+
612+ return checkSpace ;
613613 }
614614
615615 public bool MayDespawn ( ref Vehicle vehicleData ) {
616616 return ! Options . disableDespawning || ( ( vehicleData . m_flags2 & ( Vehicle . Flags2 . Blown | Vehicle . Flags2 . Floating ) ) != 0 ) || ( vehicleData . m_flags & Vehicle . Flags . Parking ) != 0 ;
617617 }
618618
619- public float CalcMaxSpeed ( ushort vehicleId , ref Vehicle vehicleData , VehicleInfo vehicleInfo , PathUnit . Position position , ref NetSegment segment , Vector3 pos , float maxSpeed ) {
619+ public float CalcMaxSpeed ( ushort vehicleId , ref VehicleState state , VehicleInfo vehicleInfo , PathUnit . Position position , ref NetSegment segment , Vector3 pos , float maxSpeed ) {
620620 if ( Singleton < NetManager > . instance . m_treatWetAsSnow ) {
621621 DistrictManager districtManager = Singleton < DistrictManager > . instance ;
622622 byte district = districtManager . GetDistrict ( pos ) ;
@@ -656,7 +656,7 @@ public float CalcMaxSpeed(ushort vehicleId, ref Vehicle vehicleData, VehicleInfo
656656 maxSpeed *= 1f + ( float ) segment . m_condition * 0.0005882353f ; // vanilla: ±0% .. +15 %
657657 }
658658
659- maxSpeed = ApplyRealisticSpeeds ( maxSpeed , vehicleId , ref vehicleData , vehicleInfo ) ;
659+ maxSpeed = ApplyRealisticSpeeds ( maxSpeed , vehicleId , ref state , vehicleInfo ) ;
660660 maxSpeed = Math . Max ( MIN_SPEED , maxSpeed ) ; // at least 10 km/h
661661
662662 return maxSpeed ;
@@ -673,18 +673,17 @@ public uint GetVehicleRand(ushort vehicleId) {
673673 return range + step ;
674674 }
675675
676- public float ApplyRealisticSpeeds ( float speed , ushort vehicleId , ref Vehicle vehicleData , VehicleInfo vehicleInfo ) {
677- bool isRecklessDriver = IsRecklessDriver ( vehicleId , ref vehicleData ) ;
676+ public float ApplyRealisticSpeeds ( float speed , ushort vehicleId , ref VehicleState state , VehicleInfo vehicleInfo ) {
678677 if ( Options . realisticSpeeds ) {
679678 float vehicleRand = 0.01f * ( float ) GetVehicleRand ( vehicleId ) ;
680679 if ( vehicleInfo . m_isLargeVehicle ) {
681680 speed *= 0.75f + vehicleRand * 0.25f ; // a little variance, 0.75 .. 1
682- } else if ( isRecklessDriver ) {
681+ } else if ( state . recklessDriver ) {
683682 speed *= 1.3f + vehicleRand * 1.7f ; // woohooo, 1.3 .. 3
684683 } else {
685684 speed *= 0.8f + vehicleRand * 0.5f ; // a little variance, 0.8 .. 1.3
686685 }
687- } else if ( isRecklessDriver ) {
686+ } else if ( state . recklessDriver ) {
688687 speed *= 1.5f ;
689688 }
690689 return speed ;
@@ -1177,7 +1176,7 @@ public int FindBestLane(ushort vehicleId, ref Vehicle vehicleData, ref VehicleSt
11771176#endif
11781177 NetInfo . Lane next1LaneInfo = next1SegInfo . m_lanes [ currentFwdTransitions [ i ] . laneIndex ] ;
11791178 float next1MaxSpeed = SpeedLimitManager . Instance . GetLockFreeGameSpeedLimit ( currentFwdTransitions [ i ] . segmentId , currentFwdTransitions [ i ] . laneIndex , currentFwdTransitions [ i ] . laneId , next1LaneInfo ) ;
1180- float targetSpeed = Math . Min ( vehicleMaxSpeed , ApplyRealisticSpeeds ( next1MaxSpeed , vehicleId , ref vehicleData , vehicleInfo ) ) ;
1179+ float targetSpeed = Math . Min ( vehicleMaxSpeed , ApplyRealisticSpeeds ( next1MaxSpeed , vehicleId , ref vehicleState , vehicleInfo ) ) ;
11811180
11821181 ushort meanSpeed = TrafficMeasurementManager . Instance . CalcLaneRelativeMeanSpeed ( currentFwdTransitions [ i ] . segmentId , currentFwdTransitions [ i ] . laneIndex , currentFwdTransitions [ i ] . laneId , next1LaneInfo ) ;
11831182
0 commit comments