Example #1
0
        public static ThinkResult TryIssueJobPackage2(ThinkNode_Priority __instance, Pawn pawn, JobIssueParams jobParams)
        {
            int count = __instance.subNodes.Count;

            for (int index = 0; index < count; ++index)
            {
                ThinkResult thinkResult = ThinkResult.NoJob;
                try
                {
                    ThinkNode thinkNode = __instance.subNodes[index];
                    if (thinkNode == null)
                    {
                        return(thinkResult);
                    }
                    thinkResult = thinkNode.TryIssueJobPackage(pawn, jobParams);
                }
                catch (Exception ex)
                {
                    Log.Error("Exception in " + __instance.GetType() + " TryIssueJobPackage: " + ex.ToString());
                }
                if (thinkResult.IsValid)
                {
                    return(thinkResult);
                }
            }
            return(ThinkResult.NoJob);
        }
Example #2
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);
        }
Example #3
0
 private Toil ChainJob()
 {
     return(new Toil
     {
         initAction = delegate
         {
             if (RetrievedWorkFlow.tryToChainJobGiver.FirstOrFallback() is ThinkNode_JobGiver JG)
             {
                 if (MyDebug)
                 {
                     Log.Warning("trying to thinknode: " + JG.ToString());
                 }
                 ThinkResult TR = JG.TryIssueJobPackage(pawn, default(JobIssueParams));
                 if (MyDebug)
                 {
                     Log.Warning(TR.ToString());
                 }
                 if (TR != ThinkResult.NoJob)
                 {
                     pawn.jobs.jobQueue.EnqueueFirst(TR.Job);
                 }
                 else if (MyDebug)
                 {
                     Log.Warning("failed to chain job");
                 }
             }
             else
             {
                 if (MyDebug)
                 {
                     Log.Warning("no thinknode");
                 }
             }
         }
     });
Example #4
0
        public static bool TryIssueJobPackage(ThinkNode_Priority __instance, ref ThinkResult __result, Pawn pawn, JobIssueParams jobParams)
        {
            ThinkNode subNode;

            for (int index = 0; index < __instance.subNodes.Count; ++index)
            {
                try
                {
                    subNode = __instance.subNodes[index];
                }
                catch (ArgumentOutOfRangeException) { break; }
                try
                {
                    if (subNode != null)
                    {
                        ThinkResult thinkResult = subNode.TryIssueJobPackage(pawn, jobParams);
                        if (null == thinkResult)
                        {
                            break;
                        }
                        if (thinkResult.IsValid)
                        {
                            __result = thinkResult;
                            return(false);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error("Exception in " + (object)__instance.GetType() + " TryIssueJobPackage: " + ex.ToString());
                }
            }
            __result = ThinkResult.NoJob;
            return(false);
        }
        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);
        }
Example #6
0
        static void Postfix(ref Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (!pawn.RaceProps.IsMechanoid)
            {
                return;
            }

            ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage();

            if (store != null)
            {
                //de-activate if should auto recharge and power is very low.
                ExtendedPawnData pawnData = store.GetExtendedDataFor(pawn);
                if (pawn.ShouldRecharge() &&
                    pawn.IsActivated()
                    )
                {
                    pawn.drafter.Drafted = false;
                    pawnData.isActive    = false;
                }
            }
            if (pawn.Downed)
            {
                return;
            }
            if (pawn.IsHacked() && pawn.IsActivated() && pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly))
            {
                HackedPoorlyEvent(pawn);
            }
        }
Example #7
0
        private static ThinkResult DetermineNextJob2(Pawn_JobTracker __instance, out ThinkTreeDef thinkTree)
        {
            ThinkResult result = __instance.DetermineNextConstantThinkTreeJob();

            if (result.Job != null)
            {
                thinkTree = __instance.pawn.thinker.ConstantThinkTree;
                return(result);
            }

            ThinkResult result2 = ThinkResult.NoJob;

            try
            {
                result2 = __instance.pawn.thinker.MainThinkNodeRoot.TryIssueJobPackage(__instance.pawn, default);
            }
            catch (Exception exception)
            {
                JobUtility.TryStartErrorRecoverJob(__instance.pawn, __instance.pawn.ToStringSafe() + " threw exception while determining job (main)", exception);
                thinkTree = null;
                return(ThinkResult.NoJob);
            }
            finally
            {
            }

            thinkTree = __instance.pawn.thinker.MainThinkTree;
            return(result2);
        }
