public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { ThinkResult result; if (pawn.GetLord() == null) { Log.Error(pawn + " doing ThinkNode_DutyConstant with no Lord.", false); result = ThinkResult.NoJob; } else if (pawn.mindState.duty == null) { Log.Error(pawn + " doing ThinkNode_DutyConstant with no duty.", false); result = ThinkResult.NoJob; } else { if (this.dutyDefToSubNode == null) { Log.Error(pawn + " has null dutyDefToSubNode. Recovering by calling ResolveSubnodes() (though that should have been called already).", false); this.ResolveSubnodes(); } int num = this.dutyDefToSubNode[pawn.mindState.duty.def]; if (num < 0) { result = ThinkResult.NoJob; } else { result = this.subNodes[num].TryIssueJobPackage(pawn, jobParams); } } return result; }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { ThinkResult result; if (!HealthAIUtility.ShouldSeekMedicalRest(pawn)) { result = ThinkResult.NoJob; } else if (this.respectTimetable && RestUtility.TimetablePreventsLayDown(pawn) && !HealthAIUtility.ShouldHaveSurgeryDoneNow(pawn) && !HealthAIUtility.ShouldBeTendedNowByPlayer(pawn)) { result = ThinkResult.NoJob; } else if (RestUtility.DisturbancePreventsLyingDown(pawn)) { result = ThinkResult.NoJob; } else { Thing thing = RestUtility.FindPatientBedFor(pawn); if (thing == null) { result = ThinkResult.NoJob; } else { Job job = new Job(JobDefOf.LayDown, thing); result = new ThinkResult(job, this, null, false); } } return(result); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { float num = this.MtbHours(pawn); if (num <= 0f) // This is why I had to detour whole method. Vanilla ThinkNode_ChancePerHour is hardcoded to return NoJob if MtbHours = 0 while I need it to always return job instead. Also, this is faster since it avoids saving ticks if not necessary. Also, vanilla has hardcoded one hour min delay. { // it is not actually too bad though - while it can interfere with other mods, this method is unlikely to be required for anything else and it is runtime only, so no changes in saves return(base.TryIssueJobPackage(pawn, jobParams)); } ThinkResult result; float mtb_duration = Math.Min(MtbHours(pawn) * GenDate.TicksPerHour / 2, 2500); if (Find.TickManager.TicksGame < this.GetLastTryTick(pawn) + mtb_duration) { result = ThinkResult.NoJob; } else { this.SetLastTryTick(pawn, Find.TickManager.TicksGame); Rand.PushState(); int salt = Gen.HashCombineInt(base.UniqueSaveKey, 26504059); Rand.Seed = pawn.RandSeedForHour(salt); bool flag = Rand.MTBEventOccurs(num, GenDate.TicksPerHour, GenDate.TicksPerHour); Rand.PopState(); if (flag) { result = base.TryIssueJobPackage(pawn, jobParams); } else { result = ThinkResult.NoJob; } } return(result); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (pawn.GetLord() == null) { Log.Error(string.Concat(pawn, " doing ThinkNode_DutyConstant with no Lord.")); return(ThinkResult.NoJob); } if (pawn.mindState.duty == null) { Log.Error(string.Concat(pawn, " doing ThinkNode_DutyConstant with no duty.")); return(ThinkResult.NoJob); } if (dutyDefToSubNode == null) { Log.Error(string.Concat(pawn, " has null dutyDefToSubNode. Recovering by calling ResolveSubnodes() (though that should have been called already).")); ResolveSubnodes(); } int num = dutyDefToSubNode[pawn.mindState.duty.def]; if (num < 0) { return(ThinkResult.NoJob); } return(subNodes[num].TryIssueJobPackage(pawn, jobParams)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { Logger.MessageFormat(this, "Checking for saved job on Meeseeks."); CompMeeseeksMemory compMeeseeksMemory = pawn.GetComp <CompMeeseeksMemory>(); if (compMeeseeksMemory != null && compMeeseeksMemory.GivenTask) { SavedJob savedJob = compMeeseeksMemory.savedJob; if (savedJob == null || CompMeeseeksMemory.noContinueJobs.Contains(savedJob.def)) { return(ThinkResult.NoJob); } Job nextJob = GetNextJob(pawn, compMeeseeksMemory); if (nextJob == null && compMeeseeksMemory.jobTargets.Count == 0) { nextJob = JobMaker.MakeJob(MeeseeksDefOf.CM_Meeseeks_Box_Job_EmbraceTheVoid); } if (nextJob != null) { return(new ThinkResult(nextJob, this, JobTag.MiscWork, fromQueue: false)); } } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { var forcePool = pawn.needs.TryGetNeed <Need_ForcePool>(); if (forcePool == null) { return(ThinkResult.NoJob); } var compForce = pawn.TryGetComp <CompForceUser>(); if (compForce == null) { return(ThinkResult.NoJob); } var sensitiveTrait = pawn.story.traits.GetTrait(ProjectJediDefOf.PJ_ForceSensitive); if (sensitiveTrait != null) { return(ThinkResult.NoJob); } if (compForce.ForceData.TicksUntilMeditate > Find.TickManager.TicksAbs) { return(ThinkResult.NoJob); } if (forcePool.CurCategory > ForcePoolCategory.Strong) { return(ThinkResult.NoJob); } return(base.TryIssueJobPackage(pawn, jobParams)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { var area = pawn.GetGuestArea(); if (area == null) { return(ThinkResult.NoJob); } if (area.TrueCount == 0) { return(ThinkResult.NoJob); } // Find nearby bool found = CellFinder.TryFindRandomReachableCellNear(pawn.Position, pawn.MapHeld, 20, TraverseParms.For(pawn, Danger.Some, TraverseMode.PassDoors), c => area[c], null, out var closeSpot); if (!found) { // Find any closeSpot = area.ActiveCells.InRandomOrder().Where(cell => area.Map.pathGrid.WalkableFast(cell)).Take(20) .FirstOrDefault(cell => pawn.CanReach(cell, PathEndMode.OnCell, Danger.Some, false, TraverseMode.PassDoors)); found = closeSpot.IsValid; } var job = found ? new ThinkResult(new Job(JobDefOf.Goto, closeSpot) { locomotionUrgency = LocomotionUrgency.Jog }, this) : ThinkResult.NoJob; return(job); }
private void DoWork_ForceOwnerToSleep() { for (int i = 0; i < owners.Count; i++) { // preparation: stop all other jobs if (owners[i].jobs != null) { owners[i].jobs.StopAll(); } // Do Job with JobGiver -> Force owner to sleep JobGiver_GetRest getRest = new JobGiver_GetRest(); JobIssueParams jobParms = new JobIssueParams(); ThinkResult thinkResult = getRest.TryIssueJobPackage(owners[i], jobParms); owners[i].jobs.StartJob(thinkResult.Job); // Alternate: If you want to send the pawn somewhere... //// Do Job with JobDriver -> Call owner to bed //JobDriver_GotoTarget jobDriver = new JobDriver_GotoTarget(owner); //// Alternate: (JobDriver_GotoTarget)MakeDriver(owner, typeof(JobDriver_GotoTarget)); //jobDriver.TargetCell = Position; //jobDriver.StartJob(); } }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { JobQueue jobQueue = pawn.jobs.jobQueue; if (pawn.Downed || jobQueue.AnyCanBeginNow(pawn, inBedOnly)) { while (jobQueue.Count > 0 && !jobQueue.Peek().job.CanBeginNow(pawn, inBedOnly)) { QueuedJob queuedJob = jobQueue.Dequeue(); pawn.ClearReservationsForJob(queuedJob.job); if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(" Throwing away queued job that I cannot begin now: " + queuedJob.job); } } } if (jobQueue.Count > 0 && jobQueue.Peek().job.CanBeginNow(pawn, inBedOnly)) { QueuedJob queuedJob2 = jobQueue.Dequeue(); if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(" Returning queued job: " + queuedJob2.job); } return(new ThinkResult(queuedJob2.job, this, queuedJob2.tag, fromQueue: true)); } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (Find.TickManager.TicksGame < GetLastTryTick(pawn) + 2500) { return(ThinkResult.NoJob); } SetLastTryTick(pawn, Find.TickManager.TicksGame); float num = MtbHours(pawn); if (num <= 0f) { return(ThinkResult.NoJob); } Rand.PushState(); int salt = Gen.HashCombineInt(base.UniqueSaveKey, 26504059); Rand.Seed = pawn.RandSeedForHour(salt); bool num2 = Rand.MTBEventOccurs(num, 2500f, 2500f); Rand.PopState(); if (num2) { return(base.TryIssueJobPackage(pawn, jobParams)); } return(ThinkResult.NoJob); }
//public override void PostLoad() //{ // subNodes.Add(giverRechargeEnergy); //}F public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobIssueParams) { statuses.Clear(); if (pawn.needs != null && pawn.needs.rest != null && pawn.needs.rest.CurLevel <= 0.25) { statuses.Add(pawn.needs.rest); } for (int i = 0; i < this.statuses.Count; i++) { ThinkResult jobPackage = new ThinkResult(); if (this.statuses[i] is Need_Rest) { jobPackage = this.giverRechargeEnergy.TryIssueJobPackage(pawn, jobIssueParams); } if (jobPackage.IsValid) { if (this.maxDistToSquadFlag > 0f) { IntVec3 cell = jobPackage.Job.targetA.Cell; if ((pawn.Position - cell).LengthHorizontalSquared > this.maxDistToSquadFlag * this.maxDistToSquadFlag) { return(ThinkResult.NoJob); } } return(jobPackage); } } return(ThinkResult.NoJob); }
/* * If the mech has no reason to leave a platform, or if it should go to a platform, override the job it intended to do with a mechanoid_rest job. */ public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { ThinkResult result = base.TryIssueJobPackage(pawn, jobParams); //Log.Message("result JobDef: " + result.Job.def.defName); if (result.Job == null && !pawn.IsActivated()) { Job job = null; if (pawn.OnBaseMechanoidPlatform())//If the mech is already on a platform, let it stay on it. { job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, pawn.CurrentBed()); } else//Else, let if find another platform. If it can't find one, let it continue work or idling. { Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(pawn, pawn); if (closestAvailablePlatform != null && pawn.CanReserve(closestAvailablePlatform)) { if (pawn.CurJob != null) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); } job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform); } } if (job != null) { result = new ThinkResult(job, this); } } return(result); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (Satisfied(pawn) == !invert) { return(base.TryIssueJobPackage(pawn, jobParams)); } return(ThinkResult.NoJob); }
// When the robot is idle, check if it is inside the room of the recharge station. If not, return there. public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { X2_AIRobot robot = pawn as X2_AIRobot; if (robot.DestroyedOrNull()) { return(ThinkResult.NoJob); } if (!robot.Spawned) { return(ThinkResult.NoJob); } X2_Building_AIRobotRechargeStation rechargeStation = robot.rechargeStation; if (rechargeStation.DestroyedOrNull()) { return(ThinkResult.NoJob); } if (!rechargeStation.Spawned) { return(ThinkResult.NoJob); } Need_Rest needRest = pawn.needs.rest; if (needRest == null) { return(ThinkResult.NoJob); } float curLevel = needRest.CurLevel; Job jobIdle = new Job(DefDatabase <JobDef> .GetNamed("AIRobot_GoAndWait"), rechargeStation); jobIdle.locomotionUrgency = LocomotionUrgency.Amble; if (curLevel > 0.751f) { return(new ThinkResult(jobIdle, this, JobTag.Idle, false)); } //double distance = AIRobot_Helper.GetDistance(pawn.Position, (pawn as X2_AIRobot).rechargeStation.Position); // //if (distance > 5f) // return ThinkResult.NoJob; //Boolean isInDistance = AIRobot_Helper.IsInDistance(pawn.Position, (pawn as X2_AIRobot).rechargeStation.Position, 5); //if (isInDistance) // return ThinkResult.NoJob; Job job = new Job(DefDatabase <JobDef> .GetNamed("AIRobot_GoRecharge"), rechargeStation); job.locomotionUrgency = LocomotionUrgency.Amble; return(new ThinkResult(job, this, JobTag.SatisfyingNeeds, false)); }
// Token: 0x0600002D RID: 45 RVA: 0x00002758 File Offset: 0x00000958 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParm) { bool flag = !HealthAIUtility.ShouldSeekMedicalRest(pawn); ThinkResult result; if (flag) { result = ThinkResult.NoJob; } else { bool flag2 = !HealthAIUtility.ShouldBeTendedNowByPlayer(pawn); if (flag2) { result = ThinkResult.NoJob; } else { bool flag3 = !GenCollection.Any <Apparel>(pawn.apparel.WornApparel, (Apparel x) => x.def.defName.Contains("RRY_Equipment_HunterGauntlet")); if (flag3) { result = ThinkResult.NoJob; } else { Thing thing = RestUtility.FindPatientBedFor(pawn); bool flag4 = thing == null; if (flag4) { result = ThinkResult.NoJob; } else { Thing thing2 = null; bool flag5 = Medicine.GetMedicineCountToFullyHeal(pawn) > 0; if (flag5) { thing2 = HealthAIUtility.FindBestMedicine(pawn, pawn); } bool flag6 = thing2 != null; Job job; if (flag6) { job = new Job(YautjaDefOf.RRY_Yautja_TendSelf, thing, thing2); } else { job = new Job(YautjaDefOf.RRY_Yautja_TendSelf, thing); } result = new ThinkResult(job, this, null, false); } } } } return(result); }
private static void Postfix(Pawn pawn, JobIssueParams jobParams, ref ThinkResult __result) { var jobDefs = pawn.GetPawnExtensions()?.suppressJobs?.soft; var job = __result.Job; if (jobDefs != null && job != null && jobDefs.Contains(job.def)) { __result = ThinkResult.NoJob; } }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { Job job = this.TryGiveJob(pawn); if (job == null) { return(ThinkResult.NoJob); } return(new ThinkResult(job, this, null, false)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { ThinkResult result = base.TryIssueJobPackage(pawn, jobParams); if (result.IsValid && !result.Tag.HasValue) { result = new ThinkResult(result.Job, result.SourceNode, tagToGive); } return(result); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { CheckLeaveCurrentVoluntarilyJoinableLord(pawn); JoinVoluntarilyJoinableLord(pawn); if (pawn.GetLord() != null && (pawn.mindState.duty == null || pawn.mindState.duty.def.hook == dutyHook)) { return(base.TryIssueJobPackage(pawn, jobParams)); } return(ThinkResult.NoJob); }
private static ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams, List <ThinkNode> subNodes, float minPriority) { List <ThinkNode> workingNodes = new List <ThinkNode>(); int count = subNodes.Count; for (int i = 0; i < count; i++) { workingNodes.Insert(Rand.Range(0, workingNodes.Count - 1), subNodes[i]); } while (workingNodes.Count > 0) { float num = 0f; int num2 = -1; for (int j = 0; j < workingNodes.Count; j++) { float num3 = 0f; try { num3 = workingNodes[j].GetPriority(pawn); } catch (Exception ex) { Log.Error("Think node error under threading, priority sorter"); } if (num3 > 0f && num3 >= minPriority) { if (num3 > num) { num = num3; num2 = j; } } } if (num2 == -1) { break; } ThinkResult result = ThinkResult.NoJob; try { result = workingNodes[num2].TryIssueJobPackage(pawn, jobParams); } catch (Exception ex2) { Log.Error("Think node error under threading, priority sorter"); } if (result.IsValid) { return(result); } workingNodes.RemoveAt(num2); } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { try { return(base.TryIssueJobPackage(pawn, jobParams)); } catch (NullReferenceException) { return(ThinkResult.NoJob);; } }
// When the robot is idle, check if it is inside the room of the recharge station. If not, return there. public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { X2_AIRobot robot = pawn as X2_AIRobot; if (robot.DestroyedOrNull()) { return(ThinkResult.NoJob); } if (!robot.Spawned) { return(ThinkResult.NoJob); } X2_Building_AIRobotRechargeStation rechargeStation = robot.rechargeStation; if (rechargeStation.DestroyedOrNull()) { return(ThinkResult.NoJob); } if (!rechargeStation.Spawned) { return(ThinkResult.NoJob); } Room roomRecharge = rechargeStation.Position.GetRoom(rechargeStation.Map); Room roomRobot = robot.Position.GetRoom(robot.Map); if (roomRecharge == roomRobot) { return(ThinkResult.NoJob); } // Find target pos, but max 10 cells away! Map mapRecharge = rechargeStation.Map; IntVec3 posRecharge = rechargeStation.Position; IntVec3 cell = roomRecharge.Cells.Where(c => c.Standable(mapRecharge) && !c.IsForbidden(pawn) && AIRobot_Helper.IsInDistance(c, posRecharge, 10) && pawn.CanReach(c, PathEndMode.OnCell, Danger.Some, false, TraverseMode.ByPawn) ) .FirstOrDefault(); if (cell == null || cell == IntVec3.Invalid) { return(ThinkResult.NoJob); } Job jobGoto = new Job(JobDefOf.Goto, cell); jobGoto.locomotionUrgency = LocomotionUrgency.Amble; return(new ThinkResult(jobGoto, this, JobTag.Misc, false)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { try { return(base.TryIssueJobPackage(pawn, jobParams)); } catch (NullReferenceException e) { //--Log.Message("[RJW]ThinkNode_ChancePerHour_Beastiality:TryIssueJobPackage - error message" + e.Message); //--Log.Message("[RJW]ThinkNode_ChancePerHour_Beastiality:TryIssueJobPackage - error stacktrace" + e.StackTrace); return(ThinkResult.NoJob);; } }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (pawn.GetLord() == null) { Log.Error(pawn + " doing ThinkNode_Duty with no Lord."); return(ThinkResult.NoJob); } if (pawn.mindState.duty == null) { Log.Error(pawn + " doing ThinkNode_Duty with no duty."); return(ThinkResult.NoJob); } return(this.subNodes[(int)pawn.mindState.duty.def.index].TryIssueJobPackage(pawn, jobParams)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (!pawn.PsiTracker().ShouldTrain()) { return(ThinkResult.NoJob); } var availableTrainer = Current.Game.GetComponent <PsiTechManager>().GetOpenTrainerForPawn(pawn); return(availableTrainer == null ? ThinkResult.NoJob : new ThinkResult(JobMaker.MakeJob(JobDefOf.EnterCryptosleepCasket, (LocalTargetInfo)availableTrainer), this, new JobTag?())); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { List <Trait> allTraits = pawn.story.traits.allTraits; for (int i = 0; i < allTraits.Count; i++) { ThinkTreeDef thinkTree = allTraits[i].CurrentData.thinkTree; if (thinkTree != null) { return(thinkTree.thinkRoot.TryIssueJobPackage(pawn, jobParams)); } } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { if (pawn.CurJob != null) { //Log.Message(pawn.NameStringShort + " already has a job: " + pawn.CurJob); return(new ThinkResult(pawn.CurJob, this)); } if (pawn.needs == null || pawn.needs.rest == null) { if (pawn.needs == null) { Log.ErrorOnce(pawn.NameStringShort + " has no needs", 453636 + pawn.thingIDNumber); } if (pawn.needs.rest == null) { Log.ErrorOnce(pawn.NameStringShort + " has no rest need", 357474 + pawn.thingIDNumber); } return(ThinkResult.NoJob); } if (pawn.mindState == null) { Log.ErrorOnce(pawn.NameStringShort + " has no mindstate", 23892 + pawn.thingIDNumber); pawn.mindState = new Pawn_MindState(pawn); } if (Find.TickManager.TicksGame - pawn.mindState.lastDisturbanceTick < 400) { Log.Message(pawn.NameStringShort + " can't sleep - got disturbed"); return(ThinkResult.NoJob); } Building_GuestBed bed = pawn.FindBedFor(); if (bed != null) { return(new ThinkResult(new Job(JobDefOf.LayDown, bed), this)); } IntVec3 vec = CellFinder.RandomClosewalkCellNear(pawn.mindState.duty.focus.Cell, pawn.MapHeld, 4); if (!pawn.CanReserve(vec)) { return(ThinkResult.NoJob); } pawn.Reserve(vec); return(new ThinkResult(new Job(JobDefOf.LayDown, vec), this)); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { int count = subNodes.Count; for (int i = 0; i < count; i++) { if (subNodes[i].GetPriority(pawn) > minPriority) { ThinkResult result = subNodes[i].TryIssueJobPackage(pawn, jobParams); if (result.IsValid) { return(result); } } } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { ThinkResult result = base.TryIssueJobPackage(pawn, jobParams); if (result.IsValid) { if (IsForbidden(result)) { return(ThinkResult.NoJob); } if (!IsOutsideArea(result.Job, pawn.GetGuestArea())) { return(result); } } return(ThinkResult.NoJob); }
public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams) { Lord lord = pawn.GetLord(); if (lord == null) { if (!pawn.Awake()) { return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams())); } if (pawn.needs?.food?.Starving ?? false) { return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams())); } if (pawn.story == null) { return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams())); } IdleJobGiverBase jobGiver = null; this.JobGivers.TryRandomElementByWeight((IdleJobGiverBase x) => x.GetWeight(pawn, pawn.story.traits.GetTrait(TraitDefOf.Industriousness)), out jobGiver); if (jobGiver != null) { Job job = jobGiver.TryGiveJob(pawn); if (job != null) { #if DEBUG Log.Message(string.Format("idle job {0} to {1}", jobGiver.GetType().Name, pawn.Name)); #endif return(new ThinkResult(job, this, null, false)); } #if DEBUG else { Log.Message(string.Format("idle job {0} to {1} but job is null", jobGiver.GetType().Name, pawn.Name)); } #endif } } return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams())); }