public override void Tick()
        {
            base.Tick();

            if (!pawn.IsColonistPlayerControlled)
            {
                return;
            }

            if (pawn.IsHashIntervalTick(pawnStateCheckInterval))
            {
                Predicate <Thing> validator = delegate(Thing t)
                {
                    Thing egg = t as Thing;
                    return(egg.def.defName == ThingDefOf.AvaliEgg.ToString() &&
                           (egg.TryGetComp <CompHatcher>().hatcheeParent == pawn ||
                            egg.TryGetComp <CompHatcher>().otherParent == pawn));
                };
                Thing egg2 = (Thing)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(pawn.def), PathEndMode.Touch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, null, 0, -1, false, RegionType.Set_Passable, false);
                if (egg2 != null)
                {
                    Pawn mother = egg2.TryGetComp <CompHatcher>().hatcheeParent;
                    if (mother == null)
                    {
                        mother = egg2.TryGetComp <CompHatcher>().otherParent;
                        if (mother == null)
                        {
                            pawn.health.RemoveHediff(this);
                            return;
                        }
                    }
                    if (mother.CurrentBed() == null)
                    {
                        return;
                    }

                    //Log.Message("Giving CheckAvaliEgg job to " + pawn);
                    Job newJob = new Job(JobDefOf.CheckAvaliEgg, egg2, mother.CurrentBed(), mother.CurrentBed().OccupiedRect().CenterCell);
                    pawn.jobs.StartJob(newJob, JobCondition.InterruptForced, null, true, false, null, null, false);
                }
            }
        }
Ejemplo n.º 2
0
        public static Thing FindClosestUnoccupiedThing(Pawn pawn, ThingDef thingDef, float maxSearchDistance = 9999, bool shouldBePowered = false)
        {
            Predicate <Thing> validator = delegate(Thing t)
            {
                Thing building2 = t as Building;
                if (shouldBePowered)
                {
                    shouldBePowered = building2.IsPowered();
                }
                else
                {
                    shouldBePowered = true;
                }

                return(pawn.CanReserve(building2, 1, -1, null, false) && shouldBePowered);
            };
            Thing thing = (Thing)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(thingDef), PathEndMode.Touch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), maxSearchDistance, validator, null, 0, -1, false, RegionType.Set_Passable, false);

            return(thing);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Tries to get a cat that is the closest to the altar.
        /// </summary>
        /// <param name="map"></param>
        /// <returns></returns>
        protected Pawn TryGetClosestCatOnMap(Map map)
        {
            Building_SacrificialAltar mapAltar      = altar(map);
            GuardianProperties        guardianProps = def.GetModExtension <GuardianProperties>();

            if (mapAltar != null && guardianProps != null)
            {
                Thing closestThing = GenClosest.ClosestThingReachable(
                    mapAltar.InteractionCell, map, ThingRequest.ForGroup(ThingRequestGroup.Pawn),
                    Verse.AI.PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.PassDoors), 9999, lookThing => (lookThing?.Faction?.IsPlayer ?? false) && guardianProps.eligiblePawnDefs.Contains(lookThing.def));

                //Found a Cat.
                if (closestThing != null && closestThing is Pawn)
                {
                    return(closestThing as Pawn);
                }
            }

            return(null);
        }
