Skip to content

Instantly share code, notes, and snippets.

@freehuntx
Last active December 22, 2023 16:04
Show Gist options
  • Select an option

  • Save freehuntx/8471a14f4d9b54ece3634b53d94412fe to your computer and use it in GitHub Desktop.

Select an option

Save freehuntx/8471a14f4d9b54ece3634b53d94412fe to your computer and use it in GitHub Desktop.
Godot Eventemitter
class_name EventEmitter extends RefCounted
var _listeners := {}
func emit(name: String, args:=[]):
if not name in _listeners: return
for e in _listeners[name]:
e.fn.callv(args)
_listeners[name] = _listeners[name].filter(func(e): return not e.once)
func once(name: String, fn: Callable) -> Callable:
return on(name, fn, true)
func on(name: String, fn: Callable, once:=false) -> Callable:
if not name in _listeners: _listeners[name] = []
_listeners[name].append({ "fn": fn, "once": once })
return off.bind(name, fn, once)
func off(name: String, fn: Callable, once:=false) -> void:
if not name in _listeners: return
_listeners[name] = _listeners[name].filter(func(e): return e.fn != fn and e.once != once)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment