Example #1
0
        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);
        }