public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
		{
			ThinkResult result;
			if (pawn.GetLord() == null)
			{
				Log.Error(pawn + " doing ThinkNode_DutyConstant with no Lord.", false);
				result = ThinkResult.NoJob;
			}
			else if (pawn.mindState.duty == null)
			{
				Log.Error(pawn + " doing ThinkNode_DutyConstant with no duty.", false);
				result = ThinkResult.NoJob;
			}
			else
			{
				if (this.dutyDefToSubNode == null)
				{
					Log.Error(pawn + " has null dutyDefToSubNode. Recovering by calling ResolveSubnodes() (though that should have been called already).", false);
					this.ResolveSubnodes();
				}
				int num = this.dutyDefToSubNode[pawn.mindState.duty.def];
				if (num < 0)
				{
					result = ThinkResult.NoJob;
				}
				else
				{
					result = this.subNodes[num].TryIssueJobPackage(pawn, jobParams);
				}
			}
			return result;
		}
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            ThinkResult result;

            if (!HealthAIUtility.ShouldSeekMedicalRest(pawn))
            {
                result = ThinkResult.NoJob;
            }
            else if (this.respectTimetable && RestUtility.TimetablePreventsLayDown(pawn) && !HealthAIUtility.ShouldHaveSurgeryDoneNow(pawn) && !HealthAIUtility.ShouldBeTendedNowByPlayer(pawn))
            {
                result = ThinkResult.NoJob;
            }
            else if (RestUtility.DisturbancePreventsLyingDown(pawn))
            {
                result = ThinkResult.NoJob;
            }
            else
            {
                Thing thing = RestUtility.FindPatientBedFor(pawn);
                if (thing == null)
                {
                    result = ThinkResult.NoJob;
                }
                else
                {
                    Job job = new Job(JobDefOf.LayDown, thing);
                    result = new ThinkResult(job, this, null, false);
                }
            }
            return(result);
        }
Пример #3
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            float num = this.MtbHours(pawn);

            if (num <= 0f) // This is why I had to detour whole method. Vanilla ThinkNode_ChancePerHour is hardcoded to return NoJob if MtbHours = 0 while I need it to always return job instead. Also, this is faster since it avoids saving ticks if not necessary. Also, vanilla has hardcoded one hour min delay.
            {              // it is not actually too bad though - while it can interfere with other mods, this method is unlikely to be required for anything else and it is runtime only, so no changes in saves
                return(base.TryIssueJobPackage(pawn, jobParams));
            }

            ThinkResult result;
            float       mtb_duration = Math.Min(MtbHours(pawn) * GenDate.TicksPerHour / 2, 2500);

            if (Find.TickManager.TicksGame < this.GetLastTryTick(pawn) + mtb_duration)
            {
                result = ThinkResult.NoJob;
            }
            else
            {
                this.SetLastTryTick(pawn, Find.TickManager.TicksGame);
                Rand.PushState();
                int salt = Gen.HashCombineInt(base.UniqueSaveKey, 26504059);
                Rand.Seed = pawn.RandSeedForHour(salt);
                bool flag = Rand.MTBEventOccurs(num, GenDate.TicksPerHour, GenDate.TicksPerHour);
                Rand.PopState();
                if (flag)
                {
                    result = base.TryIssueJobPackage(pawn, jobParams);
                }
                else
                {
                    result = ThinkResult.NoJob;
                }
            }
            return(result);
        }
Пример #4
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            if (pawn.GetLord() == null)
            {
                Log.Error(string.Concat(pawn, " doing ThinkNode_DutyConstant with no Lord."));
                return(ThinkResult.NoJob);
            }
            if (pawn.mindState.duty == null)
            {
                Log.Error(string.Concat(pawn, " doing ThinkNode_DutyConstant with no duty."));
                return(ThinkResult.NoJob);
            }
            if (dutyDefToSubNode == null)
            {
                Log.Error(string.Concat(pawn, " has null dutyDefToSubNode. Recovering by calling ResolveSubnodes() (though that should have been called already)."));
                ResolveSubnodes();
            }
            int num = dutyDefToSubNode[pawn.mindState.duty.def];

            if (num < 0)
            {
                return(ThinkResult.NoJob);
            }
            return(subNodes[num].TryIssueJobPackage(pawn, jobParams));
        }