Example #8
0
        private void Button_CallBotForShutdown()
        {
            this.SpawnRobotAfterRecharge = false;
            bool flag = this.robot == null || this.robotIsDestroyed;

            if (!flag)
            {
                bool flag2 = !this.robot.Spawned;
                if (!flag2)
                {
                    bool flag3 = this.robot.jobs == null;
                    if (flag3)
                    {
                        Log.Error("Robot has no job driver!");
                    }
                    JobGiver_RechargeEnergy x2_JobGiver_RechargeEnergy = new JobGiver_RechargeEnergy();
                    ThinkResult             thinkResult = x2_JobGiver_RechargeEnergy.TryIssueJobPackage(this.robot, default(JobIssueParams));
                    bool flag4 = thinkResult.Job == null || this.robot.CurJob.def == thinkResult.Job.def;
                    if (!flag4)
                    {
                        this.robot.jobs.StopAll(false);
                        bool flag5 = this.robot.drafter == null;
                        if (flag5)
                        {
                            this.robot.drafter = new Pawn_DraftController(this.robot);
                        }
                        this.robot.drafter.Drafted = false;
                        this.robot.jobs.StartJob(thinkResult.Job, 0, null, false, true, null, null);
                    }
                }
            }
        }
        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();
            }
        }
Example #10
0
 static void Postfix(ref Pawn_JobTracker __instance, ref ThinkResult __result, ref Pawn ___pawn)
 {
     if (___pawn.IsHacked() && ___pawn.IsActivated() && ___pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly))
     {
         HackedPoorlyEvent(___pawn);
     }
 }
Example #11
0
 private static void Postfix(ThinkNode_JobGiver __instance, ThinkResult __result, Pawn pawn, JobIssueParams jobParams)
 {
     if (pawn is Wendigo && __result.Job != null)
     {
         Log.Message(pawn + " gets " + __result.Job + " from " + __instance);
     }
 }
Example #12
0
        public static bool TryIssueJobPackage(ThinkNode_SubtreesByTag __instance, ref ThinkResult __result, Pawn pawn, JobIssueParams jobParams)
        {
            List <ThinkTreeDef> matchedTrees = new List <ThinkTreeDef>();

            foreach (ThinkTreeDef allDef in DefDatabase <ThinkTreeDef> .AllDefs)
            {
                if (allDef.insertTag == __instance.insertTag)
                {
                    matchedTrees.Add(allDef);
                }
            }
            matchedTrees = matchedTrees.OrderByDescending((ThinkTreeDef tDef) => tDef.insertPriority).ToList();

            ThinkTreeDef thinkTreeDef;

            for (int i = 0; i < matchedTrees.Count; i++)
            {
                thinkTreeDef = matchedTrees[i];
                ThinkResult result = thinkTreeDef.thinkRoot.TryIssueJobPackage(pawn, jobParams);
                if (result.IsValid)
                {
                    __result = result;
                    return(false);
                }
            }

            __result = ThinkResult.NoJob;
            return(false);
        }
