Exemple #1
0
        public static Job HopperFillFoodJob(Pawn pawn, ISlotGroupParent hopperSgp)
        {
            Building building = hopperSgp as Building;

            if (!pawn.CanReserveAndReach(building.Position, PathEndMode.Touch, pawn.NormalMaxDanger(), 1))
            {
                return(null);
            }
            ThingDef thingDef  = null;
            Thing    firstItem = building.Position.GetFirstItem();

            if (firstItem != null)
            {
                if (firstItem.def.IsNutritionSource)
                {
                    thingDef = firstItem.def;
                }
                else
                {
                    if (firstItem.IsForbidden(pawn.Faction))
                    {
                        return(null);
                    }
                    return(HaulAIUtility.HaulAsideJobFor(pawn, firstItem));
                }
            }
            List <Thing> list;

            if (thingDef == null)
            {
                list = Find.Map.listerThings.ThingsInGroup(ThingRequestGroup.FoodNotPlantOrTree);
            }
            else
            {
                list = Find.Map.listerThings.ThingsOfDef(thingDef);
            }
            for (int i = 0; i < list.Count; i++)
            {
                Thing thing = list[i];
                if (thing.def.ingestible.preferability == FoodPreferability.Raw)
                {
                    if (HaulAIUtility.PawnCanAutomaticallyHaul(pawn, thing))
                    {
                        if (Find.SlotGroupManager.SlotGroupAt(building.Position).Settings.AllowedToAccept(thing))
                        {
                            StoragePriority storagePriority = HaulAIUtility.StoragePriorityAtFor(thing.Position, thing);
                            if (storagePriority < hopperSgp.GetSlotGroup().Settings.Priority)
                            {
                                Job job = HaulAIUtility.HaulMaxNumToCellJob(pawn, thing, building.Position, true);
                                if (job != null)
                                {
                                    return(job);
                                }
                            }
                        }
                    }
                }
            }
            return(null);
        }
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!t.def.mineable)
            {
                return(null);
            }
            if (pawn.Map.designationManager.DesignationAt(t.Position, DesignationDefOf.Mine) == null)
            {
                return(null);
            }
            if (!pawn.CanReserve(t, 1, -1, null, forced))
            {
                return(null);
            }
            bool flag = false;

            for (int i = 0; i < 8; i++)
            {
                IntVec3 intVec = t.Position + GenAdj.AdjacentCells[i];
                if (intVec.InBounds(pawn.Map) && intVec.Standable(pawn.Map) && ReachabilityImmediate.CanReachImmediate(intVec, t, pawn.Map, PathEndMode.Touch, pawn))
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                for (int j = 0; j < 8; j++)
                {
                    IntVec3 intVec2 = t.Position + GenAdj.AdjacentCells[j];
                    if (!intVec2.InBounds(t.Map) || !ReachabilityImmediate.CanReachImmediate(intVec2, t, pawn.Map, PathEndMode.Touch, pawn) || !intVec2.Walkable(t.Map) || intVec2.Standable(t.Map))
                    {
                        continue;
                    }
                    Thing        thing     = null;
                    List <Thing> thingList = intVec2.GetThingList(t.Map);
                    for (int k = 0; k < thingList.Count; k++)
                    {
                        if (thingList[k].def.designateHaulable && thingList[k].def.passability == Traversability.PassThroughOnly)
                        {
                            thing = thingList[k];
                            break;
                        }
                    }
                    if (thing != null)
                    {
                        Job job = HaulAIUtility.HaulAsideJobFor(pawn, thing);
                        if (job != null)
                        {
                            return(job);
                        }
                        JobFailReason.Is(NoPathTrans);
                        return(null);
                    }
                }
                JobFailReason.Is(NoPathTrans);
                return(null);
            }
            return(JobMaker.MakeJob(JobDefOf.Mine, t, 20000, checkOverrideOnExpiry: true));
        }
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            var job = base.JobOnCell(pawn, c, forced);

            // plant has seeds, if there is a seed return a job, otherwise prevent it. Seeds with no category are forbidden.
            var seed = job?.plantDefToSow?.blueprintDef;

            if (seed != null && !seed.thingCategories.NullOrEmpty())
            {
                // Clear the area some...
                var zone = c.GetZone(pawn.Map);
                if (zone != null)
                {
                    foreach (var corner in GenAdj.AdjacentCells8WayRandomized())
                    {
                        var cell = c + corner;
                        if (zone.ContainsCell(cell))
                        {
                            foreach (var thing in pawn.Map.thingGrid.ThingsAt(cell))
                            {
                                if (thing.def != job.plantDefToSow && thing.def.BlocksPlanting(true) && pawn.CanReserve(thing) && !thing.IsForbidden(pawn))
                                {
                                    if (thing.def.category == ThingCategory.Plant)
                                    {
                                        return(new Job(JobDefOf.CutPlant, thing));
                                    }
                                    if (thing.def.EverHaulable)
                                    {
                                        return(HaulAIUtility.HaulAsideJobFor(pawn, thing));
                                    }
                                }
                            }
                        }
                    }
                }

                Predicate <Thing> predicate = (Thing tempThing) =>
                                              !ForbidUtility.IsForbidden(tempThing, pawn.Faction) &&
                                              ForbidUtility.InAllowedArea(tempThing.Position, pawn) &&
                                              PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) &&
                                              ReservationUtility.CanReserve(pawn, tempThing, 1);

                Thing bestSeedThingForSowing = GenClosest.ClosestThingReachable(
                    c, pawn.Map, ThingRequest.ForDef(job.plantDefToSow.blueprintDef),
                    PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999,
                    predicate);

                if (bestSeedThingForSowing != null)
                {
                    return(new Job(ResourceBank.JobDefOf.SowWithSeeds, c, bestSeedThingForSowing)
                    {
                        plantDefToSow = job.plantDefToSow,
                        count = SEEDS_TO_CARRY
                    });
                }
                return(null);
            }

            return(job);
        }
        public static Job HandleBlockingThingJob(Thing constructible, Pawn worker, bool forced = false)
        {
            Thing thing = GenConstruct.FirstBlockingThing(constructible, worker);
            Job   result;

            if (thing == null)
            {
                result = null;
            }
            else
            {
                if (thing.def.category == ThingCategory.Plant)
                {
                    LocalTargetInfo target    = thing;
                    PathEndMode     peMode    = PathEndMode.ClosestTouch;
                    Danger          maxDanger = worker.NormalMaxDanger();
                    if (worker.CanReserveAndReach(target, peMode, maxDanger, 1, -1, null, forced))
                    {
                        return(new Job(JobDefOf.CutPlant, thing));
                    }
                }
                else if (thing.def.category == ThingCategory.Item)
                {
                    if (thing.def.EverHaulable)
                    {
                        return(HaulAIUtility.HaulAsideJobFor(worker, thing));
                    }
                    Log.ErrorOnce(string.Concat(new object[]
                    {
                        "Never haulable ",
                        thing,
                        " blocking ",
                        constructible.ToStringSafe <Thing>(),
                        " at ",
                        constructible.Position
                    }), 6429262, false);
                }
                else if (thing.def.category == ThingCategory.Building)
                {
                    if (worker.story != null && worker.story.WorkTypeIsDisabled(WorkTypeDefOf.Construction))
                    {
                        JobFailReason.Is(GenConstruct.IncapableOfDeconstruction, null);
                        return(null);
                    }
                    LocalTargetInfo target    = thing;
                    PathEndMode     peMode    = PathEndMode.Touch;
                    Danger          maxDanger = worker.NormalMaxDanger();
                    if (worker.CanReserveAndReach(target, peMode, maxDanger, 1, -1, null, forced))
                    {
                        return(new Job(JobDefOf.Deconstruct, thing)
                        {
                            ignoreDesignations = true
                        });
                    }
                }
                result = null;
            }
            return(result);
        }
