コード例 #1
0
        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);
        }
コード例 #2
0
        public override Job JobOnCell(Pawn pawn, IntVec3 cell)
        {
            Job job = base.JobOnCell(pawn, cell);

            if (job != null && job.plantDefToSow != null && job.plantDefToSow.blueprintDef != null)
            {
                Predicate <Thing> predicate = (Thing tempThing) =>
                                              !ForbidUtility.IsForbidden(tempThing, pawn.Faction) &&
                                              PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) &&
                                              ReservationUtility.CanReserve(pawn, tempThing, 1);

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

                if (bestSeedThingForSowing != null)
                {
                    return(new Job(LocalJobDefOf.SowWithSeeds, cell, bestSeedThingForSowing)
                    {
                        plantDefToSow = job.plantDefToSow,
                        count = 25
                    });
                }
                return(null);
            }

            return(job);
        }
コード例 #3
0
        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);
        }