From 779a819339600a94b14ef49dd4eab047a8b78c58 Mon Sep 17 00:00:00 2001 From: roeter Date: Sun, 22 Jan 2023 11:59:58 +0100 Subject: [PATCH] Correction for player locomotive on turntable --- .../Simulation/Timetables/TTTurntable.cs | 17 ++++++------- .../Orts.Simulation/Simulation/Turntables.cs | 25 ++++++++++++++++++- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs b/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs index b44207df59..0ad3e3e090 100644 --- a/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs +++ b/Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs @@ -1847,16 +1847,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"); @@ -1871,12 +1870,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"); @@ -1904,7 +1903,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"); @@ -1913,7 +1912,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"); @@ -1928,12 +1927,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 acda2c43e6..a6ee5d7a9e 100644 --- a/Source/Orts.Simulation/Simulation/Turntables.cs +++ b/Source/Orts.Simulation/Simulation/Turntables.cs @@ -854,7 +854,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