lobby: spawn colored capsule avatars for each player at LobbySpots

This commit is contained in:
2026-04-16 00:51:45 +02:00
parent 8a47abda3f
commit 40297d9d4c

View File

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