示例#1
0
 public static bool ShouldBeTendedNowByPlayer(Pawn pawn)
 {
     return(pawn.playerSettings != null && HealthAIUtility.ShouldEverReceiveMedicalCareFromPlayer(pawn) && pawn.health.HasHediffsNeedingTendByPlayer(false));
 }
示例#2
0
        public static bool IsValidBedFor(Thing bedThing, Pawn sleeper, Pawn traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool allowMedBedEvenIfSetToNoCare = false, bool ignoreOtherReservations = false)
        {
            Building_Bed building_Bed = bedThing as Building_Bed;
            bool         result;

            if (building_Bed == null)
            {
                result = false;
            }
            else
            {
                LocalTargetInfo target             = building_Bed;
                PathEndMode     peMode             = PathEndMode.OnCell;
                Danger          maxDanger          = Danger.Some;
                int             sleepingSlotsCount = building_Bed.SleepingSlotsCount;
                if (!traveler.CanReserveAndReach(target, peMode, maxDanger, sleepingSlotsCount, -1, null, ignoreOtherReservations))
                {
                    result = false;
                }
                else if (traveler.HasReserved(building_Bed, new LocalTargetInfo?(sleeper), null, null))
                {
                    result = false;
                }
                else if (!RestUtility.CanUseBedEver(sleeper, building_Bed.def))
                {
                    result = false;
                }
                else if (!building_Bed.AnyUnoccupiedSleepingSlot && (!sleeper.InBed() || sleeper.CurrentBed() != building_Bed) && !building_Bed.AssignedPawns.Contains(sleeper))
                {
                    result = false;
                }
                else if (building_Bed.IsForbidden(traveler))
                {
                    result = false;
                }
                else if (checkSocialProperness && !building_Bed.IsSociallyProper(sleeper, sleeperWillBePrisoner, false))
                {
                    result = false;
                }
                else if (building_Bed.IsBurning())
                {
                    result = false;
                }
                else
                {
                    if (sleeperWillBePrisoner)
                    {
                        if (!building_Bed.ForPrisoners)
                        {
                            return(false);
                        }
                        if (!building_Bed.Position.IsInPrisonCell(building_Bed.Map))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (building_Bed.Faction != traveler.Faction)
                        {
                            return(false);
                        }
                        if (building_Bed.ForPrisoners)
                        {
                            return(false);
                        }
                    }
                    if (building_Bed.Medical)
                    {
                        if (!allowMedBedEvenIfSetToNoCare && !HealthAIUtility.ShouldEverReceiveMedicalCareFromPlayer(sleeper))
                        {
                            return(false);
                        }
                        if (!HealthAIUtility.ShouldSeekMedicalRest(sleeper))
                        {
                            return(false);
                        }
                    }
                    else if (building_Bed.owners.Any <Pawn>() && !building_Bed.owners.Contains(sleeper))
                    {
                        if (sleeper.IsPrisoner || sleeperWillBePrisoner)
                        {
                            if (!building_Bed.AnyUnownedSleepingSlot)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            if (!RestUtility.IsAnyOwnerLovePartnerOf(building_Bed, sleeper))
                            {
                                return(false);
                            }
                            if (!building_Bed.AnyUnownedSleepingSlot)
                            {
                                return(false);
                            }
                        }
                    }
                    result = true;
                }
            }
            return(result);
        }
        public static bool IsValidBedFor(Thing bedThing, Pawn sleeper, Pawn traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool allowMedBedEvenIfSetToNoCare = false, bool ignoreOtherReservations = false)
        {
            Building_Bed building_Bed = bedThing as Building_Bed;

            if (building_Bed == null)
            {
                return(false);
            }
            if (!traveler.CanReserveAndReach(building_Bed, PathEndMode.OnCell, Danger.Some, building_Bed.SleepingSlotsCount, -1, null, ignoreOtherReservations))
            {
                return(false);
            }
            if (traveler.HasReserved <JobDriver_TakeToBed>(building_Bed, sleeper))
            {
                return(false);
            }
            if (!CanUseBedEver(sleeper, building_Bed.def))
            {
                return(false);
            }
            if (!building_Bed.AnyUnoccupiedSleepingSlot && (!sleeper.InBed() || sleeper.CurrentBed() != building_Bed) && !building_Bed.CompAssignableToPawn.AssignedPawns.Contains(sleeper))
            {
                return(false);
            }
            if (building_Bed.IsForbidden(traveler))
            {
                return(false);
            }
            if (checkSocialProperness && !building_Bed.IsSociallyProper(sleeper, sleeperWillBePrisoner))
            {
                return(false);
            }
            if (building_Bed.IsBurning())
            {
                return(false);
            }
            if (sleeperWillBePrisoner)
            {
                if (!building_Bed.ForPrisoners)
                {
                    return(false);
                }
                if (!building_Bed.Position.IsInPrisonCell(building_Bed.Map))
                {
                    return(false);
                }
            }
            else
            {
                if (building_Bed.Faction != traveler.Faction && (traveler.HostFaction == null || building_Bed.Faction != traveler.HostFaction))
                {
                    return(false);
                }
                if (building_Bed.ForPrisoners)
                {
                    return(false);
                }
            }
            if (building_Bed.Medical)
            {
                if (!allowMedBedEvenIfSetToNoCare && !HealthAIUtility.ShouldEverReceiveMedicalCareFromPlayer(sleeper))
                {
                    return(false);
                }
                if (!HealthAIUtility.ShouldSeekMedicalRest(sleeper))
                {
                    return(false);
                }
            }
            else if (building_Bed.OwnersForReading.Any() && !building_Bed.OwnersForReading.Contains(sleeper))
            {
                if (sleeper.IsPrisoner || sleeperWillBePrisoner)
                {
                    if (!building_Bed.AnyUnownedSleepingSlot)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!IsAnyOwnerLovePartnerOf(building_Bed, sleeper))
                    {
                        return(false);
                    }
                    if (!building_Bed.AnyUnownedSleepingSlot)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }