net: add register/kick/sync/start_game RPCs to NetworkManager

This commit is contained in:
2026-04-13 21:05:33 +02:00
parent 12d0cd1f14
commit ab6a6a40e6

View File

@@ -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)