Пример #5
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            Logger.MessageFormat(this, "Checking for saved job on Meeseeks.");

            CompMeeseeksMemory compMeeseeksMemory = pawn.GetComp <CompMeeseeksMemory>();

            if (compMeeseeksMemory != null && compMeeseeksMemory.GivenTask)
            {
                SavedJob savedJob = compMeeseeksMemory.savedJob;

                if (savedJob == null || CompMeeseeksMemory.noContinueJobs.Contains(savedJob.def))
                {
                    return(ThinkResult.NoJob);
                }

                Job nextJob = GetNextJob(pawn, compMeeseeksMemory);

                if (nextJob == null && compMeeseeksMemory.jobTargets.Count == 0)
                {
                    nextJob = JobMaker.MakeJob(MeeseeksDefOf.CM_Meeseeks_Box_Job_EmbraceTheVoid);
                }

                if (nextJob != null)
                {
                    return(new ThinkResult(nextJob, this, JobTag.MiscWork, fromQueue: false));
                }
            }

            return(ThinkResult.NoJob);
        }
Пример #6
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            var forcePool = pawn.needs.TryGetNeed <Need_ForcePool>();

            if (forcePool == null)
            {
                return(ThinkResult.NoJob);
            }

            var compForce = pawn.TryGetComp <CompForceUser>();

            if (compForce == null)
            {
                return(ThinkResult.NoJob);
            }

            var sensitiveTrait = pawn.story.traits.GetTrait(ProjectJediDefOf.PJ_ForceSensitive);

            if (sensitiveTrait != null)
            {
                return(ThinkResult.NoJob);
            }

            if (compForce.ForceData.TicksUntilMeditate > Find.TickManager.TicksAbs)
            {
                return(ThinkResult.NoJob);
            }

            if (forcePool.CurCategory > ForcePoolCategory.Strong)
            {
                return(ThinkResult.NoJob);
            }

            return(base.TryIssueJobPackage(pawn, jobParams));
        }
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            var area = pawn.GetGuestArea();

            if (area == null)
            {
                return(ThinkResult.NoJob);
            }
            if (area.TrueCount == 0)
            {
                return(ThinkResult.NoJob);
            }

            // Find nearby
            bool found = CellFinder.TryFindRandomReachableCellNear(pawn.Position, pawn.MapHeld, 20,
                                                                   TraverseParms.For(pawn, Danger.Some, TraverseMode.PassDoors), c => area[c], null, out var closeSpot);

            if (!found)
            {
                // Find any
                closeSpot = area.ActiveCells.InRandomOrder().Where(cell => area.Map.pathGrid.WalkableFast(cell)).Take(20)
                            .FirstOrDefault(cell => pawn.CanReach(cell, PathEndMode.OnCell, Danger.Some, false, TraverseMode.PassDoors));
                found = closeSpot.IsValid;
            }

            var job = found ? new ThinkResult(new Job(JobDefOf.Goto, closeSpot)
            {
                locomotionUrgency = LocomotionUrgency.Jog
            }, this) : ThinkResult.NoJob;

            return(job);
        }
        private void DoWork_ForceOwnerToSleep()
        {
            for (int i = 0; i < owners.Count; i++)
            {
                // preparation: stop all other jobs
                if (owners[i].jobs != null)
                {
                    owners[i].jobs.StopAll();
                }

                // Do Job with JobGiver  -> Force owner to sleep
                JobGiver_GetRest getRest     = new JobGiver_GetRest();
                JobIssueParams   jobParms    = new JobIssueParams();
                ThinkResult      thinkResult = getRest.TryIssueJobPackage(owners[i], jobParms);
                owners[i].jobs.StartJob(thinkResult.Job);



                // Alternate: If you want to send the pawn somewhere...

                //// Do Job with JobDriver  -> Call owner to bed
                //JobDriver_GotoTarget jobDriver = new JobDriver_GotoTarget(owner);
                //// Alternate: (JobDriver_GotoTarget)MakeDriver(owner, typeof(JobDriver_GotoTarget));
                //jobDriver.TargetCell = Position;
                //jobDriver.StartJob();
            }
        }
