static private MoveCar ( Train Train, int CarIndex, double Delta, double TimeElapsed ) : void | ||
Train | Train | |
CarIndex | int | |
Delta | double | |
TimeElapsed | double | |
return | void |
internal static void MoveCar(Train Train, int CarIndex, double Delta, double TimeElapsed)
{
if (Train.State != TrainState.Disposed)
{
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].FrontAxle.Follower, Train.Cars[CarIndex].FrontAxle.Follower.TrackPosition + Delta, true, true);
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].FrontBogie.FrontAxle.Follower, Train.Cars[CarIndex].FrontBogie.FrontAxle.Follower.TrackPosition + Delta, true, true);
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].FrontBogie.RearAxle.Follower, Train.Cars[CarIndex].FrontBogie.RearAxle.Follower.TrackPosition + Delta, true, true);
if (Train.State != TrainState.Disposed)
{
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].RearAxle.Follower, Train.Cars[CarIndex].RearAxle.Follower.TrackPosition + Delta, true, true);
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].RearBogie.FrontAxle.Follower, Train.Cars[CarIndex].RearBogie.FrontAxle.Follower.TrackPosition + Delta, true, true);
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].RearBogie.RearAxle.Follower, Train.Cars[CarIndex].RearBogie.RearAxle.Follower.TrackPosition + Delta, true, true);
if (Train.State != TrainState.Disposed)
{
TrackManager.UpdateTrackFollower(ref Train.Cars[CarIndex].BeaconReceiver, Train.Cars[CarIndex].BeaconReceiver.TrackPosition + Delta, true, true);
}
}
}
}
/// <summary>Jumps a train to a new station</summary> /// <param name="train">The train</param> /// <param name="stationIndex">The zero-based index of the station</param> internal static void JumpTrain(Train train, int stationIndex) { if (train == PlayerTrain) { for (int i = 0; i < ObjectManager.AnimatedWorldObjects.Length; i++) { if (ObjectManager.AnimatedWorldObjects[i].FollowsTrack) { //Track followers should be reset if we jump between stations ObjectManager.AnimatedWorldObjects[i].FrontAxleFollower.TrackPosition = ObjectManager.AnimatedWorldObjects[i].TrackPosition + ObjectManager.AnimatedWorldObjects[i].FrontAxlePosition; ObjectManager.AnimatedWorldObjects[i].FrontAxleFollower.TrackPosition = ObjectManager.AnimatedWorldObjects[i].TrackPosition + ObjectManager.AnimatedWorldObjects[i].RearAxlePosition; ObjectManager.AnimatedWorldObjects[i].FrontAxleFollower.UpdateWorldCoordinates(false); ObjectManager.AnimatedWorldObjects[i].RearAxleFollower.UpdateWorldCoordinates(false); } } } train.StationState = TrainStopState.Jumping; 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].FrontAxle.Position - 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(); } } train.StationState = TrainStopState.Pending; } }