Example #13
0
        static void Postfix(Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (!pawn.IsColonistPlayerControlled)
            {
                return;
            }
            ExtendedDataStorage store    = Base.Instance.GetExtendedDataStorage();
            ExtendedPawnData    pawnData = store.GetExtendedDataFor(pawn);

            if (store == null || pawnData == null)
            {
                return;
            }

            if (pawnData.owning == null || !pawnData.owning.Spawned || pawnData.owning.Downed || pawnData.owning.Dead || pawnData.mount != null)
            {
                return;
            }

            LocalTargetInfo target             = DistanceUtility.GetFirstTarget(__result.Job, TargetIndex.A);
            float           pawnTargetDistance = DistanceUtility.QuickDistance(pawnData.owning.Position, target.Cell);

            if (pawnTargetDistance > 10 || __result.Job.def == JobDefOf.LayDown || __result.Job.def == JobDefOf.Research || pawn.InMentalState || pawn.Dead || pawn.Downed)
            {
                if (pawnData.owning.jobs.curJob != null && pawnData.owning.jobs.curJob.def == JobDefOf.Wait)
                {
                    pawnData.owning.jobs.EndCurrentJob(JobCondition.InterruptForced);
                }
                ExtendedPawnData animalData = store.GetExtendedDataFor(pawnData.owning);
                pawnData.owning    = null;
                animalData.ownedBy = null;
            }
        }
        static void Postfix(Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            //If a hostile pawn owns an animal, make sure it mounts it whenever possible


            if (pawn.RaceProps.Humanlike && pawn.Faction != null && pawn.Faction.HostileTo(Faction.OfPlayer) && !pawn.Downed && !pawn.IsBurning() && !pawn.IsPrisoner)
            {
                ExtendedPawnData pawnData = Base.Instance.GetExtendedDataStorage().GetExtendedDataFor(pawn);
                if (pawnData.owning == null || pawnData.owning.Faction != pawn.Faction || pawnData.mount != null || pawnData.owning.Downed || pawnData.owning.Dead || !pawnData.owning.Spawned || pawnData.owning.IsBurning())
                {
                    return;
                }
                QueuedJob qJob = pawn.jobs.jobQueue.FirstOrFallback(null);
                if (qJob != null && (qJob.job.def == GUC_JobDefOf.Mount))
                {
                    return;
                }
                if (__result.Job.def == GUC_JobDefOf.Mount)
                {
                    return;
                }

                Job mountJob = new Job(GUC_JobDefOf.Mount, pawnData.owning);
                mountJob.count = 1;
                __instance.jobQueue.EnqueueFirst(mountJob);
            }
        }
Example #15
0
        private static ThinkResult InsertMountingJobs(Pawn pawn, Pawn closestAnimal, LocalTargetInfo target, LocalTargetInfo secondTarget, ref ExtendedPawnData pawnData, ExtendedPawnData animalData, Pawn_JobTracker __instance, ThinkResult __result)
        {
            ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage();

            //__instance.jobQueue.EnqueueFirst(dismountJob);
            if (pawn.CanReserve(target) && pawn.CanReserve(closestAnimal))
            {
                Job oldJob = __result.Job;

                ExtendedPawnData pawnDataTest = store.GetExtendedDataFor(pawn);
                pawnDataTest.targetJob = oldJob;
                Job mountJob  = new Job(GUC_JobDefOf.Mount, closestAnimal);
                Job rideToJob = new Job(GU_RR_JobDefOf.RideToJob, closestAnimal, target);

                if (pawnData.mount != null)
                {
                    __instance.jobQueue.EnqueueFirst(oldJob);
                    __result = new ThinkResult(rideToJob, __result.SourceNode, __result.Tag, false);
                }
                else
                {
                    __instance.jobQueue.EnqueueFirst(oldJob);
                    __instance.jobQueue.EnqueueFirst(rideToJob);
                    __result = new ThinkResult(mountJob, __result.SourceNode, __result.Tag, false);
                }
            }
            return(__result);
        }
