public static Toil FailOnDespawnedNullOrForbiddenPlacedThings(this Toil toil) { toil.AddFailCondition(delegate { if (toil.actor.jobs.curJob.placedThings == null) { return(false); } for (int i = 0; i < toil.actor.jobs.curJob.placedThings.Count; i++) { ThingStackPartClass thingStackPartClass = toil.actor.jobs.curJob.placedThings[i]; if (thingStackPartClass.thing == null || !thingStackPartClass.thing.Spawned || thingStackPartClass.thing.Map != toil.actor.Map || (!toil.actor.CurJob.ignoreForbidden && thingStackPartClass.thing.IsForbidden(toil.actor))) { return(true); } } return(false); }); return(toil); }
public static Toil FailOnDespawnedNullOrForbiddenPlacedThings(this Toil toil) { toil.AddFailCondition(delegate { if (toil.actor.jobs.curJob.placedThings == null) { return(false); } int num = 0; while (num < toil.actor.jobs.curJob.placedThings.Count) { ThingStackPartClass thingStackPartClass = toil.actor.jobs.curJob.placedThings[num]; if (thingStackPartClass.thing != null && thingStackPartClass.thing.Spawned && thingStackPartClass.thing.Map == toil.actor.Map && (toil.actor.CurJob.ignoreForbidden || !thingStackPartClass.thing.IsForbidden(toil.actor))) { num++; continue; } return(true); } return(false); }); return(toil); }
public static Toil PlaceHauledThingInCell(TargetIndex cellInd, Toil nextToilOnPlaceFailOrIncomplete, bool storageMode) { Toil toil = new Toil(); toil.initAction = delegate { Pawn actor = toil.actor; Job curJob = actor.jobs.curJob; IntVec3 cell = curJob.GetTarget(cellInd).Cell; if (actor.carryTracker.CarriedThing == null) { Log.Error(actor + " tried to place hauled thing in cell but is not hauling anything."); } else { SlotGroup slotGroup = actor.Map.slotGroupManager.SlotGroupAt(cell); if (slotGroup != null && slotGroup.Settings.AllowedToAccept(actor.carryTracker.CarriedThing)) { actor.Map.designationManager.RemoveAllDesignationsOn(actor.carryTracker.CarriedThing, false); } Action <Thing, int> placedAction = null; if (curJob.def == JobDefOf.DoBill) { placedAction = delegate(Thing th, int added) { if (curJob.placedThings == null) { curJob.placedThings = new List <ThingStackPartClass>(); } ThingStackPartClass thingStackPartClass = curJob.placedThings.Find((ThingStackPartClass x) => x.thing == th); if (thingStackPartClass != null) { thingStackPartClass.Count += added; } else { curJob.placedThings.Add(new ThingStackPartClass(th, added)); } }; } Thing thing = default(Thing); if (!actor.carryTracker.TryDropCarriedThing(cell, ThingPlaceMode.Direct, out thing, placedAction)) { if (storageMode) { IntVec3 c = default(IntVec3); if (nextToilOnPlaceFailOrIncomplete != null && StoreUtility.TryFindBestBetterStoreCellFor(actor.carryTracker.CarriedThing, actor, actor.Map, StoragePriority.Unstored, actor.Faction, out c, true)) { if (actor.CanReserve(c, 1, -1, null, false)) { actor.Reserve(c, actor.CurJob, 1, -1, null); } actor.CurJob.SetTarget(cellInd, c); actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete); } else { Job job = HaulAIUtility.HaulAsideJobFor(actor, actor.carryTracker.CarriedThing); if (job != null) { curJob.targetA = job.targetA; curJob.targetB = job.targetB; curJob.targetC = job.targetC; curJob.count = job.count; curJob.haulOpportunisticDuplicates = job.haulOpportunisticDuplicates; curJob.haulMode = job.haulMode; actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete); } else { Log.Error("Incomplete haul for " + actor + ": Could not find anywhere to put " + actor.carryTracker.CarriedThing + " near " + actor.Position + ". Destroying. This should never happen!"); actor.carryTracker.CarriedThing.Destroy(DestroyMode.Vanish); } } } else if (nextToilOnPlaceFailOrIncomplete != null) { actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete); } } } }; return(toil); }