public override void Tick() { base.Tick(); if (!this.IsHashIntervalTick(AutoDef.dischargePeriodTicks)) { return; } AutocleanerJobDef job = CurJobDef as AutocleanerJobDef; if (job == null) { return; } charge -= job.dischargePerSecond * GenTicks.TicksToSeconds(AutoDef.dischargePeriodTicks); if (charge < 0) { charge = 0; } if (charge > AutoDef.charge) { charge = AutoDef.charge; } }
protected override IEnumerable <Toil> MakeNewToils() { PawnAutocleaner cleaner = pawn as PawnAutocleaner; AutocleanerJobDef def = job.def as AutocleanerJobDef; if (cleaner == null || def == null) { EndJobWith(JobCondition.Incompletable); yield break; } yield return(new Toil() { initAction = delegate() { Map.pawnDestinationReservationManager.Reserve(pawn, job, pawn.Position); pawn.pather.StopDead(); }, tickAction = delegate() { if (!pawn.IsHashIntervalTick(60)) { return; } if (cleaner.charge < cleaner.AutoDef.charge * 0.75f) { EndJobWith(JobCondition.InterruptForced); return; } if (cleaner.health.summaryHealth.SummaryHealthPercent >= 1) { EndJobWith(JobCondition.Succeeded); return; } }, defaultCompleteMode = ToilCompleteMode.Never, }); yield break; }
protected override IEnumerable <Toil> MakeNewToils() { PawnAutocleaner cleaner = pawn as PawnAutocleaner; AutocleanerJobDef def = job.def as AutocleanerJobDef; CompPowerTrader comp = pawn.TryGetComp <CompPowerTrader>(); if (comp != null) { PowerConnectionMaker.DisconnectFromPowerNet(comp); } Toil initExtractTargetFromQueue = Toils_JobTransforms.ClearDespawnedNullOrForbiddenQueuedTargets(TargetIndex.A, null); yield return(initExtractTargetFromQueue); yield return(Toils_JobTransforms.SucceedOnNoTargetInQueue(TargetIndex.A)); yield return(Toils_JobTransforms.ExtractNextTargetFromQueue(TargetIndex.A, true)); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.OnCell).JumpIfDespawnedOrNullOrForbidden(TargetIndex.A, initExtractTargetFromQueue).JumpIfOutsideHomeArea(TargetIndex.A, initExtractTargetFromQueue)); Toil clean = new Toil(); clean.initAction = delegate() { cleaningWorkDone = 0f; totalCleaningWorkDone = 0f; totalCleaningWorkRequired = Filth.def.filth.cleaningWorkToReduceThickness * Filth.thickness; }; clean.tickAction = delegate() { Filth filth = Filth; cleaningWorkDone += 1f; totalCleaningWorkDone += 1f; if (cleaner != null && def != null) { cleaner.charge -= def.activeDischargePerSecond / cleaner.AutoDef.dischargePeriodTicks; if (cleaner.LowPower) { EndJobWith(JobCondition.Incompletable); return; } } if (cleaningWorkDone > filth.def.filth.cleaningWorkToReduceThickness) { filth.ThinFilth(); cleaningWorkDone = 0f; if (filth.Destroyed) { clean.actor.records.Increment(RecordDefOf.MessesCleaned); ReadyForNextToil(); return; } } }; clean.defaultCompleteMode = ToilCompleteMode.Never; clean.WithProgressBar(TargetIndex.A, () => totalCleaningWorkDone / totalCleaningWorkRequired, true, -0.5f); clean.PlaySustainerOrSound(() => SoundDefOf.Interact_CleanFilth); clean.JumpIfDespawnedOrNullOrForbidden(TargetIndex.A, initExtractTargetFromQueue); clean.JumpIfOutsideHomeArea(TargetIndex.A, initExtractTargetFromQueue); yield return(clean); yield return(Toils_Jump.Jump(initExtractTargetFromQueue)); yield break; }