extends Node var message_types: Dictionary[String, Array] = {} func subscribe(id: String, callback: Callable) -> void: if not message_types.has(id): message_types.set(id, Array()) message_types.get(id).append(callback) func emit_local(id: String, data: Variant, expand: bool = false) -> void: emit_propagation(id, data, expand) # TODO: Need to actually validate client request. Also, message bus is more # about server talking to clients than clients to server. I.E, reducing # the number of needed @rpc method decorator bindings. @rpc("any_peer", "call_remote", "reliable") func emit_request(id: String, data: Variant, expand: bool = false) -> void: if not multiplayer.is_server(): return if not message_types.has(id): push_error("'%s' not an existing message type to handle...", [id]) return emit_propagation(id, data, expand) @rpc("authority", "call_local", "reliable") func emit_propagation(id: String, data: Variant, expand: bool = false) -> void: if not message_types.has(id): push_error("'%s' not an existing message type to handle...", [id]) return for callback: Callable in message_types.get(id): if data == null: callback.call() continue if not expand: callback.call(data) else: callback.callv(data) @rpc("authority", "call_remote", "reliable") func emit_propagation_clients_only(id: String, data: Variant, expand: bool = false) -> void: if not message_types.has(id): push_error("'%s' not an existing message type to handle...", [id]) return for callback: Callable in message_types.get(id): if data == null: callback.call() continue if not expand: callback.call(data) else: callback.callv(data)