decdb74ade
Bump export_presets.cfg version to 2.3.5. Update CHANGELOG_DRAFT.md. Refactor lobby.gd into LobbyChat, LobbyMainMenu, LobbyRoomList, LobbyRoom. Move Nakama config to environment variables in nakama_manager.gd. Derive auth_manager.gd encryption key from OS.get_unique_id().sha256_text(). Remove Steam email auth fallback. Require auth ticket. Make GachaManager.pull() async in gacha_panel.gd. Remove dummy wallet seeding. Add store_type to IAP payload. Validate IAP receipts server-side in economy.lua. Register gacha module in main.lua. Clean backend_service.gd stubs. Fix featured_banners type safety in gacha_manager.gd. Guards non-array responses. Move tiles_armagedon_a1.res to assets/models/meshes/. Fix import fallback_path.
156 lines
5.7 KiB
GDScript
156 lines
5.7 KiB
GDScript
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]
|