Ejemplo n.º 4
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.interactions.InteractedTooRecentlyToInteract() || lastInteractionTick > Find.TickManager.TicksGame - 500)
            {
                return(null);
            }
            Predicate <Thing> validator = delegate(Thing t)
            {
                Pawn pawn3 = (Pawn)t;
                return(pawn3 != pawn && !pawn3.Dead && !pawn3.Downed && pawn3.Awake() && InteractionUtility.CanReceiveInteraction(pawn3) && pawn3.RaceProps.Humanlike);
            };
            Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator);

            if (pawn2 == null || Rand.Value > 0.5f)
            {
                return(null);
            }
            lastInteractionTick = Find.TickManager.TicksGame;
            return(new Job(JobDefOfPsychology.Abuse, pawn2));
        }
        private Thing FindBestGame(Pawn pawn, bool inBed, IntVec3 gatheringSpot)
        {
            tmpCandidates.Clear();
            GetSearchSet(pawn, tmpCandidates);
            if (tmpCandidates.Count == 0)
            {
                return(null);
            }
            Predicate <Thing> predicate = (Thing t) => CanInteractWith(pawn, t, inBed);

            if (gatheringSpot.IsValid)
            {
                Predicate <Thing> oldValidator = predicate;
                predicate = ((Thing x) => GatheringsUtility.InGatheringArea(x.Position, gatheringSpot, pawn.Map) && oldValidator(x));
            }
            Thing result = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, tmpCandidates, PathEndMode.OnCell, TraverseParms.For(pawn), 9999f, predicate);

            tmpCandidates.Clear();
            return(result);
        }
        public static bool Prefix(ref Thing __result, Pawn pawn)
        {
            bool Predicate(Thing t)
            {
                return((pawn.InMentalState || !t.IsForbidden(pawn)) && pawn.CanReserve(t) &&
                       (pawn.Position.InHorDistOf(t.Position, 100f) || t.Position.Roofed(t.Map) ||
                        pawn.Map.areaManager.Home[t.Position] || t.GetSlotGroup() != null));
            }

            var position       = pawn.Position;
            var map            = pawn.Map;
            var peMode         = PathEndMode.OnCell;
            var traverseParams = TraverseParms.For(pawn);
            var validator      = (Predicate <Thing>)Predicate;
            var PlaceboReq     = ThingRequest.ForDef(ThingDef.Named("MSPlacebo"));

            __result = GenClosest.ClosestThingReachable(position, map, PlaceboReq, peMode, traverseParams, 9999f,
                                                        validator);
            return(__result == null);
        }
Ejemplo n.º 7
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Predicate <Thing> validator = delegate(Thing t)
            {
                Pawn pawn2 = ((AttachableThing)t).parent as Pawn;
                return(pawn2 == null && pawn.CanReserve(t, 1, -1, null, false) && !pawn.story.WorkTagIsDisabled(WorkTags.Firefighting));
            };
            Thing thing = GenClosest.ClosestThingReachable(pawn.GetLord().CurLordToil.FlagLoc, pawn.Map, ThingRequest.ForDef(ThingDefOf.Fire), PathEndMode.Touch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), this.maxDistFromPoint, validator, null, 0, -1, false, RegionType.Set_Passable, false);
            Job   result;

            if (thing != null)
            {
                result = new Job(JobDefOf.BeatFire, thing);
            }
            else
            {
                result = null;
            }
            return(result);
        }
