static void Prefix(StationLocoSpawner __instance, ref bool ___playerEnteredLocoSpawnRange, GameObject ___spawnTrackMiddleAnchor, List <TrainCar> ___spawnedLocos) { Transform playerTransform = PlayerManager.PlayerTransform; if (playerTransform == null || !SaveLoadController.carsAndJobsLoadingFinished) { return; } bool inRange = (double)(playerTransform.position - ___spawnTrackMiddleAnchor.transform.position).sqrMagnitude < (double)__instance.spawnLocoPlayerSqrDistanceFromTrack; if (inRange) { ___playerEnteredLocoSpawnRange = true; if (Main.boughtLoco) { var trainCarTypes = new List <TrainCarType>(); if (Main.boughtLocoIdx == 0) { trainCarTypes.Add(TrainCarType.LocoShunter); } else if (Main.boughtLocoIdx == 1) { trainCarTypes.Add(TrainCarType.LocoSteamHeavy); trainCarTypes.Add(TrainCarType.Tender); } List <TrainCar> trainCarList = CarSpawner.SpawnCarTypesOnTrack(trainCarTypes, __instance.locoSpawnTrack, 0.0, __instance.spawnRotationFlipped); Main.boughtLoco = false; if (trainCarList == null) { return; } } } }
private static bool Prefix(StationLocoSpawner __instance, GameObject ___spawnTrackMiddleAnchor, ref bool ___playerEnteredLocoSpawnRange, ref int ___nextLocoGroupSpawnIndex) { if (NetworkManager.IsClient() && !NetworkManager.IsHost()) { return(false); } else if (NetworkManager.IsHost()) { if (!SingletonBehaviour <NetworkPlayerManager> .Exists || !SingletonBehaviour <NetworkPlayerManager> .Instance) { return(false); } if (SingletonBehaviour <NetworkPlayerManager> .Instance.newPlayerConnecting) { return(false); } bool shouldSpawn = false; if (!SaveLoadController.carsAndJobsLoadingFinished) { return(false); } bool isHostInArea = (PlayerManager.PlayerTransform.position - ___spawnTrackMiddleAnchor.transform.position).sqrMagnitude < __instance.spawnLocoPlayerSqrDistanceFromTrack; if (!___playerEnteredLocoSpawnRange && isHostInArea) { ___playerEnteredLocoSpawnRange = true; shouldSpawn = true; } else if (!___playerEnteredLocoSpawnRange && !isHostInArea) { if (SingletonBehaviour <NetworkPlayerManager> .Instance.GetPlayers().Any(p => (p.transform.position - ___spawnTrackMiddleAnchor.transform.position).sqrMagnitude < __instance.spawnLocoPlayerSqrDistanceFromTrack)) { ___playerEnteredLocoSpawnRange = true; shouldSpawn = true; } } else if (___playerEnteredLocoSpawnRange) { if (SingletonBehaviour <NetworkPlayerManager> .Instance.GetPlayers().All(p => !((p.transform.position - ___spawnTrackMiddleAnchor.transform.position).sqrMagnitude < __instance.spawnLocoPlayerSqrDistanceFromTrack)) && !isHostInArea) { ___playerEnteredLocoSpawnRange = false; } } if (shouldSpawn) { List <Car> carsFullyOnTrack = __instance.locoSpawnTrack.logicTrack.GetCarsFullyOnTrack(); if (carsFullyOnTrack.Count != 0) { if (carsFullyOnTrack.Any((Car car) => CarTypes.IsLocomotive(car.carType))) { return(false); } } List <TrainCarType> trainCarTypes = new List <TrainCarType>(__instance.locoTypeGroupsToSpawn[___nextLocoGroupSpawnIndex].trainCarTypes); ___nextLocoGroupSpawnIndex = UnityEngine.Random.Range(0, __instance.locoTypeGroupsToSpawn.Count); List <TrainCar> list = CarSpawner.SpawnCarTypesOnTrack(trainCarTypes, __instance.locoSpawnTrack, true, 0.0, __instance.spawnRotationFlipped, false); if (list != null) { SingletonBehaviour <UnusedTrainCarDeleter> .Instance.MarkForDelete(list); return(false); } } return(false); } return(true); }