コード例 #1
0
        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);
            }
        }
コード例 #2
0
    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;
    }
コード例 #3
0
ファイル: Patches.cs プロジェクト: fauxnik/DVPassengerJobs
 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);
     }
 }
コード例 #4
0
    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;
    }
コード例 #5
0
        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);
        }