extends Node # Dictionary to hold event listeners var listeners : Dictionary = {} # Register a listener for a specific event func subscribe(event_name: String, listener: Object, method: Callable) -> void: # Clean up after objects if listener is Node: listener.tree_exited.connect(func() -> void: self.unsubscribe(event_name, listener)) if not listeners.has(event_name): listeners[event_name] = [] listeners[event_name].append({"listener": listener, "method": method}) # Unregister a listener for an event func unsubscribe(event_name: String, listener: Object, method : Variant = null) -> void: if listeners.has(event_name): listeners[event_name] = listeners[event_name].filter(func(entry : Dictionary) -> bool: # Unsubscribe only a specific method if method: return entry.listener != listener and entry.method != method # Unsubscribe listener from event else: return entry.listener != listener ) else: print_debug("Unknown EventBus event: %s" % event_name) # Emit an event to all registered listeners func emit(event_name: String, data: Variant = null) -> void: if listeners.has(event_name): for entry : Dictionary in listeners[event_name]: # EventBus.emit("event", [array, of, values]) if data is Array: # func _event(array, of, values): entry.method.callv(data) # EventBus.emit("event", value) elif data != null: # func _event(value): entry.method.call(data) # EventBus.emit("event") else: # func _event(): entry.method.call()
or share this direct link: