From 40297d9d4c3b293bdac29c082bdebce2a5cf744a Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:51:45 +0200 Subject: [PATCH] lobby: spawn colored capsule avatars for each player at LobbySpots --- ruf-der-pilze/scripts/tavern_lobby.gd | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/ruf-der-pilze/scripts/tavern_lobby.gd b/ruf-der-pilze/scripts/tavern_lobby.gd index 6c7c3c4..e974db7 100644 --- a/ruf-der-pilze/scripts/tavern_lobby.gd +++ b/ruf-der-pilze/scripts/tavern_lobby.gd @@ -1,7 +1,11 @@ extends Node3D +const CharacterPlaceholder := preload("res://scenes/character_placeholder.tscn") + var _local_role: String = "" var _pending_player_name: String = "" +var _capsules: Dictionary = {} # peer_id: int → Node3D +var _lobby_spots: Array[Marker3D] = [] func _ready() -> void: @@ -17,6 +21,18 @@ func _ready() -> void: NetworkManager.player_left.connect(_on_player_left) NetworkManager.player_list_synced.connect(_rebuild_player_list) + _lobby_spots = [ + $LobbySpot0 as Marker3D, + $LobbySpot1 as Marker3D, + $LobbySpot2 as Marker3D, + $LobbySpot3 as Marker3D, + $LobbySpot4 as Marker3D, + ] + NetworkManager.player_joined.connect(_on_player_joined_capsule) + NetworkManager.player_left.connect(_on_player_left_capsule) + if NetworkManager.has_signal("character_updated"): + NetworkManager.character_updated.connect(_on_character_updated_capsule) + func _on_join_pressed() -> void: var player_name: String = ($CanvasLayer/JoinPanel/NameInput as LineEdit).text.strip_edges() @@ -40,6 +56,10 @@ func _exit_tree() -> void: NetworkManager.player_joined.disconnect(_on_player_joined) NetworkManager.player_left.disconnect(_on_player_left) NetworkManager.player_list_synced.disconnect(_rebuild_player_list) + NetworkManager.player_joined.disconnect(_on_player_joined_capsule) + NetworkManager.player_left.disconnect(_on_player_left_capsule) + if NetworkManager.has_signal("character_updated") and NetworkManager.character_updated.is_connected(_on_character_updated_capsule): + NetworkManager.character_updated.disconnect(_on_character_updated_capsule) func _on_connection_failed() -> void: @@ -66,3 +86,29 @@ func _rebuild_player_list() -> void: func _on_start_pressed() -> void: NetworkManager.request_start_game.rpc_id(1) + + +func _on_player_joined_capsule(peer_id: int, _player_name: String, _role: String) -> void: + if _capsules.has(peer_id): + return + var spot_index := _capsules.size() % _lobby_spots.size() + var capsule: Node3D = CharacterPlaceholder.instantiate() + add_child(capsule) + capsule.global_position = _lobby_spots[spot_index].global_position + var player_data: Dictionary = NetworkManager.players.get(peer_id, {}) + capsule.set_label(player_data.get("name", "???")) + capsule.set_color(player_data.get("char", {}).get("class", "")) + _capsules[peer_id] = capsule + + +func _on_player_left_capsule(peer_id: int) -> void: + if not _capsules.has(peer_id): + return + (_capsules[peer_id] as Node3D).queue_free() + _capsules.erase(peer_id) + + +func _on_character_updated_capsule(peer_id: int, data: Dictionary) -> void: + if not _capsules.has(peer_id): + return + (_capsules[peer_id] as Node3D).set_color(data.get("class", ""))