Example #16
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);
        }
        public static bool Fringe(MethodBase __originalMethod, ThinkNode_Priority __instance, Pawn pawn, JobIssueParams jobParams, ref string __state, ref ThinkResult __result)
        {
            if (Active)
            {
                int count = __instance.subNodes.Count;
                for (int i = 0; i < count; i++)
                {
                    ThinkResult result = ThinkResult.NoJob;
                    Profiler    prof   = null;
                    try
                    {
                        __state = $"ThinkNode_Priority SubNode [{__instance.subNodes[i].GetType()}]";
                        prof    = ProfileController.Start(__state, null, null, __originalMethod);
                        result  = __instance.subNodes[i].TryIssueJobPackage(pawn, jobParams);
                        prof.Stop();
                    }
                    catch (Exception)
                    {
                        prof?.Stop();
                    }
                    if (result.IsValid)
                    {
                        __result = result;
                        return(false);
                    }
                }
                __result = ThinkResult.NoJob;

                return(false);
            }
            return(true);
        }
Example #18
0
        private static ThinkResult DetermineNextJob2(Pawn_JobTracker __instance, out ThinkTreeDef thinkTree)
        {
            ThinkResult result = funcDetermineNextConstantThinkTreeJob(__instance);

            if (result.Job != null)
            {
                thinkTree = pawnFieldRef(__instance).thinker.ConstantThinkTree;
                return(result);
            }

            ThinkResult result2 = ThinkResult.NoJob;

            try
            {
                result2 = pawnFieldRef(__instance).thinker.MainThinkNodeRoot.TryIssueJobPackage(pawnFieldRef(__instance), default(JobIssueParams));
            }
            catch (Exception exception)
            {
                JobUtility.TryStartErrorRecoverJob(pawnFieldRef(__instance), pawnFieldRef(__instance).ToStringSafe() + " threw exception while determining job (main)", exception);
                thinkTree = null;
                return(ThinkResult.NoJob);
            }

            thinkTree = pawnFieldRef(__instance).thinker.MainThinkTree;
            return(result2);
        }
Example #19
0
        public static bool DetermineNextJob(Pawn_JobTracker __instance, ref ThinkResult __result, out ThinkTreeDef thinkTree)
        {
            ThinkResult constantThinkTreeJob = __instance.DetermineNextConstantThinkTreeJob();

            if (constantThinkTreeJob.Job != null)
            {
                thinkTree = __instance.pawn.thinker.ConstantThinkTree;
                __result  = constantThinkTreeJob;
                return(false);
            }
            ThinkResult thinkResult = ThinkResult.NoJob;

            try
            {
                thinkResult = __instance.pawn.thinker.MainThinkNodeRoot.TryIssueJobPackage(__instance.pawn, new JobIssueParams());
            }
            catch (Exception ex)
            {
                JobUtility.TryStartErrorRecoverJob(__instance.pawn, __instance.pawn.ToStringSafe <Pawn>() + " threw exception while determining job (main)", ex);
                thinkTree = null;
                __result  = ThinkResult.NoJob;
                return(false);
            }
            finally
            {
            }
            thinkTree = __instance?.pawn?.thinker?.MainThinkTree; //changed
            if (thinkTree == null)                                //changed
            {
                thinkResult = ThinkResult.NoJob;                  //changed
            }
            __result = thinkResult;
            return(false);
        }
 private static bool IsForbidden(ThinkResult result)
 {
     if (!result.Job.targetA.HasThing)
     {
         return(false);
     }
     return(result.Job.targetA.Thing.IsForbidden(Faction.OfPlayer));
 }
Example #21
0
        private static void mountAnimal(Pawn_JobTracker __instance, Pawn pawn, ExtendedPawnData pawnData, ref ThinkResult __result)
        {
            Job mountJob = new Job(GUC_JobDefOf.Mount, pawnData.owning);

            __result = new ThinkResult(mountJob, __result.SourceNode, __result.Tag, false);
            __instance.jobQueue.EnqueueFirst(mountJob);
            pawn.mindState.duty = new PawnDuty(DutyDefOf.ExitMapBest);
        }
