protected override Job TryGivePlayJob(Pawn pawn, Thing t)
        {
            if ((t as ThingWithComps).TryGetComp <CompMountable>().IsMounted&& !ToolsForHaulUtility.IsDriverOfThisVehicle(pawn, t))
            {
                return(null);
            }

            if (!(t as ThingWithComps).TryGetComp <CompRefuelable>().HasFuel)
            {
                return(null);
            }

            if (t.IsForbidden(Faction.OfPlayer))
            {
                return(null);
            }

            if (!JoyUtility.EnjoyableOutsideNow(pawn, null))
            {
                return(null);
            }
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }
            Region reg;

            if (!CellFinder.TryFindClosestRegionWith(pawn.Position.GetRegion(), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), (Region r) => r.Room.PsychologicallyOutdoors && !r.IsForbiddenEntirely(pawn), 100, out reg))
            {
                return(null);
            }
            IntVec3 root;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, null, out root))
            {
                return(null);
            }
            List <IntVec3> list;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list))
            {
                return(null);
            }
            Job job = new Job(this.def.jobDef, list[0])
            {
                targetQueueA = new List <TargetInfo>(),
                targetB      = t,
            };

            for (int i = 1; i < list.Count; i++)
            {
                job.targetQueueA.Add(list[i]);
            }

            job.locomotionUrgency = LocomotionUrgency.Jog;
            return(job);
        }
        // Token: 0x06000568 RID: 1384 RVA: 0x00035040 File Offset: 0x00033440
        public override Job TryGiveJob(Pawn pawn)
        {
            float HowMuchSnowIsThere = 0;

            if (pawn.Map.weatherManager.curWeather.snowRate > 0.0f)
            {
                HowMuchSnowIsThere = pawn.Map.weatherManager.curWeather.snowRate;
            }
            if (HowMuchSnowIsThere < 0.1f)
            {
                return(null);
            }
            if (!JoyUtility.EnjoyableOutsideNow(pawn, null))
            {
                return(null);
            }
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }
            Predicate <IntVec3> cellValidator = (IntVec3 x) => !PawnUtility.KnownDangerAt(x, pawn.Map, pawn) && !x.GetTerrain(pawn.Map).avoidWander&& x.Standable(pawn.Map) && !x.Roofed(pawn.Map);
            Predicate <Region>  validator     = delegate(Region x)
            {
                IntVec3 intVec;
                return(x.Room.PsychologicallyOutdoors && !x.IsForbiddenEntirely(pawn) && x.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out intVec));
            };
            Region reg;

            if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), validator, 100, out reg, RegionType.Set_Passable))
            {
                return(null);
            }
            IntVec3 root;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root))
            {
                return(null);
            }
            List <IntVec3> list;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list))
            {
                return(null);
            }
            Job job = new Job(this.def.jobDef, list[0]);

            job.targetQueueA = new List <LocalTargetInfo>();
            for (int i = 1; i < list.Count; i++)
            {
                job.targetQueueA.Add(list[i]);
            }
            job.locomotionUrgency = LocomotionUrgency.Walk;
            return(job);
        }
        public override Job TryGiveJob(Pawn pawn)
        {
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }
            Predicate <IntVec3> cellValidator = (IntVec3 x) => !PawnUtility.KnownDangerAt(x, pawn.Map, pawn) && !x.GetTerrain(pawn.Map).avoidWander&& x.Standable(pawn.Map) && x.SupportsStructureType(pawn.Map, TerrainAffordanceDefOf.Diggable);
            Predicate <Region>  validator     = delegate(Region x)
            {
                IntVec3 intVec;
                return(!x.IsForbiddenEntirely(pawn) && x.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out intVec));
            };
            Region reg;

            if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), validator, 500, out reg, RegionType.Set_Passable))
            {
                return(null);
            }
            IntVec3 root;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root))
            {
                return(null);
            }
            List <IntVec3> list;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list))
            {
                return(null);
            }
            Job job = new Job(this.def.jobDef, list[0]);

            job.targetQueueA = new List <LocalTargetInfo>();
            job.targetQueueA.Add(list[0]);
            job.locomotionUrgency = LocomotionUrgency.Walk;
            return(job);
        }
