private static StaticPassengerJobDefinition CreateSavedPassengerJob(GameObject jobChainGO, PassengerJobDefinitionData jobData) { // associated station if (!(GetStationWithId(jobData.stationId) is Station logicStation)) { PrintError($"Couldn't find corresponding Station with ID: {jobData.stationId}! Skipping load of this job chain!"); return(null); } // bonus time limit, base payment if (jobData.timeLimitForJob < 0f || jobData.initialWage < 0f || string.IsNullOrEmpty(jobData.originStationId) || string.IsNullOrEmpty(jobData.destinationStationId)) { PrintError("Invalid data! Skipping load of this job chain!"); return(null); } // license requirements if (!LicenseManager.IsValidForParsingToJobLicense(jobData.requiredLicenses)) { PrintError("Undefined job licenses requirement! Skipping load of this job chain!"); return(null); } // starting track if (!(GetYardTrackWithId(jobData.startingTrack) is Track startTrack)) { PrintError($"Couldn't find corresponding start Track with ID: {jobData.startingTrack}! Skipping load of this job chain!"); return(null); } // destination track if (!(GetYardTrackWithId(jobData.destinationTrack) is Track destTrack)) { PrintError($"Couldn't find corresponding destination Track with ID: {jobData.destinationTrack}! Skipping load of this job chain!"); return(null); } // consist if (!(GetCarsFromCarGuids(jobData.trainCarGuids) is List <Car> consist)) { PrintError("Couldn't find all carsToTransport with transportCarGuids! Skipping load of this job chain!"); return(null); } // loading platform WarehouseMachine loadMachine = null; if (!string.IsNullOrEmpty(jobData.loadingTrackId)) { if (PlatformManager.GetPlatformByTrackId(jobData.loadingTrackId) is PlatformDefinition pd) { loadMachine = pd.Controller.LogicMachine; } } // unloading platform WarehouseMachine unloadMachine = null; if (!string.IsNullOrEmpty(jobData.unloadingTrackId)) { if (PlatformManager.GetPlatformByTrackId(jobData.unloadingTrackId) is PlatformDefinition pd) { unloadMachine = pd.Controller.LogicMachine; } } // Named train SpecialTrain special = null; if (!string.IsNullOrWhiteSpace(jobData.specialName)) { special = SpecialConsistManager.TrainDefinitions.Find(train => string.Equals(train.Name, jobData.specialName)); } StaticPassengerJobDefinition jobDefinition = jobChainGO.AddComponent <StaticPassengerJobDefinition>(); var chainData = new StationsChainData(jobData.originStationId, jobData.destinationStationId); jobDefinition.PopulateBaseJobDefinition(logicStation, jobData.timeLimitForJob, jobData.initialWage, chainData, (JobLicenses)jobData.requiredLicenses); jobDefinition.subType = (JobType)jobData.subType; jobDefinition.startingTrack = startTrack; jobDefinition.destinationTrack = destTrack; jobDefinition.trainCarsToTransport = consist; jobDefinition.loadMachine = loadMachine; jobDefinition.unloadMachine = unloadMachine; jobDefinition.specialDefinition = special; return(jobDefinition); }
protected override void GenerateJob(Station jobOriginStation, float jobTimeLimit = 0, float initialWage = 0, string forcedJobId = null, JobLicenses requiredLicenses = JobLicenses.Basic) { if ((trainCarsToTransport == null) || (trainCarsToTransport.Count == 0) || (startingTrack == null) || (destinationTrack == null)) { trainCarsToTransport = null; startingTrack = null; destinationTrack = null; return; } // Get total cargo capacity float totalCapacity = 0; foreach (var car in trainCarsToTransport) { //car.DumpCargo(); totalCapacity += car.capacity; } Track departTrack = startingTrack; Track arriveTrack = destinationTrack; var taskList = new List <Task>(); // Check for loading task PlatformController loadPlatform = null; if (loadMachine != null) { departTrack = loadMachine.WarehouseTrack; Task stageCarsTask = JobsGenerator.CreateTransportTask(trainCarsToTransport, departTrack, startingTrack); taskList.Add(stageCarsTask); Task loadTask = new WarehouseTask(trainCarsToTransport, WarehouseTaskType.Loading, loadMachine, CargoType.Passengers, totalCapacity); taskList.Add(loadTask); // check to register for unloading display if ((PlatformManager.GetPlatformByTrackId(loadMachine.WarehouseTrack.ID.FullID) is PlatformDefinition pdef) && pdef.Initialized) { loadPlatform = pdef.Controller; } } else { foreach (var car in trainCarsToTransport) { car.LoadCargo(car.capacity, CargoType.Passengers); } } if (unloadMachine != null) { arriveTrack = unloadMachine.WarehouseTrack; } // actual move between stations Task transportTask = JobsGenerator.CreateTransportTask( trainCarsToTransport, arriveTrack, departTrack, Enumerable.Repeat(CargoType.Passengers, trainCarsToTransport.Count).ToList()); taskList.Add(transportTask); // check for unloading task PlatformController unloadPlatform = null; if (unloadMachine != null) { Task unloadTask = new WarehouseTask(trainCarsToTransport, WarehouseTaskType.Unloading, unloadMachine, CargoType.Passengers, totalCapacity); taskList.Add(unloadTask); Task storeCarsTask = JobsGenerator.CreateTransportTask(trainCarsToTransport, destinationTrack, arriveTrack); taskList.Add(storeCarsTask); // check to register for unloading display if ((PlatformManager.GetPlatformByTrackId(unloadMachine.WarehouseTrack.ID.FullID) is PlatformDefinition pdef) && pdef.Initialized) { unloadPlatform = pdef.Controller; } } Task superTask = new SequentialTasks(taskList); // check if we should generate a special job ID if (string.IsNullOrEmpty(forcedJobId) && (specialDefinition != null)) { forcedJobId = IG_GenerateJobId_Patch.GetNamedExpressId(specialDefinition); } job = new Job(superTask, subType, jobTimeLimit, initialWage, chainData, forcedJobId, requiredLicenses); // set up platform displays if (loadPlatform != null) { loadPlatform.AddOutgoingJobToDisplay(job); } if (unloadPlatform != null) { job.JobTaken += unloadPlatform.AddIncomingJobToDisplay; } // track the job if it's a special, for booklet info etc if (specialDefinition != null) { SpecialConsistManager.JobToSpecialMap.Add(job.ID, specialDefinition); } jobOriginStation.AddJobToStation(job); }