Ejemplo n.º 8
0
        private static Job FindOrStartFire(Pawn pawn, float dist)
        {
            // try finding existing fires.
            Thing f = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(ThingDefOf.Fire), PathEndMode.Touch, TraverseParms.For(pawn), dist);

            if (f != null)
            {
                return(new Job(DefDatabase <JobDef> .GetNamed("Fluffy_DrawEnergyFromFire"), f));
            }

            // light a new fire
            Thing t = FindClosestFlammableThing(pawn, dist);

            if (t != null)
            {
                return(new Job(DefDatabase <JobDef> .GetNamed("Fluffy_IgniteFire"), t));
            }

            return(null);
        }
        /// <remarks>Copied from <see cref="JobDriver_ManTurret.FindAmmoForTurret" />.</remarks>
        private static Thing FindAmmoForTurret(Pawn pawn, Thing turret)
        {
            var compAmmo = (turret as Building_Turret)?.GetAmmo();

            if (compAmmo == null || !compAmmo.UseAmmo)
            {
                return(null);
            }

            return(GenClosest.ClosestThingReachable(
                       turret.Position,
                       turret.Map,
                       ThingRequest.ForGroup(ThingRequestGroup.HaulableEver),
                       PathEndMode.OnCell,
                       TraverseParms.For(pawn),
                       40f,
                       t => !t.IsForbidden(pawn) &&
                       pawn.CanReserve(t, 10, 1) &&
                       compAmmo.Props.ammoSet.ammoTypes.Any(l => l.ammo == t.def)));
        }
        static bool Prefix(Pawn pawn, ref Job __result)
        {
            if (pawn == null || pawn.Faction == null || !pawn.Faction.IsPlayer)
            {
                return(true);
            }
            Comp_PawnMenu comp = pawn.GetComp <Comp_PawnMenu>();

            if (comp != null && comp.activated())
            {
                Predicate <Thing> validator = (Thing t) => t.def.category == ThingCategory.Item && t.IngestibleNow && pawn.RaceProps.CanEverEat(t) && pawn.CanReserve(t, 1, -1, null, false) && comp.contains(t.def);
                Thing             food      = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableAlways), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 10f, validator, null, 0, -1, false, RegionType.Set_Passable, false);
                if (food != null)
                {
                    __result = new Job(JobDefOf.Ingest, food);
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 11
0
 public static Building_BaseMechanoidPlatform GetAvailableMechanoidPlatform(Pawn pawn, Pawn targetPawn)
 {
     return((Building_BaseMechanoidPlatform)GenClosest.ClosestThingReachable(targetPawn.Position, targetPawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, delegate(Thing b)
     {
         if (b is Building_BaseMechanoidPlatform platform &&
             !b.IsBurning() &&
             !b.IsForbidden(targetPawn) &&
             targetPawn.CanReserve(b) &&
             (targetPawn.ownership.OwnedBed == null && !platform.CompAssignableToPawn.AssignedPawns.Any() || platform.CompAssignableToPawn.AssignedPawns.Contains(targetPawn)))
         {
             CompFlickable flickable = platform.TryGetComp <CompFlickable>();
             if (flickable != null && !flickable.SwitchIsOn)
             {
                 return false;
             }
             return true;
         }
         return false;
     }));
 }
        protected override Job TryGiveJob(Pawn pawn)
        {
            Predicate <Thing> validator = (Thing t) => t.def.hasInteractionCell && t.def.HasComp(typeof(CompMannable)) && pawn.CanReserve(t, 1, -1, null, false) && JobDriver_ManTurret.FindAmmoForTurret(pawn, (Building_TurretGun)t) != null;
            Thing             thing     = GenClosest.ClosestThingReachable(this.GetRoot(pawn), pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.InteractionCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), this.maxDistFromPoint, validator, null, 0, -1, false, RegionType.Set_Passable, false);
            Job result;

            if (thing != null)
            {
                result = new Job(JobDefOf.ManTurret, thing)
                {
                    expiryInterval        = 2000,
                    checkOverrideOnExpire = true
                };
            }
            else
            {
                result = null;
            }
            return(result);
        }
Ejemplo n.º 13
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Predicate <Thing> validator = delegate(Thing t)
            {
                IntVec3 intVec;
                return(!t.IsForbidden(pawn) && HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, t, false) && pawn.carryTracker.MaxStackSpaceEver(t.def) > 0 && StoreUtility.TryFindBestBetterStoreCellFor(t, pawn, pawn.Map, StoreUtility.CurrentStoragePriorityOf(t), pawn.Faction, out intVec, true));
            };
            Thing thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.listerHaulables.ThingsPotentiallyNeedingHauling(), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, null);
            Job   result;

            if (thing != null)
            {
                result = HaulAIUtility.HaulToStorageJob(pawn, thing);
            }
            else
            {
                result = null;
            }
            return(result);
        }
