Ejemplo n.º 1
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            ///
            //Set fail conditions
            ///

            this.FailOnDestroyedOrNull(TargetIndex.A);
            this.AddEndCondition(() => { return(this.Deliveree.health.ShouldBeTendedNow ? JobCondition.Ongoing : JobCondition.Succeeded); });
            //Note we only fail on forbidden if the target doesn't start that way
            //This helps haul-aside jobs on forbidden items



            ///
            //Define Toil
            ///



            ///
            //Toils Start
            ///

            //Reserve thing to be stored and storage cell
            yield return(Toils_Reserve.Reserve(TargetIndex.A));


            StatWorker statWorker = new StatWorker();

            statWorker.InitSetStat(StatDefOf.BaseHealingQuality);

            Toil toilApplyMedicine = new Toil();

            toilApplyMedicine.initAction = () =>
            {
                Thing dummy;
                Medicine.holder.TryDrop(Medicine, pawn.Position + IntVec3.North.RotatedBy(pawn.Rotation), ThingPlaceMode.Direct, out dummy);
            };
            yield return(toilApplyMedicine);

            yield return(Toils_Tend.PickupMedicine(TargetIndex.B, Deliveree));

            Toil toilGoTodeliveree = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch);

            yield return(toilGoTodeliveree);

            int  duration          = (int)(1.0 / (double)StatExtension.GetStatValue((Thing)pawn, StatDefOf.HealingSpeed, true) * 600.0);
            Toil toilDelivereeWait = new Toil();

            toilDelivereeWait.initAction = () =>
            {
                Deliveree.drafter.TakeOrderedJob(new Job(JobDefOf.Wait, duration));
            };

            yield return(Toils_General.Wait(duration));

            yield return(Toils_Tend.FinalizeTend(Deliveree));

            yield return(Toils_Jump.Jump(toilGoTodeliveree));
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedNullOrForbidden <JobDriver_StabilizeHere>(TargetIndex.A);
            this.FailOnAggroMentalState <JobDriver_StabilizeHere>(TargetIndex.A);
            this.AddEndCondition(() => {
                if (HealthAIUtility.ShouldBeTendedNowByPlayer(this.Patient) || this.Patient.health.HasHediffsNeedingTend(false))
                {
                    return(JobCondition.Ongoing);
                }
                return(JobCondition.Succeeded);
            });

            Toil toil1 = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell);

            yield return(toil1);

            Toil toil2 = Toils_General.Wait((int)(1f / this.Doctor.GetStatValue(StatDefOf.MedicalTendSpeed, true) * 600f), TargetIndex.None).FailOnCannotTouch <Toil>(TargetIndex.A, PathEndMode.InteractionCell).WithProgressBarToilDelay(TargetIndex.A, false, -0.5f).PlaySustainerOrSound(SoundDefOf.Interact_Tend);

            toil2.activeSkill = () => SkillDefOf.Medicine;
            yield return(toil2);

            yield return(Toils_Tend.FinalizeTend(this.Patient));

            yield return(Toils_Jump.Jump(toil1));
        }