Skip to content

Commit c85ee86

Browse files
committed
Emergency vehicles do not pass closed barriers at level crossings
1 parent b094185 commit c85ee86

File tree

3 files changed

+18
-19
lines changed

3 files changed

+18
-19
lines changed

TLM/TLM/Custom/AI/CustomCarAI.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ public void CustomCalculateSegmentPosition(ushort vehicleId, ref Vehicle vehicle
255255
}
256256

257257
// NON-STOCK CODE START (stock code replaced)
258-
maxSpeed = Constants.ManagerFactory.VehicleBehaviorManager.CalcMaxSpeed(vehicleId, ref vehicleData, this.m_info, prevPosition, ref netManager.m_segments.m_buffer[prevPosition.m_segment], pos, maxSpeed);
258+
maxSpeed = Constants.ManagerFactory.VehicleBehaviorManager.CalcMaxSpeed(vehicleId, ref VehicleStateManager.Instance.VehicleStates[vehicleId], this.m_info, prevPosition, ref netManager.m_segments.m_buffer[prevPosition.m_segment], pos, maxSpeed);
259259
// NON-STOCK CODE END
260260
}
261261

@@ -278,7 +278,7 @@ public void CustomCalculateSegmentPositionPathFinder(ushort vehicleId, ref Vehic
278278
}
279279

280280
// NON-STOCK CODE START
281-
maxSpeed = VehicleBehaviorManager.Instance.CalcMaxSpeed(vehicleId, ref vehicleData, this.m_info, position, ref netManager.m_segments.m_buffer[position.m_segment], pos, maxSpeed);
281+
maxSpeed = VehicleBehaviorManager.Instance.CalcMaxSpeed(vehicleId, ref VehicleStateManager.Instance.VehicleStates[vehicleId], this.m_info, position, ref netManager.m_segments.m_buffer[position.m_segment], pos, maxSpeed);
282282
// NON-STOCK CODE END
283283
}
284284

TLM/TLM/Manager/IVehicleBehaviorManager.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,22 @@ public interface IVehicleBehaviorManager {
6767
/// </summary>
6868
/// <param name="speed">vehicle target velocity</param>
6969
/// <param name="vehicleId">vehicle id</param>
70-
/// <param name="vehicleData">vehicle data</param>
70+
/// <param name="vehicleState">vehicle state</param>
7171
/// <param name="vehicleInfo">vehicle info</param>
7272
/// <returns>modified target velocity</returns>
73-
float ApplyRealisticSpeeds(float speed, ushort vehicleId, ref Vehicle vehicleData, VehicleInfo vehicleInfo);
73+
float ApplyRealisticSpeeds(float speed, ushort vehicleId, ref VehicleState vehicleState, VehicleInfo vehicleInfo);
7474

7575
/// <summary>
7676
/// Calculates the target velocity for the given vehicle.
7777
/// </summary>
7878
/// <param name="vehicleId">vehicle id</param>
79-
/// <param name="vehicleData">vehicle data</param>
79+
/// <param name="state">vehicle state</param>
8080
/// <param name="vehicleInfo">vehicle info</param>
8181
/// <param name="position">current path position</param>
8282
/// <param name="segment">segment data</param>
8383
/// <param name="pos">current world position</param>
8484
/// <param name="maxSpeed">vehicle target velocity</param>
8585
/// <returns>modified target velocity</returns>
86-
float CalcMaxSpeed(ushort vehicleId, ref Vehicle vehicleData, VehicleInfo vehicleInfo, PathUnit.Position position, ref NetSegment segment, Vector3 pos, float maxSpeed);
86+
float CalcMaxSpeed(ushort vehicleId, ref VehicleState state, VehicleInfo vehicleInfo, PathUnit.Position position, ref NetSegment segment, Vector3 pos, float maxSpeed);
8787
}
8888
}

TLM/TLM/Manager/Impl/VehicleBehaviorManager.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)