net: add register/kick/sync/start_game RPCs to NetworkManager
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user