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); }
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); }
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); }