Exemple #5
0
        // Token: 0x060000EB RID: 235 RVA: 0x000083A0 File Offset: 0x000065A0
        public static void HandleBlockingThingJob_Prefix(ref Job __result, Thing constructible, Pawn worker, bool forced = false)
        {
            Thing thing = GenConstruct.FirstBlockingThing(constructible, worker);
            bool  flag  = thing == null;

            if (flag)
            {
                __result = null;
            }
            bool flag2 = thing.def.category == ThingCategory.Plant && worker.RaceProps.Animal;

            if (flag2)
            {
                bool flag3 = worker.CanReserveAndReach(thing, PathEndMode.ClosestTouch, worker.NormalMaxDanger(), 1, -1, null, forced);
                if (flag3)
                {
                    __result = new Job(JobDefOf.CutPlant, thing);
                }
            }
            else
            {
                bool flag4 = thing.def.category == ThingCategory.Item && worker.RaceProps.Animal;
                if (flag4)
                {
                    bool everHaulable = thing.def.EverHaulable;
                    if (everHaulable)
                    {
                        __result = HaulAIUtility.HaulAsideJobFor(worker, thing);
                    }
                    Log.ErrorOnce(string.Concat(new object[]
                    {
                        "Never haulable ",
                        thing,
                        " blocking ",
                        constructible.ToStringSafe <Thing>(),
                        " at ",
                        constructible.Position
                    }), 6429262, false);
                }
                else
                {
                    bool flag5 = thing.def.category == ThingCategory.Building && worker.RaceProps.Animal;
                    if (flag5)
                    {
                        bool flag6 = worker.CanReserveAndReach(thing, PathEndMode.Touch, worker.NormalMaxDanger(), 1, -1, null, forced);
                        if (flag6)
                        {
                            __result = new Job(WPJobDefOf.WPDeconstruct, thing)
                            {
                                ignoreDesignations = true
                            };
                        }
                    }
                }
            }
            __result = null;
        }
Exemple #6
0
        public static Job HandleBlockingThingJob(Thing constructible, Pawn worker, bool forced = false)
        {
            Thing thing = FirstBlockingThing(constructible, worker);

            if (thing == null)
            {
                return(null);
            }
            if (thing.def.category == ThingCategory.Plant)
            {
                if (worker.CanReserveAndReach(thing, PathEndMode.ClosestTouch, worker.NormalMaxDanger(), 1, -1, null, forced))
                {
                    return(JobMaker.MakeJob(JobDefOf.CutPlant, thing));
                }
            }
            else if (thing.def.category == ThingCategory.Item)
            {
                if (thing.def.EverHaulable)
                {
                    return(HaulAIUtility.HaulAsideJobFor(worker, thing));
                }
                Log.ErrorOnce("Never haulable " + thing + " blocking " + constructible.ToStringSafe() + " at " + constructible.Position, 6429262);
            }
            else if (thing.def.category == ThingCategory.Building)
            {
                if (((Building)thing).DeconstructibleBy(worker.Faction))
                {
                    if (worker.WorkTypeIsDisabled(WorkTypeDefOf.Construction))
                    {
                        JobFailReason.Is(IncapableOfDeconstruction);
                        return(null);
                    }
                    if (worker.CanReserveAndReach(thing, PathEndMode.Touch, worker.NormalMaxDanger(), 1, -1, null, forced))
                    {
                        Job job = JobMaker.MakeJob(JobDefOf.Deconstruct, thing);
                        job.ignoreDesignations = true;
                        return(job);
                    }
                }
                if (thing.def.mineable)
                {
                    if (worker.WorkTypeIsDisabled(WorkTypeDefOf.Mining))
                    {
                        JobFailReason.Is(IncapableOfMining);
                        return(null);
                    }
                    if (worker.CanReserveAndReach(thing, PathEndMode.Touch, worker.NormalMaxDanger(), 1, -1, null, forced))
                    {
                        Job job2 = JobMaker.MakeJob(JobDefOf.Mine, thing);
                        job2.ignoreDesignations = true;
                        return(job2);
                    }
                }
            }
            return(null);
        }
 public static Job HaulStuffOffBillGiverJob(Pawn pawn, IBillGiver giver, Thing thingToIgnore)
 {
     foreach (IntVec3 ingredientStackCell in giver.IngredientStackCells)
     {
         Thing thing = pawn.Map.thingGrid.ThingAt(ingredientStackCell, ThingCategory.Item);
         if (thing != null && thing != thingToIgnore)
         {
             return(HaulAIUtility.HaulAsideJobFor(pawn, thing));
         }
     }
     return(null);
 }
Exemple #8
0
 private static Job HaulStuffOffBillGiverJob(Pawn pawn, Building_ReligiousBuildingFacility giver, Thing thingToIgnore)
 {
     foreach (IntVec3 ingredientStackCell in giver.IngredientStackCells)
     {
         Thing t = pawn.Map.thingGrid.ThingAt(ingredientStackCell, ThingCategory.Item);
         if (t != null && t != thingToIgnore)
         {
             return(HaulAIUtility.HaulAsideJobFor(pawn, t));
         }
     }
     return((Job)null);
 }
Exemple #9
0
        public static Job HopperFillFoodJob(Pawn pawn, ISlotGroupParent hopperSgp)
        {
            Building building = (Building)hopperSgp;

            if (!pawn.CanReserveAndReach(building.Position, PathEndMode.Touch, pawn.NormalMaxDanger()))
            {
                return(null);
            }
            ThingDef thingDef  = null;
            Thing    firstItem = building.Position.GetFirstItem(building.Map);

            if (firstItem != null)
            {
                if (!Building_NutrientPasteDispenser.IsAcceptableFeedstock(firstItem.def))
                {
                    if (firstItem.IsForbidden(pawn))
                    {
                        return(null);
                    }
                    return(HaulAIUtility.HaulAsideJobFor(pawn, firstItem));
                }
                thingDef = firstItem.def;
            }
            List <Thing> list = (thingDef != null) ? pawn.Map.listerThings.ThingsOfDef(thingDef) : pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.FoodSourceNotPlantOrTree);
            bool         flag = false;

            for (int i = 0; i < list.Count; i++)
            {
                Thing thing = list[i];
                if (thing.def.IsNutritionGivingIngestible && (thing.def.ingestible.preferability == FoodPreferability.RawBad || thing.def.ingestible.preferability == FoodPreferability.RawTasty) && HaulAIUtility.PawnCanAutomaticallyHaul(pawn, thing, forced: false) && pawn.Map.haulDestinationManager.SlotGroupAt(building.Position).Settings.AllowedToAccept(thing))
                {
                    StoragePriority storagePriority = StoreUtility.CurrentStoragePriorityOf(thing);
                    if ((int)storagePriority >= (int)hopperSgp.GetSlotGroup().Settings.Priority)
                    {
                        flag = true;
                        JobFailReason.Is(TheOnlyAvailableFoodIsInStorageOfHigherPriorityTrans);
                    }
                    else
                    {
                        Job job = HaulAIUtility.HaulToCellStorageJob(pawn, thing, building.Position, fitInStoreCell: true);
                        if (job != null)
                        {
                            return(job);
                        }
                    }
                }
            }
            if (!flag)
            {
                JobFailReason.Is(NoFoodToFillHopperTrans);
            }
            return(null);
        }
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            Job job = base.JobOnCell(pawn, c);

            if (job == null || job.plantDefToSow == null || job.plantDefToSow.blueprintDef == null)
            {
                return(job);
            }
            Zone zone = GridsUtility.GetZone(c, pawn.Map);

            if (zone != null)
            {
                foreach (IntVec3 current in GenAdj.AdjacentCells8WayRandomized())
                {
                    IntVec3 intVec = c + current;
                    if (zone.ContainsCell(intVec))
                    {
                        foreach (Thing current2 in pawn.Map.thingGrid.ThingsAt(intVec))
                        {
                            if (current2.def != job.plantDefToSow && current2.def.BlockPlanting && ReservationUtility.CanReserve(pawn, current2, 1, -1, null, false) && !ForbidUtility.IsForbidden(current2, pawn))
                            {
                                if (current2.def.category == ThingCategory.Plant)
                                {
                                    Job result = new Job(JobDefOf.CutPlant, current2);
                                    return(result);
                                }
                                if (current2.def.EverHaulable)
                                {
                                    Job result = HaulAIUtility.HaulAsideJobFor(pawn, current2);
                                    return(result);
                                }
                            }
                        }
                    }
                }
            }
            Predicate <Thing> predicate = (Thing tempThing) => !ForbidUtility.IsForbidden(tempThing, pawn.Faction) && PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) && ReservationUtility.CanReserve(pawn, tempThing, 1, -1, null, false);
            Thing             thing     = GenClosest.ClosestThingReachable(c, pawn.Map, ThingRequest.ForDef(job.plantDefToSow.blueprintDef), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, 0, false), 9999f, predicate, null, 0, -1, false, RegionType.Set_Passable, false);

            if (thing != null)
            {
                return(new Job(DefDatabase <JobDef> .GetNamed("SowWithSeeds"), c, thing)
                {
                    plantDefToSow = job.plantDefToSow,
                    count = 25
                });
            }
            return(null);
        }
