public static Toil PickupParts(TargetIndex ind, Need_Maintenance need)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn  actor       = toil.actor;
                Job   curJob      = actor.jobs.curJob;
                Thing thing       = curJob.GetTarget(ind).Thing;
                int   partsNeeded = need.PartsNeededToRestore();
                if (actor.carryTracker.CarriedThing != null)
                {
                    partsNeeded -= actor.carryTracker.CarriedThing.stackCount;
                }
                int partsFound = Mathf.Min(actor.Map.reservationManager.CanReserveStack(actor, thing, 10, null, false), partsNeeded);
                if (partsFound > 0)
                {
                    actor.carryTracker.TryStartCarry(thing, partsFound, true);
                }
                curJob.count = partsNeeded - partsFound;
                if (thing.Spawned)
                {
                    toil.actor.Map.reservationManager.Release(thing, actor, curJob);
                }
                curJob.SetTarget(ind, actor.carryTracker.CarriedThing);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Instant;
            return(toil);
        }
        public static Toil ReserveParts(TargetIndex ind, Need_Maintenance need)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn  actor  = toil.actor;
                Job   curJob = actor.jobs.curJob;
                Thing thing  = curJob.GetTarget(ind).Thing;
                int   num    = actor.Map.reservationManager.CanReserveStack(actor, thing, 10, null, false);
                if (num <= 0 || !actor.Reserve(thing, curJob, 10, Mathf.Min(num, need.PartsNeededToRestore()), null, true))
                {
                    toil.actor.jobs.EndCurrentJob(JobCondition.Incompletable, true);
                }
            };
            toil.defaultCompleteMode = ToilCompleteMode.Instant;
            toil.atomicWithPrevious  = true;
            return(toil);
        }
Beispiel #3
0
        private static void MaintainMechsIfNeeded(Caravan caravan, List <Thing> allParts, List <Pawn> allHackedMechs)
        {
            Thing       partItem = allParts.First();
            List <Pawn> allPawnsCapableOfMaintenance = caravan.AllThings.Where((Thing t) => t is Pawn pawn && !pawn.Dead && !pawn.Downed).Cast <Pawn>().ToList();

            if (allPawnsCapableOfMaintenance.NullOrEmpty())
            {
                return;
            }
            List <Pawn> allMechsNeedingMaintenance = allHackedMechs.Where((Pawn p) => p.needs.TryGetNeed <Need_Maintenance>() is Need_Maintenance needM && needM.CurLevelPercentage < 0.5f).ToList();

            if (allMechsNeedingMaintenance.NullOrEmpty())
            {
                return;
            }
            Pawn  bestPawn      = allPawnsCapableOfMaintenance.MaxBy((Pawn p) => p.skills.AverageOfRelevantSkillsFor(WTH_DefOf.WTH_Hack));
            float successChance = bestPawn.GetStatValue(WTH_DefOf.WTH_HackingSuccessChance, true);

            if (successChance < 0.20f)
            {
                return;
            }

            Pawn             chosenMech = allMechsNeedingMaintenance.RandomElement();
            Need_Maintenance need       = chosenMech.needs.TryGetNeed <Need_Maintenance>();
            int   partsAvailable        = Math.Min(need.PartsNeededToRestore(), partItem.stackCount);
            float combatPowerCapped     = chosenMech.kindDef.combatPower <= 10000 ? chosenMech.kindDef.combatPower : 300;

            if (Rand.Chance(successChance))
            {
                bestPawn.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.5f, false);
                bestPawn.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.5f, false);
                need.RestoreUsingParts(partsAvailable);
            }
            else
            {
                bestPawn.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.25f, false);
                bestPawn.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.25f, false);
            }
            partItem.SplitOff(partsAvailable);
        }