private static bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     if (!giver.def.nonColonistsCanDo && !pawn.IsColonist)
     {
         return(false);
     }
     if (pawn.WorkTagIsDisabled(giver.def.workTags))
     {
         return(false);
     }
     try
     {
         if (giver.ShouldSkip(pawn))
         {
             return(false);
         }
     }
     catch
     {
         return(false);
     }
     if (giver.MissingRequiredCapacity(pawn) != null)
     {
         return(false);
     }
     return(true);
 }
            public static bool Prefix(ref bool __result, Pawn pawn, WorkGiver giver)
            {
                if (!pawn.IsGuest())
                {
                    return(true);
                }

                var canDo = !giver.ShouldSkip(pawn) && giver.MissingRequiredCapacity(pawn) == null && IsSkilledEnough(pawn, giver.def.workType);

                if (!canDo)
                {
                    return(false);
                }

                if (IsNegotiating(giver))
                {
                    return(false);
                }
                if (Settings.disableArtAndCraft.Value && IsArtOrCraft(giver.def.workType.workTags))
                {
                    return(false);
                }
                if (Settings.disableOperations.Value && IsOperation(giver))
                {
                    return(false);
                }
                if (Settings.disableMedical.Value && IsOperation(giver) || IsMedical(giver))
                {
                    return(false);
                }
                if (Settings.disableWarden.Value && IsWarden(giver))
                {
                    return(false);
                }
                if (IsFeeding(giver))
                {
                    return(false);                  // Too many problems with this (uses food from inventory, wrong food category, etc.
                }
                if (!pawn.GetVisitScore(out var score))
                {
                    return(false);
                }

                var   passion      = pawn.skills.MaxPassionOfRelevantSkillsFor(giver.def.workType);
                float passionBonus = passion == Passion.Major ? 40 : passion == Passion.Minor ? 20 : 0;

                var desireToHelp = pawn.Faction.GoodwillWith(Faction.OfPlayer) + passionBonus + score * 100 + (giver.def.emergency ? 75 : 0);

                //Log.Message($"{pawn.LabelShort}: help with {giver.def.gerund}? {desireToHelp:F0} >= {100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100:F0}");
                if (desireToHelp < 100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100)
                {
                    return(false);
                }

                __result = true;
                return(false);
            }
Exemple #3
0
 private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     try
     {
         return(giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn));
     }
     catch
     {
         // Catch errors from WorkGivers not recognising the robot as a valid pawn (For example because it doesn't use the worksettings?)
         return(false);
     }
 }
Exemple #4
0
 private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     if (giver.ShouldSkip(pawn))
     {
         return(false);
     }
     if (pawn.story != null && pawn.story.WorkTagIsDisabled(giver.def.workTags))
     {
         return(false);
     }
     if (giver.MissingRequiredCapacity(pawn) != null)
     {
         return(false);
     }
     return(true);
 }
Exemple #5
0
            public static bool Prefix(ref bool __result, Pawn pawn, WorkGiver giver)
            {
                if (!pawn.IsGuest())
                {
                    return(true);
                }

                var canDo = !giver.ShouldSkip(pawn) && giver.MissingRequiredCapacity(pawn) == null && IsSkilledEnough(pawn, giver.def.workType);

                if (!canDo)
                {
                    return(false);
                }

                if (Settings.disableArtAndCraft.Value && IsArtOrCraft(giver.def.workType.workTags))
                {
                    return(false);
                }


                float score;

                if (!pawn.GetVisitScore(out score))
                {
                    return(false);
                }

                var   passion      = pawn.skills.MaxPassionOfRelevantSkillsFor(giver.def.workType);
                float passionBonus = passion == Passion.Major ? 40 : passion == Passion.Minor ? 20 : 0;

                var desireToHelp = pawn.Faction.GoodwillWith(Faction.OfPlayer) + passionBonus + score * 100 + (giver.def.emergency ? 75 : 0);

                //Log.Message(pawn.NameStringShort + ": help with "+giver.def.gerund+"? " + Mathf.RoundToInt(desireToHelp) + " >= " + Mathf.RoundToInt(100+Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436)*100));
                if (desireToHelp < 100 + Rand.ValueSeeded(pawn.thingIDNumber ^ 3436436) * 100)
                {
                    return(false);
                }

                __result = true;
                return(false);
            }
        // Method from RimWorld.JobGiver_Work.TryIssueJobPackage(Pawn pawn, JobIssueParams jobParams)
        // I modified the line if (!workGiver.ShouldSkip(pawn))
