private static bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { if (!giver.def.nonColonistsCanDo && !pawn.IsColonist) { return(false); } if (pawn.WorkTagIsDisabled(giver.def.workTags)) { return(false); } try { if (giver.ShouldSkip(pawn)) { return(false); } } catch { return(false); } if (giver.MissingRequiredCapacity(pawn) != null) { return(false); } return(true); }
public static bool Prefix(ref bool __result, Pawn pawn, WorkGiver giver) { if (!pawn.IsGuest()) { return(true); } var canDo = !giver.ShouldSkip(pawn) && giver.MissingRequiredCapacity(pawn) == null && IsSkilledEnough(pawn, giver.def.workType); if (!canDo) { return(false); } if (IsNegotiating(giver)) { return(false); } if (Settings.disableArtAndCraft.Value && IsArtOrCraft(giver.def.workType.workTags)) { return(false); } if (Settings.disableOperations.Value && IsOperation(giver)) { return(false); } if (Settings.disableMedical.Value && IsOperation(giver) || IsMedical(giver)) { return(false); } if (Settings.disableWarden.Value && IsWarden(giver)) { return(false); } if (IsFeeding(giver)) { return(false); // Too many problems with this (uses food from inventory, wrong food category, etc. } if (!pawn.GetVisitScore(out var score)) { return(false); } var passion = pawn.skills.MaxPassionOfRelevantSkillsFor(giver.def.workType); float passionBonus = passion == Passion.Major ? 40 : passion == Passion.Minor ? 20 : 0; var desireToHelp = pawn.Faction.GoodwillWith(Faction.OfPlayer) + passionBonus + score * 100 + (giver.def.emergency ? 75 : 0); //Log.Message($"{pawn.LabelShort}: help with {giver.def.gerund}? {desireToHelp:F0} >= {100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100:F0}"); if (desireToHelp < 100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100) { return(false); } __result = true; return(false); }
private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { try { return(giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn)); } catch { // Catch errors from WorkGivers not recognising the robot as a valid pawn (For example because it doesn't use the worksettings?) return(false); } }
private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { if (giver.ShouldSkip(pawn)) { return(false); } if (pawn.story != null && pawn.story.WorkTagIsDisabled(giver.def.workTags)) { return(false); } if (giver.MissingRequiredCapacity(pawn) != null) { return(false); } return(true); }
public static bool Prefix(ref bool __result, Pawn pawn, WorkGiver giver) { if (!pawn.IsGuest()) { return(true); } var canDo = !giver.ShouldSkip(pawn) && giver.MissingRequiredCapacity(pawn) == null && IsSkilledEnough(pawn, giver.def.workType); if (!canDo) { return(false); } if (Settings.disableArtAndCraft.Value && IsArtOrCraft(giver.def.workType.workTags)) { return(false); } float score; if (!pawn.GetVisitScore(out score)) { return(false); } var passion = pawn.skills.MaxPassionOfRelevantSkillsFor(giver.def.workType); float passionBonus = passion == Passion.Major ? 40 : passion == Passion.Minor ? 20 : 0; var desireToHelp = pawn.Faction.GoodwillWith(Faction.OfPlayer) + passionBonus + score * 100 + (giver.def.emergency ? 75 : 0); //Log.Message(pawn.NameStringShort + ": help with "+giver.def.gerund+"? " + Mathf.RoundToInt(desireToHelp) + " >= " + Mathf.RoundToInt(100+Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436)*100)); if (desireToHelp < 100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100) { return(false); } __result = true; return(false); }
// Method from RimWorld.JobGiver_Work.TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) // I modified the line if (!workGiver.ShouldSkip(pawn)) #pragma warning disable public ThinkResult TryIssueJobPackageDrone(Pawn pawn, bool emergency) { List <WorkGiver> list = emergency ? pawn.workSettings.WorkGiversInOrderEmergency : pawn.workSettings.WorkGiversInOrderNormal; int num = -999; TargetInfo targetInfo = TargetInfo.Invalid; WorkGiver_Scanner workGiver_Scanner = null; for (int j = 0; j < list.Count; j++) { WorkGiver workGiver = list[j]; if (workGiver.def.priorityInType != num && targetInfo.IsValid) { break; } if (!workGiver.ShouldSkip(pawn)) { try { Job job2 = workGiver.NonScanJob(pawn); if (job2 != null) { return(new ThinkResult(job2, null, new JobTag?(list[j].def.tagToGive), false)); } WorkGiver_Scanner scanner = workGiver as WorkGiver_Scanner; if (scanner != null) { if (scanner.def.scanThings) { Predicate <Thing> predicate = (Thing t) => !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t, false); IEnumerable <Thing> enumerable = scanner.PotentialWorkThingsGlobal(pawn); Thing thing; if (scanner.Prioritized) { IEnumerable <Thing> enumerable2 = enumerable; if (enumerable2 == null) { enumerable2 = pawn.Map.listerThings.ThingsMatching(scanner.PotentialWorkThingRequest); } if (scanner.AllowUnreachable) { IntVec3 position = pawn.Position; IEnumerable <Thing> searchSet = enumerable2; Predicate <Thing> validator = predicate; thing = GenClosest.ClosestThing_Global(position, searchSet, 99999f, validator, (Thing x) => scanner.GetPriority(pawn, x)); } else { IntVec3 position = pawn.Position; Map map = pawn.Map; IEnumerable <Thing> searchSet = enumerable2; PathEndMode pathEndMode = scanner.PathEndMode; TraverseParms traverseParams = TraverseParms.For(pawn, scanner.MaxPathDanger(pawn), TraverseMode.ByPawn, false); Predicate <Thing> validator = predicate; thing = GenClosest.ClosestThing_Global_Reachable(position, map, searchSet, pathEndMode, traverseParams, 9999f, validator, (Thing x) => scanner.GetPriority(pawn, x)); } } else if (scanner.AllowUnreachable) { IEnumerable <Thing> enumerable3 = enumerable; if (enumerable3 == null) { enumerable3 = pawn.Map.listerThings.ThingsMatching(scanner.PotentialWorkThingRequest); } IntVec3 position = pawn.Position; IEnumerable <Thing> searchSet = enumerable3; Predicate <Thing> validator = predicate; thing = GenClosest.ClosestThing_Global(position, searchSet, 99999f, validator, null); } else { IntVec3 position = pawn.Position; Map map = pawn.Map; ThingRequest potentialWorkThingRequest = scanner.PotentialWorkThingRequest; PathEndMode pathEndMode = scanner.PathEndMode; TraverseParms traverseParams = TraverseParms.For(pawn, scanner.MaxPathDanger(pawn), TraverseMode.ByPawn, false); Predicate <Thing> validator = predicate; bool forceGlobalSearch = enumerable != null; thing = GenClosest.ClosestThingReachable(position, map, potentialWorkThingRequest, pathEndMode, traverseParams, 9999f, validator, enumerable, 0, scanner.LocalRegionsToScanFirst, forceGlobalSearch, RegionType.Set_Passable, false); } if (thing != null) { targetInfo = thing; workGiver_Scanner = scanner; } } if (scanner.def.scanCells) { IntVec3 position2 = pawn.Position; float num2 = 99999f; float num3 = float.MinValue; bool prioritized = scanner.Prioritized; bool allowUnreachable = scanner.AllowUnreachable; Danger maxDanger = scanner.MaxPathDanger(pawn); foreach (IntVec3 intVec in scanner.PotentialWorkCellsGlobal(pawn)) { bool flag = false; float num4 = (float)(intVec - position2).LengthHorizontalSquared; float num5 = 0f; if (prioritized) { if (scanner.HasJobOnCell(pawn, intVec)) { if (!allowUnreachable && !pawn.CanReach(intVec, scanner.PathEndMode, maxDanger, false, TraverseMode.ByPawn)) { continue; } num5 = scanner.GetPriority(pawn, intVec); if (num5 > num3 || (num5 == num3 && num4 < num2)) { flag = true; } } } else if (num4 < num2 && scanner.HasJobOnCell(pawn, intVec)) { if (!allowUnreachable && !pawn.CanReach(intVec, scanner.PathEndMode, maxDanger, false, TraverseMode.ByPawn)) { continue; } flag = true; } if (flag) { targetInfo = new TargetInfo(intVec, pawn.Map, false); workGiver_Scanner = scanner; num2 = num4; num3 = num5; } } } } } catch (Exception ex) { Log.Error(string.Concat(new object[] { pawn, " threw exception in WorkGiver ", workGiver.def.defName, ": ", ex.ToString() })); } finally { } if (targetInfo.IsValid) { pawn.mindState.lastGivenWorkType = workGiver.def.workType; Job job3; if (targetInfo.HasThing) { job3 = workGiver_Scanner.JobOnThing(pawn, targetInfo.Thing, false); } else { job3 = workGiver_Scanner.JobOnCell(pawn, targetInfo.Cell); } if (job3 != null) { return(new ThinkResult(job3, null, new JobTag?(list[j].def.tagToGive), false)); } Log.ErrorOnce(string.Concat(new object[] { workGiver_Scanner, " provided target ", targetInfo, " but yielded no actual job for pawn ", pawn, ". The CanGiveJob and JobOnX methods may not be synchronized." }), 6112651); } num = workGiver.def.priorityInType; } } return(ThinkResult.NoJob); }
private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { return(giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn)); }
//Make mechs with work modules able to do work. Some duplicate code here in regards to vanilla, but I fear a transpiler would mess up compatibility with other mods. static void Postfix(ref bool __result, Pawn pawn, WorkGiver giver) { if (__result == false) { __result = (giver.def.nonColonistsCanDo || pawn.IsColonist || pawn.IsHacked() && pawn.workSettings != null) && (pawn.story == null || !pawn.WorkTypeIsDisabled(giver.def.workType)) && !giver.ShouldSkip(pawn, false) && giver.MissingRequiredCapacity(pawn) == null; } }
private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { return((pawn.story == null || !pawn.WorkTagIsDisabled(giver.def.workTags)) && !giver.ShouldSkip(pawn) && (giver.def.nonColonistsCanDo || pawn.IsPrisoner) && giver.MissingRequiredCapacity(pawn) == null); }
private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver) { try { return(!pawn.DestroyedOrNull() && pawn.Spawned && giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn)); } catch (Exception ex) { Log.Warning("Robot caught error in PawnCanUseWorkGiver: Robot " + pawn.def.defName + " on WorkGiver '" + giver.def.defName + "', this will be ignored..\n" + ex.ToString()); // Catch errors from WorkGivers not recognising the robot as a valid pawn (For example because it doesn't use the worksettings?) return(false); } }
private bool GiverCanGiveJobToPawn(Pawn pawn, WorkGiver giver) { return((giver.def.canBeDoneByNonColonists || pawn.IsColonist) && giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn)); }
//public bool emergency; protected override Job TryGiveTerminalJob(Pawn pawn) { if (!(pawn is Droid)) { return(null); } Droid droid = pawn as Droid; if (!droid.Active) { return(null); } List <WorkGiver> list = this.emergency ? droid.work.WorkGiversInOrderEmergency : droid.work.WorkGiversInOrder; int num = -999; TargetInfo targetInfo = TargetInfo.Invalid; WorkGiver_Scanner workGiver_Scanner = null; for (int i = 0; i < list.Count; i++) { WorkGiver workGiver = list[i]; if (workGiver.def.priorityInType != num && targetInfo.IsValid) { break; } if (workGiver.MissingRequiredCapacity(pawn) == null) { if (!workGiver.ShouldSkip(pawn)) { try { Job job = workGiver.NonScanJob(pawn); if (job != null) { Job result = job; return(result); } WorkGiver_Scanner scanner = workGiver as WorkGiver_Scanner; if (scanner != null) { if (workGiver.def.scanThings) { Predicate <Thing> predicate = (Thing t) => !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t); IEnumerable <Thing> enumerable = scanner.PotentialWorkThingsGlobal(pawn); Predicate <Thing> validator = predicate; Thing thing = GenClosest.ClosestThingReachable(pawn.Position, scanner.PotentialWorkThingRequest, scanner.PathEndMode, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, enumerable, scanner.LocalRegionsToScanFirst, enumerable != null); if (thing != null) { targetInfo = thing; workGiver_Scanner = scanner; } } if (workGiver.def.scanCells) { IntVec3 position = pawn.Position; float num2 = 99999f; foreach (IntVec3 current in scanner.PotentialWorkCellsGlobal(pawn)) { float lengthHorizontalSquared = (current - position).LengthHorizontalSquared; if (lengthHorizontalSquared < num2 && !current.IsForbidden(pawn) && scanner.HasJobOnCell(pawn, current)) { targetInfo = current; workGiver_Scanner = scanner; num2 = lengthHorizontalSquared; } } } num = workGiver.def.priorityInType; } } catch (Exception ex) { Log.Error(string.Concat(new object[] { pawn, " threw exception in WorkGiver ", workGiver.def.defName, ": ", ex.ToString() })); } finally { } if (targetInfo.IsValid) { pawn.mindState.lastGivenWorkType = workGiver.def.workType; if (targetInfo.HasThing) { return(workGiver_Scanner.JobOnThing(pawn, targetInfo.Thing)); } return(workGiver_Scanner.JobOnCell(pawn, targetInfo.Cell)); } } } } return(null); }