コード例 #1
0
        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;
        }