Example #22
0
        static void Postfix(Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();


            if (pawn.IsColonistPlayerControlled || pawn.RaceProps.Animal)
            {
                return;
            }

            LocalTargetInfo target = DistanceUtility.GetFirstTarget(__result.Job, TargetIndex.A);

            if (!target.IsValid)
            {
                return;
            }

            ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage();

            if (store == null)
            {
                return;
            }

            //Log.Message("wrong duty");
            ExtendedPawnData PawnData = store.GetExtendedDataFor(pawn);
            Lord             lord     = pawn.GetLord();

            if (lord == null)
            {
                return;
            }
            QueuedJob qJob = pawn.jobs.jobQueue.FirstOrFallback(null);

            if (qJob != null && (qJob.job.def == GUC_JobDefOf.Dismount))
            {
                return;
            }

            Log.Message("curLordToil: " + pawn.GetLord().CurLordToil.ToString() + ", pawn name: " + pawn.Name);
            Log.Message("lordJob: " + pawn.GetLord().LordJob + ", pawn name: " + pawn.Name);
            Log.Message("lord.CurLordToil.GetType().Name" + lord.CurLordToil.GetType().Name);

            if (lord.CurLordToil is LordToil_ExitMapAndEscortCarriers)
            {
                if (PawnData.owning != null && PawnData.mount == null && !PawnData.owning.Downed && PawnData.owning.Spawned)
                {
                    mountAnimal(__instance, pawn, PawnData, ref __result);
                }
            }
            else if (lord.CurLordToil.GetType().Name == "LordToil_DefendTraderCaravan" || lord.CurLordToil is LordToil_DefendPoint) //first option is internal class, hence this way of accessing.
            {
                if (PawnData.mount != null)
                {
                    parkAnimal(__instance, pawn, PawnData);
                }
            }
        }
        private static void mountAnimal(Pawn_JobTracker __instance, Pawn pawn, ExtendedPawnData pawnData, ref ThinkResult __result)
        {
            Job oldJob   = __result.Job;
            Job mountJob = new Job(GUC_JobDefOf.Mount, pawnData.owning);

            mountJob.count = 1;
            __result       = new ThinkResult(mountJob, __result.SourceNode, __result.Tag, false);
            __instance.jobQueue.EnqueueFirst(oldJob);
        }
Example #24
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map         = (Map)parms.target;
            PawnKindDef elderDragon = WyvernUtility.GetRandomElderDragonForEvent(map);

            if (elderDragon == null)
            {
                return(false);
            }
            IntVec3 intVec;

            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal, false, null))
            {
                return(false);
            }
            IntVec3 loc            = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
            Pawn    newThing       = PawnGenerator.GeneratePawn(elderDragon, null);
            Pawn    newElderDragon = (Pawn)GenSpawn.Spawn(newThing, loc, map, WipeMode.Vanish);

            newElderDragon.needs.food.CurLevelPercentage = 1f;
            List <Pawn> wildlifeAnimals = map.mapPawns.AllPawnsSpawned.FindAll(p => p != newElderDragon && p.Faction == null && p.RaceProps.Animal && !p.health.Dead);

            foreach (Pawn wildlifeAnimal in wildlifeAnimals)
            {
                if (WyvernUtility.IsElderDragon(wildlifeAnimal))
                {
                    if (!WyvernUtility.IsSameSpecies(newElderDragon, wildlifeAnimal))
                    {
                        if (wildlifeAnimal.IsFighting())
                        {
                            continue;
                        }
                        if (newElderDragon.jobs.TryTakeOrderedJob(new Job(JobDefOf.AttackMelee, wildlifeAnimal)))
                        {
                            Messages.Message("TurfWarLabel".Translate().CapitalizeFirst(), newElderDragon, MessageTypeDefOf.NeutralEvent);
                        }
                        if (wildlifeAnimal.jobs.TryTakeOrderedJob(new Job(JobDefOf.AttackMelee, newElderDragon)))
                        {
                            Messages.Message("TurfWarLabel".Translate().CapitalizeFirst(), wildlifeAnimal, MessageTypeDefOf.NeutralEvent);
                        }
                    }
                    continue;
                }
                if (Rand.Chance(0.2f) || LoadedModManager.GetMod <MonsterHunterRimworldMod>().GetSettings <MonsterHunterRimworldModSettings>().elderDragonScareAnimals)
                {
                    continue;                                                                                                                                                   // animals will flee with a 80% chance
                }
                JobGiver_ExitMapPanic jobFlee     = new JobGiver_ExitMapPanic();
                ThinkResult           thinkResult = jobFlee.TryIssueJobPackage(wildlifeAnimal, new JobIssueParams()
                {
                    maxDistToSquadFlag = 500
                });
                wildlifeAnimal.jobs.TryTakeOrderedJob(thinkResult.Job);
            }
            Find.LetterStack.ReceiveLetter("LetterLabelElderDragonAppear".Translate(), "LetterTextElderDragonAppear".Translate(newElderDragon.Label.CapitalizeFirst()), LetterDefOf.ThreatSmall, new TargetInfo(intVec, map, false), null, null);
            return(true);
        }
        static void Postfix(ref Pawn_JobTracker __instance, ref ThinkResult __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (pawn.IsHacked() && pawn.IsActivated() && pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly))
            {
                HackedPoorlyEvent(pawn);
            }
        }
