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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
        }