From 5c98e2f71d01ca65fab4b3752e9399e1195c44c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20GNIEWEK?= Date: Wed, 24 Aug 2022 16:19:23 +0200 Subject: [PATCH] Fix for crash --- .../Simulation/Physics/Train.cs | 2 +- .../Simulation/Signalling/SignalObject.cs | 38 +++++++++++-------- .../Simulation/Signalling/Signals.cs | 4 +- .../Signalling/SpeedPostWorldObject.cs | 5 +++ 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Source/Orts.Simulation/Simulation/Physics/Train.cs b/Source/Orts.Simulation/Simulation/Physics/Train.cs index 06c51e8fc5..a9f62863c1 100644 --- a/Source/Orts.Simulation/Simulation/Physics/Train.cs +++ b/Source/Orts.Simulation/Simulation/Physics/Train.cs @@ -8173,7 +8173,7 @@ public void UpdateManualMode(int signalObjectIndex) bool hasEndSignal = false; // ends with cleared signal int sectionWithSignalIndex = 0; - SignalObject previousSignal = new SignalObject(signalRef); + SignalObject previousSignal = new SignalObject(signalRef, SignalObjectType.Signal); for (int iindex = 0; iindex < newRoute.Count && !endWithSignal; iindex++) { diff --git a/Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs b/Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs index 92597bbc36..92f59141d7 100644 --- a/Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs +++ b/Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs @@ -90,20 +90,7 @@ public enum Permission public int thisRef; // This signal's reference. public int direction; // Direction facing on track - public SignalObjectType Type - { - get - { - if (SignalHeads.Exists(x => x.Function.MstsFunction != MstsSignalFunction.SPEED)) - { - return SignalObjectType.Signal; - } - else - { - return SpeedPostWorldObject != null ? SignalObjectType.SpeedPost : SignalObjectType.SpeedSignal; - } - } - } + public SignalObjectType Type { get; protected set; } public List SignalHeads = new List(); public int SignalNumClearAhead_MSTS = -2; // Overall maximum SignalNumClearAhead over all heads (MSTS calculation) @@ -203,10 +190,12 @@ public int trItem /// /// Constructor for empty item /// - public SignalObject(Signals signalReference) + public SignalObject(Signals signalReference, SignalObjectType type) { signalRef = signalReference; + Type = type; + LockedTrains = new List>(); foreach (SignalFunction function in signalRef.SignalFunctions.Values) @@ -222,7 +211,18 @@ public SignalObject(Signals signalReference) public SignalObject(SignalObject copy) { signalRef = copy.signalRef; - WorldObject = new SignalWorldObject(copy.WorldObject); + Type = copy.Type; + switch (Type) + { + case SignalObjectType.Signal: + case SignalObjectType.SpeedSignal: + WorldObject = new SignalWorldObject(copy.WorldObject); + break; + + case SignalObjectType.SpeedPost: + SpeedPostWorldObject = new SpeedPostWorldObject(copy.SpeedPostWorldObject); + break; + } trackNode = copy.trackNode; LockedTrains = new List>(); @@ -1881,6 +1881,12 @@ public void SetSignalType(SignalConfigurationFile sigCFG) { sigHead.SetSignalType(trItems, sigCFG); } + + if (Type == SignalObjectType.Signal + && !SignalHeads.Exists(x => x.Function.MstsFunction != MstsSignalFunction.SPEED)) + { + Type = SignalObjectType.SpeedSignal; + } } public void Initialize() diff --git a/Source/Orts.Simulation/Simulation/Signalling/Signals.cs b/Source/Orts.Simulation/Simulation/Signalling/Signals.cs index c1b681d5b5..440638f899 100644 --- a/Source/Orts.Simulation/Simulation/Signalling/Signals.cs +++ b/Source/Orts.Simulation/Simulation/Signalling/Signals.cs @@ -1010,7 +1010,7 @@ private int AddSignal(int trackNode, int nodeIndx, SignalItem sigItem, int TDBRe { validSignal = true; - SignalObjects[foundSignals] = new SignalObject(this); + SignalObjects[foundSignals] = new SignalObject(this, SignalObjectType.Signal); SignalObjects[foundSignals].direction = (int)sigItem.Direction; SignalObjects[foundSignals].trackNode = trackNode; SignalObjects[foundSignals].trRefIndex = nodeIndx; @@ -1056,7 +1056,7 @@ private int AddSignal(int trackNode, int nodeIndx, SignalItem sigItem, int TDBRe /// private int AddSpeed(int trackNode, int nodeIndx, SpeedPostItem speedItem, int TDBRef, TrackSectionsFile tsectiondat, TrackDatabaseFile tdbfile) { - SignalObjects[foundSignals] = new SignalObject(this); + SignalObjects[foundSignals] = new SignalObject(this, SignalObjectType.SpeedPost); SignalObjects[foundSignals].direction = 0; // preset - direction not yet known // SignalObjects[foundSignals].trackNode = trackNode; SignalObjects[foundSignals].trRefIndex = nodeIndx; diff --git a/Source/Orts.Simulation/Simulation/Signalling/SpeedPostWorldObject.cs b/Source/Orts.Simulation/Simulation/Signalling/SpeedPostWorldObject.cs index b5d1fbf7c2..8399e842dc 100644 --- a/Source/Orts.Simulation/Simulation/Signalling/SpeedPostWorldObject.cs +++ b/Source/Orts.Simulation/Simulation/Signalling/SpeedPostWorldObject.cs @@ -12,5 +12,10 @@ public SpeedPostWorldObject(SpeedPostObj speedPostItem) // get filename in Uppercase SFileName = Path.GetFileName(speedPostItem.FileName).ToUpperInvariant(); } + + public SpeedPostWorldObject(SpeedPostWorldObject other) + { + SFileName = other.SFileName; + } } }