public Job ReturnToStationJob(Pawn_Drone drone)
 {
     if (drone.station != null && drone.Map == drone.station.Map)
     {
         return(new Job(PRFDefOf.PRFDrone_ReturnToStation, drone.station));
     }
     return(null);
 }
Пример #2
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Pawn_Drone drone = (Pawn_Drone)pawn;

            if (drone.station != null)
            {
                if (drone.station.Spawned && drone.station.Map == pawn.Map)
                {
                    Job result = null;
                    if (drone.station is Building_WorkGiverDroneStation b)
                    {
                        if (!(drone.station.cachedSleepTimeList.Contains(GenLocalDate.HourOfDay(drone).ToString())))
                        {
                            pawn.workSettings = new Pawn_WorkSettings(pawn);
                            pawn.workSettings.EnableAndInitialize();
                            pawn.workSettings.DisableAll();
                            foreach (WorkTypeDef def in b.WorkTypes)
                            {
                                pawn.workSettings.SetPriority(def, 3);
                            }
                            foreach (WorkTypeDef def in b.WorkSettings_dict.Keys)
                            {
                                if (b.WorkSettings_dict[def])
                                {
                                    pawn.workSettings.SetPriority(def, 3);
                                }
                                else
                                {
                                    pawn.workSettings.SetPriority(def, 0);
                                }
                            }


                            // So the station finds the best job for the pawn
                            result = b.TryIssueJobPackageDrone(drone, true).Job;
                            if (result == null)
                            {
                                result = b.TryIssueJobPackageDrone(drone, false).Job;
                            }
                        }
                    }
                    else
                    {
                        result = drone.station.TryGiveJob();
                    }
                    if (result == null)
                    {
                        result = new Job(PRFDefOf.PRFDrone_ReturnToStation, drone.station);
                    }
                    return(result);
                }
                return(new Job(PRFDefOf.PRFDrone_SelfTerminate));
            }
            return(null);
        }
        static void Postfix(Pawn pawn, ref IEnumerable <Thing> __result)
        {
            if (pawn.kindDef == PRFDefOf.PRFDroneKind)
            {
                Pawn_Drone drone           = (Pawn_Drone)pawn;
                IntVec3    DroneStationPos = drone.station.Position;

                //Remove work on the station itself
                __result = __result.Where(u => u.Position != DroneStationPos).ToList();
            }
        }
        static bool Prefix(Pawn_JobTracker __instance, JobCondition condition, bool startNewJob = true, bool canReturnToPool = true)
        {
            //Only run the Prefix if its a Drone and the Expected Error Condition did occur
            if (Traverse.Create(__instance).Field <Pawn>("pawn").Value.kindDef == PRFDefOf.PRFDroneKind && (condition == JobCondition.ErroredPather || condition == JobCondition.Errored))
            {
                //Display Warning & Affected Cell info
                Log.Warning("Pathing Failed Drone Returning to Station - (This is a Rimwold Pathing Bug)");
                Log.Message("Target is " + __instance.curJob.GetTarget(TargetIndex.A).Cell);

                //Run default Code (may need to update that in the Future (if RW Updates This Method))
                JobDef jobDef = (__instance.curJob != null) ? __instance.curJob.def : null;
                Traverse.Create(__instance).Method("CleanupCurrentJob", condition, true, true, canReturnToPool).GetValue();
                //Send the Drone Home
                Pawn_Drone drone = Traverse.Create(__instance).Field <Pawn_Drone>("pawn").Value;
                __instance.StartJob(new Job(PRFDefOf.PRFDrone_ReturnToStation, drone.station));


                return(false);
            }
            return(true);
        }
Пример #5
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Pawn_Drone drone = (Pawn_Drone)pawn;

            if (drone.station != null)
            {
                if (drone.station.Spawned && drone.station.Map == pawn.Map)
                {
                    Job result;
                    if (drone.station is Building_WorkGiverDroneStation b)
                    {
                        pawn.workSettings = new Pawn_WorkSettings(pawn);
                        pawn.workSettings.EnableAndInitialize();
                        pawn.workSettings.DisableAll();
                        foreach (WorkTypeDef def in b.WorkTypes)
                        {
                            pawn.workSettings.SetPriority(def, 3);
                        }
                        // So the station finds the best job for the pawn
                        result = b.TryIssueJobPackageDrone(drone, true).Job;
                        if (result == null)
                        {
                            result = b.TryIssueJobPackageDrone(drone, false).Job;
                        }
                        pawn.workSettings = null;
                    }
                    else
                    {
                        result = drone.station.TryGiveJob();
                    }
                    if (result == null)
                    {
                        result = new Job(PRFDefOf.PRFDrone_ReturnToStation, drone.station);
                    }
                    return(result);
                }
                return(new Job(PRFDefOf.PRFDrone_SelfTerminate));
            }
            return(null);
        }