Files
Billiards/globals/message_bus.gd
itdominator 26dcfe0d1b refactor: improve multiplayer connection lifecycle
* Move client/server connection handling into game-specific networking classes
* Add multiplayer data reset for disconnected clients
* Clean up invalid MessageBus listeners after disconnects
* Persist lobby host address and port in game data
* Standardize the default server port to 8080
* Increase server address input length to support valid addresses
* Remove obsolete connection and match initialization logic from base networking
2026-08-10 00:40:45 -05:00

69 lines
1.9 KiB
GDScript

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 clear_voided_listeners() -> void:
for mtype in message_types.keys():
var mlisteners: Array = message_types.get(mtype)
for mlistener in mlisteners:
if mlistener.is_valid(): continue
mlisteners.erase(mlistener)
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)