class_name LobbyRoomList extends RefCounted var lobby: Control func _init(p_lobby: Control): lobby = p_lobby if lobby.refresh_btn: lobby.refresh_btn.pressed.connect(_on_refresh_pressed) if lobby.join_btn: lobby.join_btn.pressed.connect(_on_join_pressed) if lobby.back_btn: lobby.back_btn.pressed.connect(_on_back_pressed) LobbyManager.room_list_updated.connect(on_room_list_updated) func _on_refresh_pressed() -> void: if lobby.connection_status: lobby.connection_status.text = "Refreshing..." if lobby.room_list: lobby.room_list.clear() LobbyManager.refresh_room_list() func _on_room_selected(index: int) -> void: if index < LobbyManager.available_rooms.size(): var room = LobbyManager.available_rooms[index] if LobbyManager.is_lan_mode: var ip = room.get("ip", "") if not ip.is_empty() and lobby.match_id_input: lobby.match_id_input.text = ip else: var mid = room.get("match_id", "") if not mid.is_empty() and lobby.match_id_input: lobby.match_id_input.text = mid func _on_room_activated(index: int) -> void: _on_room_selected(index) _on_join_pressed() func _on_join_pressed() -> void: if not lobby.match_id_input: return var match_id = lobby.match_id_input.text.strip_edges() if match_id.is_empty() and not LobbyManager.is_lan_mode: var selected_items = [] if not lobby.room_list else lobby.room_list.get_selected_items() if selected_items.size() == 0: if lobby.connection_status: lobby.connection_status.text = "Please select a room or enter Match ID" return var selected_idx = selected_items[0] if selected_idx < LobbyManager.available_rooms.size(): match_id = LobbyManager.available_rooms[selected_idx].get("match_id", "") if AuthManager.is_guest: if LobbyManager.local_player_name.is_empty() or LobbyManager.local_player_name == "Player": LobbyManager.local_player_name = NameGenerator.generate_guest_name() else: LobbyManager.local_player_name = UserProfileManager.get_display_name() if LobbyManager.is_lan_mode: if match_id.is_empty(): var selected_items = [] if not lobby.room_list else lobby.room_list.get_selected_items() if selected_items.size() > 0: var idx = selected_items[0] if idx < LobbyManager.available_rooms.size(): match_id = LobbyManager.available_rooms[idx].get("ip", "") if match_id.is_empty(): if lobby.connection_status: lobby.connection_status.text = "Enter Host IP to join" return if lobby.connection_status: lobby.connection_status.text = "Connecting to %s..." % match_id lobby._apply_loadout_character() var ok = LobbyManager.join_room_lan(match_id) if not ok: if lobby.connection_status: lobby.connection_status.text = "Failed to connect to %s" % match_id else: if match_id.is_empty(): if lobby.connection_status: lobby.connection_status.text = "No room selected" return if lobby.connection_status: lobby.connection_status.text = "Joining Nakama room..." lobby._apply_loadout_character() LobbyManager.join_room(match_id) func _on_back_pressed() -> void: lobby._show_panel("main_menu") if lobby.connection_status: lobby.connection_status.text = "" func on_room_list_updated(rooms: Array) -> void: if not lobby.room_list: return lobby.room_list.clear() if lobby.item_template: var parent = lobby.item_template.get_parent() for child in parent.get_children(): if child.has_meta("room_row"): child.queue_free() var filtered := rooms.filter(func(r): return lobby._room_mode_filter.is_empty() or r.get("game_mode", "") == lobby._room_mode_filter ) if lobby.item_template: var parent = lobby.item_template.get_parent() for i in range(filtered.size()): var room = filtered[i] var row = lobby.item_template.duplicate() row.visible = true row.set_meta("room_row", true) row.set_meta("room_index", i) var room_id_short = room.get("room_name", "???") var host_name = room.get("host_name", "Unknown") var player_count = room.get("player_count", 1) var max_players = room.get("max_players", 8) var mode = room.get("game_mode", "") var mode_short = "FMD" if mode == "Freemode" else ("SNG" if mode == "Stop n Go" else mode.left(3).to_upper()) var hbox = row.get_node_or_null("PanelContainer/MarginContainer/HBoxContainer") if hbox: var lbl_id = hbox.get_child(0) var lbl_host = hbox.get_child(1) var lbl_mode = hbox.get_child(2) var lbl_cap = hbox.get_child(3) if lbl_id: lbl_id.text = room_id_short if lbl_host: lbl_host.text = host_name if lbl_mode: lbl_mode.text = mode_short if lbl_cap: lbl_cap.text = "%d/%d" % [player_count, max_players] parent.add_child(row) var panel_box = row.get_node_or_null("PanelContainer") if panel_box: var idx = i panel_box.gui_input.connect(func(event: InputEvent): if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: _on_room_selected(idx) if event.double_click: _on_room_activated(idx) ) panel_box.mouse_filter = Control.MOUSE_FILTER_STOP else: for room in filtered: var room_name = room.get("room_name", "Unknown") var host_name = room.get("host_name", "Unknown") var player_count = room.get("player_count", 1) var max_players = room.get("max_players", 4) var mode = room.get("game_mode", "") var mode_tag = " [%s]" % mode if not mode.is_empty() else "" lobby.room_list.add_item("%s - %s (%d/%d)%s" % [room_name, host_name, player_count, max_players, mode_tag]) var filter_note = " [Filter: %s]" % lobby._room_mode_filter if not lobby._room_mode_filter.is_empty() else "" if filtered.size() == 0: if lobby.connection_status: lobby.connection_status.text = "No rooms available%s" % filter_note else: if lobby.connection_status: lobby.connection_status.text = "Found %d room(s)%s" % [filtered.size(), filter_note]