Ejemplo n.º 4
0
 private static void FlashWalkPath()
 {
     WalkPathFinder.DebugFlashWalkPath(UI.MouseCell());
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Tries to give a job to the given pawn.
        /// </summary>
        /// <param name="pawn">The pawn.</param>
        /// <returns></returns>
        public override Job TryGiveJob(Pawn pawn)
        {
            if (!JoyUtility.EnjoyableOutsideNow(pawn, null))
            {
                return(null);
            }
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }


            if (!def.IsValidFor(pawn))
            {
                return(null);
            }


            var allProductionComps = pawn.health.hediffSet.hediffs.Select(h => h.TryGetComp <Comp_TerrainProduction>()?.Props)
                                     .Where(p => p != null)
                                     .ToList();

            if (allProductionComps.Count == 0)
            {
                return(null);
            }

            bool IsValidCell(IntVec3 cell)
            {
                if (PawnUtility.KnownDangerAt(cell, pawn.Map, pawn))
                {
                    return(false);
                }
                var terrain = cell.GetTerrain(pawn.Map);

                if (terrain == null)
                {
                    return(false);
                }
                if (!allProductionComps.Any(p => p.CanProduceOn(terrain)))
                {
                    return(false);
                }
                return(cell.Standable(pawn.Map));
            }

            bool IsValidRegion(Region region)
            {
                if (region.IsForbiddenEntirely(pawn))
                {
                    return(false);
                }
                return(region.TryFindRandomCellInRegionUnforbidden(pawn, IsValidCell, out IntVec3 _));
            }

            if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable),
                                                     TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn), IsValidRegion,
                                                     100, out Region reg, RegionType.Set_Passable))
            {
                return(null);
            }

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, IsValidCell, out IntVec3 root))
            {
                return(null);
            }

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out var result))
            {
                return(null);
            }

            Job job = new Job(def.jobDef, result[0])
            {
                targetQueueA = new List <LocalTargetInfo>()
            };

            for (int i = 1; i < result.Count; i++)
            {
                job.targetQueueA.Add(result[i]);
            }

            job.locomotionUrgency = LocomotionUrgency.Walk;
            return(job);
        }
        // Token: 0x06000568 RID: 1384 RVA: 0x00035040 File Offset: 0x00033440
        public override Job TryGiveJob(Pawn pawn)
        {
            string IsCurrentWeatherClear = "Null";

            if (pawn.Map.weatherManager.curWeather != null)
            {
                IsCurrentWeatherClear = pawn.Map.weatherManager.curWeather.ToString();
            }
            if (IsCurrentWeatherClear != "Clear")
            {
                return(null);
            }
            float CurrentCelestialGlow = GenCelestial.CurCelestialSunGlow(pawn.Map);

            if (CurrentCelestialGlow <= 0.4f)
            {
                return(null);
            }

            /*
             * if (GenLocalDate.DayPercent(pawn.Map) < 0.5f)
             * {
             *  return null;
             * }
             */
            if (!JoyUtility.EnjoyableOutsideNow(pawn, null))
            {
                return(null);
            }
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }
            Predicate <IntVec3> cellValidator = (IntVec3 x) => !PawnUtility.KnownDangerAt(x, pawn.Map, pawn) && !x.GetTerrain(pawn.Map).avoidWander&& x.Standable(pawn.Map) && !x.Roofed(pawn.Map);
            Predicate <Region>  validator     = delegate(Region x)
            {
                IntVec3 intVec;
                return(x.Room.PsychologicallyOutdoors && !x.IsForbiddenEntirely(pawn) && x.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out intVec));
            };
            Region reg;

            if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), validator, 100, out reg, RegionType.Set_Passable))
            {
                return(null);
            }
            IntVec3 root;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root))
            {
                return(null);
            }
            List <IntVec3> list;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list))
            {
                return(null);
            }
            Job job = new Job(this.def.jobDef, list[0]);

            job.targetQueueA = new List <LocalTargetInfo>();
            for (int i = 1; i < list.Count; i++)
            {
                job.targetQueueA.Add(list[i]);
            }
            job.locomotionUrgency = LocomotionUrgency.Walk;
            return(job);
        }
        public override Job TryGiveJob(Pawn pawn)
        {
            if (PawnUtility.WillSoonHaveBasicNeed(pawn))
            {
                return(null);
            }
            Predicate <IntVec3> cellValidator = (IntVec3 x) => !PawnUtility.KnownDangerAt(x, pawn.Map, pawn) && !x.GetTerrain(pawn.Map).avoidWander&& x.Standable(pawn.Map) && x.CloseToEdge(pawn.Map, 5);
            Predicate <Region>  validator     = delegate(Region x)
            {
                IntVec3 intVec;
                return(x.Room.PsychologicallyOutdoors && x.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out intVec));
            };
            Region reg;

            if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), validator, 500, out reg, RegionType.Set_Passable))
            {
                return(null);
            }
            IntVec3 root;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root))
            {
                return(null);
            }
            List <IntVec3> list;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list))
            {
                return(null);
            }
            IntVec3 root2;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root2))
            {
                return(null);
            }
            List <IntVec3> list2;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root2, out list2))
            {
                return(null);
            }
            IntVec3 root4;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root4))
            {
                return(null);
            }
            List <IntVec3> list4;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root4, out list4))
            {
                return(null);
            }
            IntVec3 root5;

            if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root5))
            {
                return(null);
            }
            List <IntVec3> list5;

            if (!WalkPathFinder.TryFindWalkPath(pawn, root4, out list5))
            {
                return(null);
            }
            Job job = new Job(this.def.jobDef, list[0]);

            job.targetQueueA = new List <LocalTargetInfo>();
            //can't figure out how to get hte pawn to wait so this has them sit for an extra tick. sadly not more than that.
            list[1] = list[0];
            list[2] = list2[0];
            list[3] = list2[0];
            list[4] = list4[0];
            list[5] = list4[0];
            list[6] = list5[0];
            list[7] = list5[0];
            job.targetQueueA.Add(list[0]);
            job.targetQueueA.Add(list[1]);
            job.targetQueueA.Add(list[2]);
            job.targetQueueA.Add(list[3]);
            job.targetQueueA.Add(list[4]);
            job.targetQueueA.Add(list[5]);
            job.targetQueueA.Add(list[6]);
            job.targetQueueA.Add(list[7]);

            /* adding this made htem go back to the start again. its intersting. still nots rue how this translates to wandering only in water
             * for (int i = 1; i < list.Count; i++)
             * {
             *  job.targetQueueA.Add(list[i]);
             * }
             */
            job.locomotionUrgency = LocomotionUrgency.Sprint;
            return(job);
        }