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); }
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); }
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); }