Created EventBus
This commit is contained in:
16
common/autoload/event_bus.gd
Normal file
16
common/autoload/event_bus.gd
Normal file
@@ -0,0 +1,16 @@
|
||||
## EventBus — Cross-cutting signal hub for session-lifecycle and phase
|
||||
## transitions. Systems emit here instead of chaining through NetworkManager,
|
||||
## so subscribers don't need to know which service originated the event.
|
||||
## Authority: N/A (autoload singleton).
|
||||
class_name EventBusClass
|
||||
extends Node
|
||||
|
||||
signal connection_state_changed(connected: bool)
|
||||
signal authentication_failed(message: String)
|
||||
signal match_joined()
|
||||
signal match_left()
|
||||
signal match_join_failed(message: String)
|
||||
signal raid_starting()
|
||||
signal peer_joined(peer_id: int)
|
||||
signal peer_left(peer_id: int)
|
||||
signal phase_changed(phase: int)
|
||||
1
common/autoload/event_bus.gd.uid
Normal file
1
common/autoload/event_bus.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dcod2wlrxnaol
|
||||
@@ -3,7 +3,6 @@
|
||||
class_name GameStateClass
|
||||
extends Node
|
||||
|
||||
signal state_changed(new_state: Phase)
|
||||
signal party_members_updated(members: Array)
|
||||
|
||||
enum Phase {
|
||||
@@ -20,7 +19,7 @@ var current_phase: Phase = Phase.OFFLINE:
|
||||
if current_phase == value:
|
||||
return
|
||||
current_phase = value
|
||||
state_changed.emit(value)
|
||||
EventBus.phase_changed.emit(value)
|
||||
|
||||
var local_user_id: String = ""
|
||||
var local_username: String = ""
|
||||
|
||||
@@ -1,25 +1,19 @@
|
||||
## NetworkManager — Thin facade over AuthService / PartyService /
|
||||
## MatchmakingService / SessionPeers. Re-exposes their signals and methods so
|
||||
## game code can keep talking to a single, stable autoload.
|
||||
## MatchmakingService / SessionPeers. Owns service lifecycle and exposes
|
||||
## method-level API. Cross-cutting signals (session, match, phase, peers)
|
||||
## are emitted on EventBus; party/matchmaking flow signals remain here since
|
||||
## only the lobby subscribes to them.
|
||||
## Authority: N/A (autoload singleton).
|
||||
class_name NetworkManagerClass
|
||||
extends Node
|
||||
|
||||
# --- Re-emitted service signals ---
|
||||
signal connection_state_changed(connected: bool)
|
||||
signal authentication_failed(message: String)
|
||||
# --- Lobby-scoped signals (re-emitted from services) ---
|
||||
signal party_created(party_id: String)
|
||||
signal party_joined(party_id: String)
|
||||
signal party_left()
|
||||
signal party_presence_changed()
|
||||
signal matchmaking_started()
|
||||
signal matchmaking_cancelled()
|
||||
signal match_joined()
|
||||
signal match_left()
|
||||
signal match_join_failed(message: String)
|
||||
signal peer_joined(peer_id: int)
|
||||
signal peer_left(peer_id: int)
|
||||
signal raid_starting()
|
||||
|
||||
# --- Services ---
|
||||
var auth: AuthService
|
||||
@@ -47,19 +41,12 @@ func _ready() -> void:
|
||||
peers.name = "SessionPeers"
|
||||
add_child(peers)
|
||||
|
||||
auth.connection_state_changed.connect(connection_state_changed.emit)
|
||||
auth.authentication_failed.connect(authentication_failed.emit)
|
||||
party.party_created.connect(party_created.emit)
|
||||
party.party_joined.connect(party_joined.emit)
|
||||
party.party_left.connect(party_left.emit)
|
||||
party.party_presence_changed.connect(party_presence_changed.emit)
|
||||
matchmaking.matchmaking_started.connect(matchmaking_started.emit)
|
||||
matchmaking.matchmaking_cancelled.connect(matchmaking_cancelled.emit)
|
||||
matchmaking.match_joined.connect(match_joined.emit)
|
||||
matchmaking.match_left.connect(match_left.emit)
|
||||
matchmaking.match_join_failed.connect(match_join_failed.emit)
|
||||
peers.peer_joined.connect(peer_joined.emit)
|
||||
peers.peer_left.connect(peer_left.emit)
|
||||
|
||||
|
||||
# --- Facade API ---
|
||||
@@ -119,7 +106,7 @@ func start_raid() -> void:
|
||||
func _notify_raid_start() -> void:
|
||||
print("[NetworkManager] _notify_raid_start received on peer_id=%d" % multiplayer.get_unique_id())
|
||||
GameState.current_phase = GameState.Phase.IN_RAID
|
||||
raid_starting.emit()
|
||||
EventBus.raid_starting.emit()
|
||||
var err: Error = get_tree().change_scene_to_file("res://stages/raid/raid.tscn")
|
||||
if err != OK:
|
||||
push_error("Failed to change scene: %s" % error_string(err))
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
class_name AuthService
|
||||
extends Node
|
||||
|
||||
signal connection_state_changed(connected: bool)
|
||||
signal authentication_failed(message: String)
|
||||
signal socket_ready(socket: NakamaSocket)
|
||||
|
||||
var client: NakamaClient
|
||||
@@ -38,7 +36,7 @@ func connect_to_server(username: String) -> Error:
|
||||
session = await client.authenticate_device_async(device_id, username, true)
|
||||
if session.is_exception():
|
||||
var msg: String = "Authentication failed: %s" % session.get_exception().message
|
||||
authentication_failed.emit(msg)
|
||||
EventBus.authentication_failed.emit(msg)
|
||||
session = null
|
||||
return ERR_CANT_CONNECT
|
||||
|
||||
@@ -54,7 +52,7 @@ func connect_to_server(username: String) -> Error:
|
||||
socket_ready.emit(socket)
|
||||
|
||||
GameState.current_phase = GameState.Phase.CONNECTED
|
||||
connection_state_changed.emit(true)
|
||||
EventBus.connection_state_changed.emit(true)
|
||||
return OK
|
||||
|
||||
|
||||
@@ -67,7 +65,7 @@ func disconnect_auth() -> void:
|
||||
socket = null
|
||||
session = null
|
||||
GameState.reset()
|
||||
connection_state_changed.emit(false)
|
||||
EventBus.connection_state_changed.emit(false)
|
||||
|
||||
|
||||
func _on_socket_closed() -> void:
|
||||
|
||||
@@ -6,9 +6,6 @@ extends Node
|
||||
|
||||
signal matchmaking_started()
|
||||
signal matchmaking_cancelled()
|
||||
signal match_joined()
|
||||
signal match_left()
|
||||
signal match_join_failed(message: String)
|
||||
|
||||
var _auth: AuthService
|
||||
var _bridge: NakamaMultiplayerBridge
|
||||
@@ -99,7 +96,7 @@ func leave_match(notify_server: bool = true) -> void:
|
||||
_bridge = null
|
||||
multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new()
|
||||
GameState.reset_match()
|
||||
match_left.emit()
|
||||
EventBus.match_left.emit()
|
||||
|
||||
|
||||
func bridge() -> NakamaMultiplayerBridge:
|
||||
@@ -132,13 +129,13 @@ func _on_party_matchmaker_ticket(ticket: NakamaRTAPI.PartyMatchmakerTicket) -> v
|
||||
func _on_bridge_match_joined() -> void:
|
||||
GameState.match_id = _bridge.match_id
|
||||
GameState.current_phase = GameState.Phase.IN_MATCH
|
||||
match_joined.emit()
|
||||
EventBus.match_joined.emit()
|
||||
|
||||
|
||||
func _on_bridge_match_join_error(exception: NakamaException) -> void:
|
||||
_bridge = null
|
||||
var msg: String = "Match join failed: %s" % exception.message
|
||||
match_join_failed.emit(msg)
|
||||
EventBus.match_join_failed.emit(msg)
|
||||
if GameState.party_id != "":
|
||||
GameState.current_phase = GameState.Phase.IN_PARTY
|
||||
else:
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
## SessionPeers — Tracks Godot multiplayer peer connections for the active
|
||||
## match and mirrors them into GameState.match_peers.
|
||||
## match and mirrors them into GameState.match_peers. Emits on EventBus so
|
||||
## UI/gameplay code can subscribe without routing through NetworkManager.
|
||||
## Authority: N/A (local service under NetworkManager).
|
||||
class_name SessionPeers
|
||||
extends Node
|
||||
|
||||
signal peer_joined(peer_id: int)
|
||||
signal peer_left(peer_id: int)
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
multiplayer.peer_connected.connect(_on_peer_connected)
|
||||
@@ -15,9 +13,9 @@ func _ready() -> void:
|
||||
|
||||
func _on_peer_connected(id: int) -> void:
|
||||
GameState.match_peers[id] = true
|
||||
peer_joined.emit(id)
|
||||
EventBus.peer_joined.emit(id)
|
||||
|
||||
|
||||
func _on_peer_disconnected(id: int) -> void:
|
||||
GameState.match_peers.erase(id)
|
||||
peer_left.emit(id)
|
||||
EventBus.peer_left.emit(id)
|
||||
|
||||
@@ -22,6 +22,7 @@ config/icon="res://icon.svg"
|
||||
[autoload]
|
||||
|
||||
Nakama="*uid://dpwa6ykdkxalb"
|
||||
EventBus="*res://common/autoload/event_bus.gd"
|
||||
GameState="*res://common/autoload/game_state.gd"
|
||||
NetworkManager="*res://common/autoload/network_manager.gd"
|
||||
|
||||
|
||||
@@ -33,20 +33,20 @@ func _ready() -> void:
|
||||
_cancel_match_button.pressed.connect(_on_cancel_match_pressed)
|
||||
_start_raid_button.pressed.connect(_on_start_raid_pressed)
|
||||
|
||||
NetworkManager.connection_state_changed.connect(_on_connection_state_changed)
|
||||
NetworkManager.authentication_failed.connect(_on_auth_failed)
|
||||
NetworkManager.party_created.connect(_on_party_created)
|
||||
NetworkManager.party_joined.connect(_on_party_joined)
|
||||
NetworkManager.party_left.connect(_on_party_left)
|
||||
NetworkManager.party_presence_changed.connect(_refresh_party_ui)
|
||||
NetworkManager.matchmaking_started.connect(_on_matchmaking_started)
|
||||
NetworkManager.matchmaking_cancelled.connect(_on_matchmaking_cancelled)
|
||||
NetworkManager.match_joined.connect(_on_match_joined)
|
||||
NetworkManager.match_join_failed.connect(_on_match_join_failed)
|
||||
NetworkManager.peer_joined.connect(_on_peer_joined)
|
||||
NetworkManager.peer_left.connect(_on_peer_left)
|
||||
|
||||
GameState.state_changed.connect(_on_state_changed)
|
||||
EventBus.connection_state_changed.connect(_on_connection_state_changed)
|
||||
EventBus.authentication_failed.connect(_on_auth_failed)
|
||||
EventBus.match_joined.connect(_on_match_joined)
|
||||
EventBus.match_join_failed.connect(_on_match_join_failed)
|
||||
EventBus.peer_joined.connect(_on_peer_joined)
|
||||
EventBus.peer_left.connect(_on_peer_left)
|
||||
EventBus.phase_changed.connect(_on_state_changed)
|
||||
|
||||
_refresh_ui()
|
||||
_maybe_position_windows_from_cli()
|
||||
|
||||
Reference in New Issue
Block a user