Ejemplo n.º 14
0
        // Token: 0x060000C9 RID: 201 RVA: 0x000079E0 File Offset: 0x00005BE0
        public Lord GetLord(Pawn forPawn)
        {
            Lord    lord    = null;
            Faction faction = forPawn.Faction;
            bool    flag    = forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction).Any((Pawn p) => p != forPawn);

            if (flag)
            {
                Pawn p2 = (Pawn)GenClosest.ClosestThing_Global(forPawn.Position, forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction), this.SpawnerProps.lordJoinRadius, (Thing p) => p != forPawn && ((Pawn)p).GetLord() != null, null);
                lord = p2.GetLord();
            }
            bool flag2 = lord == null;

            if (flag2)
            {
                LordJob lordJob = this.SpawnerProps.CreateJobForLord(forPawn.Position);
                lord = LordMaker.MakeNewLord(faction, lordJob, Find.VisibleMap, null);
            }
            return(lord);
        }
Ejemplo n.º 15
0
        private Thing FindFood(Pawn pawn, IntVec3 gatheringSpot)
        {
            Predicate <Thing> validator = delegate(Thing x)
            {
                if (!x.IngestibleNow)
                {
                    return(false);
                }
                if (!x.def.IsNutritionGivingIngestible)
                {
                    return(false);
                }
                if (!GatheringsUtility.InGatheringArea(x.Position, gatheringSpot, pawn.Map))
                {
                    return(false);
                }
                if (x.def.IsDrug)
                {
                    return(false);
                }
                if ((int)x.def.ingestible.preferability <= 4)
                {
                    return(false);
                }
                if (!pawn.WillEat(x))
                {
                    return(false);
                }
                if (x.IsForbidden(pawn))
                {
                    return(false);
                }
                if (!x.IsSociallyProper(pawn))
                {
                    return(false);
                }
                return(pawn.CanReserve(x) ? true : false);
            };

            return(GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.FoodSourceNotPlantOrTree), PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.NoPassClosedDoors), 14f, validator, null, 0, 12));
        }
