Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 3
0
        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);
        }