using System; using UnityEngine; [DisallowMultipleComponent] public sealed class WaitBehavior : NodeBehavior { private const float RemainingRefreshInterval = 0.1f; private bool waiting; private float waitEndTime; private float nextRemainingRefreshAt; private void Start() { if (base.IsAuthoritative) { SetOutputValueIfChanged("Remaining", BSValue.FromNumber(0.0)); } } private void Update() { if (base.IsAuthoritative && waiting) { float num = Mathf.Max(0f, waitEndTime - Time.unscaledTime); if (num <= 0.0001f) { waiting = false; SetOutputValueIfChanged("Remaining", BSValue.FromNumber(0.0)); TriggerOutput("Done"); } else if (Time.unscaledTime >= nextRemainingRefreshAt) { nextRemainingRefreshAt = Time.unscaledTime + 0.1f; SetOutputValueIfChanged("Remaining", BSValue.FromNumber(num)); } } } public override void OnRun(string inputPortName) { if (!base.IsAuthoritative) { return; } if (string.Equals(inputPortName, "Wait", StringComparison.Ordinal)) { float num = Mathf.Max(0f, (float)GetInputNumber("Delay")); waiting = false; SetOutputValueIfChanged("Remaining", BSValue.FromNumber(num)); if (num <= 0.0001f) { TriggerOutput("Done"); return; } waiting = true; waitEndTime = Time.unscaledTime + num; nextRemainingRefreshAt = 0f; } else if (string.Equals(inputPortName, "Stop", StringComparison.Ordinal) && waiting) { waiting = false; SetOutputValueIfChanged("Remaining", BSValue.FromNumber(0.0)); TriggerOutput("Stopped"); } } }