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