internal static void JumpTrain(Train train, int stationIndex)
{
train.StationState = TrainStopState.Pending;
int stopIndex = Game.GetStopIndex(stationIndex, train.Cars.Length);
if (stopIndex >= 0)
{
if (train == PlayerTrain)
{
if (train.Plugin != null)
{
train.Plugin.BeginJump((OpenBveApi.Runtime.InitializationModes)Game.TrainStart);
}
}
for (int h = 0; h < train.Cars.Length; h++)
{
train.Cars[h].Specs.CurrentSpeed = 0.0;
}
double d = Game.Stations[stationIndex].Stops[stopIndex].TrackPosition - train.Cars[0].FrontAxle.Follower.TrackPosition + train.Cars[0].FrontAxlePosition - 0.5 * train.Cars[0].Length;
if (train == PlayerTrain)
{
TrackManager.SuppressSoundEvents = true;
}
while (d != 0.0)
{
double x;
if (Math.Abs(d) > 1.0)
{
x = (double)Math.Sign(d);
}
else
{
x = d;
}
for (int h = 0; h < train.Cars.Length; h++)
{
TrainManager.MoveCar(train, h, x, 0.0);
}
if (Math.Abs(d) >= 1.0)
{
d -= x;
}
else
{
break;
}
}
if (train == PlayerTrain)
{
TrainManager.UnderailTrains();
TrackManager.SuppressSoundEvents = false;
}
if (train.Specs.CurrentEmergencyBrake.Driver)
{
TrainManager.ApplyNotch(train, 0, false, 0, true);
}
else
{
TrainManager.ApplyNotch(train, 0, false, train.Specs.MaximumBrakeNotch, false);
TrainManager.ApplyAirBrakeHandle(train, TrainManager.AirBrakeHandleState.Service);
}
if (Game.Sections.Length > 0)
{
Game.UpdateSection(Game.Sections.Length - 1);
}
if (train == PlayerTrain)
{
if (Game.CurrentScore.ArrivalStation <= stationIndex)
{
Game.CurrentScore.ArrivalStation = stationIndex + 1;
}
}
if (train == PlayerTrain)
{
if (Game.Stations[stationIndex].ArrivalTime >= 0.0)
{
Game.SecondsSinceMidnight = Game.Stations[stationIndex].ArrivalTime;
}
else if (Game.Stations[stationIndex].DepartureTime >= 0.0)
{
Game.SecondsSinceMidnight = Game.Stations[stationIndex].DepartureTime - Game.Stations[stationIndex].StopTime;
}
}
for (int i = 0; i < train.Cars.Length; i++)
{
train.Cars[i].Specs.AnticipatedLeftDoorsOpened = Game.Stations[stationIndex].OpenLeftDoors;
train.Cars[i].Specs.AnticipatedRightDoorsOpened = Game.Stations[stationIndex].OpenRightDoors;
}
if (train == PlayerTrain)
{
Game.CurrentScore.DepartureStation = stationIndex;
Game.CurrentInterface = Game.InterfaceType.Normal;
Game.Messages = new Game.Message[] { };
}
ObjectManager.UpdateAnimatedWorldObjects(0.0, true);
TrainManager.UpdateTrainObjects(0.0, true);
if (train == PlayerTrain)
{
if (train.Plugin != null)
{
train.Plugin.EndJump();
}
}
}
}
}