4
0
Fork 0
WolfBox/scripts/util/multi_await.gd

34 lines
931 B
GDScript

extends RefCounted
class_name MultiAwait
var waiting_count: int = 0
var finished: bool = false
signal done(timed_out: bool)
func _init(signals: Array[Signal], timeout: float) -> void:
for sig in signals:
var err: int = sig.connect(receive_signal, CONNECT_ONE_SHOT)
if err == Error.OK:
waiting_count += 1
check_done()
var scene_tree: SceneTree = Engine.get_main_loop() as SceneTree
if scene_tree != null:
scene_tree.create_timer(timeout).timeout.connect(finish.bind(true))
print("MultiAwait: waiting for %d signals or %f seconds" % [waiting_count,timeout])
func receive_signal() -> void:
waiting_count -= 1
print("MultiAwait: got signal, %d signals left" % [waiting_count])
check_done()
func check_done() -> void:
if waiting_count <= 0:
finish(false)
func finish(timed_out: bool) -> void:
if !finished:
print("MultiAwait: done, timed_out: %s" % [timed_out])
done.emit(timed_out)
finished = true