Ejemplo n.º 16
0
        public Job TryGiveJob(Pawn pawn, Thing targetThing, bool NoJoyCheck = false)
        {
            Verb verb = null;

            if (pawn != null)
            {
                verb = pawn.meleeVerbs.TryGetMeleeVerb(targetThing);
            }
            Job result;

            if (pawn.WorkTagIsDisabled(WorkTags.Violent) || verb == null || verb.verbProps == null)
            {
                result = null;
            }
            else
            {
                List <Thing>      list      = pawn.Map.listerThings.ThingsOfDef(this.def.thingDefs[0]);
                Predicate <Thing> predicate = delegate(Thing t)
                {
                    return(!ForbidUtility.IsForbidden(t, pawn) &&
                           ReservationUtility.CanReserve(pawn, t, this.def.jobDef.joyMaxParticipants, -1, null, false) &&
                           SocialProperness.IsSociallyProper(t, pawn));
                };
                Thing thing = null;
                if (targetThing != null && ReachabilityUtility.CanReach(pawn, targetThing.Position, PathEndMode.InteractionCell, Danger.Deadly, false, 0) && predicate(targetThing))
                {
                    thing = targetThing;
                }
                else if (targetThing == null)
                {
                    thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, list, PathEndMode.InteractionCell, TraverseParms.For(pawn, Danger.Deadly, 0, false), 9999f, predicate, null);
                }
                if (thing != null)
                {
                    Job job = JobMaker.MakeJob(this.def.jobDef, thing);
                    return(job);
                }
                result = null;
            }
            return(result);
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            PawnAutocleaner cleaner = pawn as PawnAutocleaner;

            if (cleaner == null)
            {
                return(null);
            }
            if (!cleaner.active)
            {
                return(null);
            }
            if (cleaner.LowPower)
            {
                return(null);
            }
            if (cleaner.health.summaryHealth.SummaryHealthPercent < 1)
            {
                return(null);
            }

            WorkGiverCleanFilth scanner = Globals.AutocleanerCleanFilth.Worker as WorkGiverCleanFilth;

            if (scanner == null)
            {
                return(null);
            }

            IEnumerable <Thing> enumerable = scanner.PotentialWorkThingsGlobal(pawn).Where(x => scanner.HasJobOnThing(pawn, x));
            Danger maxDanger = (pawn.playerSettings != null && pawn.playerSettings.UsesConfigurableHostilityResponse && pawn.playerSettings.hostilityResponse != HostilityResponseMode.Flee) ? Danger.Deadly : Danger.None;
            Thing  thing     = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, enumerable, scanner.PathEndMode, TraverseParms.For(pawn, maxDanger, TraverseMode.ByPawn, false), 9999f);

            if (thing == null)
            {
                return(null);
            }

            Job job = scanner.JobOnThing(pawn, thing, false);

            return(job);
        }
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (t is ThingWithComps thing)
            {
                if (!pawn.Dead && !pawn.Downed && !pawn.IsBurning() && !thing.Destroyed && !thing.IsBurning() && pawn.CanReserveAndReach(thing, PathEndMode.InteractionCell, Danger.Deadly))
                {
                    CompUpgrade comp = null;
                    foreach (var c in thing.AllComps.OfType <CompUpgrade>())
                    {
                        if (c.beginUpgrade)
                        {
                            comp = c;
                            break;
                        }
                    }
                    if (comp == null)
                    {
                        return(null);
                    }

                    ThingDefCount needThingCount = comp.TryGetOneMissingMaterial();

                    if (!comp.PawnMeetsSkillRequirement(pawn))
                    {
                        JobFailReason.Is("ConstructionSkillTooLow");
                        return(null);
                    }
                    if (needThingCount.Count > 0)
                    {
                        Thing foundRes = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(needThingCount.ThingDef), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly), 9999f, (Thing r) => { return(r.def == needThingCount.ThingDef && !r.IsForbidden(pawn) && pawn.CanReserve(r)); });
                        if (foundRes == null)
                        {
                            JobFailReason.Is("Upgrade_missingMaterial");
                            return(null);
                        }
                    }
                    return(new Job(PESDefOf.PES_Job_InstallUpgrade, t));
                }
            }
            return(null);
        }
        // Token: 0x0600009A RID: 154 RVA: 0x0000580C File Offset: 0x00003A0C
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn pawn2 = (Pawn)t;
            Predicate <Thing> predicate = (Thing t3) => t3.def.category == ThingCategory.Item && t3.IngestibleNow && pawn.RaceProps.CanEverEat(t3) && pawn.CanReserve(t3, 1, -1, null, false) && !t3.IsForbidden(pawn.Faction) && !t3.IsNotFresh() && t3.def.IsNutritionGivingIngestible;
            bool flag = predicate == null;
            Job  result;

            if (flag)
            {
                result = null;
            }
            else
            {
                Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableAlways), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 10f, predicate, null, 0, -1, false, RegionType.Set_Passable, false);
                bool  flag2 = thing == null;
                if (flag2)
                {
                    result = null;
                }
                else
                {
                    bool flag3 = predicate != null && thing != null && pawn2 != null;
                    if (flag3)
                    {
                        ThingDef def       = thing.def;
                        float    nutrition = FoodUtility.GetNutrition(thing, def);
                        result = new Job(WPJobDefOf.WPFeedPatient)
                        {
                            targetA = thing,
                            targetB = pawn2,
                            count   = FoodUtility.WillIngestStackCountOf(pawn2, def, nutrition)
                        };
                    }
                    else
                    {
                        result = null;
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 20
0
        public static bool TryFindBestItemToSteal(IntVec3 root, Map map, float maxDist, out Thing item, Pawn thief, List <Thing> disallowed = null)
        {
            if (map == null)
            {
                item = null;
                return(false);
            }
            if (thief != null && !thief.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                item = null;
                return(false);
            }
            if ((thief != null && !map.reachability.CanReachMapEdge(thief.Position, TraverseParms.For(thief, Danger.Some))) || (thief == null && !map.reachability.CanReachMapEdge(root, TraverseParms.For(TraverseMode.PassDoors, Danger.Some))))
            {
                item = null;
                return(false);
            }
            Predicate <Thing> validator = delegate(Thing t)
            {
                if (thief != null && !thief.CanReserve(t))
                {
                    return(false);
                }
                if (disallowed != null && disallowed.Contains(t))
                {
                    return(false);
                }
                if (!t.def.stealable)
                {
                    return(false);
                }
                return((!t.IsBurning()) ? true : false);
            };

            item = GenClosest.ClosestThing_Regionwise_ReachablePrioritized(root, map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEverOrMinifiable), PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Some), maxDist, validator, (Thing x) => GetValue(x), 15, 15);
            if (item != null && GetValue(item) < 320f)
            {
                item = null;
            }
            return(item != null);
        }
        // Token: 0x060004D1 RID: 1233 RVA: 0x0003100C File Offset: 0x0002F40C
        protected override Job TryGiveJob(Pawn pawn)
        {
            IntVec3 c;

            if (!RCellFinder.TryFindBestExitSpot(pawn, out c, TraverseMode.ByPawn))
            {
                c = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(XenomorphDefOf.RRY_EggXenomorphFertilized), PathEndMode.OnCell, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Deadly, false), 9999f, null, null, 0, -1, false, RegionType.Set_Passable, false).Position;
            }
            Pawn t;

            if (TryFindGoodKidnapVictim(pawn, 18f, out t, null) && !GenAI.InDangerousCombat(pawn))
            {
                return(new Job(JobDefOf.Kidnap)
                {
                    targetA = t,
                    targetB = c,
                    count = 1
                });
            }
            return(null);
        }
