extends Control signal joined var current_map_idx := 0 var settings := {} @onready var list: VBoxContainer = %PlayersList func _ready() -> void: if not multiplayer.is_server(): %StartButton.disabled = true #%StartButton.queue_free() %PlayersList.remove_child(%PlayersList.get_child(0)) %PlayersList.remove_child(%PlayersList.get_child(0)) if multiplayer.is_server(): set_map.rpc(current_map_idx) joined.connect(func(): set_map.rpc(current_map_idx) ) for idx in %Maps.get_child_count(): %Maps.get_child(idx).pressed.connect(func(): set_map.rpc(idx) ) if not multiplayer.is_server(): set_map(0) for node: Control in %Maps.get_children(): node.mouse_filter = Control.MOUSE_FILTER_IGNORE Network.players_changed.connect(update_players) update_players() multiplayer.peer_disconnected.connect(remove_player) multiplayer.peer_connected.connect(_on_peer_connected) multiplayer.peer_disconnected.connect(_on_peer_disconnected) # reset map texture for clean load %Thumbnail.texture = null set_map(current_map_idx) func update_players(): for id in Network.get_ordered_player_ids(): var player: Player = Network.get_player(id) var control: Control = list.get_node_or_null(str(id)) if not control: control = MarginContainer.new() control.name = str(id) var label = Label.new() label.add_theme_color_override("font_color", player.get_color()) if id == multiplayer.get_unique_id(): label.add_theme_color_override("font_outline_color", Color(0.75, 0.75, 0.75, 0.75)) label.add_theme_constant_override("outline_size", 10) control.add_child(label) list.add_child(control) joined.emit() control.get_child(0).text = str(player.username) control.get_child(0).tooltip_text = str(id) list.move_child(control, Network.get_ordered_player_ids().find(id) + 1) func remove_player(id): list.remove_child(list.get_node(str(id))) func _on_peer_connected(id): Network._on_peer_connected(id) func _on_peer_disconnected(id): Network._on_peer_disconnected(id) func _on_start_button_pressed() -> void: start.rpc() func _on_cancel_button_pressed() -> void: multiplayer.multiplayer_peer.close() get_tree().change_scene_to_file("res://UI/Start.tscn") @rpc("authority", "call_local") func start(): var packed_scene = %Maps.get_child(current_map_idx).get_meta("map_scene") var scene = packed_scene.instantiate() for setting in settings: scene[setting] = settings[setting] Client.change_scene_to_instance(scene) @rpc("authority", "call_local") func set_map(index: int): current_map_idx = index for node: Button in %Maps.get_children(): node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 0.5)) var node = %Maps.get_child(index) var thumbnail = node.get_meta("thumbnail") # settings for child in %Settings.get_children(): child.queue_free() if node.get_meta("settings"): var scene = node.get_meta("map_scene").instantiate() for setting in node.get_meta("settings", []): settings[setting] = scene[setting] var control = preload("res://UI/lobby_setting.tscn").instantiate() control.label = setting control.value = settings[setting] control.disabled = !multiplayer.is_server() if multiplayer.is_server(): control.value_changed.connect(func(value): set_setting.rpc(setting, value) ) %Settings.add_child(control) node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 1.0)) %Thumbnail.texture = thumbnail @rpc("authority", "call_local") func set_setting(key: String, value: Variant): settings[key] = value if not multiplayer.is_server(): %Settings.get_node(key).value = value