diff --git a/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs b/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs
index 5cdaf887af..39ae073be5 100644
--- a/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs
+++ b/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs
@@ -1858,16 +1858,15 @@ public bool UpdateTurntableStatePlayer(float elapsedClockSeconds)
// check if train position on turntable
if (!trainOnTable.FrontOnBoard)
{
- if (WorldLocation.Within(parentTrain.FrontTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (parentTurntable.CheckOnSection(parentTrain.FrontTDBTraveller))
{
trainOnTable.SetFrontState(true);
parentTrain.Simulator.Confirmer.Information("Front of train is on table");
-
}
}
else if (!trainOnTable.BackOnBoard)
{
- if (WorldLocation.Within(parentTrain.RearTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (parentTurntable.CheckOnSection(parentTrain.RearTDBTraveller))
{
trainOnTable.SetBackState(true);
parentTrain.Simulator.Confirmer.Information("Rear of train is on table");
@@ -1882,12 +1881,12 @@ public bool UpdateTurntableStatePlayer(float elapsedClockSeconds)
if (loco.ThrottlePercent < 1 && Math.Abs(loco.SpeedMpS) < 0.05 && (loco.Direction == Direction.N || Math.Abs(parentTrain.MUReverserPercent) <= 1))
{
// check if train still on turntable
- if (!WorldLocation.Within(parentTrain.FrontTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (!parentTurntable.CheckOnSection(parentTrain.FrontTDBTraveller))
{
trainOnTable.SetFrontState(false);
parentTrain.Simulator.Confirmer.Information("Front of train slipped off table");
}
- if (!WorldLocation.Within(parentTrain.RearTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (!parentTurntable.CheckOnSection(parentTrain.RearTDBTraveller))
{
trainOnTable.SetBackState(false);
parentTrain.Simulator.Confirmer.Information("Rear of train slipped off table");
@@ -1915,7 +1914,7 @@ public bool UpdateTurntableStatePlayer(float elapsedClockSeconds)
// check if train position on turntable
if (!trainOnTable.FrontOnBoard)
{
- if (WorldLocation.Within(parentTrain.FrontTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (parentTurntable.CheckOnSection(parentTrain.FrontTDBTraveller))
{
trainOnTable.SetFrontState(true);
parentTrain.Simulator.Confirmer.Information("Front of train is on table");
@@ -1924,7 +1923,7 @@ public bool UpdateTurntableStatePlayer(float elapsedClockSeconds)
}
else if (!trainOnTable.BackOnBoard)
{
- if (WorldLocation.Within(parentTrain.RearTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (parentTurntable.CheckOnSection(parentTrain.RearTDBTraveller))
{
trainOnTable.SetBackState(true);
parentTrain.Simulator.Confirmer.Information("Rear of train is on table");
@@ -1939,12 +1938,12 @@ public bool UpdateTurntableStatePlayer(float elapsedClockSeconds)
if (loco.ThrottlePercent < 1 && Math.Abs(loco.SpeedMpS) < 0.05 && (loco.Direction == Direction.N || Math.Abs(parentTrain.MUReverserPercent) <= 1))
{
// check if train still on turntable
- if (!WorldLocation.Within(parentTrain.FrontTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (!parentTurntable.CheckOnSection(parentTrain.FrontTDBTraveller))
{
trainOnTable.SetFrontState(false);
parentTrain.Simulator.Confirmer.Information("Front of train slipped off table");
}
- if (!WorldLocation.Within(parentTrain.RearTDBTraveller.WorldLocation, parentTurntable.WorldPosition.WorldLocation, parentTurntable.Length / 2))
+ if (!parentTurntable.CheckOnSection(parentTrain.RearTDBTraveller))
{
trainOnTable.SetBackState(false);
parentTrain.Simulator.Confirmer.Information("Rear of train slipped off table");
diff --git a/Source/Orts.Simulation/Simulation/Turntables.cs b/Source/Orts.Simulation/Simulation/Turntables.cs
index b02b10999f..5d94760ff6 100644
--- a/Source/Orts.Simulation/Simulation/Turntables.cs
+++ b/Source/Orts.Simulation/Simulation/Turntables.cs
@@ -868,7 +868,30 @@ public override bool CheckMovingTableAligned(Train train, bool forward)
return false;
}
-
+ ///
+ /// Check if train position is on turntable track section
+ ///
+
+ public bool CheckOnSection(Traveller trainPosition)
+ {
+ bool onTable = false;
+ int nodeIndex = -1;
+
+ for (int inode = 0; inode < MyTrackNodesIndex.Length && nodeIndex == -1; inode++)
+ {
+ if (MyTrackNodesIndex[inode] == trainPosition.TrackNodeIndex)
+ {
+ nodeIndex = inode;
+ }
+ }
+
+ if (nodeIndex >= 0)
+ {
+ onTable = (trainPosition.TrackVectorSectionIndex == MyTrVectorSectionsIndex[nodeIndex]);
+ }
+
+ return (onTable);
+ }
///
/// PerformUpdateActions: actions to be performed at every animation step