From e2ad93eef74f014043a9e88526f7c0205295bd91 Mon Sep 17 00:00:00 2001 From: Csantucci Date: Thu, 9 Mar 2023 12:08:03 +0100 Subject: [PATCH] Bug fix for https://bugs.launchpad.net/or/+bug/1848878 AI train WP restart events don't work after save --- Source/Orts.Simulation/Simulation/AIs/AIAuxAction.cs | 5 ++++- Source/Orts.Simulation/Simulation/AIs/AITrain.cs | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/Orts.Simulation/Simulation/AIs/AIAuxAction.cs b/Source/Orts.Simulation/Simulation/AIs/AIAuxAction.cs index 6a8d1c10b9..7ea6467178 100644 --- a/Source/Orts.Simulation/Simulation/AIs/AIAuxAction.cs +++ b/Source/Orts.Simulation/Simulation/AIs/AIAuxAction.cs @@ -680,6 +680,7 @@ public class AIAuxActionsRef : AuxActionRef public float RequiredSpeedMpS; public float RequiredDistance; public int Delay; + public int OriginalDelay; public int EndSignalIndex { get; protected set; } public AUX_ACTION NextAction = AUX_ACTION.NONE; @@ -888,6 +889,7 @@ public AIActionWPRef(Train thisTrain, BinaryReader inf) : base (thisTrain, inf) { Delay = inf.ReadInt32(); + OriginalDelay = inf.ReadInt32(); NextAction = AUX_ACTION.WAITING_POINT; #if WITH_PATH_DEBUG File.AppendAllText(@"C:\temp\checkpath.txt", "\tRestore one WPAuxAction" + @@ -915,6 +917,7 @@ public override void save(BinaryWriter outf, int cnt) #endif base.save(outf, cnt); outf.Write(Delay); + outf.Write(OriginalDelay); } public override AIActionItem Handler(params object[] list) @@ -2733,4 +2736,4 @@ public override AITrain.AI_MOVEMENT_STATE ProcessAction(Train thisTrain, int pre } #endregion -} \ No newline at end of file +} diff --git a/Source/Orts.Simulation/Simulation/AIs/AITrain.cs b/Source/Orts.Simulation/Simulation/AIs/AITrain.cs index fc0924932e..193f73fd6e 100644 --- a/Source/Orts.Simulation/Simulation/AIs/AITrain.cs +++ b/Source/Orts.Simulation/Simulation/AIs/AITrain.cs @@ -4027,6 +4027,7 @@ public void BuildWaitingPointList(float clearingDistanceM) RandomizedWPDelay(ref randomizedDelay); } action.SetDelay(randomizedDelay); + action.OriginalDelay = action.Delay; AuxActionsContain.Add(action); if (insertSigDelegate && (waitingPoint[2] != 60002) && signalIndex[iWait] > -1) { @@ -6685,7 +6686,7 @@ public void RestartWaitingTrain(RestartWaitingTrain restartWaitingTrain) var matchingWPDelay = restartWaitingTrain.MatchingWPDelay; int presentTime = Convert.ToInt32(Math.Floor(Simulator.ClockTime)); var roughActualDepart = presentTime + delayToRestart; - if (MovementState == AITrain.AI_MOVEMENT_STATE.HANDLE_ACTION && (((nextActionInfo as AuxActionWPItem).ActionRef as AIActionWPRef).Delay == matchingWPDelay || + if (MovementState == AITrain.AI_MOVEMENT_STATE.HANDLE_ACTION && (((nextActionInfo as AuxActionWPItem).ActionRef as AIActionWPRef).OriginalDelay == matchingWPDelay || (AuxActionsContain.specRequiredActions.Count > 0 && ((AuxActSigDelegate)(AuxActionsContain.specRequiredActions).First.Value).currentMvmtState == AITrain.AI_MOVEMENT_STATE.HANDLE_ACTION && (((AuxActSigDelegate)(AuxActionsContain.specRequiredActions).First.Value).ActionRef as AIActSigDelegateRef).Delay == matchingWPDelay))) {