public static Pawn FindCatToPet(Pawn pawn) { if (!pawn.Spawned) { return(null); } //find bonded animal. If no bonded animal, pick a pet-like creature. Pawn result = ColonyAnimalLister.FindBondedAnimal(pawn); if (result != null) { return(result); } else { tmpAnimals.Clear(); List <Pawn> allPawnsSpawned = pawn.Map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { Pawn pawn2 = allPawnsSpawned[i]; if (pawn2.RaceProps.Animal && pawn2.Faction == pawn.Faction && pawn2.RaceProps.petness >= 0.1 && !(pawn2.CurJob.def == JobDefOf.LayDown) && pawn2 != pawn && !pawn2.IsBurning() && !pawn2.InAggroMentalState && pawn.CanReserveAndReach(pawn2, PathEndMode.Touch, Danger.Deadly, 1, -1, null, false)) { tmpAnimals.Add(pawn2); } } if (!tmpAnimals.Any <Pawn>()) { return(null); } result = tmpAnimals.RandomElement <Pawn>(); tmpAnimals.Clear(); return(result); } }
protected override IntVec3 GetWanderRoot(Pawn pawn) { Pawn pawnToHarass = ColonyAnimalLister.FindBondedMaster(pawn); if (pawnToHarass == null || pawnToHarass.CurJob.def != JobDefOf.LayDown || pawnToHarass.CurrentBed()?.GetCurOccupant(1) != pawnToHarass) { pawn.Map.mapPawns.FreeHumanlikesSpawnedOfFaction(Faction.OfPlayer).TryRandomElement(out Pawn randomColonist); pawnToHarass = randomColonist; } if (pawnToHarass?.ownership?.OwnedRoom != null) { Room masterBedroom = pawnToHarass.ownership.OwnedRoom; if ((from c in masterBedroom.Cells where c.Standable(pawn.Map) && !c.IsForbidden(pawn) && pawn.CanReach(c, PathEndMode.OnCell, Danger.None, false) select c).TryRandomElement(out IntVec3 vec3)) { return(vec3); } } return(IntVec3.Invalid); }