// Token: 0x060005B9 RID: 1465 RVA: 0x00037BC0 File Offset: 0x00035FC0 private Pawn FindPawnTarget(Pawn pawn) { Predicate <Thing> validator = delegate(Thing x) { Pawn p = (Pawn)x; // Log.Message(string.Format("{0}\nisInfectablePawn: {1}, Alive: {2}", pawn.LabelShortCap, XenomorphUtil.isInfectablePawn(p), !p.Dead)); return(XenomorphUtil.isInfectablePawn(p)); }; Pawn pawn2 = (Pawn)XenomorphTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, validator, 0f, HuntingRange, pawn.Position, float.MaxValue, true, true); /* * while (pawn2==null && HuntingRange<50) * { * HuntingRange += 10; * // Log.Message(string.Format("{0}@{1} hunting failed, extending radius to {2}", pawn.Label, pawn.Position, HuntingRange)); * pawn2 = (Pawn)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, validator, 0f, HuntingRange, pawn.Position, float.MaxValue, true, true); * // return pawn2; * } */ if (pawn2 == null) { pawn2 = BestPawnToHuntForPredator(pawn, forceScanWholeMap); } #if DEBUG bool selected = Find.Selector.SingleSelectedThing == pawn; if (selected) { if (pawn2 != null) { Log.Message(string.Format("{0}@{1} hunting {2}@{3}", pawn.Label, pawn.Position, pawn2.Label, pawn2.Position)); } } #endif return(pawn2 ?? null); }
// Token: 0x060009B3 RID: 2483 RVA: 0x0004DFD8 File Offset: 0x0004C3D8 protected override bool Satisfied(Pawn pawn) { bool result; if (pawn.Spawned && XenomorphUtil.IsXenomorph(pawn)) { result = pawn.Map.mapPawns.AllPawns.Any((Pawn x) => x.Downed && XenomorphUtil.isInfectablePawn(x)); } else { result = false; } return(result); }
// Token: 0x060004D2 RID: 1234 RVA: 0x00031074 File Offset: 0x0002F474 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, TraverseMode.ByPawn, false))) { victim = null; return(false); } Predicate <Thing> validator = delegate(Thing t) { Pawn pawn = t as Pawn; return(XenomorphUtil.isInfectablePawn(pawn) && 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); return(victim != null); }
// Token: 0x06000524 RID: 1316 RVA: 0x0003381C File Offset: 0x00031C1C protected override Job TryGiveJob(Pawn pawn) { Predicate <Thing> validator = delegate(Thing t) { Pawn pawn3 = (Pawn)t; float eggDist = 9999f; Thing egg = XenomorphUtil.ClosestReachableEgg(pawn3); if (egg != null) { eggDist = XenomorphUtil.DistanceBetween(pawn3.Position, egg.Position); } else { return(false); } if (eggDist == 9999f || eggDist <= 5) { return(false); } return(pawn3.Downed && pawn3.Faction != pawn.Faction && XenomorphUtil.isInfectablePawn(pawn3) && pawn.CanReserve(pawn3, 1, -1, null, false) && !pawn3.IsForbidden(pawn) && !GenAI.EnemyIsNear(pawn3, 25f)); }; Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), this.radius, validator, null, 0, -1, false, RegionType.Set_Passable, false); if (pawn2 == null) { return(null); } Thing thing = 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); if (thing == null) { return(null); thing = 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); if (thing == null) { return(null); } } return(new Job(XenomorphDefOf.RRY_Job_XenomorphKidnap, pawn2, thing) { count = 1 }); }
// Token: 0x060005B7 RID: 1463 RVA: 0x00037A28 File Offset: 0x00035E28 protected override Job TryGiveJob(Pawn pawn) { Comp_Facehugger _Facehugger = pawn.TryGetComp <Comp_Facehugger>(); bool selected = Find.Selector.SingleSelectedThing == pawn; if (pawn.TryGetAttackVerb(null, false) == null) { return(null); } Pawn pawn2 = FindPawnTarget(pawn); // Pawn pawn2 = BestPawnToHuntForPredator(pawn, forceScanWholeMap); if (pawn2 != null && !pawn2.Dead && _Facehugger.Impregnations < _Facehugger.maxImpregnations && XenomorphUtil.isInfectablePawn(pawn2) && pawn.CanReach(pawn2, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn)) { #if DEBUG // if (selected) Log.Message(string.Format("{0}@{1} hunting {2}@{3}", pawn.Label, pawn.Position, pawn2.Label, pawn2.Position)); #endif return(this.MeleeAttackJob(pawn, pawn2)); } if (pawn2 != null && XenomorphUtil.isInfectablePawn(pawn2)) { using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassDoors, false), PathEndMode.OnCell)) { if (!pawnPath.Found) { return(null); } if (!pawnPath.TryFindLastCellBeforeBlockingDoor(pawn, out IntVec3 loc)) { // Log.Error(pawn + " did TryFindLastCellBeforeDoor but found none when it should have been one. Target: " + pawn2.LabelCap, false); return(null); } IntVec3 randomCell = CellFinder.RandomRegionNear(loc.GetRegion(pawn.Map, RegionType.Set_Passable), 9, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), null, null, RegionType.Set_Passable).RandomCell; if (randomCell == pawn.Position) { return(new Job(JobDefOf.Wait, 30, false)); } return(new Job(JobDefOf.Goto, randomCell)); } } return(null); }
// Token: 0x060005B9 RID: 1465 RVA: 0x00037BC0 File Offset: 0x00035FC0 private Pawn FindPawnTarget(Pawn pawn) { Pawn pawn2 = (Pawn)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, (Thing x) => x is Pawn && XenomorphUtil.isInfectablePawn((Pawn)x), 0f, 10f, default(IntVec3), float.MaxValue, true, true); if (pawn2 == null) { pawn2 = (Pawn)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, (Thing x) => x is Pawn && XenomorphUtil.isInfectablePawn((Pawn)x), 0f, 9999f, default(IntVec3), float.MaxValue, true, true); } if (pawn2 == null) { pawn2 = BestPawnToHuntForPredator(pawn, forceScanWholeMap); } #if DEBUG bool selected = Find.Selector.SingleSelectedThing == pawn; if (selected) { if (pawn2 != null) { Log.Message(string.Format("{0}@{1} hunting {2}@{3}", pawn.Label, pawn.Position, pawn2.Label, pawn2.Position)); } } #endif return(pawn2); }
public static bool isPotentialHost(this Thing t) { Pawn p = (Pawn)t; return(XenomorphUtil.isInfectablePawn(p) && !p.isXenomorph() && !p.isNeomorph() && p.health.hediffSet.HasHead); }
// Token: 0x060009B3 RID: 2483 RVA: 0x0004DFD8 File Offset: 0x0004C3D8 protected override bool Satisfied(Pawn pawn) { bool result; if (pawn.Spawned && XenomorphUtil.IsXenomorph(pawn)) { List <Pawn> list = pawn.Map.mapPawns.AllPawns.Where((Pawn x) => x.RaceProps.FleshType != XenomorphRacesDefOf.RRY_Xenomorph && x.RaceProps.FleshType != XenomorphRacesDefOf.RRY_Neomorph && !x.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Cocooned) && x.Downed && XenomorphUtil.isInfectablePawn(x) && pawn.CanReach(x, PathEndMode.InteractionCell, Danger.Deadly, false, TraverseMode.NoPassClosedDoors)).ToList(); result = !list.NullOrEmpty() ? list.Any <Pawn>(x => x.Spawned) : false; } else { result = false; } if (Find.Selector.SelectedObjects.Contains(pawn)) { Log.Message(string.Format("{0} Result: {1}", this, result)); } return(result); }
// RimWorld.FoodUtility private static Pawn BestPawnToHuntForPredator(Pawn predator, bool forceScanWholeMap) { if (predator.meleeVerbs.TryGetMeleeVerb(null) == null) { return(null); } bool flag = false; float summaryHealthPercent = predator.health.summaryHealth.SummaryHealthPercent; if (summaryHealthPercent < 0.25f) { flag = true; } tmpPredatorCandidates.Clear(); int maxRegionsToScan = GetMaxRegionsToScan(predator, forceScanWholeMap); if (maxRegionsToScan < 0) { tmpPredatorCandidates.AddRange(predator.Map.mapPawns.AllPawnsSpawned); } else { TraverseParms traverseParms = TraverseParms.For(predator, Danger.Deadly, TraverseMode.ByPawn, false); RegionTraverser.BreadthFirstTraverse(predator.Position, predator.Map, (Region from, Region to) => to.Allows(traverseParms, true), delegate(Region x) { List <Thing> list = x.ListerThings.ThingsInGroup(ThingRequestGroup.Pawn); for (int j = 0; j < list.Count; j++) { Pawn p = ((Pawn)list[j]); if (XenomorphUtil.isInfectablePawn(p)) { tmpPredatorCandidates.Add(p); } else { // Log.Message(string.Format("{0} cannae hunt {2} XenoInfection:{1} IsXenos:{3}", predator.Label, XenomorphUtil.IsInfectedPawn(p), ((Pawn)list[j]).Label, XenomorphUtil.IsXenomorph(p))); } } return(false); }, 999999, RegionType.Set_Passable); } Pawn pawn = null; float num = 0f; bool tutorialMode = TutorSystem.TutorialMode; for (int i = 0; i < tmpPredatorCandidates.Count; i++) { Pawn pawn2 = tmpPredatorCandidates[i]; if (predator.GetRoom(RegionType.Set_Passable) == pawn2.GetRoom(RegionType.Set_Passable)) { if (predator != pawn2) { if (!flag || pawn2.Downed) { if (IsAcceptablePreyFor(predator, pawn2)) { if (predator.CanReach(pawn2, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { if (!pawn2.IsForbidden(predator)) { if (!tutorialMode || pawn2.Faction != Faction.OfPlayer) { float preyScoreFor = FoodUtility.GetPreyScoreFor(predator, pawn2); if (preyScoreFor > num || pawn == null) { num = preyScoreFor; pawn = pawn2; } } } } } } } } } tmpPredatorCandidates.Clear(); return(pawn); }
// Token: 0x060005B9 RID: 1465 RVA: 0x00037BC0 File Offset: 0x00035FC0 private Pawn FindPawnTarget(Pawn pawn) { bool selected = Find.Selector.SingleSelectedThing == pawn; List <Pawn> list = pawn.Map.mapPawns.AllPawns.Where((Pawn x) => !x.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Cocooned) && !x.Downed && XenomorphUtil.isInfectablePawn(x) && pawn.CanReach(x, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.NoPassClosedDoors) && !pawn.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Anesthetic) && ((requireLOS && pawn.CanSee(x)) || !requireLOS) && (this.Gender == Gender.None || (this.Gender != Gender.None && x.gender == this.Gender))).ToList(); if (list.NullOrEmpty()) { return(null); } return((Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.ClosestTouch, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Deadly, false), HuntingRange, (x => x is Pawn p && list.Contains(p))));//(Pawn)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, (Thing x) => x is Pawn p && XenomorphUtil.isInfectablePawn(p) && !p.Downed, 0f, 9999f, default(IntVec3), float.MaxValue, true, true); }