Exemple #11
0
        public Job JobOnThing(Pawn pawn, Thing t)
        {
            if (!t.def.mineable)
            {
                return(null);
            }
            if (Find.DesignationManager.DesignationAt(t.Position, DesignationDefOf.Mine) == null)
            {
                return(null);
            }
            if (!pawn.CanReserve(t, 1))
            {
                return(null);
            }
            bool flag = false;

            for (int i = 0; i < 8; i++)
            {
                IntVec3 c = t.Position + GenAdj.AdjacentCells[i];
                if (c.InBounds() && c.Standable())
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                for (int j = 0; j < 8; j++)
                {
                    IntVec3 c2 = t.Position + GenAdj.AdjacentCells[j];
                    if (c2.InBounds())
                    {
                        if (c2.Walkable() && !c2.Standable())
                        {
                            Thing firstHaulable = c2.GetFirstHaulable();
                            if (firstHaulable != null && firstHaulable.def.passability == Traversability.PassThroughOnly)
                            {
                                return(HaulAIUtility.HaulAsideJobFor(pawn, firstHaulable));
                            }
                        }
                    }
                }
                return(null);
            }
            return(new Job(JobDefOf.Mine, t, 1500, true));
        }
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            List <Thing> thingList = t.Position.GetThingList(t.Map);

            for (int i = 0; i < thingList.Count; i++)
            {
                if (thingList[i] != t && thingList[i].def.category == ThingCategory.Item)
                {
                    Job job = HaulAIUtility.HaulAsideJobFor(pawn, thingList[i]);
                    if (job != null)
                    {
                        return(job);
                    }
                }
            }
            return(new Job(BetaTrapDefOf.RearmTrapJob, t));
        }
Exemple #13
0
        /// <summary>
        /// Check if a thing is standable beside. If not, set job to a
        /// haul job to move something out of the way. Otherwise, job is null.
        /// In some cases, when pawn can't stand by thing but there's no way to fix that by hauling,
        /// job will still be null when CanStandBy is false.
        /// </summary>
        public static bool CanStandBy(Pawn pawn, Thing thing, out Job job)
        {
            if (CellUtilities.EnumerateAdjacentCells(thing.Position).Any(c => c.InBounds() && c.Standable()))
            {
                job = null;
                return(true);
            }

            var impediment = CellUtilities.GetHaulableImpedimentBeside(thing.Position);

            if (impediment != null)
            {
                job = HaulAIUtility.HaulAsideJobFor(pawn, impediment);
                return(false);
            }

            job = null;
            return(false);
        }
Exemple #14
0
        /* RimWorld.GenConstruct.HandleBlockingThingJob
         * Tweaked vanilla code to disregard construction and only cut plants if the hauler is a PlantCutter */
        public static Job HandleBlockingThingJob(Thing firstBlocking, Pawn p, bool forced = false)
        {
            if (firstBlocking.def.category == ThingCategory.Plant)
            {
                if (p.workSettings.GetPriority(PlantCutting) > 0)
                {
                    if (p.CanReserveAndReach(new LocalTargetInfo(firstBlocking), PathEndMode.ClosestTouch, p.NormalMaxDanger(), 1, -1, null, forced))
                    {
                        return(new Job(JobDefOf.CutPlant, firstBlocking));
                    }
                }
            }

            else if (firstBlocking.def.category == ThingCategory.Item && firstBlocking.def.EverHaulable)
            {
                return(HaulAIUtility.HaulAsideJobFor(p, firstBlocking));
            }

            return(null);
        }
Exemple #15
0
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            // Move things 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)
                {
                    var haulAsideJob = HaulAIUtility.HaulAsideJobFor(pawn, thing);
                    if (haulAsideJob != null)
                    {
                        return(haulAsideJob);
                    }
                }
            }

            // Rearm trap
            return(new Job(JobDefOf.VFES_RearmTrap, t));
        }
        public static Job HandleBlockingThingJob(Thing constructible, Pawn worker, bool forced = false)
        {
            Thing thing = GenConstruct.FirstBlockingThing(constructible, worker);

            if (thing == null)
            {
                return(null);
            }
            if (thing.def.category == ThingCategory.Plant)
            {
                LocalTargetInfo target    = thing;
                PathEndMode     peMode    = PathEndMode.ClosestTouch;
                Danger          maxDanger = worker.NormalMaxDanger();
                if (worker.CanReserveAndReach(target, peMode, maxDanger, 1, -1, null, forced))
                {
                    return(new Job(JobDefOf.CutPlant, thing));
                }
            }
            else if (thing.def.category == ThingCategory.Item)
            {
                if (thing.def.EverHaulable)
                {
                    return(HaulAIUtility.HaulAsideJobFor(worker, thing));
                }
                Log.ErrorOnce("Never haulable " + thing + " blocking " + constructible.ToStringSafe() + " at " + constructible.Position, 6429262);
            }
            else if (thing.def.category == ThingCategory.Building)
            {
                LocalTargetInfo target    = thing;
                PathEndMode     peMode    = PathEndMode.Touch;
                Danger          maxDanger = worker.NormalMaxDanger();
                if (worker.CanReserveAndReach(target, peMode, maxDanger, 1, -1, null, forced))
                {
                    Job job = new Job(JobDefOf.Deconstruct, thing);
                    job.ignoreDesignations = true;
                    return(job);
                }
            }
            return(null);
        }
        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.", false);
                    return;
                }
                SlotGroup slotGroup = actor.Map.haulDestinationManager.SlotGroupAt(cell);
                if (slotGroup != null && slotGroup.Settings.AllowedToAccept(actor.carryTracker.CarriedThing))
                {
                    actor.Map.designationManager.TryRemoveDesignationOn(actor.carryTracker.CarriedThing, DesignationDefOf.Haul);
                }
                Action <Thing, int> placedAction = null;
                if (curJob.def == DissectionDefOf.DoDissectionBill)
                {
                    placedAction = delegate(Thing th, int added)
                    {
                        if (curJob.placedThings == null)
                        {
                            curJob.placedThings = new List <ThingCountClass>();
                        }
                        ThingCountClass thingCountClass = curJob.placedThings.Find((ThingCountClass x) => x.thing == th);
                        if (thingCountClass != null)
                        {
                            thingCountClass.Count += added;
                        }
                        else
                        {
                            curJob.placedThings.Add(new ThingCountClass(th, added));
                        }
                    };
                }
                if (!actor.carryTracker.TryDropCarriedThing(cell, ThingPlaceMode.Direct, out Thing thing, placedAction))
                {
                    if (storageMode)
                    {
                        if (nextToilOnPlaceFailOrIncomplete != null && StoreUtility.TryFindBestBetterStoreCellFor(actor.carryTracker.CarriedThing, actor, actor.Map, StoragePriority.Unstored, actor.Faction, out IntVec3 c, true))
                        {
                            if (actor.CanReserve(c, 1, -1, null, false))
                            {
                                actor.Reserve(c, actor.CurJob, 1, -1, null, true);
                            }
                            actor.CurJob.SetTarget(cellInd, c);
                            actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete);
                            return;
                        }
                        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(string.Concat(new object[]
                            {
                                "Incomplete haul for ",
                                actor,
                                ": Could not find anywhere to put ",
                                actor.carryTracker.CarriedThing,
                                " near ",
                                actor.Position,
                                ". Destroying. This should never happen!"
                            }), false);
                            actor.carryTracker.CarriedThing.Destroy(DestroyMode.Vanish);
                        }
                    }
                    else if (nextToilOnPlaceFailOrIncomplete != null)
                    {
                        actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete);
                        return;
                    }
                }
            };
            return(toil);
        }