Ejemplo n.º 22
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            Predicate <Thing> validator = delegate(Thing t)
            {
                Pawn pawn3 = (Pawn)t;
                return(!pawn3.Dead && !pawn3.Downed && (pawn3.IsPrisoner || pawn3.RaceProps.Animal));
            };
            Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, null, -1, false);

            if (pawn2 == null || Rand.Value > 0.5f || pawn.mindState.MeleeThreatStillThreat)
            {
                return(null);
            }
            return(new Job(JobDefOf.AttackMelee, pawn2)
            {
                maxNumMeleeAttacks = 25,
                expiryInterval = 50000,
                killIncappedTarget = false,
                canBash = true
            });
        }
        /// <summary>
        ///     Tries to get a cat that is the closest to the altar.
        /// </summary>
        /// <param name="map"></param>
        /// <returns></returns>
        protected Pawn TryGetClosestCatOnMap(Map map)
        {
            var mapAltar      = altar(map);
            var guardianProps = def.GetModExtension <GuardianProperties>();

            if (mapAltar == null || guardianProps == null)
            {
                return(null);
            }

            var closestThing = GenClosest.ClosestThingReachable(
                mapAltar.InteractionCell, map, ThingRequest.ForGroup(ThingRequestGroup.Pawn),
                PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.PassDoors), 9999,
                lookThing => (lookThing?.Faction?.IsPlayer ?? false) &&
                guardianProps.eligiblePawnDefs.Contains(lookThing.def));

            //Found a Cat.
            var pawn = closestThing as Pawn;

            return(pawn);
        }
        public static Building_Turret FindTurretFor(Pawn p)
        {
            Predicate <Thing> turretValidator = delegate(Thing t)
            {
                Building_TurretGun building_Turret3 = (Building_TurretGun)t;
                if (!p.CanReserveAndReach(t, PathEndMode.OnCell, Danger.Some))
                {
                    return(false);
                }
                return(building_Turret3.GetComp <CompFlickable>().SwitchIsOn&& !building_Turret3.IsBurning());
            };
            ThingDef          thingDef         = ThingDefOf.TurretGun;
            Predicate <Thing> validator        = (Thing b) => turretValidator(b);
            Building_Turret   building_Turret2 = (Building_Turret)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(thingDef), PathEndMode.OnCell, TraverseParms.For(p, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, null, -1, false);

            if (building_Turret2 != null)
            {
                return(building_Turret2);
            }
            return(null);
        }
        public FloatMenuOption RepairMenuOption(Pawn selPawn, JobDef jobDef, LocalTargetInfo destination)
        {
            if (CanRepair)
            {
                Thing material = GenClosest.ClosestThingReachable(selPawn.Position, selPawn.Map,
                                                                  ThingRequest.ForDef(RepairStuff), Verse.AI.PathEndMode.ClosestTouch,
                                                                  TraverseParms.For(selPawn, selPawn.NormalMaxDanger())); // validator?

                if (material != null)
                {
                    return(new FloatMenuOption("RepairTentPart".Translate(this.parent.def.label, RepairCost, RepairStuff.label), delegate
                    {
                        selPawn.jobs.TryTakeOrderedJob(JobMaker.MakeJob(jobDef, material, destination));
                    }));
                }

                return(new FloatMenuOption("CannotRepairTentPart".Translate(this.parent.LabelNoCount, RepairCost, RepairStuff.label), null));
            }

            return(new FloatMenuOption("NoRepairNeeded".Translate(this.parent.LabelNoCount), null));
        }
