Ejemplo n.º 1
0
    internal bool IsPlayerCloseToStation(GameObject player, StationController station)
    {
        StationJobGenerationRange stationRange   = station.GetComponent <StationJobGenerationRange>();
        float playerSqrDistanceFromStationCenter = (player.transform.position - stationRange.stationCenterAnchor.position).sqrMagnitude;

        return(stationRange.IsPlayerInJobGenerationZone(playerSqrDistanceFromStationCenter));
    }
Ejemplo n.º 2
0
            static void Prefix(StationJobGenerationRange __instance, MethodBase __originalMethod)
            {
                // backup existing values before overwriting
                if (initialDistanceRegular < 1f)
                {
                    initialDistanceRegular = __instance.destroyGeneratedJobsSqrDistanceRegular;
                }
                if (initialDistanceAnyJobTaken < 1f)
                {
                    initialDistanceAnyJobTaken = __instance.destroyGeneratedJobsSqrDistanceAnyJobTaken;
                }

                if (thisModEntry.Active)
                {
                    if (__instance.destroyGeneratedJobsSqrDistanceAnyJobTaken < 4000000f)
                    {
                        __instance.destroyGeneratedJobsSqrDistanceAnyJobTaken = 4000000f;
                    }
                    __instance.destroyGeneratedJobsSqrDistanceRegular =
                        __instance.destroyGeneratedJobsSqrDistanceAnyJobTaken;
                }
                else
                {
                    __instance.destroyGeneratedJobsSqrDistanceRegular     = initialDistanceRegular;
                    __instance.destroyGeneratedJobsSqrDistanceAnyJobTaken = initialDistanceAnyJobTaken;
                }
            }
Ejemplo n.º 3
0
        public void Initialize()
        {
            Controller = gameObject.GetComponent <StationController>();
            if (Controller != null)
            {
                StationRange   = Controller.GetComponent <StationJobGenerationRange>();
                StorageTracks  = GetStorageTracks(Controller);
                PlatformTracks = GetLoadingTracks(Controller);

                // register tracks for train spawning, since they are ignored in the base game
                foreach (Track t in PlatformTracks.Union(StorageTracks))
                {
                    YardTracksOrganizer.Instance.InitializeYardTrack(t);
                    YardTracksOrganizer.Instance.yardTrackIdToTrack[t.ID.FullID] = t;
                }

                var sb = new StringBuilder($"Created generator for {Controller.stationInfo.Name}:\n");
                sb.Append("Coach Storage: ");
                sb.AppendLine(string.Join(", ", StorageTracks.Select(t => t.ID)));
                sb.Append("Platforms: ");
                sb.Append(string.Join(", ", PlatformTracks.Select(t => t.ID)));

                PassengerJobs.ModEntry.Logger.Log(sb.ToString());

                RegisterStation(Controller, this);

                // check if the player is already inside the generation zone
                float playerDist = StationRange.PlayerSqrDistanceFromStationCenter;
                PlayerWasInGenerateRange = StationRange.IsPlayerInJobGenerationZone(playerDist);
            }
        }
Ejemplo n.º 4
0
        private static bool Prefix(StationController __instance, StationJobGenerationRange ___stationRange, Station ___logicStation, ref bool ___attemptJobOverviewGeneration, ref bool ___playerEnteredJobGenerationZone, ref HashSet <Job> ___processedNewJobs, ref List <JobOverview> ___spawnedJobOverviews, PointOnPlane ___jobBookletSpawnSurface)
        {
            if (NetworkManager.IsClient())
            {
                if (___logicStation == null || !SaveLoadController.carsAndJobsLoadingFinished)
                {
                    return(false);
                }
                if (___stationRange.IsPlayerInRangeForBookletGeneration(___stationRange.PlayerSqrDistanceFromStationOffice) && ___attemptJobOverviewGeneration)
                {
                    for (int i = 0; i < ___logicStation.availableJobs.Count; i++)
                    {
                        Job job = ___logicStation.availableJobs[i];
                        if (!___processedNewJobs.Contains(job))
                        {
                            PointOnPlane pointOnPlane = ___jobBookletSpawnSurface;
                            ValueTuple <Vector3, Quaternion> valueTuple = (pointOnPlane != null) ? pointOnPlane.GetRandomPointWithRotationOnPlane() : new ValueTuple <Vector3, Quaternion>(__instance.transform.position, __instance.transform.rotation);
                            Transform   parent = SingletonBehaviour <WorldMover> .Exists ? SingletonBehaviour <WorldMover> .Instance.originShiftParent : null;
                            JobOverview item   = BookletCreator.CreateJobOverview(job, valueTuple.Item1, valueTuple.Item2, parent);
                            ___spawnedJobOverviews.Add(item);
                            ___processedNewJobs.Add(job);
                        }
                    }
                    ___attemptJobOverviewGeneration = false;
                }


                if (NetworkManager.IsHost() && SingletonBehaviour <NetworkPlayerManager> .Exists && SingletonBehaviour <NetworkPlayerManager> .Instance.IsSynced && SingletonBehaviour <NetworkJobsManager> .Exists)
                {
                    if (SingletonBehaviour <NetworkPlayerManager> .Instance.newPlayerConnecting)
                    {
                        return(false);
                    }

                    float playerSqrDistanceFromStationCenter = ___stationRange.PlayerSqrDistanceFromStationCenter;
                    bool  isHostInGenerationZone             = ___stationRange.IsPlayerInJobGenerationZone(playerSqrDistanceFromStationCenter);
                    if (isHostInGenerationZone && !___playerEnteredJobGenerationZone)
                    {
                        Main.Log("Generating jobs because host is in area");
                        __instance.ProceduralJobsController.TryToGenerateJobs();
                        ___playerEnteredJobGenerationZone = true;
                    }
                    else if (!isHostInGenerationZone && !___playerEnteredJobGenerationZone)
                    {
                        if (SingletonBehaviour <NetworkPlayerManager> .Instance.GetPlayers().Any(p => ___stationRange.IsPlayerInJobGenerationZone((p.transform.position - ___stationRange.stationCenterAnchor.position).sqrMagnitude)))
                        {
                            Main.Log("Generating jobs because a client is in area");
                            __instance.ProceduralJobsController.TryToGenerateJobs();
                            ___playerEnteredJobGenerationZone = true;
                        }
                    }
                    else if (___playerEnteredJobGenerationZone)
                    {
                        if (SingletonBehaviour <NetworkPlayerManager> .Instance.GetPlayers().All(p => !___stationRange.IsPlayerInJobGenerationZone((p.transform.position - ___stationRange.stationCenterAnchor.position).sqrMagnitude)) && !isHostInGenerationZone)
                        {
                            ___playerEnteredJobGenerationZone = false;
                            Main.Log("No one in area reseting generation flag");
                            SingletonBehaviour <NetworkJobsManager> .Instance.ExpireJobsUnTakenInStation(__instance);

                            SingletonBehaviour <NetworkJobsManager> .Instance.SendJobsExpirationInStation(__instance.logicStation.ID);
                        }
                    }
                }
                return(false);
            }
            return(true);
        }