protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedNullOrForbidden(PowerDestIndex); if (!TargetB.IsValid) { AddFailCondition(() => energyNeed == null); } if (!isUsedFromInventory) { yield return(Toils_Reserve.Reserve(PowerDestIndex)); if (TargetB.IsValid) { yield return(Toils_Reserve.Reserve(OtherPawnIndex)); } yield return(Toils_Goto.GotoThing(PowerDestIndex, PathEndMode.OnCell).FailOnSomeonePhysicallyInteracting(PowerDestIndex)); yield return(Toils_Reserve.Release(PowerDestIndex)); } else { yield return(new Toil() { initAction = delegate() { if (!thingIsSplitOff && pawn.carryTracker.CarriedThing != TargetThingA) { Thing splitOffThing = TargetThingA.SplitOff(job.count); thingIsSplitOff = true; GenPlace.TryPlaceThing(splitOffThing, pawn.Position, pawn.Map, ThingPlaceMode.Near); TargetThingA = splitOffThing; } } }); } yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, true, false)); this.AddFinishAction(delegate() { if (pawn.carryTracker is Pawn_CarryTracker carryTracker && carryTracker.CarriedThing is Thing thing) { if (isUsedFromInventory) { //Thing takenThing = carryTracker.innerContainer.Take(thing); pawn.inventory.innerContainer.TryAddOrTransfer(thing, true); } else { carryTracker.TryDropCarriedThing(pawn.Position, ThingPlaceMode.Near, out Thing resultThing); } } }); if (TargetB.IsValid) { //Recharge someone else. yield return(Toils_Goto.GotoThing(OtherPawnIndex, PathEndMode.Touch).FailOnForbidden(OtherPawnIndex)); yield return(Toils_General.Wait(100).WithProgressBarToilDelay(TargetIndex.A, false)); Toil rechargeToil = new Toil(); rechargeToil.AddFinishAction(delegate() { //Use up the carried stack Thing carriedThing = pawn.carryTracker.CarriedThing; if (carriedThing != null) { EnergySourceComp energyComp = carriedThing.TryGetComp <EnergySourceComp>(); if (energyComp != null) { energyComp.RechargeEnergyNeed((Pawn)TargetB.Thing); } pawn.carryTracker.DestroyCarriedThing(); } }); yield return(rechargeToil); yield return(Toils_Reserve.Release(OtherPawnIndex)); } else { yield return(Toils_General.Wait(100).WithProgressBarToilDelay(TargetIndex.A, false)); //Recharge user. Toil rechargeToil = new Toil(); rechargeToil.AddFinishAction(delegate() { //Use up the carried stack Thing carriedThing = pawn.carryTracker.CarriedThing; if (carriedThing != null) { EnergySourceComp energyComp = carriedThing.TryGetComp <EnergySourceComp>(); if (energyComp != null) { energyComp.RechargeEnergyNeed(pawn); } pawn.carryTracker.DestroyCarriedThing(); } }); yield return(rechargeToil); } }