Ejemplo n.º 26
0
        public static bool TryFindGoodKidnapVictim(Pawn kidnapper, float maxDist, out Pawn victim, List <Thing> disallowed = null)
        {
            bool result;

            if (!kidnapper.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !kidnapper.Map.reachability.CanReachMapEdge(kidnapper.Position, TraverseParms.For(kidnapper, Danger.Some, TraverseMode.ByPawn, false)))
            {
                victim = null;
                result = false;
            }
            else
            {
                Predicate <Thing> validator = delegate(Thing t)
                {
                    Pawn pawn = t as Pawn;
                    return(pawn.RaceProps.Humanlike && pawn.Downed && pawn.Faction == Faction.OfPlayer && pawn.Faction.HostileTo(kidnapper.Faction) && kidnapper.CanReserve(pawn, 1, -1, null, false) && (disallowed == null || !disallowed.Contains(pawn)));
                };
                victim = (Pawn)GenClosest.ClosestThingReachable(kidnapper.Position, kidnapper.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Some, false), maxDist, validator, null, 0, -1, false, RegionType.Set_Passable, false);
                result = (victim != null);
            }
            return(result);
        }
Ejemplo n.º 27
0
 public static void Postfix(Job __result, Pawn pawn)
 {
     if (__result == null)
     {
         if (!(Genital_Helper.has_penis(pawn) || Genital_Helper.has_penis_infertile(pawn)) || !pawn.ageTracker.CurLifeStage.reproductive)
         {
             __result = null;
         }
         Predicate <Thing> validator = delegate(Thing t)
         {
             Pawn pawn3 = t as Pawn;
             return(!pawn3.Downed && pawn3.CanCasuallyInteractNow(false) && !pawn3.IsForbidden(pawn) && pawn3.Faction == pawn.Faction && PawnUtility.FertileMateTarget(pawn, pawn3));
         };
         Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(pawn.def), PathEndMode.Touch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 30f, validator, null, 0, -1, false, RegionType.Set_Passable, false);
         if (pawn2 == null)
         {
             __result = null;
         }
         __result = new Job(JobDefOf.Mate, pawn2);
     }
 }