Exemple #18
0
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            Map map = pawn.Map;

            if (c.IsForbidden(pawn))
            {
                return(null);
            }
            if (!PlantUtility.GrowthSeasonNow(c, map, true))
            {
                return(null);
            }
            if (WorkGiver_GrowerBotany.wantedPlantDef == null)
            {
                WorkGiver_GrowerBotany.wantedPlantDef = WorkGiver_GrowerBotany.CalculateWantedPlantDef(c, map);
                if (WorkGiver_GrowerBotany.wantedPlantDef == null)
                {
                    return(null);
                }
            }
            List <Thing> thingList = c.GetThingList(map);
            bool         flag      = false;

            for (int i = 0; i < thingList.Count; i++)
            {
                Thing thing = thingList[i];
                if (thing.def == WorkGiver_GrowerBotany.wantedPlantDef)
                {
                    return(null);
                }
                if ((thing is Blueprint || thing is Frame) && thing.Faction == pawn.Faction)
                {
                    flag = true;
                }
            }
            if (flag)
            {
                Thing edifice = c.GetEdifice(map);
                if (edifice == null || edifice.def.fertility < 0f)
                {
                    return(null);
                }
            }
            if (WorkGiver_GrowerBotany.wantedPlantDef.plant.cavePlant)
            {
                if (!c.Roofed(map))
                {
                    JobFailReason.Is(WorkGiver_GrowerSowBotany.CantSowCavePlantBecauseUnroofedTrans, null);
                    return(null);
                }
                if (map.glowGrid.GameGlowAt(c, true) > 0f)
                {
                    JobFailReason.Is(WorkGiver_GrowerSowBotany.CantSowCavePlantBecauseOfLightTrans, null);
                    return(null);
                }
            }
            if (WorkGiver_GrowerBotany.wantedPlantDef.plant.interferesWithRoof && c.Roofed(pawn.Map))
            {
                return(null);
            }
            Plant plant = c.GetPlant(map);

            if (plant != null && plant.def.plant.blockAdjacentSow)
            {
                LocalTargetInfo target = plant;
                if (!pawn.CanReserve(target, 1, -1, null, forced) || plant.IsForbidden(pawn))
                {
                    return(null);
                }
                return(new Job(JobDefOf.CutPlant, plant));
            }
            else
            {
                Thing thing2 = PlantUtility.AdjacentSowBlocker(WorkGiver_GrowerBotany.wantedPlantDef, c, map);
                if (thing2 != null)
                {
                    Plant plant2 = thing2 as Plant;
                    if (plant2 != null)
                    {
                        LocalTargetInfo target = plant2;
                        if (pawn.CanReserve(target, 1, -1, null, forced) && !plant2.IsForbidden(pawn))
                        {
                            IPlantToGrowSettable plantToGrowSettable = plant2.Position.GetPlantToGrowSettable(plant2.Map);
                            if (plantToGrowSettable == null || plantToGrowSettable.GetPlantDefToGrow() != plant2.def)
                            {
                                return(new Job(JobDefOf.CutPlant, plant2));
                            }
                        }
                    }
                    return(null);
                }
                if (WorkGiver_GrowerBotany.wantedPlantDef.plant.sowMinSkill > 0 && pawn.skills != null && pawn.skills.GetSkill(SkillDefOf.Plants).Level < WorkGiver_GrowerBotany.wantedPlantDef.plant.sowMinSkill)
                {
                    return(null);
                }
                int j = 0;
                while (j < thingList.Count)
                {
                    Thing thing3 = thingList[j];
                    if (thing3.def.BlockPlanting)
                    {
                        LocalTargetInfo target = thing3;
                        if (!pawn.CanReserve(target, 1, -1, null, forced))
                        {
                            return(null);
                        }
                        if (thing3.def.category == ThingCategory.Plant)
                        {
                            if (!thing3.IsForbidden(pawn))
                            {
                                return(new Job(JobDefOf.CutPlant, thing3));
                            }
                            return(null);
                        }
                        else
                        {
                            if (thing3.def.EverHaulable)
                            {
                                return(HaulAIUtility.HaulAsideJobFor(pawn, thing3));
                            }
                            return(null);
                        }
                    }
                    else
                    {
                        j++;
                    }
                }
                if (WorkGiver_GrowerBotany.wantedPlantDef.CanEverPlantAt(c, map) && PlantUtility.GrowthSeasonNow(c, map, true))
                {
                    LocalTargetInfo target = c;
                    if (pawn.CanReserve(target, 1, -1, null, forced))
                    {
                        return(new Job(JobDefOf.Sow, c)
                        {
                            plantDefToSow = WorkGiver_GrowerBotany.wantedPlantDef
                        });
                    }
                }
                return(null);
            }
        }
        public override Job JobOnThing(Pawn pawn, Thing t)
        {
            if (t.Faction != pawn.Faction)
            {
                return(null);
            }
            Blueprint blueprint = t as Blueprint;

            if (blueprint == null)
            {
                return(null);
            }
            Thing thingToIgnore = GenConstruct.MiniToInstallOrBuildingToReinstall(blueprint);
            Thing thing         = blueprint.FirstBlockingThing(pawn, thingToIgnore, false);

            if (thing != null)
            {
                if (thing.def.category == ThingCategory.Plant)
                {
                    // SINGLE CHANGE FROM VANILLA WorkGiver, make designation instead of immediate cutting plants
                    //return new Job(JobDefOf.CutPlant, thing);

                    if (Find.DesignationManager.DesignationOn(thing, DesignationDefOf.CutPlant) == null && Find.DesignationManager.DesignationOn(thing, DesignationDefOf.HarvestPlant) == null)
                    {
                        Find.DesignationManager.AddDesignation(new Designation(thing, DesignationDefOf.CutPlant));
                    }
                    return(null);
                }
                else if (thing.def.category == ThingCategory.Item)
                {
                    if (thing.def.EverHaulable)
                    {
                        return(HaulAIUtility.HaulAsideJobFor(pawn, thing));
                    }
                    Log.ErrorOnce(string.Concat(new object[]
                    {
                        "Never haulable ",
                        thing,
                        " blocking ",
                        t,
                        " at ",
                        t.Position
                    }), 6429262);
                }
                return(null);
            }
            if (!GenConstruct.CanConstruct(blueprint, pawn))
            {
                return(null);
            }
            Job job = this.DeconstructExistingEdificeJob(pawn, blueprint);

            if (job != null)
            {
                return(job);
            }
            Job job2 = base.ResourceDeliverJobFor(pawn, blueprint);

            if (job2 != null)
            {
                return(job2);
            }
            Job job3 = this.NoCostFrameMakeJobFor(pawn, blueprint);

            if (job3 != null)
            {
                return(job3);
            }
            return(null);
        }
