private static void DeleteOldChain(JobChainSaveData chainSaveData) { var cars = GetTrainCarsFromCarGuids(chainSaveData.trainCarGuids); if (cars != null) { PassengerJobs.ModEntry.Logger.Log("Deleting pre v2.0 job chain"); SingletonBehaviour <CarSpawner> .Instance.DeleteTrainCars(cars, true); } }
private IEnumerator InitializeNewChainsAndJobs(Chain[] chains, Job[] cjobs) { IsChangedByNetwork = true; foreach (Chain chain in chains) { Job[] chainJobs = cjobs.Where(j => j.ChainId == chain.Id).ToArray(); Main.Log($"Job chain with ID {chain.Id} loading, amount of jobs in chain: {chainJobs.Length}"); JobChainSaveData jobSaveData = JsonConvert.DeserializeObject <JobChainSaveData>(chain.Data, JobSaveManager.serializeSettings); yield return(new WaitUntil(() => { foreach (string guid in jobSaveData.trainCarGuids) { if (!SingletonBehaviour <NetworkTrainManager> .Instance.localCars.Any(t => t.CarGUID == guid)) { return false; } } return true; })); GameObject chainGO = SingletonBehaviour <JobSaveManager> .Instance.LoadJobChain(jobSaveData); if (chainGO) { Main.Log("Job chain succesfully loaded"); StaticJobDefinition[] chainJobDefinitions = chainGO.GetComponents <StaticJobDefinition>(); foreach (StaticJobDefinition definition in chainJobDefinitions) { Main.Log("Register job definition"); Job job = chainJobs.FirstOrDefault(j => j.Type == (definition.job != null ? definition.job.jobType : GetJobTypeFromDefinition(definition))); job.Definition = definition; Main.Log("Add to jobs list"); jobs.Add(job); if (job.IsCurrentJob) { Main.Log("Job is current registering job taken event"); if (!job.IsTaken) { job.Definition.job.JobTaken += OnJobTaken; } else { job.CanTakeJob = false; } } Main.Log("Job fully loaded"); } Main.Log("Chain successfully loaded"); } } IsChangedByNetwork = false; }
static void Postfix(JobChainController __instance, ref JobChainSaveData __result) { if (__instance is PassengerTransportChainController) { __result = new PassengerChainSaveData(PassengerChainSaveData.PassChainType.Transport, __result); } else if (__instance is CommuterChainController) { __result = new PassengerChainSaveData(PassengerChainSaveData.PassChainType.Commuter, __result); } }
private void OnJobSyncMessage(Message message) { using (DarkRiftReader reader = message.GetReader()) { Main.Log($"[CLIENT] < JOB_SYNC"); while (reader.Position < reader.Length) { IsChangedByNetwork = true; Chain[] chains = reader.ReadSerializables <Chain>(); Job[] cjobs = reader.ReadSerializables <Job>(); foreach (Chain chain in chains) { Job[] chainJobs = cjobs.Where(j => j.ChainId == chain.Id).ToArray(); Main.Log($"Job chain with ID {chain.Id} loading, amount of jobs in chain: {chainJobs.Length}"); JobChainSaveData jobSaveData = JsonConvert.DeserializeObject <JobChainSaveData>(chain.Data, JobSaveManager.serializeSettings); GameObject chainGO = SingletonBehaviour <JobSaveManager> .Instance.LoadJobChain(jobSaveData); if (chainGO) { Main.Log("Job chain succesfully loaded"); StaticJobDefinition[] chainJobDefinitions = chainGO.GetComponents <StaticJobDefinition>(); foreach (StaticJobDefinition definition in chainJobDefinitions) { Main.Log("Register job definition"); Job job = chainJobs.FirstOrDefault(j => j.Type == (definition.job != null ? definition.job.jobType : GetJobTypeFromDefinition(definition))); job.Definition = definition; Main.Log("Add to jobs list"); jobs.Add(job); if (job.IsCurrentJob) { Main.Log("Job is current registering job taken event"); if (!job.IsTaken) { job.Definition.job.JobExpired += OnJobExpired; job.Definition.job.JobTaken += OnJobTaken; } else { job.CanTakeJob = false; } } Main.Log("Job fully loaded"); } Main.Log("Chain successfully loaded"); } } IsChangedByNetwork = false; } } IsSynced = true; }
static bool Prefix(JobChainSaveData chainSaveData, ref GameObject __result) { if (chainSaveData.jobChainData.Length < 1) { return(true); } JobChainController chainController = null; if (chainSaveData is PassengerChainSaveData passChainData) { chainController = CreateSavedJobChain(passChainData); } else { var firstJobData = chainSaveData.jobChainData.First(); if (((JobLicenses)firstJobData.requiredLicenses).HasFlag(PassLicenses.Passengers1)) { DeleteOldChain(chainSaveData); } else { return(true); // pass to base game } } if (chainController == null) { return(false); } chainController.FinalizeSetupAndGenerateFirstJob(true); if (chainSaveData.jobTaken) { PlayerJobs.Instance.TakeJob(chainController.currentJobInChain, true); if (chainSaveData.currentJobTaskData != null) { chainController.currentJobInChain.OverrideTasksStates(chainSaveData.currentJobTaskData); } else { PrintError("Job from chain was taken, but there is no task data! Task data won't be loaded!"); } InitializeCorrespondingJobBooklet(chainController.currentJobInChain); } PassengerJobs.ModEntry.Logger.Log($"Successfully loaded job chain: {chainController.jobChainGO.name}"); __result = chainController.jobChainGO; return(false); }