Ejemplo n.º 28
0
        public static Thing FindBestMedicine(Pawn healer, Pawn patient)
        {
            if (patient.playerSettings == null || patient.playerSettings.medCare <= MedicalCareCategory.NoMeds)
            {
                return(null);
            }
            if (Medicine.GetMedicineCountToFullyHeal(patient) <= 0)
            {
                return(null);
            }
            Predicate <Thing>   predicate      = (Thing m) => !m.IsForbidden(healer) && patient.playerSettings.medCare.AllowsMedicine(m.def) && healer.CanReserve(m, 10, 1, null, false);
            Func <Thing, float> priorityGetter = (Thing t) => t.def.GetStatValueAbstract(StatDefOf.MedicalPotency, null);
            IntVec3             position       = patient.Position;
            Map               map            = patient.Map;
            List <Thing>      searchSet      = patient.Map.listerThings.ThingsInGroup(ThingRequestGroup.Medicine);
            PathEndMode       peMode         = PathEndMode.ClosestTouch;
            TraverseParms     traverseParams = TraverseParms.For(healer, Danger.Deadly, TraverseMode.ByPawn, false);
            Predicate <Thing> validator      = predicate;

            return(GenClosest.ClosestThing_Global_Reachable(position, map, searchSet, peMode, traverseParams, 9999f, validator, priorityGetter));
        }
Ejemplo n.º 29
0
        public static bool TryFindGoodKidnapVictim(Pawn kidnapper, float maxDist, out Pawn victim, List <Thing> disallowed = null)
        {
            if (!kidnapper.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !kidnapper.Map.reachability.CanReachMapEdge(kidnapper.Position, TraverseParms.For(kidnapper, Danger.Some)))
            {
                victim = null;
                return(false);
            }
            Predicate <Thing> validator = delegate(Thing t)
            {
                Pawn pawn = t as Pawn;
                if (!pawn.RaceProps.Humanlike)
                {
                    return(false);
                }
                if (!pawn.Downed)
                {
                    return(false);
                }
                if (pawn.Faction != Faction.OfPlayer)
                {
                    return(false);
                }
                if (!pawn.Faction.HostileTo(kidnapper.Faction))
                {
                    return(false);
                }
                if (!kidnapper.CanReserve(pawn))
                {
                    return(false);
                }
                if (disallowed != null && disallowed.Contains(pawn))
                {
                    return(false);
                }
                return(true);
            };

            victim = (Pawn)GenClosest.ClosestThingReachable(kidnapper.Position, kidnapper.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Some), maxDist, validator);
            return(victim != null);
        }
Ejemplo n.º 30
0
        public override void TickRare()
        {
            if (Spawned)
            {
                ticksLeft--;
                if (!triggered)
                {
                    if (ticksLeft < 0)
                    {
                        ticksLeft = (int)Math.Abs(Rand.Gaussian(0, referenceTimeoutAfterTriggered));
                        triggered = true;
                        Debug.Log("Battle", "Auto triggered raid at {0}, {1} of value {2} after {3} long ticks (approximately max speed seconds)", base.Position.x, base.Position.z, value, ticksLeft);
                    }

                    List <Thing> searchSet = PawnsFinder.AllMaps_FreeColonistsSpawned.ToList().ConvertAll(pawn => (Thing)pawn);

                    Thing thing = GenClosest.ClosestThing_Global(base.Position, searchSet, 10.0f);
                    if (thing != null)
                    {
                        ticksLeft = (int)Math.Abs(Rand.Gaussian(0, 200));
                        triggered = true;
                        Debug.Log("Battle", "Triggered raid at {0}, {1} of value {2} after {3} long ticks (approximately max speed seconds)", base.Position.x, base.Position.z, value, ticksLeft);
                    }
                }
                else
                {
                    if (ticksLeft < 0)
                    {
                        IncidentDef   incidentDef = IncidentDefOf.RaidEnemy;
                        IncidentParms parms       = new IncidentParms {
                            faction = faction, points = value, target = base.Map
                        };

                        incidentDef.Worker.TryExecute(parms);

                        Destroy();
                    }
                }
            }
        }