forked from Nekojimi/JackIt
34 lines
931 B
GDScript3
34 lines
931 B
GDScript3
|
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
|