Example #1
0
        protected virtual Job TryStartNewDoBillJob(Pawn pawn, Bill bill, IBillGiver giver)
        {
            Job job = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, giver, null);

            if (job != null)
            {
                return(job);
            }
            Job job2 = new Job(TechJobDefOf.ScanBook, (Thing)giver);

            job2.targetQueueB = new List <LocalTargetInfo>(chosenIngThings.Count);
            job2.countQueue   = new List <int>(chosenIngThings.Count);
            for (int i = 0; i < chosenIngThings.Count; i++)
            {
                job2.targetQueueB.Add(chosenIngThings[i].Thing);
                job2.countQueue.Add(chosenIngThings[i].Count);
            }
            job2.haulMode = HaulMode.ToCellNonStorage;
            job2.bill     = bill;
            return(job2);
        }
Example #2
0
        public new static Job FinishUftJob(Pawn pawn, UnfinishedThing uft, Bill_ProductionWithUft bill)
        {
            if (pawn.TryGetComp <CompKnowledge>().expertise.Where(x => !x.Key.IsFinished && x.Value >= 1f && x.Key.LabelCap == uft.Stuff.stuffProps.stuffAdjective).Any() == false)
            {
                return(null);
            }
            Job job = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, bill.billStack.billGiver, uft);

            if (job != null && job.targetA.Thing != uft)
            {
                return(job);
            }
            Job job2 = JobMaker.MakeJob(TechJobDefOf.DocumentTech, (Thing)bill.billStack.billGiver);

            job2.bill         = bill;
            job2.targetQueueB = new List <LocalTargetInfo> {
                uft
            };
            job2.countQueue = new List <int> {
                1
            };
            job2.haulMode = HaulMode.ToCellNonStorage;
            return(job2);
        }
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            MicroWorkGiverDef mdef = def as MicroWorkGiverDef;

            if (mdef == null)
            {
                return(null);
            }

            LocalTargetInfo target = t;

            if (!pawn.CanReserve(target, 1, -1, null, forced) || t.IsBurning() || t.IsForbidden(pawn))
            {
                return(null);
            }

            List <Building> list = new List <Building>();

            foreach (var user in mdef.recipeDef.AllRecipeUsers)
            {
                List <Building> buildings = t.Map.listerBuildings.AllBuildingsColonistOfDef(user).Where(
                    x => !x.IsForbidden(pawn) && pawn.CanReserve(x, 1, -1, null, forced) &&
                    (x as IBillGiver) != null && (x as IBillGiver).CurrentlyUsableForBills() &&
                    pawn.CanReach(x, PathEndMode.InteractionCell, Danger.Deadly)).ToList();
                list.AddRange(buildings);
            }

            if (list.NullOrEmpty())
            {
                return(null);
            }
            //
            list.SortBy(x => x.TryGetComp <CompRefuelable>() == null || x.TryGetComp <CompRefuelable>().HasFuel ? 0f : 99999f + x.Position.DistanceTo(t.Position));

            Thing building = null;

            foreach (var l in list)
            {
                CompRefuelable compRefuelable = l.TryGetComp <CompRefuelable>();
                if (compRefuelable != null && !compRefuelable.HasFuel)
                {
                    if (RefuelWorkGiverUtility.CanRefuel(pawn, l, forced))
                    {
                        return(RefuelWorkGiverUtility.RefuelJob(pawn, l, forced, null, null));
                    }
                }
                else
                {
                    building = l;
                    break;
                }
            }

            Job job = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, building as IBillGiver, null);

            if (job != null)
            {
                return(job);
            }

            job = new Job(mdef.jobDef, building);
            job.targetQueueB = new List <LocalTargetInfo>(1);
            job.countQueue   = new List <int>(1);
            job.targetQueueB.Add(t);
            job.countQueue.Add(1);
            job.haulMode = HaulMode.ToCellNonStorage;
            Bill            bill = mdef.recipeDef.MakeNewBill();
            Bill_Production bp   = bill as Bill_Production;

            if (bp != null)
            {
                bp.repeatCount++;
                bp.SetStoreMode(BillStoreModeDefOf.DropOnFloor);
            }

            job.bill = bill;

            return(job);
        }
Example #4
0
        public override Job JobOnThing(Pawn pawn, Thing bench, bool forced = false)
        {
            var giver = bench as IBillGiver;

            if (giver == null || !ThingIsUsableBillGiver(bench) || !giver.CurrentlyUsableForBills() || !giver.BillStack.AnyShouldDoNow || bench.IsBurning() || bench.IsForbidden(pawn))
            {
                return(null);
            }

            if (!pawn.CanReserve(bench))
            {
                return(null);
            }

            if (!pawn.CanReserveAndReach(bench.InteractionCell, PathEndMode.OnCell, Danger.Some))
            {
                return(null);
            }

            giver.BillStack.RemoveIncompletableBills();

            // clears off workbench
            var jobHaul = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, giver, null);

            if (jobHaul != null)
            {
                return(jobHaul);
            }

            foreach (var bill in giver.BillStack)
            {
                if ((bill.recipe.requiredGiverWorkType != null && bill.recipe.requiredGiverWorkType != def.workType) ||
                    (Find.TickManager.TicksGame < bill.lastIngredientSearchFailTicks + ReCheckFailedBillTicksRange.RandomInRange && FloatMenuMakerMap.makingFor != pawn) ||
                    !bill.ShouldDoNow() || !bill.PawnAllowedToStartAnew(pawn))
                {
                    continue;
                }

                if (!bill.recipe.PawnSatisfiesSkillRequirements(pawn))
                {
                    JobFailReason.Is(_missingSkillTranslated);
                    return(null);
                }

                var damagedItems = FindDamagedItems(pawn, bench, bill);
                if (damagedItems == null)
                {
                    JobFailReason.Is(_benchNoItemsTranslated);
                    return(null);
                }

                Debug.PrintList("JobOnThing.damagedItems", damagedItems);

                foreach (var item in damagedItems)
                {
                    if (TryFindBestBillIngredients(bill, pawn, bench, chosenIngThings, item))
                    {
                        return(StartNewRepairJob(bill, giver, item, chosenIngThings));
                    }
                }

                if (FloatMenuMakerMap.makingFor != pawn)
                {
                    bill.lastIngredientSearchFailTicks = Find.TickManager.TicksGame;
                }
            }

            JobFailReason.Is(_benchNoMaterialsTranslated);
            return(null);
        }