public override void CompTick() { if (!toggling) { return; } if (progressBar != null) { if (progressBar.ticksLeft <= 0) { progressBar.ticksLeft = 1; } var progress = locksToToggle.Where(t => t.State.IsState(assignedState)).Count(); progressBar.EffectTick(parent, keyHolder?.Pawn ?? TargetInfo.Invalid); var mote = ((SubEffecter_ProgressBar)progressBar.children[0]).mote; if (mote != null) { mote.progress = Mathf.Clamp01((float)progress / locksToToggle.Count); mote.offsetZ = CompProp.progressBarOffset; } } if (assignedState.IsLocked() && Door.Open) { return; } if (currLock == null) { currLock = GetNextLockToToggle(); } if (currLock != null) { if (currLock.Toggling) { return; } currLock = GetNextLockToToggle(); currLock?.StartToggle(keyHolder, progressBar != null); return; } else if (!LockComps.Any(t => t.Toggling)) { if (progressBar != null) { progressBar.Cleanup(); progressBar = null; } toggling = false; locksToToggle.Clear(); } }
public override IEnumerable <FloatMenuOption> CompFloatMenuOptions(Pawn selPawn) { yield return(new FloatMenuOption("Lockpick", delegate { var job = JobMaker.MakeJob(JobDefOf.Lockpick, parent); foreach (var lockComp in LockComps.Where(t => t.State.IsLocked())) { job.AddQueuedTarget(TargetIndex.B, lockComp.parent); } if (job.GetTargetQueue(TargetIndex.B).NullOrEmpty()) { return; } selPawn.jobs.StartJob(job, JobCondition.InterruptForced); })); }
public LockComp GetNextLockToToggle(bool includeAutomatic = false) => LockComps.FirstOrFallback(t => !t.Toggling && !t.State.IsBroken() && !t.State.IsState(assignedState) && (includeAutomatic || !t.State.IsAutomatic()));