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)); }