private static Thing getPicnicSittable(Pawn pawn) { var zonesList = pawn.Map.zoneManager.AllZones.InRandomOrder(); Thing returnValue = null; var currentMinRange = 1000f; foreach (var zone in zonesList) { var picnicArea = zone as Zone_PicnicArea; if (picnicArea == null) { continue; } if (picnicArea.cells.Count == 0) { Log.ErrorOnce("Picnic zone has 0 cells (this should never happen): " + picnicArea, -563287); continue; } if (picnicArea.ContainsStaticFire) { PicnicArea.LogMessage("Contains fire"); continue; } if (pawn.Position.DistanceTo(picnicArea.Position) > currentMinRange) { PicnicArea.LogMessage($"Range is longer than {currentMinRange}"); continue; } currentMinRange = pawn.Position.DistanceTo(picnicArea.Position); var sittables = picnicArea.AllContainedThings.Where(thing => Predicate(thing, pawn)); if (!sittables.Any()) { PicnicArea.LogMessage("No sittables"); continue; } returnValue = sittables.RandomElement(); } return(returnValue); }
public static bool Prefix(Thought_Memory newThought, Pawn otherPawn, ref MemoryThoughtHandler __instance) { if (newThought.def != ThoughtDefOf.AteWithoutTable) { return(true); } if (!PicnicArea.VerifyPicnicSpot(__instance.pawn)) { return(true); } if (!PicnicArea.VerifyPicnicConditions(__instance.pawn.Map)) { return(true); } return(false); }
public static void Postfix(RecordDef def, float value, ref Pawn_RecordsTracker __instance) { if (def != RecordDefOf.NutritionEaten) { return; } if (!PicnicArea.VerifyPicnicSpot(__instance.pawn)) { return; } if (!PicnicArea.VerifyPicnicConditions(__instance.pawn.Map)) { return; } __instance.pawn.needs.mood?.thoughts.memories.TryGainMemory(PicnicAreaThoughtDefOf.AteAtPicnicArea); }
public static void Postfix(this IntVec3 c, Map map, ref bool __result) { if (__result) { return; } //if (!PicnicArea.VerifyPicnicSpot(c, map)) //{ // return; //} if (!PicnicArea.VerifyPicnicConditions(map)) { return; } for (var i = 4; i >= 0; i--) { var rot = new Rot4(i); var intVec = c + rot.FacingCell; var possibleChair = intVec.GetFirstThing <Thing>(map); if (possibleChair?.def.building == null || !possibleChair.def.building.isSittable) { continue; } if (possibleChair.Rotation != rot.Opposite) { continue; } if (!PicnicArea.VerifyPicnicSpot(intVec, map)) { continue; } __result = true; return; } }
public static void Postfix(Pawn pawn, TargetIndex ingestibleInd, ref Toil __result) { bool BaseChairValidator(Thing t) { if (t.def.building == null || !t.def.building.isSittable) { return(false); } if (t.IsForbidden(pawn)) { return(false); } if (!pawn.CanReserve(t)) { return(false); } if (!t.IsSociallyProper(pawn)) { return(false); } if (t.IsBurning()) { return(false); } if (t.HostileTo(pawn)) { return(false); } var result = false; for (var i = 0; i < 4; i++) { var edifice = (t.Position + GenAdj.CardinalDirections[i]).GetEdifice(t.Map); if (edifice == null || edifice.def.surfaceType != SurfaceType.Eat) { continue; } result = true; break; } return(result); } var possibleThing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.OnCell, TraverseParms.For(pawn), 32f, t => BaseChairValidator(t) && t.Position.GetDangerFor(pawn, t.Map) == Danger.None); if (possibleThing != null && Rand.Bool) { return; } if (!PicnicArea.VerifyPicnicConditions(pawn.Map)) { return; } var picnicSittable = getPicnicSittable(pawn); if (picnicSittable == null) { PicnicArea.LogMessage("No good spot"); return; } var toil = new Toil(); toil.initAction = delegate { var actor = toil.actor; actor.Reserve(picnicSittable, actor.CurJob); actor.Map.pawnDestinationReservationManager.Reserve(actor, actor.CurJob, picnicSittable.Position); actor.pather.StartPath(picnicSittable, PathEndMode.OnCell); }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; __result = toil; }