static void Postfix(LocoControllerSteam __instance, float position) { TrainCar currentCar = __instance.GetComponent <TrainCar>(); TrainCar targetCar = null; Trainset trainset = null; if (PlayerManager.Car != null && PlayerManager.Car.trainset != null) { targetCar = PlayerManager.Car; trainset = PlayerManager.Car.trainset; } if (currentCar == null || targetCar == null || !targetCar.Equals(currentCar) || trainset == null || trainset.cars.Count < 2) { return; } List <TrainCar> trainsetCars = trainset.cars; for (int i = 0; i < trainsetCars.Count; i++) { TrainCar car = trainsetCars[i]; if (targetCar.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { if (GetCarsBehind(PlayerManager.Car).Contains(car)) { if (GetCarsInFrontOf(car).Contains(PlayerManager.Car)) { steamController.SetReverser(position); } else { steamController.SetReverser(position * -1f); } } else if (GetCarsInFrontOf(PlayerManager.Car).Contains(car)) { if (GetCarsBehind(car).Contains(PlayerManager.Car)) { steamController.SetReverser(position); } else { steamController.SetReverser(position * -1f); } } } } } }
static void Postfix(LocoControllerSteam __instance) { var tractionTorqueCurve = new AnimationCurve(); tractionTorqueCurve.AddKey(0f, 1f); tractionTorqueCurve.AddKey(50f, 0.85f); tractionTorqueCurve.AddKey(150f, 0f); __instance.tractionTorqueCurve = tractionTorqueCurve; __instance.tractionTorqueMult *= 1.3f; }
static void Postfix(LocoControllerSteam __instance, float throttle) { TrainCar currentCar = __instance.GetComponent <TrainCar>(); TrainCar targetCar = null; Trainset trainset = null; if (PlayerManager.Car != null && PlayerManager.Car.trainset != null) { targetCar = PlayerManager.Car; trainset = PlayerManager.Car.trainset; } if (currentCar == null || targetCar == null || !targetCar.Equals(currentCar) || trainset == null || trainset.cars.Count < 2) { return; } List <TrainCar> trainsetCars = trainset.cars; for (int i = 0; i < trainsetCars.Count; i++) { TrainCar car = trainsetCars[i]; if (targetCar.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetThrottle(throttle); } } } }
static void OnUpdate(UnityModManager.ModEntry mod, float delta) { // Can we set/unset UnityModManager.ModEntry.OnUpdate dynamically instead? if (!mod.Enabled) { return; } if (!listenersSetup) { // Gotta wait until we are loaded until registering the listeners if (LoadingScreenManager.IsLoading || !WorldStreamingInit.IsLoaded || !InventoryStartingItems.itemsLoaded) { return; } Grabber grab = PlayerManager.PlayerTransform.GetComponentInChildren <Grabber>(); grab.Grabbed += OnItemGrabbedRightNonVR; grab.Released += OnItemUngrabbedRightNonVR; SingletonBehaviour <Inventory> .Instance.ItemAddedToInventory += OnItemAddedToInventory; mod.Logger.Log("Listeners have been set up."); listenersSetup = true; } // For some reason the axis defaults to 50% on loss of focus. Stop any inputs when that happens hasFocusPrev = hasFocus; hasFocus = Application.isFocused; if (hasFocus) { // Get remote or local loco LocoControllerBase locoController = null; if (HoldingLocoRoCo != null) { // Go get some private fields from the currently held locomotive remote bool isPoweredOn = (bool)typeof(LocomotiveRemoteController).GetField("isPoweredOn", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HoldingLocoRoCo);; float lostSignalSecondsLeft = (float)typeof(LocomotiveRemoteController).GetField("lostSignalSecondsLeft", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HoldingLocoRoCo); // Implement the logic for understanding if the pairedLocomotive is valid. // This is normally done in the LocomotiveRemoteController.Transmit method but is easier to do it here so we can re-use the analogue input logic. if (isPoweredOn && lostSignalSecondsLeft == 0f) { locoController = (LocoControllerBase)typeof(LocomotiveRemoteController).GetField("pairedLocomotive", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HoldingLocoRoCo); } } else { locoController = PlayerManager.Car?.GetComponent <LocoControllerBase>(); } // Do the actual updating if (locoController != null) { throttleInput.SetItem(config.Throttle, locoController.SetThrottle); reverserInput.SetItem(config.Reverser, locoController.SetReverser); trainBrakeInput.SetItem(config.TrainBrake, locoController.SetBrake); independentBrakeInput.SetItem(config.IndependentBrake, locoController.SetIndependentBrake); if (locoController.GetType().Name.Equals("LocoControllerSteam")) { // All the steam loco stuff really doesnt like being set // Visuals dont update but the logic is correct ;( LocoControllerSteam locoControllerSteam = locoController as LocoControllerSteam; // Whistle resets every sim tick so just override it WhistleInput.SetItem(config.Whistle, locoControllerSteam.SetWhistle, 0f); fireDoorInput.SetItem(config.FireDoor, locoControllerSteam.SetFireDoorOpen); InjectorInput.SetItem(config.Injector, locoControllerSteam.SetInjector); DraftInput.SetItem(config.Draft, locoControllerSteam.SetDraft); BlowerInput.SetItem(config.Blower, locoControllerSteam.SetBlower); SanderValveInput.SetItem(config.SanderValve, locoControllerSteam.SetSanderValve); SteamReleaseInput.SetItem(config.SteamRelease, locoControllerSteam.SetSteamReleaser); WaterDumpInput.SetItem(config.WaterDump, locoControllerSteam.SetWaterDump); } } } }
static IEnumerator <object> AttachListeners() { yield return(null); DV.CabControls.ControlImplBase sanderCtrl = instance.sanderValveObj.GetComponent <DV.CabControls.ControlImplBase>(); sanderCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetSanderValve(e.newValue); } } } }); DV.CabControls.ControlImplBase blowerCtrl = instance.blowerValveObj.GetComponent <DV.CabControls.ControlImplBase>(); blowerCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetBlower(e.newValue); } } } }); DV.CabControls.ControlImplBase injectorCtrl = instance.injectorValveObj.GetComponent <DV.CabControls.ControlImplBase>(); injectorCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetInjector(e.newValue); } } } }); DV.CabControls.ControlImplBase waterDumpCtrl = instance.waterDumpValveObj.GetComponent <DV.CabControls.ControlImplBase>(); waterDumpCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetWaterDump(e.newValue); } } } }); DV.CabControls.ControlImplBase steamReleaseCtrl = instance.steamReleaserValveObj.GetComponent <DV.CabControls.ControlImplBase>(); steamReleaseCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetSteamReleaser(e.newValue); } } } }); DV.CabControls.ControlImplBase draftPullerCtrl = instance.draftPullerObj.GetComponent <DV.CabControls.ControlImplBase>(); draftPullerCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetDraft(e.newValue); } } } }); DV.CabControls.ControlImplBase fireDoorLeverCtrl = instance.fireDoorLeverObj.GetComponent <DV.CabControls.ControlImplBase>(); fireDoorLeverCtrl.ValueChanged += (e => { if (PlayerManager.Car == null || PlayerManager.Car.trainset == null) { return; } for (int i = 0; i < PlayerManager.Car.trainset.cars.Count; i++) { TrainCar car = PlayerManager.Car.trainset.cars[i]; if (PlayerManager.Car.Equals(car)) { continue; } if (car.carType == TrainCarType.LocoSteamHeavy) { LocoControllerSteam steamController = car.GetComponent <LocoControllerSteam>(); if (steamController) { steamController.SetFireDoorOpen(e.newValue); } } } }); }