Exemple #20
0
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            Map map = pawn.Map;

            if (c.IsForbidden(pawn))
            {
                return(null);
            }
            if (!PlantUtility.GrowthSeasonNow(c, map, forSowing: true))
            {
                return(null);
            }
            if (WorkGiver_Grower.wantedPlantDef == null)
            {
                WorkGiver_Grower.wantedPlantDef = WorkGiver_Grower.CalculateWantedPlantDef(c, map);
                if (WorkGiver_Grower.wantedPlantDef == null)
                {
                    return(null);
                }
            }
            List <Thing> thingList = c.GetThingList(map);
            bool         flag      = false;

            for (int i = 0; i < thingList.Count; i++)
            {
                Thing thing = thingList[i];
                if (thing.def == WorkGiver_Grower.wantedPlantDef)
                {
                    return(null);
                }
                if ((thing is Blueprint || thing is Frame) && thing.Faction == pawn.Faction)
                {
                    flag = true;
                }
            }
            if (flag)
            {
                Thing edifice = c.GetEdifice(map);
                if (edifice == null || edifice.def.fertility < 0f)
                {
                    return(null);
                }
            }
            if (WorkGiver_Grower.wantedPlantDef.plant.cavePlant)
            {
                if (!c.Roofed(map))
                {
                    JobFailReason.Is(CantSowCavePlantBecauseUnroofedTrans);
                    return(null);
                }
                if (map.glowGrid.GameGlowAt(c, ignoreCavePlants: true) > 0f)
                {
                    JobFailReason.Is(CantSowCavePlantBecauseOfLightTrans);
                    return(null);
                }
            }
            if (WorkGiver_Grower.wantedPlantDef.plant.interferesWithRoof && c.Roofed(pawn.Map))
            {
                return(null);
            }
            Plant plant = c.GetPlant(map);

            if (plant != null && plant.def.plant.blockAdjacentSow)
            {
                if (!pawn.CanReserve(plant, 1, -1, null, forced) || plant.IsForbidden(pawn))
                {
                    return(null);
                }
                return(JobMaker.MakeJob(JobDefOf.CutPlant, plant));
            }
            Thing thing2 = PlantUtility.AdjacentSowBlocker(WorkGiver_Grower.wantedPlantDef, c, map);

            if (thing2 != null)
            {
                Plant plant2 = thing2 as Plant;
                if (plant2 != null && pawn.CanReserve(plant2, 1, -1, null, forced) && !plant2.IsForbidden(pawn))
                {
                    IPlantToGrowSettable plantToGrowSettable = plant2.Position.GetPlantToGrowSettable(plant2.Map);
                    if (plantToGrowSettable == null || plantToGrowSettable.GetPlantDefToGrow() != plant2.def)
                    {
                        return(JobMaker.MakeJob(JobDefOf.CutPlant, plant2));
                    }
                }
                return(null);
            }
            if (WorkGiver_Grower.wantedPlantDef.plant.sowMinSkill > 0 && pawn.skills != null && pawn.skills.GetSkill(SkillDefOf.Plants).Level < WorkGiver_Grower.wantedPlantDef.plant.sowMinSkill)
            {
                JobFailReason.Is("UnderAllowedSkill".Translate(WorkGiver_Grower.wantedPlantDef.plant.sowMinSkill), def.label);
                return(null);
            }
            for (int j = 0; j < thingList.Count; j++)
            {
                Thing thing3 = thingList[j];
                if (!thing3.def.BlocksPlanting())
                {
                    continue;
                }
                if (!pawn.CanReserve(thing3, 1, -1, null, forced))
                {
                    return(null);
                }
                if (thing3.def.category == ThingCategory.Plant)
                {
                    if (!thing3.IsForbidden(pawn))
                    {
                        return(JobMaker.MakeJob(JobDefOf.CutPlant, thing3));
                    }
                    return(null);
                }
                if (thing3.def.EverHaulable)
                {
                    return(HaulAIUtility.HaulAsideJobFor(pawn, thing3));
                }
                return(null);
            }
            if (!WorkGiver_Grower.wantedPlantDef.CanEverPlantAt_NewTemp(c, map) || !PlantUtility.GrowthSeasonNow(c, map, forSowing: true) || !pawn.CanReserve(c, 1, -1, null, forced))
            {
                return(null);
            }
            Job job = JobMaker.MakeJob(JobDefOf.Sow, c);

            job.plantDefToSow = WorkGiver_Grower.wantedPlantDef;
            return(job);
        }
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            //if (!pawn.IsPrisoner)
            //    return null;
            if (c.IsForbidden(pawn))
            {
                return(null);
            }
            if (!PlantUtility.GrowthSeasonNow(c, pawn.Map))
            {
                return(null);
            }
            if (wantedPlantDef == null)
            {
                wantedPlantDef = CalculateWantedPlantDef(c, pawn.Map);
                if (wantedPlantDef == null)
                {
                    return(null);
                }
            }
            var thingList = c.GetThingList(pawn.Map);

            for (var i = 0; i < thingList.Count; i++)
            {
                var thing = thingList[i];
                if (thing.def == wantedPlantDef)
                {
                    return(null);
                }
                if ((thing is Blueprint || thing is Frame) && thing.Faction == pawn.Faction)
                {
                    return(null);
                }
            }
            var plant = c.GetPlant(pawn.Map);

            if (plant != null && plant.def.plant.blockAdjacentSow)
            {
                if (!pawn.CanReserve(plant, 1, -1, null, false) || plant.IsForbidden(pawn))
                {
                    return(null);
                }
                return(new Job(JobDefOf.CutPlant, plant));
            }
            var thing2 = PlantUtility.AdjacentSowBlocker(wantedPlantDef, c, pawn.Map);

            if (thing2 != null)
            {
                var plant2 = thing2 as Plant;
                if (plant2 != null && pawn.CanReserve(plant2, 1, -1, null, false) && !plant2.IsForbidden(pawn))
                {
                    var plantToGrowSettable = plant2.Position.GetPlantToGrowSettable(plant2.Map);
                    if (plantToGrowSettable == null || plantToGrowSettable.GetPlantDefToGrow() != plant2.def)
                    {
                        return(new Job(JobDefOf.CutPlant, plant2));
                    }
                }
                return(null);
            }
            if (wantedPlantDef.plant.sowMinSkill > 0 && pawn.skills != null && pawn.skills.GetSkill(SkillDefOf.Plants).Level < wantedPlantDef.plant.sowMinSkill)
            {
                return(null);
            }
            if (pawn.IsPrisoner && wantedPlantDef.plant.sowMinSkill > 6 && !PrisonLaborPrefs.AdvancedGrowing)
            {
                Tutorials.Growing();
                return(null);
            }
            var j = 0;

            while (j < thingList.Count)
            {
                var thing3 = thingList[j];
                if (thing3.def.BlockPlanting)
                {
                    if (!pawn.CanReserve(thing3, 1, -1, null, false))
                    {
                        return(null);
                    }
                    if (thing3.def.category == ThingCategory.Plant)
                    {
                        if (!thing3.IsForbidden(pawn))
                        {
                            return(new Job(JobDefOf.CutPlant, thing3));
                        }
                        return(null);
                    }
                    if (thing3.def.EverHaulable)
                    {
                        return(HaulAIUtility.HaulAsideJobFor(pawn, thing3));
                    }
                    return(null);
                }
                j++;
            }
            if (!wantedPlantDef.CanEverPlantAt(c, pawn.Map) || !PlantUtility.GrowthSeasonNow(c, pawn.Map) ||
                !pawn.CanReserve(c, 1, -1, null, false))
            {
                return(null);
            }
            return(new Job(JobDefOf.Sow, c)
            {
                plantDefToSow = wantedPlantDef
            });
        }
