2025-05-13 19:22:01 +08:00

80 lines
1.4 KiB
C#

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<Coroutine> coroutines = new List<Coroutine>();
private static List<Coroutine> stop = new List<Coroutine>();
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);
}
}