Пример #9
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            JobQueue jobQueue = pawn.jobs.jobQueue;

            if (pawn.Downed || jobQueue.AnyCanBeginNow(pawn, inBedOnly))
            {
                while (jobQueue.Count > 0 && !jobQueue.Peek().job.CanBeginNow(pawn, inBedOnly))
                {
                    QueuedJob queuedJob = jobQueue.Dequeue();
                    pawn.ClearReservationsForJob(queuedJob.job);
                    if (pawn.jobs.debugLog)
                    {
                        pawn.jobs.DebugLogEvent("   Throwing away queued job that I cannot begin now: " + queuedJob.job);
                    }
                }
            }
            if (jobQueue.Count > 0 && jobQueue.Peek().job.CanBeginNow(pawn, inBedOnly))
            {
                QueuedJob queuedJob2 = jobQueue.Dequeue();
                if (pawn.jobs.debugLog)
                {
                    pawn.jobs.DebugLogEvent("   Returning queued job: " + queuedJob2.job);
                }
                return(new ThinkResult(queuedJob2.job, this, queuedJob2.tag, fromQueue: true));
            }
            return(ThinkResult.NoJob);
        }
Пример #10
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            if (Find.TickManager.TicksGame < GetLastTryTick(pawn) + 2500)
            {
                return(ThinkResult.NoJob);
            }
            SetLastTryTick(pawn, Find.TickManager.TicksGame);
            float num = MtbHours(pawn);

            if (num <= 0f)
            {
                return(ThinkResult.NoJob);
            }
            Rand.PushState();
            int salt = Gen.HashCombineInt(base.UniqueSaveKey, 26504059);

            Rand.Seed = pawn.RandSeedForHour(salt);
            bool num2 = Rand.MTBEventOccurs(num, 2500f, 2500f);

            Rand.PopState();
            if (num2)
            {
                return(base.TryIssueJobPackage(pawn, jobParams));
            }
            return(ThinkResult.NoJob);
        }
Пример #11
0
        //public override void PostLoad()
        //{
        //    subNodes.Add(giverRechargeEnergy);
        //}F


        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobIssueParams)
        {
            statuses.Clear();
            if (pawn.needs != null && pawn.needs.rest != null && pawn.needs.rest.CurLevel <= 0.25)
            {
                statuses.Add(pawn.needs.rest);
            }

            for (int i = 0; i < this.statuses.Count; i++)
            {
                ThinkResult jobPackage = new ThinkResult();
                if (this.statuses[i] is Need_Rest)
                {
                    jobPackage = this.giverRechargeEnergy.TryIssueJobPackage(pawn, jobIssueParams);
                }
                if (jobPackage.IsValid)
                {
                    if (this.maxDistToSquadFlag > 0f)
                    {
                        IntVec3 cell = jobPackage.Job.targetA.Cell;
                        if ((pawn.Position - cell).LengthHorizontalSquared > this.maxDistToSquadFlag * this.maxDistToSquadFlag)
                        {
                            return(ThinkResult.NoJob);
                        }
                    }
                    return(jobPackage);
                }
            }
            return(ThinkResult.NoJob);
        }
Пример #12
0
        /*
         * If the mech has no reason to leave a platform, or if it should go to a platform, override the job it intended to do with a mechanoid_rest job.
         */
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            ThinkResult result = base.TryIssueJobPackage(pawn, jobParams);

            //Log.Message("result JobDef: " + result.Job.def.defName);
            if (result.Job == null && !pawn.IsActivated())
            {
                Job job = null;
                if (pawn.OnBaseMechanoidPlatform())//If the mech is already on a platform, let it stay on it.
                {
                    job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, pawn.CurrentBed());
                }
                else//Else, let if find another platform. If it can't find one, let it continue work or idling.
                {
                    Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(pawn, pawn);
                    if (closestAvailablePlatform != null && pawn.CanReserve(closestAvailablePlatform))
                    {
                        if (pawn.CurJob != null)
                        {
                            pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
                        }
                        job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform);
                    }
                }
                if (job != null)
                {
                    result = new ThinkResult(job, this);
                }
            }
            return(result);
        }
Пример #13
0
 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
 {
     if (Satisfied(pawn) == !invert)
     {
         return(base.TryIssueJobPackage(pawn, jobParams));
     }
     return(ThinkResult.NoJob);
 }
