public static Toil JumpToCarryToNextContainerIfPossible(Toil carryToContainerToil, TargetIndex primaryTargetInd) { Toil toil = new Toil(); toil.initAction = delegate { Pawn actor = toil.actor; Job curJob = actor.jobs.curJob; if (actor.carryTracker.CarriedThing == null) { return; } if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0) { Thing primaryTarget = curJob.GetTarget(primaryTargetInd).Thing; bool hasSpareItems = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)primaryTarget, actor.carryTracker.CarriedThing.def); Predicate <Thing> validator = (Thing th) => GenConstruct.CanConstruct(th, actor, false, false) && ((IConstructible)th).MaterialsNeeded().Any((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def) && (th == primaryTarget || hasSpareItems); Thing nextTarget = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, from targ in curJob.targetQueueB select targ.Thing, PathEndMode.Touch, TraverseParms.For(actor, Danger.Deadly, TraverseMode.ByPawn, false), 99999f, validator, null); if (nextTarget != null) { curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget); curJob.targetB = nextTarget; actor.jobs.curDriver.JumpToToil(carryToContainerToil); } } }; return(toil); }
public static void JumpToCarryToNextContainerIfPossible_Prefix(ref Toil __result, Toil carryToContainerToil, TargetIndex primaryTargetInd) { Toil toil = new Toil(); toil.initAction = delegate() { Pawn actor = toil.actor; Job curJob = actor.jobs.curJob; if (actor.carryTracker.CarriedThing != null) { LocalTargetInfo target; if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0 && actor.RaceProps.Animal) { target = curJob.GetTarget(primaryTargetInd); Thing primaryTarget2 = target.Thing; bool hasSpareItems2 = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)(object)(IConstructible)primaryTarget2, actor.carryTracker.CarriedThing.def); Predicate <Thing> predicate = (Thing th) => ReservationUtility.CanReserve(actor, primaryTarget2, 1, -1, (ReservationLayerDef)null, false) && GenCollection.Any <ThingDefCountClass>(((IConstructible)th).MaterialsNeeded(), (Predicate <ThingDefCountClass>)((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def)) && ((th == primaryTarget2) | hasSpareItems2); Thing nextTarget2 = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, curJob.targetQueueB.Select(delegate(LocalTargetInfo targ) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) LocalTargetInfo val2 = targ; return(val2.Thing); }), (PathEndMode)2, TraverseParms.For(actor, (Danger)3, (TraverseMode)0, false), 99999f, predicate, (Func <Thing, float>)null); if (nextTarget2 != null) { curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget2); curJob.targetB = nextTarget2; actor.jobs.curDriver.JumpToToil(carryToContainerToil); } } if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0 && !actor.RaceProps.Animal) { target = curJob.GetTarget(primaryTargetInd); Thing primaryTarget = target.Thing; bool hasSpareItems = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)(object)(IConstructible)primaryTarget, actor.carryTracker.CarriedThing.def); Predicate <Thing> predicate2 = (Thing th) => GenConstruct.CanConstruct(th, actor, false, false) && GenCollection.Any <ThingDefCountClass>(((IConstructible)th).MaterialsNeeded(), (Predicate <ThingDefCountClass>)((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def)) && ((th == primaryTarget) | hasSpareItems); Thing nextTarget = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, curJob.targetQueueB.Select(delegate(LocalTargetInfo targ) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) LocalTargetInfo val = targ; return(val.Thing); }), (PathEndMode)2, TraverseParms.For(actor, (Danger)3, (TraverseMode)0, false), 99999f, predicate2, (Func <Thing, float>)null); if (nextTarget != null) { curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget); curJob.targetB = nextTarget; actor.jobs.curDriver.JumpToToil(carryToContainerToil); } } } }; __result = toil; }
public void FindAvailableFrames(Pawn pawn) { // find all unfinished frames availableFrames = Find.ListerThings.AllThings.FindAll(unfinishedFrame => unfinishedFrame is Frame); // needed to avoid null references if availableFrames == 0 if (availableFrames.Count() > 0) { // frame belong to colony, can be built, has required materials availableFrames = availableFrames.Where(unfinishedFrame => unfinishedFrame.Faction == pawn.Faction && GenConstruct.CanConstruct(unfinishedFrame, pawn) && (unfinishedFrame as Frame).MaterialsNeeded().Count == 0); } }
public override Job JobOnThing(Pawn pawn, Thing t) { if (t.Faction != pawn.Faction) { return(null); } Blueprint blueprint = t as Blueprint; if (blueprint == null) { return(null); } Thing thingToIgnore = GenConstruct.MiniToInstallOrBuildingToReinstall(blueprint); Thing thing = blueprint.FirstBlockingThing(pawn, thingToIgnore, false); if (thing != null) { if (thing.def.category == ThingCategory.Plant) { // SINGLE CHANGE FROM VANILLA WorkGiver, make designation instead of immediate cutting plants //return new Job(JobDefOf.CutPlant, thing); if (Find.DesignationManager.DesignationOn(thing, DesignationDefOf.CutPlant) == null && Find.DesignationManager.DesignationOn(thing, DesignationDefOf.HarvestPlant) == null) { Find.DesignationManager.AddDesignation(new Designation(thing, DesignationDefOf.CutPlant)); } return(null); } else if (thing.def.category == ThingCategory.Item) { if (thing.def.EverHaulable) { return(HaulAIUtility.HaulAsideJobFor(pawn, thing)); } Log.ErrorOnce(string.Concat(new object[] { "Never haulable ", thing, " blocking ", t, " at ", t.Position }), 6429262); } return(null); } if (!GenConstruct.CanConstruct(blueprint, pawn)) { return(null); } Job job = this.DeconstructExistingEdificeJob(pawn, blueprint); if (job != null) { return(job); } Job job2 = base.ResourceDeliverJobFor(pawn, blueprint); if (job2 != null) { return(job2); } Job job3 = this.NoCostFrameMakeJobFor(pawn, blueprint); if (job3 != null) { return(job3); } return(null); }
private static bool IsNewValidNearbyNeeder(Thing t, HashSet <Thing> nearbyNeeders, IConstructible constructible, Pawn pawn) { if (!(t is IConstructible) || t == constructible || t is Blueprint_Install || t.Faction != pawn.Faction || t.IsForbidden(pawn) || nearbyNeeders.Contains(t) || !GenConstruct.CanConstruct(t, pawn, checkSkills: false)) { return(false); } return(true); }