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