Пример #1
0
        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);
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
                    }
                }
            }
        }
Пример #5
0
        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);
                        }
                    }
                }
            });
        }