#pragma warning disable
        public ThinkResult TryIssueJobPackageDrone(Pawn pawn, bool emergency)
        {
            List <WorkGiver> list               = emergency ? pawn.workSettings.WorkGiversInOrderEmergency : pawn.workSettings.WorkGiversInOrderNormal;
            int               num               = -999;
            TargetInfo        targetInfo        = TargetInfo.Invalid;
            WorkGiver_Scanner workGiver_Scanner = null;

            for (int j = 0; j < list.Count; j++)
            {
                WorkGiver workGiver = list[j];
                if (workGiver.def.priorityInType != num && targetInfo.IsValid)
                {
                    break;
                }
                if (!workGiver.ShouldSkip(pawn))
                {
                    try
                    {
                        Job job2 = workGiver.NonScanJob(pawn);
                        if (job2 != null)
                        {
                            return(new ThinkResult(job2, null, new JobTag?(list[j].def.tagToGive), false));
                        }
                        WorkGiver_Scanner scanner = workGiver as WorkGiver_Scanner;
                        if (scanner != null)
                        {
                            if (scanner.def.scanThings)
                            {
                                Predicate <Thing>   predicate  = (Thing t) => !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t, false);
                                IEnumerable <Thing> enumerable = scanner.PotentialWorkThingsGlobal(pawn);
                                Thing thing;
                                if (scanner.Prioritized)
                                {
                                    IEnumerable <Thing> enumerable2 = enumerable;
                                    if (enumerable2 == null)
                                    {
                                        enumerable2 = pawn.Map.listerThings.ThingsMatching(scanner.PotentialWorkThingRequest);
                                    }
                                    if (scanner.AllowUnreachable)
                                    {
                                        IntVec3             position  = pawn.Position;
                                        IEnumerable <Thing> searchSet = enumerable2;
                                        Predicate <Thing>   validator = predicate;
                                        thing = GenClosest.ClosestThing_Global(position, searchSet, 99999f, validator, (Thing x) => scanner.GetPriority(pawn, x));
                                    }
                                    else
                                    {
                                        IntVec3             position       = pawn.Position;
                                        Map                 map            = pawn.Map;
                                        IEnumerable <Thing> searchSet      = enumerable2;
                                        PathEndMode         pathEndMode    = scanner.PathEndMode;
                                        TraverseParms       traverseParams = TraverseParms.For(pawn, scanner.MaxPathDanger(pawn), TraverseMode.ByPawn, false);
                                        Predicate <Thing>   validator      = predicate;
                                        thing = GenClosest.ClosestThing_Global_Reachable(position, map, searchSet, pathEndMode, traverseParams, 9999f, validator, (Thing x) => scanner.GetPriority(pawn, x));
                                    }
                                }
                                else if (scanner.AllowUnreachable)
                                {
                                    IEnumerable <Thing> enumerable3 = enumerable;
                                    if (enumerable3 == null)
                                    {
                                        enumerable3 = pawn.Map.listerThings.ThingsMatching(scanner.PotentialWorkThingRequest);
                                    }
                                    IntVec3             position  = pawn.Position;
                                    IEnumerable <Thing> searchSet = enumerable3;
                                    Predicate <Thing>   validator = predicate;
                                    thing = GenClosest.ClosestThing_Global(position, searchSet, 99999f, validator, null);
                                }
                                else
                                {
                                    IntVec3           position = pawn.Position;
                                    Map               map      = pawn.Map;
                                    ThingRequest      potentialWorkThingRequest = scanner.PotentialWorkThingRequest;
                                    PathEndMode       pathEndMode       = scanner.PathEndMode;
                                    TraverseParms     traverseParams    = TraverseParms.For(pawn, scanner.MaxPathDanger(pawn), TraverseMode.ByPawn, false);
                                    Predicate <Thing> validator         = predicate;
                                    bool              forceGlobalSearch = enumerable != null;
                                    thing = GenClosest.ClosestThingReachable(position, map, potentialWorkThingRequest, pathEndMode, traverseParams, 9999f, validator, enumerable, 0, scanner.LocalRegionsToScanFirst, forceGlobalSearch, RegionType.Set_Passable, false);
                                }
                                if (thing != null)
                                {
                                    targetInfo        = thing;
                                    workGiver_Scanner = scanner;
                                }
                            }
                            if (scanner.def.scanCells)
                            {
                                IntVec3 position2        = pawn.Position;
                                float   num2             = 99999f;
                                float   num3             = float.MinValue;
                                bool    prioritized      = scanner.Prioritized;
                                bool    allowUnreachable = scanner.AllowUnreachable;
                                Danger  maxDanger        = scanner.MaxPathDanger(pawn);
                                foreach (IntVec3 intVec in scanner.PotentialWorkCellsGlobal(pawn))
                                {
                                    bool  flag = false;
                                    float num4 = (float)(intVec - position2).LengthHorizontalSquared;
                                    float num5 = 0f;
                                    if (prioritized)
                                    {
                                        if (scanner.HasJobOnCell(pawn, intVec))
                                        {
                                            if (!allowUnreachable && !pawn.CanReach(intVec, scanner.PathEndMode, maxDanger, false, TraverseMode.ByPawn))
                                            {
                                                continue;
                                            }
                                            num5 = scanner.GetPriority(pawn, intVec);
                                            if (num5 > num3 || (num5 == num3 && num4 < num2))
                                            {
                                                flag = true;
                                            }
                                        }
                                    }
                                    else if (num4 < num2 && scanner.HasJobOnCell(pawn, intVec))
                                    {
                                        if (!allowUnreachable && !pawn.CanReach(intVec, scanner.PathEndMode, maxDanger, false, TraverseMode.ByPawn))
                                        {
                                            continue;
                                        }
                                        flag = true;
                                    }
                                    if (flag)
                                    {
                                        targetInfo        = new TargetInfo(intVec, pawn.Map, false);
                                        workGiver_Scanner = scanner;
                                        num2 = num4;
                                        num3 = num5;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error(string.Concat(new object[]
                        {
                            pawn,
                            " threw exception in WorkGiver ",
                            workGiver.def.defName,
                            ": ",
                            ex.ToString()
                        }));
                    }
                    finally
                    {
                    }
                    if (targetInfo.IsValid)
                    {
                        pawn.mindState.lastGivenWorkType = workGiver.def.workType;
                        Job job3;
                        if (targetInfo.HasThing)
                        {
                            job3 = workGiver_Scanner.JobOnThing(pawn, targetInfo.Thing, false);
                        }
                        else
                        {
                            job3 = workGiver_Scanner.JobOnCell(pawn, targetInfo.Cell);
                        }
                        if (job3 != null)
                        {
                            return(new ThinkResult(job3, null, new JobTag?(list[j].def.tagToGive), false));
                        }
                        Log.ErrorOnce(string.Concat(new object[]
                        {
                            workGiver_Scanner,
                            " provided target ",
                            targetInfo,
                            " but yielded no actual job for pawn ",
                            pawn,
                            ". The CanGiveJob and JobOnX methods may not be synchronized."
                        }), 6112651);
                    }
                    num = workGiver.def.priorityInType;
                }
            }
            return(ThinkResult.NoJob);
        }
Exemple #7
0
 private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     return(giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn));
 }
Exemple #8
0
 //Make mechs with work modules able to do work. Some duplicate code here in regards to vanilla, but I fear a transpiler would mess up compatibility with other mods.
 static void Postfix(ref bool __result, Pawn pawn, WorkGiver giver)
 {
     if (__result == false)
     {
         __result = (giver.def.nonColonistsCanDo || pawn.IsColonist || pawn.IsHacked() && pawn.workSettings != null) && (pawn.story == null || !pawn.WorkTypeIsDisabled(giver.def.workType)) && !giver.ShouldSkip(pawn, false) && giver.MissingRequiredCapacity(pawn) == null;
     }
 }
 private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     return((pawn.story == null || !pawn.WorkTagIsDisabled(giver.def.workTags)) &&
            !giver.ShouldSkip(pawn) && (giver.def.nonColonistsCanDo || pawn.IsPrisoner) &&
            giver.MissingRequiredCapacity(pawn) == null);
 }
 private bool PawnCanUseWorkGiver(Pawn pawn, WorkGiver giver)
 {
     try
     {
         return(!pawn.DestroyedOrNull() && pawn.Spawned && giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn));
     }
     catch (Exception ex)
     {
         Log.Warning("Robot caught error in PawnCanUseWorkGiver: Robot " + pawn.def.defName + " on WorkGiver '" + giver.def.defName + "', this will be ignored..\n" + ex.ToString());
         // Catch errors from WorkGivers not recognising the robot as a valid pawn (For example because it doesn't use the worksettings?)
         return(false);
     }
 }
