/// <summary>
        /// Tries to find a appropiate ingredient.
        /// </summary>
        /// <param name="pawn">Pawn to search for.</param>
        /// <param name="androidPrinter">Printer to fill.</param>
        /// <param name="request">Thing order request to fulfill.</param>
        /// <returns>Valid thing if found, otherwise null.</returns>
        private Thing FindIngredient(Pawn pawn, Building_PawnCrafter androidPrinter, ThingOrderRequest request)
        {
            if (request != null)
            {
                Predicate <Thing> extraPredicate = request.ExtraPredicate();
                Predicate <Thing> predicate      = (Thing x) => !x.IsForbidden(pawn) && pawn.CanReserve(x, 1, -1, null, false) && extraPredicate(x);
                Predicate <Thing> validator      = predicate;

                return(GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, request.Request(), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator, null, 0, -1, false, RegionType.Set_Passable, false));
            }

            return(null);
        }
        public override Job JobOnThing(Pawn pawn, Thing crafterThing, bool forced = false)
        {
            Building_PawnCrafter pawnCrafter = crafterThing as Building_PawnCrafter;

            IEnumerable <ThingOrderRequest> potentionalRequests = pawnCrafter.orderProcessor.PendingRequests();

            if (potentionalRequests != null)
            {
                foreach (ThingOrderRequest request in potentionalRequests)
                {
                    Thing ingredientThing = FindIngredient(pawn, pawnCrafter, request);

                    if (ingredientThing != null)
                    {
                        if (request.nutrition)
                        {
                            int nutritionCount = (int)(Math.Ceiling(request.amount / (ingredientThing.def.ingestible.CachedNutrition)));

                            if (nutritionCount > 0)
                            {
                                return new Job(WorkGiverProperties.fillJob, ingredientThing, crafterThing)
                                       {
                                           count = nutritionCount
                                       }
                            }
                            ;
                        }
                        else
                        {
                            return new Job(WorkGiverProperties.fillJob, ingredientThing, crafterThing)
                                   {
                                       count = (int)request.amount
                                   }
                        };
                    }
                }
            }

            return(null);
        }
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Building_PawnCrafter pawnCrafter = t as Building_PawnCrafter;

            if (pawnCrafter == null || pawnCrafter.crafterStatus != CrafterStatus.Filling)
            {
                return(false);
            }

            if (t.IsForbidden(pawn) || !pawn.CanReserveAndReach(t, PathEndMode.Touch, pawn.NormalMaxDanger(), 1, -1, null, forced))
            {
                return(false);
            }

            if (pawn.Map.designationManager.DesignationOn(t, DesignationDefOf.Deconstruct) != null)
            {
                return(false);
            }

            //Check if there is anything to fill.
            IEnumerable <ThingOrderRequest> potentionalRequests = pawnCrafter.orderProcessor.PendingRequests();
            bool validRequest = false;

            if (potentionalRequests != null)
            {
                foreach (ThingOrderRequest request in potentionalRequests)
                {
                    Thing ingredientThing = FindIngredient(pawn, pawnCrafter, request);
                    if (ingredientThing != null)
                    {
                        validRequest = true;
                        break;
                    }
                }
            }

            return(validRequest);
        }