extends Node var event_signal_ids: Dictionary[StringName, StringName] var event_last_call: Dictionary[StringName, Array] var event_signal_current_id: int = 1 func create_signal_id() -> StringName: var id: int = event_signal_current_id event_signal_current_id += 1 return StringName("__event_%d" % id) func get_or_create_signal_id(event_id: StringName) -> StringName: if not event_signal_ids.has(event_id): var signal_id: StringName = create_signal_id() add_user_signal(signal_id) event_signal_ids[event_id] = signal_id return signal_id return event_signal_ids[event_id] func subscribe(event_id: StringName, cb: Callable, emit_last_val: bool = false) -> void: connect(get_or_create_signal_id(event_id), cb) if emit_last_val and event_last_call.has(event_id): var last_args: Array = event_last_call[event_id] cb.callv(last_args) func unsubscribe(event_id: StringName, cb: Callable) -> void: var sig_id: StringName = get_or_create_signal_id(event_id) disconnect(sig_id, cb) if get_signal_connection_list(sig_id).is_empty(): remove_user_signal(sig_id) event_signal_ids.erase(event_id) event_last_call.erase(event_id) @rpc("any_peer", "call_remote", "reliable") func emit(event_id: StringName, ...args: Array) -> void: emit_signal.bindv(args).call(get_or_create_signal_id(event_id)) event_last_call[event_id] = args
or share this direct link: