public static CompReloadable FindSomeReloadableComponent(Pawn pawn, bool allowForcedReload) { if (pawn.apparel == null) { return(null); } List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int i = 0; i < wornApparel.Count; i++) { CompReloadable compReloadable = wornApparel[i].TryGetComp <CompReloadable>(); if (compReloadable != null && compReloadable.NeedsReload(allowForcedReload)) { return(compReloadable); } } return(null); }
protected override IEnumerable <Toil> MakeNewToils() { CompReloadable comp = Gear?.TryGetComp <CompReloadable>(); this.FailOn(() => comp == null); this.FailOn(() => comp.Wearer != pawn); this.FailOn(() => !comp.NeedsReload(allowForcedReload: true)); this.FailOnDestroyedOrNull(TargetIndex.A); this.FailOnIncapable(PawnCapacityDefOf.Manipulation); Toil getNextIngredient = Toils_General.Label(); yield return(getNextIngredient); foreach (Toil item in ReloadAsMuchAsPossible(comp)) { yield return(item); } yield return(Toils_JobTransforms.ExtractNextTargetFromQueue(TargetIndex.B)); yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.B).FailOnSomeonePhysicallyInteracting(TargetIndex.B)); yield return(Toils_Haul.StartCarryThing(TargetIndex.B, putRemainderInQueue: false, subtractNumTakenFromJobCount: true).FailOnDestroyedNullOrForbidden(TargetIndex.B)); yield return(Toils_Jump.JumpIf(getNextIngredient, () => !job.GetTargetQueue(TargetIndex.B).NullOrEmpty())); foreach (Toil item2 in ReloadAsMuchAsPossible(comp)) { yield return(item2); } Toil toil = new Toil(); toil.initAction = delegate { Thing carriedThing = pawn.carryTracker.CarriedThing; if (carriedThing != null && !carriedThing.Destroyed) { pawn.carryTracker.TryDropCarriedThing(pawn.Position, ThingPlaceMode.Near, out var _); } }; toil.defaultCompleteMode = ToilCompleteMode.Instant; yield return(toil); }