Пример #14
0
        // When the robot is idle, check if it is inside the room of the recharge station. If not, return there.
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            X2_AIRobot robot = pawn as X2_AIRobot;

            if (robot.DestroyedOrNull())
            {
                return(ThinkResult.NoJob);
            }
            if (!robot.Spawned)
            {
                return(ThinkResult.NoJob);
            }

            X2_Building_AIRobotRechargeStation rechargeStation = robot.rechargeStation;

            if (rechargeStation.DestroyedOrNull())
            {
                return(ThinkResult.NoJob);
            }
            if (!rechargeStation.Spawned)
            {
                return(ThinkResult.NoJob);
            }


            Need_Rest needRest = pawn.needs.rest;

            if (needRest == null)
            {
                return(ThinkResult.NoJob);
            }

            float curLevel = needRest.CurLevel;

            Job jobIdle = new Job(DefDatabase <JobDef> .GetNamed("AIRobot_GoAndWait"), rechargeStation);

            jobIdle.locomotionUrgency = LocomotionUrgency.Amble;

            if (curLevel > 0.751f)
            {
                return(new ThinkResult(jobIdle, this, JobTag.Idle, false));
            }

            //double distance = AIRobot_Helper.GetDistance(pawn.Position, (pawn as X2_AIRobot).rechargeStation.Position);
            //
            //if (distance > 5f)
            //    return ThinkResult.NoJob;

            //Boolean isInDistance = AIRobot_Helper.IsInDistance(pawn.Position, (pawn as X2_AIRobot).rechargeStation.Position, 5);
            //if (isInDistance)
            //    return ThinkResult.NoJob;

            Job job = new Job(DefDatabase <JobDef> .GetNamed("AIRobot_GoRecharge"), rechargeStation);

            job.locomotionUrgency = LocomotionUrgency.Amble;

            return(new ThinkResult(job, this, JobTag.SatisfyingNeeds, false));
        }
        // Token: 0x0600002D RID: 45 RVA: 0x00002758 File Offset: 0x00000958
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParm)
        {
            bool        flag = !HealthAIUtility.ShouldSeekMedicalRest(pawn);
            ThinkResult result;

            if (flag)
            {
                result = ThinkResult.NoJob;
            }
            else
            {
                bool flag2 = !HealthAIUtility.ShouldBeTendedNowByPlayer(pawn);
                if (flag2)
                {
                    result = ThinkResult.NoJob;
                }
                else
                {
                    bool flag3 = !GenCollection.Any <Apparel>(pawn.apparel.WornApparel, (Apparel x) => x.def.defName.Contains("RRY_Equipment_HunterGauntlet"));
                    if (flag3)
                    {
                        result = ThinkResult.NoJob;
                    }
                    else
                    {
                        Thing thing = RestUtility.FindPatientBedFor(pawn);
                        bool  flag4 = thing == null;
                        if (flag4)
                        {
                            result = ThinkResult.NoJob;
                        }
                        else
                        {
                            Thing thing2 = null;
                            bool  flag5  = Medicine.GetMedicineCountToFullyHeal(pawn) > 0;
                            if (flag5)
                            {
                                thing2 = HealthAIUtility.FindBestMedicine(pawn, pawn);
                            }
                            bool flag6 = thing2 != null;
                            Job  job;
                            if (flag6)
                            {
                                job = new Job(YautjaDefOf.RRY_Yautja_TendSelf, thing, thing2);
                            }
                            else
                            {
                                job = new Job(YautjaDefOf.RRY_Yautja_TendSelf, thing);
                            }
                            result = new ThinkResult(job, this, null, false);
                        }
                    }
                }
            }
            return(result);
        }
Пример #16
0
            private static void Postfix(Pawn pawn, JobIssueParams jobParams, ref ThinkResult __result)
            {
                var jobDefs = pawn.GetPawnExtensions()?.suppressJobs?.soft;
                var job     = __result.Job;

                if (jobDefs != null && job != null && jobDefs.Contains(job.def))
                {
                    __result = ThinkResult.NoJob;
                }
            }
Пример #17
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            Job job = this.TryGiveJob(pawn);

            if (job == null)
            {
                return(ThinkResult.NoJob);
            }
            return(new ThinkResult(job, this, null, false));
        }
