protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Reserve.Reserve(TargetIndex.B)); yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.B)); yield return(Toils_Haul.TakeToInventory(TargetIndex.B, pawn_v.maxGase - pawn_v.gas)); // fuel.stackCount < (pawn_v.maxGase - pawn_v.gas) ? fuel.stackCount : yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A)); yield return(Toils_General.Wait(450).WithProgressBarToilDelay(TargetIndex.A).FailOnDespawnedNullOrForbidden(TargetIndex.A)); Toil finish = new Toil { initAction = delegate { if (pawn_v != null) { pawn_v.gas += pawn.inventory.innerContainer.Last().stackCount; pawn.inventory.innerContainer.Remove(pawn.inventory.innerContainer.Last()); } }, defaultCompleteMode = ToilCompleteMode.Instant }; yield return(finish); }
private IEnumerable <Toil> TakeExtraIngestibles() { if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { yield break; } Toil reserveExtraFoodToCollect = Toils_WendigoIngest.ReserveFoodFromStackForIngesting(TargetIndex.C); Toil findExtraFoodToCollect = new Toil { initAction = delegate { if (pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def) < job.takeExtraIngestibles) { Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(IngestibleSource.def), PathEndMode.Touch, TraverseParms.For(pawn), 30f, (Thing x) => pawn.CanReserve(x, 10, 1) && !x.IsForbidden(pawn) && x.IsSociallyProper(pawn)); if (thing != null) { job.SetTarget(TargetIndex.C, thing); JumpToToil(reserveExtraFoodToCollect); } } }, defaultCompleteMode = ToilCompleteMode.Instant }; yield return(Toils_Jump.Jump(findExtraFoodToCollect)); yield return(reserveExtraFoodToCollect); yield return(Toils_Goto.GotoThing(TargetIndex.C, PathEndMode.Touch)); yield return(Toils_Haul.TakeToInventory(TargetIndex.C, () => job.takeExtraIngestibles - pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def))); yield return(findExtraFoodToCollect); }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(TargetIndex.A); Toil reserveTargetA = Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null); yield return(reserveTargetA); Toil toilGoto = null; toilGoto = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnSomeonePhysicallyInteracting(TargetIndex.A).FailOn(delegate() { Pawn actor = toilGoto.actor; Job curJob = actor.jobs.curJob; if (curJob.haulMode == HaulMode.ToCellStorage) { Thing thing = curJob.GetTarget(TargetIndex.A).Thing; IntVec3 cell = actor.jobs.curJob.GetTarget(TargetIndex.B).Cell; if (!cell.IsValidStorageFor(this.Map, thing)) { return(true); } } return(false); }); yield return(toilGoto); job.count = Mathf.Min(10, TargetA.Thing.stackCount); yield return(Toils_Haul.TakeToInventory(TargetIndex.A, job.count)); yield break; }
protected override IEnumerable <Toil> MakeNewToils() { _ = this.FailOnDestroyedOrNull(InstrumentInd); var gotoThing = new Toil { initAction = delegate { pawn.pather.StartPath(TargetThingA, PathEndMode.ClosestTouch); }, defaultCompleteMode = ToilCompleteMode.PatherArrival }; _ = gotoThing.FailOnDespawnedNullOrForbidden(InstrumentInd); yield return(gotoThing); var dropInstruments = new Toil { initAction = delegate { var instruments = pawn.inventory.innerContainer.Where(PerformanceManager.IsInstrument) .ToList(); foreach (var instrument in instruments) { _ = pawn.inventory.innerContainer.TryDrop(instrument, pawn.Position, pawn.Map, ThingPlaceMode.Near, out _); } } }; yield return(dropInstruments); yield return(Toils_Haul.TakeToInventory(InstrumentInd, 1)); }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(InstrumentInd); Toil gotoThing = new Toil(); gotoThing.initAction = delegate { this.pawn.pather.StartPath(this.TargetThingA, PathEndMode.ClosestTouch); }; gotoThing.defaultCompleteMode = ToilCompleteMode.PatherArrival; gotoThing.FailOnDespawnedNullOrForbidden(InstrumentInd); yield return(gotoThing); Toil dropInstruments = new Toil(); dropInstruments.initAction = delegate { List <Thing> instruments = pawn.inventory.innerContainer.Where(x => PerformanceManager.IsInstrument(x)).ToList(); Thing result; foreach (Thing instrument in instruments) { pawn.inventory.innerContainer.TryDrop(instrument, pawn.Position, pawn.Map, ThingPlaceMode.Near, out result); } }; yield return(dropInstruments); yield return(Toils_Haul.TakeToInventory(InstrumentInd, 1)); }
private IEnumerable <Toil> PrepareToIngestToils_ToolUser(Toil chewToil) { if (eatingFromInventory) { yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A)); } else { yield return(ReserveFoodIfWillIngestWholeStack()); Toil gotoToPickup = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A); yield return(Toils_Jump.JumpIf(gotoToPickup, () => pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).FailOnDespawnedNullOrForbidden(TargetIndex.A)); yield return(Toils_Jump.Jump(chewToil)); yield return(gotoToPickup); yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, pawn)); Toil reserveExtraFoodToCollect = Toils_Reserve.Reserve(TargetIndex.C); Toil findExtraFoodToCollect = new Toil(); findExtraFoodToCollect.initAction = delegate { if (pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def) < job.takeExtraIngestibles) { Predicate <Thing> validator = (Thing x) => pawn.CanReserve(x) && !x.IsForbidden(pawn) && x.IsSociallyProper(pawn); Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(IngestibleSource.def), PathEndMode.Touch, TraverseParms.For(pawn), 12f, validator); if (thing != null) { pawn.CurJob.SetTarget(TargetIndex.C, thing); JumpToToil(reserveExtraFoodToCollect); } } }; findExtraFoodToCollect.defaultCompleteMode = ToilCompleteMode.Instant; yield return(Toils_Jump.Jump(findExtraFoodToCollect)); yield return(reserveExtraFoodToCollect); yield return(Toils_Goto.GotoThing(TargetIndex.C, PathEndMode.Touch)); yield return(Toils_Haul.TakeToInventory(TargetIndex.C, () => job.takeExtraIngestibles - pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def))); yield return(findExtraFoodToCollect); } yield return(Toils_Ingest.CarryIngestibleToChewSpot(pawn, TargetIndex.A).FailOnDestroyedOrNull(TargetIndex.A)); yield return(Toils_Ingest.FindAdjacentEatSurface(TargetIndex.B, TargetIndex.A)); }
protected override IEnumerable <Toil> MakeNewToils() { //Clean up any spare blueprints AddFinishAction(delegate { Blueprint blueprint = TargetB.Thing as Blueprint; if (!blueprint?.Destroyed ?? false) { Log.Message($"Cleaning up {blueprint}"); blueprint.Destroy(DestroyMode.Vanish); } }); job.count = 1; Thing bedroll = pawn.CurJob.targetA.Thing; if (bedroll.Spawned) { Log.Message($"{pawn} needs to pick up {bedroll}"); yield return(Toils_Reserve.Reserve(TargetIndex.A)); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch)); yield return(Toils_Haul.TakeToInventory(TargetIndex.A, 1)); } yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A)); yield return(Toils_Haul.CarryHauledThingToContainer()); yield return(Toils_Construct.MakeSolidThingFromBlueprintIfNecessary(TargetIndex.B, TargetIndex.C)); //yield return Toils_Haul.DepositHauledThingInContainer(TargetIndex.B, TargetIndex.C);//1.0 game destroys minified thing, but its job still does Deposit? Toil restInBed = new Toil(); restInBed.initAction = delegate { Pawn pawn = restInBed.actor; Job curJob = pawn.jobs.curJob; Building_Bed bed = curJob.targetB.Thing as Building_Bed; pawn.Map.GetComponent <PlacedBedsMapComponent>().placedBeds[pawn] = bed; pawn.ownership?.ClaimBedIfNonMedical(bed); Job restJob = new Job(RimWorld.JobDefOf.LayDown, TargetB); pawn.jobs.StartJob(restJob, JobCondition.Succeeded); }; yield return(restInBed); }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(TargetIndex.A); this.FailOnDestroyedOrNull(TargetIndex.B); if (!pawn.inventory.Contains(TargetThingB)) { yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.Touch)); yield return(Toils_Haul.StartCarryThing(TargetIndex.B)); } else { yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.B)); } var goToAltar = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell); yield return(goToAltar); var waitingTime = new Toil { defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = 740 }; waitingTime.WithProgressBarToilDelay(TargetIndex.A); waitingTime.initAction = delegate { report = "WaitingForCongregation".Translate(); ReligionUtility.Listeners(Lectern, Lectern.listeners); foreach (var p in Lectern.listeners) { ReligionUtility.GiveAttendJob(Lectern, p); } }; yield return(waitingTime); var preachingTime = new Toil { initAction = delegate { report = "ReadAPrayer".Translate(); //MoteMaker.MakeInteractionBubble(this.pawn, null, ThingDefOf.Mote_Speech, ReligionUtility.faith); var intDef = ReligionDefOf.WorshipInteraction; foreach (var p in Lectern.listeners) { ReligionUtility.TryWorshipInteraction(pawn, p, intDef); } }, defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = 1800 }; preachingTime.WithProgressBarToilDelay(TargetIndex.A); preachingTime.tickAction = delegate { var actor = pawn; actor.skills.Learn(SkillDefOf.Social, 0.25f); }; yield return(preachingTime); var toStoreToil = new Toil(); toStoreToil.initAction = delegate { var actor = toStoreToil.actor; var curJob = actor.jobs.curJob; StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map, StoragePriority.Important, Faction.OfPlayer, out var foundCell); //if(!foundCell.IsValid) // StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map, StoragePriority.Unstored, Faction.OfPlayer, out foundCell, true); //actor.carryTracker.TryStartCarry(TargetB.Thing); curJob.targetC = foundCell.IsValid ? foundCell : Lectern.Position; foreach (var p in Lectern.listeners) { p.jobs.EndCurrentJob(JobCondition.Succeeded); } }; yield return(toStoreToil); yield return(Toils_Haul.CarryHauledThingToCell(TargetIndex.C)); yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.C, Toils_Haul.TakeToInventory(TargetIndex.C, 1), false)); AddFinishAction(() => { ReligionUtility.HeldWorshipThought(pawn); ReligionUtility.TryAddAddictionForPreacher(pawn); }); }