Exemple #22
0
        private static Toil PlaceHauledThingInCell(TargetIndex cellInd, Toil nextToilOnPlaceFailOrIncomplete, bool storageMode)
        {
            Toil toil = new Toil();

            toil.initAction = (Action)(() =>
            {
                Pawn actor = toil.actor;
                Job curJob = actor.jobs.curJob;
                IntVec3 cell = curJob.GetTarget(cellInd).Cell;
                if (actor.carryTracker.CarriedThing == null)
                {
                    Log.Error(actor.ToString() + " tried to place hauled thing in cell but is not hauling anything.", false);
                }
                else
                {
                    SlotGroup slotGroup = actor.Map.haulDestinationManager.SlotGroupAt(cell);
                    if (slotGroup != null && slotGroup.Settings.AllowedToAccept(actor.carryTracker.CarriedThing))
                    {
                        actor.Map.designationManager.TryRemoveDesignationOn(actor.carryTracker.CarriedThing, DesignationDefOf.Haul);
                    }
                    Action <Thing, int> placedAction = (Action <Thing, int>)null;
                    placedAction = (Action <Thing, int>)((th, added) =>
                    {
                        if (curJob.placedThings == null)
                        {
                            curJob.placedThings = new List <ThingCountClass>();
                        }
                        ThingCountClass thingCountClass = curJob.placedThings.Find((Predicate <ThingCountClass>)(x => x.thing == th));
                        if (thingCountClass != null)
                        {
                            thingCountClass.Count += added;
                        }
                        else
                        {
                            curJob.placedThings.Add(new ThingCountClass(th, added));
                        }
                    });
                    Thing resultingThing;
                    if (actor.carryTracker.TryDropCarriedThing(cell, ThingPlaceMode.Direct, out resultingThing, placedAction))
                    {
                        return;
                    }
                    if (storageMode)
                    {
                        IntVec3 foundCell;
                        if (nextToilOnPlaceFailOrIncomplete != null && StoreUtility.TryFindBestBetterStoreCellFor(actor.carryTracker.CarriedThing, actor, actor.Map, StoragePriority.Unstored, actor.Faction, out foundCell, true))
                        {
                            if (actor.CanReserve((LocalTargetInfo)foundCell, 1, -1, (ReservationLayerDef)null, false))
                            {
                                actor.Reserve((LocalTargetInfo)foundCell, actor.CurJob, 1, -1, (ReservationLayerDef)null, true);
                            }
                            actor.CurJob.SetTarget(cellInd, (LocalTargetInfo)foundCell);
                            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 " + (object)actor + ": Could not find anywhere to put " + (object)actor.carryTracker.CarriedThing + " near " + (object)actor.Position + ". Destroying. This should never happen!", false);
                                actor.carryTracker.CarriedThing.Destroy(DestroyMode.Vanish);
                            }
                        }
                    }
                    else
                    {
                        if (nextToilOnPlaceFailOrIncomplete == null)
                        {
                            return;
                        }
                        actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete);
                    }
                }
            });
            return(toil);
        }
Exemple #23
0
        public Job JobOnCell(Pawn pawn, IntVec3 c)
        {
            if (c.IsForbidden(pawn))
            {
                return(null);
            }
            if (!GenPlant.GrowthSeasonNow(c))
            {
                return(null);
            }
            if (wantedPlantDef == null)
            {
                DetermineWantedPlantDef(c);
                if (wantedPlantDef == null)
                {
                    return(null);
                }
            }
            Plant plant = c.GetPlant();

            if (plant != null)
            {
                if (plant.def == wantedPlantDef)
                {
                    return(null);
                }
                if (plant.def.plant.blockAdjacentSow)
                {
                    if (!pawn.CanReserve(plant, 1) || plant.IsForbidden(pawn))
                    {
                        return(null);
                    }
                    return(new Job(JobDefOf.CutPlant, plant));
                }
            }
            Thing thing = GenPlant.AdjacentSowBlocker(wantedPlantDef, c);

            if (thing != null)
            {
                Plant plant2 = thing as Plant;
                if (plant2 != null && pawn.CanReserve(plant2, 1) && !plant2.IsForbidden(pawn))
                {
                    Zone_Growing zone_Growing = Find.ZoneManager.ZoneAt(plant2.Position) as Zone_Growing;
                    if (zone_Growing == null || zone_Growing.GetPlantDefToGrow() != plant2.def)
                    {
                        return(new Job(JobDefOf.CutPlant, plant2));
                    }
                }
                return(null);
            }
            List <Thing> list = Find.ThingGrid.ThingsListAt(c);
            int          i    = 0;

            while (i < list.Count)
            {
                Thing thing2 = list[i];
                if (thing2.def == wantedPlantDef)
                {
                    return(null);
                }
                if (thing2.def.BlockPlanting)
                {
                    if (!pawn.CanReserve(thing2, 1))
                    {
                        return(null);
                    }
                    if (thing2.def.category == ThingCategory.Plant)
                    {
                        if (!thing2.IsForbidden(pawn))
                        {
                            return(new Job(JobDefOf.CutPlant, thing2));
                        }
                        return(null);
                    }
                    else
                    {
                        if (thing2.def.EverHaulable)
                        {
                            return(HaulAIUtility.HaulAsideJobFor(pawn, thing2));
                        }
                        return(null);
                    }
                }
                else
                {
                    i++;
                }
            }
            if (!wantedPlantDef.CanEverPlantAt(c) || !GenPlant.GrowthSeasonNow(c) || !pawn.CanReserve(c, 1))
            {
                return(null);
            }
            return(new Job(JobDefOf.Sow, c)
            {
                plantDefToSow = wantedPlantDef
            });
        }
Exemple #24
0
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!t.def.mineable)
            {
                return(null);
            }
            if (pawn.Map.designationManager.DesignationAt(t.Position, DesignationDefOf.Mine) == null)
            {
                return(null);
            }
            if (!pawn.CanReserve(t, 1, -1, null, false))
            {
                return(null);
            }
            bool flag = false;

            for (int i = 0; i < 8; i++)
            {
                IntVec3 intVec = t.Position + GenAdj.AdjacentCells[i];
                if (intVec.InBounds(pawn.Map) && intVec.Standable(pawn.Map) && ReachabilityImmediate.CanReachImmediate(intVec, t, pawn.Map, PathEndMode.Touch, pawn))
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                for (int j = 0; j < 8; j++)
                {
                    IntVec3 intVec2 = t.Position + GenAdj.AdjacentCells[j];
                    if (intVec2.InBounds(t.Map) && ReachabilityImmediate.CanReachImmediate(intVec2, t, pawn.Map, PathEndMode.Touch, pawn) && intVec2.Walkable(t.Map) && !intVec2.Standable(t.Map))
                    {
                        Thing        thing     = null;
                        List <Thing> thingList = intVec2.GetThingList(t.Map);
                        int          num       = 0;
                        while (num < thingList.Count)
                        {
                            if (!thingList[num].def.designateHaulable || thingList[num].def.passability != Traversability.PassThroughOnly)
                            {
                                num++;
                                continue;
                            }
                            thing = thingList[num];
                            break;
                        }
                        if (thing != null)
                        {
                            Job job = HaulAIUtility.HaulAsideJobFor(pawn, thing);
                            if (job != null)
                            {
                                return(job);
                            }
                            JobFailReason.Is(WorkGiver_Miner.NoPathTrans);
                            return(null);
                        }
                    }
                }
                JobFailReason.Is(WorkGiver_Miner.NoPathTrans);
                return(null);
            }
            return(new Job(JobDefOf.Mine, t, 1500, true));
        }
Exemple #25
0
        public static Toil PlaceHauledThingAtDest(TargetIndex destInd, Toil nextToilIfNotDonePlacing = null)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                //get alllll the vars
                Pawn  actor       = toil.actor;
                Thing carriedItem = actor.carryTracker.CarriedThing;
                if (carriedItem == null)
                {
                    Log.Error(actor + " tried to place hauled thing in cell but is not hauling anything.");
                    return;
                }
                int carryBeforeCount = carriedItem.stackCount;
                Job job    = actor.CurJob;
                var driver = (JobDriver_HaulExplicitly)actor.jobs.curDriver;
                driver.init();//this fixes problems
                Map     map       = driver.posting.map;
                IntVec3 dest      = job.GetTarget(destInd).Cell;
                Thing   floorItem = null;
                foreach (Thing t in dest.GetThingList(map))
                {
                    if (t.def.EverHaulable && t.CanStackWith(carriedItem))
                    {
                        floorItem = t;
                    }
                }

                //put it down now
                Thing placedThing; //gets set if done
                bool  done = actor.carryTracker.TryDropCarriedThing(dest, ThingPlaceMode.Direct, out placedThing);

                if (done)
                {
                    job.count = 0;
                    driver.record.movedQuantity += carryBeforeCount;
                    driver.posting.TryRemoveItem(placedThing);
                }
                else
                {
                    var placedCount = carryBeforeCount - carriedItem.stackCount;
                    job.count -= placedCount;
                    driver.record.movedQuantity += placedCount;

                    var destQueue = job.GetTargetQueue(destInd);
                    if (nextToilIfNotDonePlacing != null && destQueue.Count != 0)
                    {
                        //put the remainder in the next queued cell
                        job.SetTarget(destInd, destQueue[0]);
                        destQueue.RemoveAt(0);
                        driver.JumpToToil(nextToilIfNotDonePlacing);
                    }
                    else
                    {
                        //can't continue the job normally
                        job.count = 0;
                        Job haulAsideJob = HaulAIUtility.HaulAsideJobFor(actor, carriedItem);
                        if (haulAsideJob != null)
                        {
                            actor.jobs.StartJob(haulAsideJob);
                        }
                        else
                        {
                            Log.Error("Incomplete explicit haul for " + actor
                                      + ": Could not find anywhere to put "
                                      + carriedItem + " near " + actor.Position
                                      + ". Destroying. This should never happen!");
                            carriedItem.Destroy(DestroyMode.Vanish);
                            actor.jobs.EndCurrentJob(JobCondition.Incompletable);
                        }
                    }
                }
            };
            return(toil);
        }