Пример #18
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            ThinkResult result = base.TryIssueJobPackage(pawn, jobParams);

            if (result.IsValid && !result.Tag.HasValue)
            {
                result = new ThinkResult(result.Job, result.SourceNode, tagToGive);
            }
            return(result);
        }
 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
 {
     CheckLeaveCurrentVoluntarilyJoinableLord(pawn);
     JoinVoluntarilyJoinableLord(pawn);
     if (pawn.GetLord() != null && (pawn.mindState.duty == null || pawn.mindState.duty.def.hook == dutyHook))
     {
         return(base.TryIssueJobPackage(pawn, jobParams));
     }
     return(ThinkResult.NoJob);
 }
        private static ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams, List <ThinkNode> subNodes, float minPriority)
        {
            List <ThinkNode> workingNodes = new List <ThinkNode>();
            int count = subNodes.Count;

            for (int i = 0; i < count; i++)
            {
                workingNodes.Insert(Rand.Range(0, workingNodes.Count - 1), subNodes[i]);
            }
            while (workingNodes.Count > 0)
            {
                float num  = 0f;
                int   num2 = -1;
                for (int j = 0; j < workingNodes.Count; j++)
                {
                    float num3 = 0f;
                    try
                    {
                        num3 = workingNodes[j].GetPriority(pawn);
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Think node error under threading, priority sorter");
                    }
                    if (num3 > 0f && num3 >= minPriority)
                    {
                        if (num3 > num)
                        {
                            num  = num3;
                            num2 = j;
                        }
                    }
                }
                if (num2 == -1)
                {
                    break;
                }
                ThinkResult result = ThinkResult.NoJob;
                try
                {
                    result = workingNodes[num2].TryIssueJobPackage(pawn, jobParams);
                }
                catch (Exception ex2)
                {
                    Log.Error("Think node error under threading, priority sorter");
                }
                if (result.IsValid)
                {
                    return(result);
                }
                workingNodes.RemoveAt(num2);
            }
            return(ThinkResult.NoJob);
        }
Пример #21
0
 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
 {
     try
     {
         return(base.TryIssueJobPackage(pawn, jobParams));
     }
     catch (NullReferenceException)
     {
         return(ThinkResult.NoJob);;
     }
 }
        // When the robot is idle, check if it is inside the room of the recharge station. If not, return there.
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            X2_AIRobot robot = pawn as X2_AIRobot;

            if (robot.DestroyedOrNull())
            {
                return(ThinkResult.NoJob);
            }
            if (!robot.Spawned)
            {
                return(ThinkResult.NoJob);
            }

            X2_Building_AIRobotRechargeStation rechargeStation = robot.rechargeStation;

            if (rechargeStation.DestroyedOrNull())
            {
                return(ThinkResult.NoJob);
            }
            if (!rechargeStation.Spawned)
            {
                return(ThinkResult.NoJob);
            }

            Room roomRecharge = rechargeStation.Position.GetRoom(rechargeStation.Map);
            Room roomRobot    = robot.Position.GetRoom(robot.Map);

            if (roomRecharge == roomRobot)
            {
                return(ThinkResult.NoJob);
            }

            // Find target pos, but max 10 cells away!
            Map     mapRecharge = rechargeStation.Map;
            IntVec3 posRecharge = rechargeStation.Position;
            IntVec3 cell        = roomRecharge.Cells.Where(c =>
                                                           c.Standable(mapRecharge) && !c.IsForbidden(pawn) &&
                                                           AIRobot_Helper.IsInDistance(c, posRecharge, 10) &&
                                                           pawn.CanReach(c, PathEndMode.OnCell, Danger.Some, false, TraverseMode.ByPawn)
                                                           )
                                  .FirstOrDefault();

            if (cell == null || cell == IntVec3.Invalid)
            {
                return(ThinkResult.NoJob);
            }

            Job jobGoto = new Job(JobDefOf.Goto, cell);

            jobGoto.locomotionUrgency = LocomotionUrgency.Amble;

            return(new ThinkResult(jobGoto, this, JobTag.Misc, false));
        }
 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
 {
     try
     {
         return(base.TryIssueJobPackage(pawn, jobParams));
     }
     catch (NullReferenceException e)
     {
         //--Log.Message("[RJW]ThinkNode_ChancePerHour_Beastiality:TryIssueJobPackage - error message" + e.Message);
         //--Log.Message("[RJW]ThinkNode_ChancePerHour_Beastiality:TryIssueJobPackage - error stacktrace" + e.StackTrace);
         return(ThinkResult.NoJob);;
     }
 }
Пример #24
0
 public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
 {
     if (pawn.GetLord() == null)
     {
         Log.Error(pawn + " doing ThinkNode_Duty with no Lord.");
         return(ThinkResult.NoJob);
     }
     if (pawn.mindState.duty == null)
     {
         Log.Error(pawn + " doing ThinkNode_Duty with no duty.");
         return(ThinkResult.NoJob);
     }
     return(this.subNodes[(int)pawn.mindState.duty.def.index].TryIssueJobPackage(pawn, jobParams));
 }
