using System; using System.Collections; using System.Collections.Generic; using Godot; public partial class Coroutine { public IEnumerator enumerator; public bool done; private bool hasCaller; public Node caller; public Action onEnd; private static List coroutines = new List(); private static List stop = new List(); public static Coroutine Start(IEnumerator enumerator, Node caller = null) { Coroutine coroutine = new Coroutine { enumerator = enumerator, caller = caller, hasCaller = (caller != null) }; coroutines.Add(coroutine); return coroutine; } public static void Stop(Coroutine routine, bool now = false) { if (routine != null) { if (now) { coroutines.Remove(routine); } else { stop.Add(routine); } } } public static void DoLoop() { if (stop.Count > 0) { for (int num = stop.Count - 1; num >= 0; num--) { stop[num].done = true; coroutines.Remove(stop[num]); stop.RemoveAt(num); } } if (coroutines.Count == 0) { return; } for (int num2 = coroutines.Count - 1; num2 >= 0; num2--) { if ((coroutines[num2].hasCaller && !GodotObject.IsInstanceValid(coroutines[num2].caller)) || !coroutines[num2].enumerator.MoveNext()) { Finish(num2); } } } private static void Finish(int id) { coroutines[id].done = true; coroutines[id].onEnd?.Invoke(); coroutines.RemoveAt(id); } }