Exemple #26
0
        internal static Job HopperFillFoodJob(Pawn pawn, Building hopper, Thing parent)
        {
            var hopperSgp = hopper as ISlotGroupParent;

            if (
                (!pawn.CanReserveAndReach(
                     hopper.Position,
                     PathEndMode.Touch,
                     pawn.NormalMaxDanger(),
                     1)
                )
                )
            {
                return(null);
            }
            ThingDef resourceDef = null;
            var      firstItem   = hopper.Position.GetFirstItem();

            if (firstItem != null)
            {
                if (
                    (
                        (parent is Building_NutrientPasteDispenser) &&
                        (Building_NutrientPasteDispenser.IsAcceptableFeedstock(firstItem.def))
                    ) ||
                    (
                        (parent is Building_AutomatedFactory) &&
                        (((Building_AutomatedFactory)parent).CompHopperUser.ResourceSettings.AllowedToAccept(firstItem))
                    )
                    )
                {
                    resourceDef = firstItem.def;
                }
                else
                {
                    if (firstItem.IsForbidden(pawn))
                    {
                        return(( Job )null);
                    }
                    return(HaulAIUtility.HaulAsideJobFor(pawn, firstItem));
                }
            }
            List <Thing> list =
                resourceDef != null
                ? Find.Map.listerThings.ThingsOfDef(resourceDef)
                : Find.Map.listerThings.ThingsInGroup(ThingRequestGroup.FoodSourceNotPlantOrTree);

            for (int index = 0; index < list.Count; ++index)
            {
                Thing t = list[index];
                if (
                    (t.def.IsNutritionGivingIngestible) &&
                    (
                        (t.def.ingestible.preferability == FoodPreferability.RawBad) ||
                        (t.def.ingestible.preferability == FoodPreferability.RawTasty)
                    ) &&
                    (HaulAIUtility.PawnCanAutomaticallyHaul(pawn, t)) &&
                    (
                        (Find.SlotGroupManager.SlotGroupAt(hopper.Position).Settings.AllowedToAccept(t)) &&
                        (HaulAIUtility.StoragePriorityAtFor(t.Position, t) < hopperSgp.GetSlotGroup().Settings.Priority)
                    )
                    )
                {
                    Job job = HaulAIUtility.HaulMaxNumToCellJob(pawn, t, hopper.Position, true);
                    if (job != null)
                    {
                        return(job);
                    }
                }
            }
            return(null);
        }
        // duplicated to make changes
        public 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;
                SlotGroup slotGroup = Find.SlotGroupManager.SlotGroupAt(cell);
                if (slotGroup != null && slotGroup.Settings.AllowedToAccept(actor.carrier.CarriedThing))
                {
                    Find.DesignationManager.RemoveAllDesignationsOn(actor.carrier.CarriedThing, false);
                }
                Thing thing;
                // call duplicated to make changes
                if (TryDropCarriedThing(actor, cell, ThingPlaceMode.Direct, out thing))
                {
                    if (curJob.def == JobDefOf.DoBill && thing != null)
                    {
                        if (curJob.placedTargets == null)
                        {
                            curJob.placedTargets = new List <TargetInfo>();
                        }
                        if (!curJob.placedTargets.Contains(thing))
                        {
                            curJob.placedTargets.Add(thing);
                        }
                    }
                }
                else if (storageMode)
                {
                    IntVec3 vec;
                    // call duplicated to make changes
                    if (nextToilOnPlaceFailOrIncomplete != null && WorkGiver_HaulGeneral.TryFindBestBetterStoreCellFor(actor.carrier.CarriedThing, actor, StoragePriority.Unstored, actor.Faction, out vec, true))
                    {
                        actor.CurJob.SetTarget(cellInd, vec);
                        actor.jobs.curDriver.SetNextToil(nextToilOnPlaceFailOrIncomplete);
                        return;
                    }
                    Job job = HaulAIUtility.HaulAsideJobFor(actor, actor.carrier.CarriedThing);
                    if (job != null)
                    {
                        curJob.targetA       = job.targetA;
                        curJob.targetB       = job.targetB;
                        curJob.targetC       = job.targetC;
                        curJob.maxNumToCarry = job.maxNumToCarry;
                        curJob.haulOpportunisticDuplicates = job.haulOpportunisticDuplicates;
                        curJob.haulMode = job.haulMode;
                        actor.jobs.curDriver.JumpToToil(nextToilOnPlaceFailOrIncomplete);
                    }
                    else
                    {
                        Log.Error(string.Concat(new object[]
                        {
                            "Incomplete haul for ",
                            actor,
                            ": Could not find anywhere to put ",
                            actor.carrier.CarriedThing,
                            " near ",
                            actor.Position,
                            ". Destroying. actor.carrier should never happen!"
                        }));
                        actor.carrier.CarriedThing.Destroy(DestroyMode.Vanish);
                    }
                }
                else if (nextToilOnPlaceFailOrIncomplete != null)
                {
                    actor.jobs.curDriver.SetNextToil(nextToilOnPlaceFailOrIncomplete);
                    return;
                }
            };
            return(toil);
        }
    public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
    {
        if (!t.def.mineable)
        {
            return(null);
        }

        if (pawn.Map.designationManager.DesignationAt(t.Position, prospectDesig) == null)
        {
            return(null);
        }

        LocalTargetInfo target = t;

        if (!pawn.CanReserve(target, 1, -1, null, forced))
        {
            return(null);
        }

        var reachable = false;

        for (var i = 0; i < 8; i++)
        {
            var intVec = t.Position + GenAdj.AdjacentCells[i];
            if (!intVec.InBounds(pawn.Map) || !intVec.Standable(pawn.Map) ||
                !ReachabilityImmediate.CanReachImmediate(intVec, t, pawn.Map, PathEndMode.ClosestTouch, pawn))
            {
                continue;
            }

            reachable = true;
            break;
        }

        if (reachable)
        {
            return(new Job(ProspectJob, t, 20000, true));
        }

        for (var j = 0; j < 8; j++)
        {
            var intVec2 = t.Position + GenAdj.AdjacentCells[j];
            if (!intVec2.InBounds(t.Map) ||
                !ReachabilityImmediate.CanReachImmediate(intVec2, t, pawn.Map, PathEndMode.Touch, pawn) ||
                !intVec2.Walkable(t.Map) || intVec2.Standable(t.Map))
            {
                continue;
            }

            Thing thing     = null;
            var   thingList = intVec2.GetThingList(t.Map);
            foreach (var thing1 in thingList)
            {
                if (!thing1.def.designateHaulable || thing1.def.passability != Traversability.PassThroughOnly)
                {
                    continue;
                }

                thing = thing1;
                break;
            }

            if (thing == null)
            {
                continue;
            }

            var job = HaulAIUtility.HaulAsideJobFor(pawn, thing);
            if (job != null)
            {
                return(job);
            }

            JobFailReason.Is(NoPathTrans);
            return(null);
        }

        JobFailReason.Is(NoPathTrans);
        return(null);
    }