Пример #25
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            if (!pawn.PsiTracker().ShouldTrain())
            {
                return(ThinkResult.NoJob);
            }

            var availableTrainer = Current.Game.GetComponent <PsiTechManager>().GetOpenTrainerForPawn(pawn);

            return(availableTrainer == null
                ? ThinkResult.NoJob
                : new ThinkResult(JobMaker.MakeJob(JobDefOf.EnterCryptosleepCasket, (LocalTargetInfo)availableTrainer),
                                  this, new JobTag?()));
        }
Пример #26
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            List <Trait> allTraits = pawn.story.traits.allTraits;

            for (int i = 0; i < allTraits.Count; i++)
            {
                ThinkTreeDef thinkTree = allTraits[i].CurrentData.thinkTree;
                if (thinkTree != null)
                {
                    return(thinkTree.thinkRoot.TryIssueJobPackage(pawn, jobParams));
                }
            }
            return(ThinkResult.NoJob);
        }
Пример #27
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            if (pawn.CurJob != null)
            {
                //Log.Message(pawn.NameStringShort + " already has a job: " + pawn.CurJob);
                return(new ThinkResult(pawn.CurJob, this));
            }
            if (pawn.needs == null || pawn.needs.rest == null)
            {
                if (pawn.needs == null)
                {
                    Log.ErrorOnce(pawn.NameStringShort + " has no needs", 453636 + pawn.thingIDNumber);
                }
                if (pawn.needs.rest == null)
                {
                    Log.ErrorOnce(pawn.NameStringShort + " has no rest need", 357474 + pawn.thingIDNumber);
                }
                return(ThinkResult.NoJob);
            }
            if (pawn.mindState == null)
            {
                Log.ErrorOnce(pawn.NameStringShort + " has no mindstate", 23892 + pawn.thingIDNumber);
                pawn.mindState = new Pawn_MindState(pawn);
            }

            if (Find.TickManager.TicksGame - pawn.mindState.lastDisturbanceTick < 400)
            {
                Log.Message(pawn.NameStringShort + " can't sleep - got disturbed");
                return(ThinkResult.NoJob);
            }
            Building_GuestBed bed = pawn.FindBedFor();

            if (bed != null)
            {
                return(new ThinkResult(new Job(JobDefOf.LayDown, bed), this));
            }
            IntVec3 vec = CellFinder.RandomClosewalkCellNear(pawn.mindState.duty.focus.Cell, pawn.MapHeld, 4);

            if (!pawn.CanReserve(vec))
            {
                return(ThinkResult.NoJob);
            }

            pawn.Reserve(vec);
            return(new ThinkResult(new Job(JobDefOf.LayDown, vec), this));
        }
Пример #28
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            int count = subNodes.Count;

            for (int i = 0; i < count; i++)
            {
                if (subNodes[i].GetPriority(pawn) > minPriority)
                {
                    ThinkResult result = subNodes[i].TryIssueJobPackage(pawn, jobParams);
                    if (result.IsValid)
                    {
                        return(result);
                    }
                }
            }
            return(ThinkResult.NoJob);
        }
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            ThinkResult result = base.TryIssueJobPackage(pawn, jobParams);

            if (result.IsValid)
            {
                if (IsForbidden(result))
                {
                    return(ThinkResult.NoJob);
                }

                if (!IsOutsideArea(result.Job, pawn.GetGuestArea()))
                {
                    return(result);
                }
            }
            return(ThinkResult.NoJob);
        }
Пример #30
0
        public override ThinkResult TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        {
            Lord lord = pawn.GetLord();

            if (lord == null)
            {
                if (!pawn.Awake())
                {
                    return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams()));
                }

                if (pawn.needs?.food?.Starving ?? false)
                {
                    return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams()));
                }

                if (pawn.story == null)
                {
                    return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams()));
                }

                IdleJobGiverBase jobGiver = null;
                this.JobGivers.TryRandomElementByWeight((IdleJobGiverBase x) => x.GetWeight(pawn, pawn.story.traits.GetTrait(TraitDefOf.Industriousness)), out jobGiver);
                if (jobGiver != null)
                {
                    Job job = jobGiver.TryGiveJob(pawn);
                    if (job != null)
                    {
#if DEBUG
                        Log.Message(string.Format("idle job {0} to {1}", jobGiver.GetType().Name, pawn.Name));
#endif
                        return(new ThinkResult(job, this, null, false));
                    }
#if DEBUG
                    else
                    {
                        Log.Message(string.Format("idle job {0} to {1} but job is null", jobGiver.GetType().Name, pawn.Name));
                    }
#endif
                }
            }

            return(wanderJobGiver.TryIssueJobPackage(pawn, new JobIssueParams()));
        }