Example #26
0
 public static bool JobGiver_Labor_TryIssueJobPackage_Prefix(ref ThinkResult __result, Pawn pawn)
 {
     if (!PeacekeeperUtility.IsPeacekeeper(pawn))
     {
         return(true);
     }
     __result = ThinkResult.NoJob;
     return(false);
 }
        public override ThinkResult TryIssueJobPackage(Pawn pawn)
        {
            ThinkResult result = base.TryIssueJobPackage(pawn);

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

                Map map = pawn.MapHeld;

                // Order doesn't matter here
                if (result.Job.targetA.Cell.GetRoom(map) == null)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.DiningRoom)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.Hospital)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.RecRoom)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.None)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.Laboratory)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == RoomRoleDefOf.Barracks)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == guestroom)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == kitchen)
                {
                    return(result);
                }
                if (result.Job.targetA.Cell.GetRoom(map).Role == room)
                {
                    return(result);
                }
            }
            return(ThinkResult.NoJob);
        }
Example #28
0
 private static bool Prefix(JobGiver_Work __instance, Pawn pawn, ref ThinkResult __result)
 {
     if (!Active)
     {
         return(true);
     }
     __result = Detour(__instance, pawn);
     return(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);
        }
        public static bool TryIssueJobPackage(ThinkNode_PrioritySorter __instance, ref ThinkResult __result, Pawn pawn, JobIssueParams jobParams)
        {
            List <ThinkNode> workingNodes = new List <ThinkNode>();
            int count = __instance.subNodes.Count;

            for (int index = 0; index < count; ++index)
            {
                workingNodes.Insert(Rand.Range(0, workingNodes.Count - 1), __instance.subNodes[index]);
            }
            while (workingNodes.Count > 0)
            {
                float num1   = 0.0f;
                int   index1 = -1;
                for (int index2 = 0; index2 < workingNodes.Count; ++index2)
                {
                    float num2 = 0.0f;
                    try
                    {
                        num2 = workingNodes[index2].GetPriority(pawn);
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Exception in " + __instance.GetType() + " GetPriority: " + ex.ToString(), false);
                    }
                    if (num2 > 0.0 && (double)num2 >= __instance.minPriority && num2 > num1)
                    {
                        num1   = num2;
                        index1 = index2;
                    }
                }
                if (index1 != -1)
                {
                    ThinkResult thinkResult = ThinkResult.NoJob;
                    try
                    {
                        thinkResult = workingNodes[index1].TryIssueJobPackage(pawn, jobParams);
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Exception in " + __instance.GetType() + " TryIssueJobPackage: " + ex.ToString(), false);
                    }
                    if (thinkResult.IsValid)
                    {
                        __result = thinkResult;
                        return(false);
                    }
                    workingNodes.RemoveAt(index1);
                }
                else
                {
                    break;
                }
            }
            __result = ThinkResult.NoJob;
            return(false);
        }