예제 #1
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.AnimalOrWildMan())
            {
                return(null);
            }

            if (!pawn.IsColonist)
            {
                return(null);
            }

            if (pawn.Drafted)
            {
                return(null);
            }

            if (pawn.Downed)
            {
                return(null);
            }

            if (HealthAIUtility.ShouldSeekMedicalRest(pawn))
            {
                return(null);
            }

            CompMilkableHumanoid compMilk = pawn.TryGetComp <CompMilkableHumanoid>();

            if (compMilk == null)
            {
                return(null);
            }

            if (!compMilk.ActiveAndCanBeMilked)
            {
                return(null);
            }

            if (!compMilk.MilkProps.canMilkThemselves)
            {
                return(null);
            }

            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (lover != null)
            {
                if (pawn.Faction == lover.Faction)
                {
                    if (!lover.Drafted && !lover.Downed && !HealthAIUtility.ShouldSeekMedicalRest(lover))
                    {
                        return(null);
                    }
                }
            }

            return(new Job(MilkyDefOf.MilkySelf));
        }
예제 #2
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn targetPawn = t as Pawn;

            if (targetPawn == null)
            {
                return(false);
            }

            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (lover == null)
            {
                return(false);
            }

            if (pawn.Faction != targetPawn.Faction)
            {
                return(false);
            }

            if (lover != targetPawn)
            {
                return(false);
            }

            if (lover.Drafted)
            {
                return(false);
            }

            //Do not try to milk sleeping lovers. Its rude.
            if (lover.CurJob != null && lover.jobs.curDriver.asleep)
            {
                return(false);
            }

            //Do not intervene in player forced jobs.
            if (lover.CurJob != null && lover.CurJob.playerForced)
            {
                return(false);
            }

            CompMilkableHumanoid spouseMilkComp = lover.TryGetComp <CompMilkableHumanoid>();

            if (spouseMilkComp == null)
            {
                return(false);
            }

            if (!spouseMilkComp.ActiveAndCanBeMilked)
            {
                return(false);
            }

            //Do not interrupt forbidden jobs.
            if (lover.CurJob != null && spouseMilkComp.MilkProps.forbiddenJobsToInterrupt.Count > 0 &&
                spouseMilkComp.MilkProps.forbiddenJobsToInterrupt.Contains(lover.CurJob.def))
            {
                return(false);
            }

            if (lover.Position.IsForbidden(pawn))
            {
                return(false);
            }

            if (!pawn.CanReserve(new LocalTargetInfo(lover)))
            {
                return(false);
            }

            if (!pawn.CanReach(new LocalTargetInfo(lover), PathEndMode.ClosestTouch, Danger.Deadly))
            {
                return(false);
            }

            return(true);
        }