public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { // No designation if (pawn.Map.designationManager.DesignationOn(t, DesignationDefOf.VFES_RearmTrap) == null) { return(false); } // Cannot reserve if (!pawn.CanReserve(t, ignoreOtherReservations: forced)) { return(false); } // No movable items off trap var thingList = t.Position.GetThingList(t.Map); for (int i = 0; i < thingList.Count; i++) { var thing = thingList[i]; if (thing != t && thing.def.category == ThingCategory.Item && (thing.IsForbidden(pawn) || thing.IsInValidStorage() || !HaulAIUtility.CanHaulAside(pawn, thing, out IntVec3 storeCell))) { return(false); } } return(true); }
// Token: 0x06000009 RID: 9 RVA: 0x0000211C File Offset: 0x0000031C public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (pawn.Map.designationManager.DesignationOn(t, TrapsDefOf.TR_RearmTrap) == null) { return(false); } LocalTargetInfo localTargetInfo = t; if (!ReservationUtility.CanReserve(pawn, localTargetInfo, 1, -1, null, forced)) { return(false); } List <Thing> thingList = GridsUtility.GetThingList(t.Position, t.Map); for (int i = 0; i < thingList.Count; i++) { if (thingList[i] != t && thingList[i].def.category == ThingCategory.Item && (ForbidUtility.IsForbidden(thingList[i], pawn) || StoreUtility.IsInValidStorage(thingList[i]) || !HaulAIUtility.CanHaulAside(pawn, thingList[i], out IntVec3 intVec))) { return(false); } } return(true); }
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (pawn.Map.designationManager.DesignationOn(t, BetaTrapDefOf.RearmTrap) == null) { return(false); } LocalTargetInfo target = t; if (!pawn.CanReserve(target, 1, -1, null, forced)) { return(false); } List <Thing> thingList = t.Position.GetThingList(t.Map); for (int i = 0; i < thingList.Count; i++) { IntVec3 intVec; if (thingList[i] != t && thingList[i].def.category == ThingCategory.Item && (thingList[i].IsForbidden(pawn) || thingList[i].IsInValidStorage() || !HaulAIUtility.CanHaulAside(pawn, thingList[i], out intVec))) { return(false); } } return(true); }
public static bool CheckOportunisticToolJob(Pawn pawn, Job currJob, out Job toolJob) { toolJob = null; if (!pawn.CanUseTools(out var tracker) || pawn.InMentalState || pawn.IsBurning()) { return(false); } var jobDef = currJob.def; ToolType toolType; if (jobDef == RimWorld.JobDefOf.DoBill) { var billGiver = currJob.targetA.Thing.def; toolType = Dictionaries.billGiverToolType.TryGetValue(billGiver); } else { toolType = Dictionaries.jobToolType.TryGetValue(jobDef); } var toolList = tracker.memoryTool.ToList(); if (toolType != null) { toolList.RemoveAll(t => t.ToolTypes().Contains(toolType)); } // Return tool if (!toolList.NullOrEmpty() && jobDef.allowOpportunisticPrefix && !jobDef.IsReturningTool()) { bool foundPos = false; IntVec3 bestPos = pawn.PositionHeld; ThingWithComps tool = null; IntVec3 pawnPos = pawn.PositionHeld; foreach (var currTool in toolList) { if (HaulAIUtility.CanHaulAside(pawn, currTool, out var pos)) { if (!foundPos) { bestPos = pos; tool = currTool; foundPos = true; continue; } if (pos.DistanceTo(pawnPos) < bestPos.DistanceTo(pawnPos)) { bestPos = pos; tool = currTool; } } } if (foundPos) { toolJob = pawn.PutAwayTool(tool, false); TransformJob(ref toolJob); return(true); } return(false); } // Take tool else if (toolType != null) { if (!toolType.emergencyTool && !jobDef.allowOpportunisticPrefix) { return(false); } if (tracker.UsedHandler.BestTool[toolType] != null) { return(false); } var mapTracker = pawn.MapHeld.GetMapToolTracker(); var tool = mapTracker.ClosestTool(toolType, pawn.PositionHeld, pawn); if (tool != null) { toolJob = pawn.TakeTool(tool); TransformJob(ref toolJob); pawn.MapHeld.reservationManager.Reserve(pawn, toolJob, tool); return(true); } } return(false); }