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); } }
// Token: 0x06000013 RID: 19 RVA: 0x00002336 File Offset: 0x00000536 protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedNullOrForbidden(TargetIndex.A); bool flag = !base.TargetB.IsValid; if (flag) { base.AddFailCondition(() => this.energyNeed == null); } yield return(Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null)); bool isValid = base.TargetB.IsValid; if (isValid) { yield return(Toils_Reserve.Reserve(TargetIndex.B, 1, -1, null)); } yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnSomeonePhysicallyInteracting(TargetIndex.A)); yield return(Toils_Reserve.Release(TargetIndex.A)); yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, true, false)); bool isValid2 = base.TargetB.IsValid; if (isValid2) { yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.Touch).FailOnForbidden(TargetIndex.B)); yield return(Toils_General.Wait(100).WithProgressBarToilDelay(TargetIndex.A, false, -0.5f)); Toil rechargeToil = new Toil(); rechargeToil.AddFinishAction(delegate { Thing carriedThing = this.pawn.carryTracker.CarriedThing; bool flag2 = carriedThing != null; if (flag2) { EnergySourceComp energySourceComp = carriedThing.TryGetComp <EnergySourceComp>(); bool flag3 = energySourceComp != null; if (flag3) { energySourceComp.RechargeEnergyNeed((Pawn)base.TargetB.Thing); } this.pawn.carryTracker.DestroyCarriedThing(); } }); yield return(rechargeToil); yield return(Toils_Reserve.Release(TargetIndex.B)); rechargeToil = null; } else { yield return(Toils_General.Wait(100).WithProgressBarToilDelay(TargetIndex.A, false, -0.5f)); Toil rechargeToil2 = new Toil(); rechargeToil2.AddFinishAction(delegate { Thing carriedThing = this.pawn.carryTracker.CarriedThing; bool flag2 = carriedThing != null; if (flag2) { EnergySourceComp energySourceComp = carriedThing.TryGetComp <EnergySourceComp>(); bool flag3 = energySourceComp != null; if (flag3) { energySourceComp.RechargeEnergyNeed(this.pawn); } this.pawn.carryTracker.DestroyCarriedThing(); } }); yield return(rechargeToil2); rechargeToil2 = null; } yield break; }