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 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); }
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); }