Exemple #29
0
        public static Job HopperFillFoodJob(Pawn pawn, ISlotGroupParent hopperSgp)
        {
            Building building = hopperSgp as Building;

            if (!pawn.CanReserveAndReach(building.Position, PathEndMode.Touch, pawn.NormalMaxDanger(), 1, -1, null, false))
            {
                return(null);
            }
            ThingDef thingDef  = null;
            Thing    firstItem = building.Position.GetFirstItem(building.Map);

            if (firstItem != null)
            {
                if (Building_NutrientPasteDispenser.IsAcceptableFeedstock(firstItem.def))
                {
                    thingDef = firstItem.def;
                }
                else
                {
                    if (firstItem.IsForbidden(pawn))
                    {
                        return(null);
                    }
                    return(HaulAIUtility.HaulAsideJobFor(pawn, firstItem));
                }
            }
            List <Thing> list;

            if (thingDef == null)
            {
                list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.FoodSourceNotPlantOrTree);
            }
            else
            {
                list = pawn.Map.listerThings.ThingsOfDef(thingDef);
            }
            bool flag = false;

            for (int i = 0; i < list.Count; i++)
            {
                Thing thing = list[i];
                if (thing.def.IsNutritionGivingIngestible)
                {
                    if (thing.def.ingestible.preferability == FoodPreferability.RawBad || thing.def.ingestible.preferability == FoodPreferability.RawTasty)
                    {
                        if (HaulAIUtility.PawnCanAutomaticallyHaul(pawn, thing, false))
                        {
                            if (pawn.Map.slotGroupManager.SlotGroupAt(building.Position).Settings.AllowedToAccept(thing))
                            {
                                StoragePriority storagePriority = HaulAIUtility.StoragePriorityAtFor(thing.Position, thing);
                                if (storagePriority >= hopperSgp.GetSlotGroup().Settings.Priority)
                                {
                                    flag = true;
                                    JobFailReason.Is(WorkGiver_CookFillHopper.TheOnlyAvailableFoodIsInStorageOfHigherPriorityTrans);
                                }
                                else
                                {
                                    Job job = HaulAIUtility.HaulMaxNumToCellJob(pawn, thing, building.Position, true);
                                    if (job != null)
                                    {
                                        return(job);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (!flag)
            {
                JobFailReason.Is(WorkGiver_CookFillHopper.NoFoodToFillHopperTrans);
            }
            return(null);
        }
Exemple #30
0
        // Token: 0x060000AB RID: 171 RVA: 0x00005B20 File Offset: 0x00003D20
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            Map  map  = pawn.Map;
            bool flag = c.IsForbidden(pawn);
            Job  result;

            if (flag)
            {
                result = null;
            }
            else
            {
                bool flag2 = !PlantUtility.GrowthSeasonNow(c, map, false);
                if (flag2)
                {
                    result = null;
                }
                else
                {
                    bool flag3 = WorkGiver_WPGrower.wantedPlantDef == null;
                    if (flag3)
                    {
                        WorkGiver_WPGrower.wantedPlantDef = WorkGiver_WPGrower.CalculateWantedPlantDef(c, map);
                        bool flag4 = WorkGiver_WPGrower.wantedPlantDef == null;
                        if (flag4)
                        {
                            return(null);
                        }
                    }
                    List <Thing> thingList = c.GetThingList(map);
                    bool         flag5     = false;
                    for (int i = 0; i < thingList.Count; i++)
                    {
                        Thing thing = thingList[i];
                        bool  flag6 = thing.def == WorkGiver_WPGrower.wantedPlantDef;
                        if (flag6)
                        {
                            return(null);
                        }
                        bool flag7 = (thing is Blueprint || thing is Frame) && thing.Faction == pawn.Faction;
                        if (flag7)
                        {
                            flag5 = true;
                        }
                    }
                    bool flag8 = flag5;
                    if (flag8)
                    {
                        Thing edifice = c.GetEdifice(map);
                        bool  flag9   = edifice == null || edifice.def.fertility < 0f;
                        if (flag9)
                        {
                            return(null);
                        }
                    }
                    bool cavePlant = WorkGiver_WPGrower.wantedPlantDef.plant.cavePlant;
                    if (cavePlant)
                    {
                        bool flag10 = !c.Roofed(map);
                        if (flag10)
                        {
                            JobFailReason.Is(WorkGiver_WPGrowerSow.CantSowCavePlantBecauseUnroofedTrans, null);
                            return(null);
                        }
                        bool flag11 = map.glowGrid.GameGlowAt(c, true) > 0f;
                        if (flag11)
                        {
                            JobFailReason.Is(WorkGiver_WPGrowerSow.CantSowCavePlantBecauseOfLightTrans, null);
                            return(null);
                        }
                    }
                    Plant plant  = c.GetPlant(map);
                    bool  flag12 = plant != null && plant.def.plant.blockAdjacentSow;
                    if (flag12)
                    {
                        bool flag13 = !pawn.CanReserve(plant, 1, -1, null, false) || plant.IsForbidden(pawn);
                        if (flag13)
                        {
                            result = null;
                        }
                        else
                        {
                            result = new Job(JobDefOf.CutPlant, plant);
                        }
                    }
                    else
                    {
                        Thing thing2 = PlantUtility.AdjacentSowBlocker(WorkGiver_WPGrower.wantedPlantDef, c, map);
                        bool  flag14 = thing2 != null;
                        if (flag14)
                        {
                            Plant plant2 = thing2 as Plant;
                            bool  flag15 = plant2 != null && pawn.CanReserve(plant2, 1, -1, null, false) && !plant2.IsForbidden(pawn);
                            if (flag15)
                            {
                                IPlantToGrowSettable plantToGrowSettable = plant2.Position.GetPlantToGrowSettable(plant2.Map);
                                bool flag16 = plantToGrowSettable == null || plantToGrowSettable.GetPlantDefToGrow() != plant2.def;
                                if (flag16)
                                {
                                    return(new Job(JobDefOf.CutPlant, plant2));
                                }
                            }
                            result = null;
                        }
                        else
                        {
                            bool flag17 = WorkGiver_WPGrower.wantedPlantDef.plant.sowMinSkill > 0 && pawn.skills != null && pawn.skills.GetSkill(SkillDefOf.Plants).Level < WorkGiver_WPGrower.wantedPlantDef.plant.sowMinSkill;
                            if (flag17)
                            {
                                result = null;
                            }
                            else
                            {
                                int j = 0;
                                while (j < thingList.Count)
                                {
                                    Thing thing3        = thingList[j];
                                    bool  blockPlanting = thing3.def.BlockPlanting;
                                    if (blockPlanting)
                                    {
                                        bool flag18 = !pawn.CanReserve(thing3, 1, -1, null, false);
                                        if (flag18)
                                        {
                                            return(null);
                                        }
                                        bool flag19 = thing3.def.category == ThingCategory.Plant;
                                        if (flag19)
                                        {
                                            bool flag20 = !thing3.IsForbidden(pawn);
                                            if (flag20)
                                            {
                                                return(new Job(JobDefOf.CutPlant, thing3));
                                            }
                                            return(null);
                                        }
                                        else
                                        {
                                            bool everHaulable = thing3.def.EverHaulable;
                                            if (everHaulable)
                                            {
                                                return(HaulAIUtility.HaulAsideJobFor(pawn, thing3));
                                            }
                                            return(null);
                                        }
                                    }
                                    else
                                    {
                                        j++;
                                    }
                                }
                                bool flag21 = !WorkGiver_WPGrower.wantedPlantDef.CanEverPlantAt(c, map) || !PlantUtility.GrowthSeasonNow(c, map, false) || !pawn.CanReserve(c, 1, -1, null, false);
                                if (flag21)
                                {
                                    result = null;
                                }
                                else
                                {
                                    result = new Job(WPJobDefOf.WPSow, c)
                                    {
                                        plantDefToSow = WorkGiver_WPGrower.wantedPlantDef
                                    };
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }