Skip to content

Commit 0f744b3

Browse files
Various traincar operations windows fixes
1 parent e5b8414 commit 0f744b3

File tree

5 files changed

+109
-40
lines changed

5 files changed

+109
-40
lines changed

Source/Orts.Simulation/Simulation/Physics/Train.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,13 +1522,11 @@ public void ReverseCars()
15221522
// Reverse brake hose connections and angle cocks
15231523
for (var i = 0; i < Cars.Count; i++)
15241524
{
1525-
var ac = Cars[i].BrakeSystem.AngleCockAOpen;
1526-
Cars[i].BrakeSystem.AngleCockAOpen = Cars[i].BrakeSystem.AngleCockBOpen;
1527-
Cars[i].BrakeSystem.AngleCockBOpen = ac;
1528-
if (i == Cars.Count - 1)
1529-
Cars[i].BrakeSystem.FrontBrakeHoseConnected = false;
1530-
else
1531-
Cars[i].BrakeSystem.FrontBrakeHoseConnected = Cars[i + 1].BrakeSystem.FrontBrakeHoseConnected;
1525+
var bs = Cars[i].BrakeSystem;
1526+
(bs.AngleCockBOpen, bs.AngleCockAOpen) = (bs.AngleCockAOpen, bs.AngleCockBOpen);
1527+
(bs.AngleCockBOpenAmount, bs.AngleCockAOpenAmount) = (bs.AngleCockAOpenAmount, bs.AngleCockBOpenAmount);
1528+
(bs.AngleCockBOpenTime, bs.AngleCockAOpenTime) = (bs.AngleCockAOpenTime, bs.AngleCockBOpenTime);
1529+
(bs.RearBrakeHoseConnected, bs.FrontBrakeHoseConnected) = (bs.FrontBrakeHoseConnected, bs.RearBrakeHoseConnected);
15321530
}
15331531
// Reverse the actual order of the cars in the train.
15341532
Cars.Reverse();

Source/RunActivity/Viewer3D/Popups/TrainCarOperationsViewerWindow.cs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@
2525
using Orts.Simulation.RollingStocks.SubSystems.Brakes;
2626
using Orts.Simulation.RollingStocks.SubSystems.Brakes.MSTS;
2727
using Orts.Simulation.RollingStocks.SubSystems.PowerSupplies;
28-
using Orts.Viewer3D.RollingStock;
2928
using ORTS.Common;
3029
using ORTS.Common.Input;
31-
using ORTS.Scripting.Api;
3230
using System;
3331
using System.Collections.Generic;
3432
using System.IO;
@@ -570,25 +568,33 @@ class buttonCouplerFront : Image
570568
readonly Viewer Viewer;
571569
readonly TrainCarOperationsViewerWindow TrainCarViewer;
572570
readonly int CarPosition;
573-
readonly bool First;
574-
readonly TrainCar Car;
575571
public buttonCouplerFront(int x, int y, int size, Viewer viewer, TrainCar car, int carPosition)
576572
: base(x, y, size, size)
577573
{
578574
Viewer = viewer;
579575
TrainCarViewer = Viewer.TrainCarOperationsViewerWindow;
580576
CarPosition = carPosition;
581-
Car = car;
582-
First = car == Viewer.PlayerTrain.Cars.First();
583-
Texture = First ? CouplerFront : Car.WagonType == MSTSWagon.WagonTypes.Tender ? CouplerNotAvailable : Coupler;
577+
bool disableCouplers = false;
578+
bool first = car == Viewer.PlayerTrain.Cars.First();
579+
580+
var isSteam = Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive;
581+
var isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
582+
if (isSteam || isTender)
583+
{
584+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
585+
disableCouplers = isSteam ? carFlipped : !carFlipped;
586+
}
587+
Texture = first ? CouplerFront : disableCouplers ? CouplerNotAvailable : Coupler;
584588
Source = new Rectangle(0, 0, size, size);
585-
Click += new Action<Control, Point>(TrainCarOperationsCouplerFront_Click);
589+
590+
if (!(first || disableCouplers))
591+
{
592+
Click += new Action<Control, Point>(TrainCarOperationsCouplerFront_Click);
593+
}
586594
}
587595

588596
void TrainCarOperationsCouplerFront_Click(Control arg1, Point arg2)
589597
{
590-
if (First || Car.WagonType == MSTSWagon.WagonTypes.Tender) return;
591-
592598
if (Viewer.Simulator.TimetableMode)
593599
{
594600
Viewer.Simulator.Confirmer.Information(Viewer.Catalog.GetString("In Timetable Mode uncoupling using this window is not allowed"));
@@ -607,22 +613,32 @@ class buttonCouplerRear : Image
607613
{
608614
readonly Viewer Viewer;
609615
readonly int CarPosition;
610-
readonly bool Last;
611616
public buttonCouplerRear(int x, int y, int size, Viewer viewer, TrainCar car, int carPosition)
612617
: base(x, y, size, size)
613618
{
614619
Viewer = viewer;
615620
CarPosition = carPosition;
616-
Last = car == Viewer.PlayerTrain.Cars.Last();
617-
Texture = Last ? CouplerRear : Coupler;
621+
bool disableCouplers = false;
622+
bool last = car == Viewer.PlayerTrain.Cars.Last();
623+
624+
var isSteamAndHasTender = (Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive) &&
625+
(carPosition + 1 < Viewer.PlayerTrain.Cars.Count) && (Viewer.PlayerTrain.Cars[carPosition + 1].WagonType == MSTSWagon.WagonTypes.Tender);
626+
var isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
627+
if (isSteamAndHasTender || isTender)
628+
{
629+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
630+
disableCouplers = isSteamAndHasTender ? !carFlipped : carFlipped;
631+
}
632+
Texture = last ? CouplerRear : disableCouplers ? CouplerNotAvailable : Coupler;
618633
Source = new Rectangle(0, 0, size, size);
619-
Click += new Action<Control, Point>(TrainCarOperationsCouplerRear_Click);
634+
if (!(last || disableCouplers))
635+
{
636+
Click += new Action<Control, Point>(TrainCarOperationsCouplerRear_Click);
637+
}
620638
}
621639

622640
void TrainCarOperationsCouplerRear_Click(Control arg1, Point arg2)
623641
{
624-
if (Last) return;
625-
626642
if (Viewer.Simulator.TimetableMode)
627643
{
628644
Viewer.Simulator.Confirmer.Information(Viewer.Catalog.GetString("In Timetable Mode uncoupling using this window is not allowed"));

Source/RunActivity/Viewer3D/Popups/TrainCarOperationsWindow.cs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public class TrainCarOperationsWindow : Window
9393
public int LocalScrollPosition;
9494
public int SelectedCarPosition;
9595
const int SymbolSize = 16;
96+
public bool UpdateFlipped;
9697

9798
public int CurrentDisplaySizeY;
9899
public bool IsFullScreen;
@@ -424,11 +425,11 @@ void AddSpace()
424425
AddSpace();
425426

426427
// Front coupler
427-
line.Add(new buttonCouplerFront(0, 0, SymbolSize, Owner.Viewer, car));
428+
line.Add(new buttonCouplerFront(0, 0, SymbolSize, Owner.Viewer, car, carPosition));
428429
// Car label
429430
line.Add(carLabel);
430431
// Rear coupler
431-
line.Add(new buttonCouplerRear(0, 0, SymbolSize, Owner.Viewer, car));
432+
line.Add(new buttonCouplerRear(0, 0, SymbolSize, Owner.Viewer, car, carPosition));
432433
AddSpace();
433434

434435
// Rear angle cock
@@ -635,6 +636,7 @@ public override void PrepareFrame(ElapsedTime elapsedTime, bool updateFull)
635636

636637
LastPlayerTrainCars = Owner.Viewer.PlayerTrain.Cars.Count;
637638
if (Owner.Viewer.PlayerLocomotive != null) LastPlayerLocomotiveFlippedState = Owner.Viewer.PlayerLocomotive.Flipped;
639+
UpdateFlipped = LastPlayerLocomotiveFlippedState;
638640
}
639641
// Updates power supply status
640642
else if (SelectedCarPosition <= CarPositionVisible && SelectedCarPosition == CarPosition)
@@ -666,12 +668,19 @@ public override void PrepareFrame(ElapsedTime elapsedTime, bool updateFull)
666668
carOperations.CarOperationChanged = carOperations.Visible && carOperations.CarOperationChanged;
667669
}
668670

671+
if (UpdateFlipped)
672+
{
673+
UpdateFlipped = false;
674+
Owner.Viewer.FrontCamera.IsCameraFront = false;
675+
Layout();
676+
}
677+
669678
if (CarPositionChanged || (trainCarWebpage != null && CarPosition != trainCarViewer.CarPosition && trainCarWebpage.Connections > 0))
670679
{
671680
// Required to scroll the main window from the web version
672681
UpdateTrainCarOperation = true;
673682
CarPosition = trainCarViewer.CarPosition;
674-
SelectedCarPosition = CarPositionChanged ? CarPosition : SelectedCarPosition;
683+
SelectedCarPosition = CarPositionChanged ? CarPosition : Owner.Viewer.PlayerTrain.Cars.Count > SelectedCarPosition ? SelectedCarPosition : CarPosition;
675684
LabelTop = LabelPositionTop[SelectedCarPosition];
676685
Layout();
677686
localScrollLayout(SelectedCarPosition);
@@ -771,26 +780,44 @@ class buttonCouplerFront : Image
771780
{
772781
readonly Viewer Viewer;
773782
readonly bool First;
774-
public buttonCouplerFront(int x, int y, int size, Viewer viewer, TrainCar car)
783+
readonly bool DisableCouplers;
784+
public buttonCouplerFront(int x, int y, int size, Viewer viewer, TrainCar car, int carPosition)
775785
: base(x, y, size, size)
776786
{
777787
Viewer = viewer;
778788
First = car == Viewer.PlayerTrain.Cars.First();
779-
var isTender = car.WagonType == MSTSWagon.WagonTypes.Tender;
780-
Texture = First ? CouplerFront : isTender ? CouplerNotAvailable : Coupler;
789+
var isSteam = Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive;
790+
var isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
791+
792+
if (isSteam || isTender)
793+
{
794+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
795+
DisableCouplers = isSteam ? carFlipped : !carFlipped;
796+
}
797+
Texture = First ? CouplerFront : DisableCouplers ? CouplerNotAvailable : Coupler;
781798
Source = new Rectangle(0, 0, size, size);
782799
}
783800
}
784801
class buttonCouplerRear : Image
785802
{
786803
readonly Viewer Viewer;
787804
readonly bool Last;
788-
public buttonCouplerRear(int x, int y, int size, Viewer viewer, TrainCar car)
805+
readonly bool DisableCouplers;
806+
public buttonCouplerRear(int x, int y, int size, Viewer viewer, TrainCar car, int carPosition)
789807
: base(x, y, size, size)
790808
{
791809
Viewer = viewer;
792810
Last = car == Viewer.PlayerTrain.Cars.Last();
793-
Texture = Last ? CouplerRear : Coupler;
811+
var isSteamAndHasTender = (Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive) &&
812+
(carPosition + 1 < Viewer.PlayerTrain.Cars.Count) && (Viewer.PlayerTrain.Cars[carPosition + 1].WagonType == MSTSWagon.WagonTypes.Tender);
813+
var isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
814+
815+
if (isSteamAndHasTender || isTender)
816+
{
817+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
818+
DisableCouplers = isSteamAndHasTender ? !carFlipped : carFlipped;
819+
}
820+
Texture = Last ? CouplerRear : DisableCouplers ? CouplerNotAvailable : Coupler;
794821
Source = new Rectangle(0, 0, size, size);
795822
}
796823
}

Source/RunActivity/Viewer3D/WebServices/TrainCarOperationsWebpage.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -349,15 +349,13 @@ private void fillStatus(OperationsStatus operationStatus)
349349
private string getCarId(TrainCar trainCar, int carPosition)
350350
{
351351
MSTSLocomotive locomotive = trainCar as MSTSLocomotive;
352+
MSTSWagon wagon = trainCar as MSTSWagon;
352353
var isDiesel = trainCar is MSTSDieselLocomotive;
353354
var isElectric = trainCar is MSTSElectricLocomotive;
354355
var isSteam = trainCar is MSTSSteamLocomotive;
355356
var isEngine = isDiesel || isElectric || isSteam;
356-
// Required by OSDCar.cs
357-
CurrentCarID = Viewer.PlayerTrain.Cars[TrainCarSelectedPosition].CarID;
358-
var wagonType = isEngine ?
359-
$" {Viewer.Catalog.GetString(locomotive.WagonType.ToString())}" + $":{Viewer.Catalog.GetString(locomotive.EngineType.ToString())}" :
360-
$" {Viewer.Catalog.GetString(trainCar.WagonType.ToString())}";
357+
var wagonType = isEngine ? $" {Viewer.Catalog.GetString(locomotive.WagonType.ToString())}" + $": {Viewer.Catalog.GetString(locomotive.EngineType.ToString())}"
358+
: $" {Viewer.Catalog.GetString(wagon.WagonType.ToString())}: {wagon.MainShapeFileName.Replace(".s", "").ToLower()}";
361359
return ($"{Viewer.Catalog.GetString("Car ID")} {(carPosition >= Viewer.PlayerTrain.Cars.Count ? " " : Viewer.PlayerTrain.Cars[carPosition].CarID + wagonType)}");
362360
}
363361

@@ -401,6 +399,17 @@ private void fillAndSendAsync(OperationsStatus statusCurrent, OperationsStatus s
401399
{
402400
all = true;
403401
}
402+
else
403+
{
404+
for (int i = 0; i < statusCurrent.AmountOfCars; i++)
405+
{
406+
if (!statusCurrent.CarId[0].Equals(statusPrevious.CarId[0]) ||
407+
!statusCurrent.CarIdColor[0].Equals(statusPrevious.CarIdColor[0]))
408+
{
409+
all = true;
410+
}
411+
}
412+
}
404413
}
405414

406415
operationsSend.Rows = statusCurrent.AmountOfCars;
@@ -618,12 +627,21 @@ private void fillStatusCouplerFront(int carPosition)
618627
TrainCar trainCar = Viewer.PlayerTrain.Cars[carPosition];
619628

620629
bool first = trainCar == Viewer.PlayerTrain.Cars.First();
630+
bool disableCouplers = false;
631+
bool isSteam = Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive;
632+
bool isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
633+
634+
if (isSteam || isTender)
635+
{
636+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
637+
disableCouplers = isSteam ? carFlipped : !carFlipped;
638+
}
621639

622640
StatusCurrent.Status[carPosition].Add(
623641
new OperationsStatus.Operation
624642
{
625-
Enabled = !first,
626-
Filename = first ? "TrainOperationsCouplerFront32.png" : "TrainOperationsCoupler32.png",
643+
Enabled = !(first || disableCouplers),
644+
Filename = first ? "TrainOperationsCouplerFront32.png" : disableCouplers ? "TrainOperationsCouplerNotAvailable32.png" : "TrainOperationsCoupler32.png",
627645
Functionname = "buttonCouplerFrontClick",
628646
CarPosition = carPosition
629647
});
@@ -707,12 +725,22 @@ private void fillStatusCouplerRear(int carPosition)
707725
TrainCar trainCar = Viewer.PlayerTrain.Cars[carPosition];
708726

709727
bool last = trainCar == Viewer.PlayerTrain.Cars.Last();
728+
var DisableCouplers = false;
729+
bool isSteamAndHasTender = (Viewer.PlayerTrain.Cars[carPosition] is MSTSSteamLocomotive) &&
730+
(carPosition + 1 < Viewer.PlayerTrain.Cars.Count) && (Viewer.PlayerTrain.Cars[carPosition + 1].WagonType == MSTSWagon.WagonTypes.Tender);
731+
var isTender = Viewer.PlayerTrain.Cars[carPosition].WagonType == MSTSWagon.WagonTypes.Tender;
732+
733+
if (isSteamAndHasTender || isTender)
734+
{
735+
var carFlipped = Viewer.PlayerTrain.Cars[carPosition].Flipped;
736+
DisableCouplers = isSteamAndHasTender ? !carFlipped : carFlipped;
737+
}
710738

711739
StatusCurrent.Status[carPosition].Add(
712740
new OperationsStatus.Operation
713741
{
714-
Enabled = !last,
715-
Filename = last ? "TrainOperationsCouplerRear32.png" : "TrainOperationsCoupler32.png",
742+
Enabled = !(last || DisableCouplers),
743+
Filename = last ? "TrainOperationsCouplerRear32.png" : DisableCouplers ? "TrainOperationsCouplerNotAvailable32.png" : "TrainOperationsCoupler32.png",
716744
Functionname = "buttonCouplerRearClick",
717745
CarPosition = carPosition
718746
});
5.61 KB
Loading

0 commit comments

Comments
 (0)