lobby: spawn colored capsule avatars for each player at LobbySpots
This commit is contained in:
@@ -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", ""))
|
||||
|
||||
Reference in New Issue
Block a user