Exemple #11
0
 private bool GiverCanGiveJobToPawn(Pawn pawn, WorkGiver giver)
 {
     return((giver.def.canBeDoneByNonColonists || pawn.IsColonist) && giver.MissingRequiredCapacity(pawn) == null && !giver.ShouldSkip(pawn));
 }
        //public bool emergency;

        protected override Job TryGiveTerminalJob(Pawn pawn)
        {
            if (!(pawn is Droid))
            {
                return(null);
            }
            Droid droid = pawn as Droid;

            if (!droid.Active)
            {
                return(null);
            }

            List <WorkGiver> list = this.emergency ? droid.work.WorkGiversInOrderEmergency : droid.work.WorkGiversInOrder;

            int               num               = -999;
            TargetInfo        targetInfo        = TargetInfo.Invalid;
            WorkGiver_Scanner workGiver_Scanner = null;

            for (int i = 0; i < list.Count; i++)
            {
                WorkGiver workGiver = list[i];
                if (workGiver.def.priorityInType != num && targetInfo.IsValid)
                {
                    break;
                }
                if (workGiver.MissingRequiredCapacity(pawn) == null)
                {
                    if (!workGiver.ShouldSkip(pawn))
                    {
                        try
                        {
                            Job job = workGiver.NonScanJob(pawn);
                            if (job != null)
                            {
                                Job result = job;
                                return(result);
                            }
                            WorkGiver_Scanner scanner = workGiver as WorkGiver_Scanner;
                            if (scanner != null)
                            {
                                if (workGiver.def.scanThings)
                                {
                                    Predicate <Thing>   predicate  = (Thing t) => !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t);
                                    IEnumerable <Thing> enumerable = scanner.PotentialWorkThingsGlobal(pawn);
                                    Predicate <Thing>   validator  = predicate;
                                    Thing thing = GenClosest.ClosestThingReachable(pawn.Position, scanner.PotentialWorkThingRequest, scanner.PathEndMode, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, enumerable, scanner.LocalRegionsToScanFirst, enumerable != null);
                                    if (thing != null)
                                    {
                                        targetInfo        = thing;
                                        workGiver_Scanner = scanner;
                                    }
                                }
                                if (workGiver.def.scanCells)
                                {
                                    IntVec3 position = pawn.Position;
                                    float   num2     = 99999f;
                                    foreach (IntVec3 current in scanner.PotentialWorkCellsGlobal(pawn))
                                    {
                                        float lengthHorizontalSquared = (current - position).LengthHorizontalSquared;
                                        if (lengthHorizontalSquared < num2 && !current.IsForbidden(pawn) && scanner.HasJobOnCell(pawn, current))
                                        {
                                            targetInfo        = current;
                                            workGiver_Scanner = scanner;
                                            num2 = lengthHorizontalSquared;
                                        }
                                    }
                                }
                                num = workGiver.def.priorityInType;
                            }
                        }
                        catch (Exception ex)
                        {
                            Log.Error(string.Concat(new object[]
                            {
                                pawn,
                                " threw exception in WorkGiver ",
                                workGiver.def.defName,
                                ": ",
                                ex.ToString()
                            }));
                        }
                        finally
                        {
                        }
                        if (targetInfo.IsValid)
                        {
                            pawn.mindState.lastGivenWorkType = workGiver.def.workType;
                            if (targetInfo.HasThing)
                            {
                                return(workGiver_Scanner.JobOnThing(pawn, targetInfo.Thing));
                            }
                            return(workGiver_Scanner.JobOnCell(pawn, targetInfo.Cell));
                        }
                    }
                }
            }
            return(null);
        }