From ab6a6a40e60eb2c91cdbcb80fa503d4cdc8c019c Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Mon, 13 Apr 2026 21:05:33 +0200 Subject: [PATCH] net: add register/kick/sync/start_game RPCs to NetworkManager --- ruf-der-pilze/scripts/network_manager.gd | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/ruf-der-pilze/scripts/network_manager.gd b/ruf-der-pilze/scripts/network_manager.gd index 7d3f4ea..ce00c61 100644 --- a/ruf-der-pilze/scripts/network_manager.gd +++ b/ruf-der-pilze/scripts/network_manager.gd @@ -70,3 +70,61 @@ func _on_connection_failed() -> void: func welcome(peer_id: int) -> void: # call_remote: wird NUR auf dem Ziel-Client ausgeführt, nicht auf dem Server. print("[Client] Willkommen, meine peer_id ist: %d" % peer_id) + + +@rpc("any_peer", "call_remote", "reliable") +func register(player_name: String, role: String) -> void: + if not multiplayer.is_server(): + return + var sender_id := multiplayer.get_remote_sender_id() + if role == "dm": + for p in players.values(): + if p.role == "dm": + kick.rpc_id(sender_id, "Es ist bereits ein DM verbunden.") + return + # Erst bestehende Spielerliste an neuen Client senden (noch ohne den neuen Spieler) + sync_players.rpc_id(sender_id, players) + # Dann neuen Spieler an alle broadcasten (inkl. Server selbst durch call_local) + _broadcast_player_joined.rpc(sender_id, player_name, role) + + +@rpc("authority", "call_local", "reliable") +func _broadcast_player_joined(peer_id: int, player_name: String, role: String) -> void: + players[peer_id] = {name = player_name, role = role} + player_joined.emit(peer_id, player_name, role) + + +@rpc("authority", "call_remote", "reliable") +func sync_players(player_list: Dictionary) -> void: + # Nur Dict befüllen — kein Signal per Spieler emittieren. + # Lobby-UI rebuilt die Liste einmalig via player_list_synced. + players = player_list + player_list_synced.emit() + + +@rpc("authority", "call_remote", "reliable") +func kick(reason: String) -> void: + push_error("[Client] Verbindung abgelehnt: %s" % reason) + multiplayer.multiplayer_peer.close.call_deferred() + + +@rpc("any_peer", "call_remote", "reliable") +func request_start_game() -> void: + if not multiplayer.is_server(): + return + var requester_id := multiplayer.get_remote_sender_id() + if players.get(requester_id, {}).get("role", "") != "dm": + return + start_game.rpc() + + +@rpc("authority", "call_local", "reliable") +func start_game() -> void: + game_started.emit() + + +# call_remote: Server hat lokal bereits gelöscht; nur Clients führen aus +@rpc("authority", "call_remote", "reliable") +func _broadcast_player_left(peer_id: int) -> void: + players.erase(peer_id) + player_left.emit(peer_id)