diff --git a/assets/core/networking/scenes/lobby.tscn b/assets/core/networking/scenes/lobby.tscn index 9fea78a..6f54eec 100644 --- a/assets/core/networking/scenes/lobby.tscn +++ b/assets/core/networking/scenes/lobby.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://assets/core/networking/scripts/lobby.gd" id="1_o4fbq"] [ext_resource type="PackedScene" uid="uid://biryul3n6thlw" path="res://assets/core/networking/scenes/user_box_prefab.tscn" id="2_dpthk"] -[node name="Lobby" type="Control" node_paths=PackedStringArray("host_button", "join_button", "leave_button", "lobby_id", "user_list_box")] +[node name="Lobby" type="Control" node_paths=PackedStringArray("host_button", "join_button", "leave_button", "lobby_id_line_edit", "user_list_box")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -14,7 +14,7 @@ script = ExtResource("1_o4fbq") host_button = NodePath("Panel/HBoxContainer/Buttons/Host") join_button = NodePath("Panel/HBoxContainer/Buttons/HBoxContainer/Join") leave_button = NodePath("Panel/HBoxContainer/Buttons/Leave") -lobby_id = NodePath("Panel/HBoxContainer/Buttons/HBoxContainer/LineEdit") +lobby_id_line_edit = NodePath("Panel/HBoxContainer/Buttons/HBoxContainer/LineEdit") user_list_box = NodePath("Panel/HBoxContainer/PlayerList") user_box_prefab = ExtResource("2_dpthk") diff --git a/assets/core/networking/scripts/NetworkManager.gd b/assets/core/networking/scripts/NetworkManager.gd index b4df001..54ea800 100644 --- a/assets/core/networking/scripts/NetworkManager.gd +++ b/assets/core/networking/scripts/NetworkManager.gd @@ -18,6 +18,7 @@ signal lobby_created(lobby_id: int) signal lobby_joined(lobby_id: int) signal user_joined_lobby(user_id: int) signal user_left_lobby(user_id: int) +signal avatar_loaded(user_id: int, avatar_texture: ImageTexture) func _ready() -> void: @@ -48,8 +49,8 @@ func _init_steam() -> void: Steam.join_requested.connect(_on_lobby_join_requested) Steam.lobby_chat_update.connect(_on_lobby_chat_update) Steam.lobby_created.connect(_on_lobby_created) - Steam.lobby_data_update.connect(_on_lobby_data_update) - Steam.lobby_invite.connect(_on_lobby_invite) + #Steam.lobby_data_update.connect(_on_lobby_data_update) + #Steam.lobby_invite.connect(_on_lobby_invite) Steam.lobby_joined.connect(_on_lobby_joined) Steam.lobby_match_list.connect(_on_lobby_match_list) Steam.lobby_message.connect(_on_lobby_message) @@ -96,15 +97,15 @@ func _on_lobby_created(connect: int, this_lobby_id: int) -> void: var set_relay: bool = Steam.allowP2PPacketRelay(true) -func _on_lobby_data_update(): - pass +#func _on_lobby_data_update(): +# pass -func _on_lobby_invite(): - pass - - -func _on_lobby_joined(this_lobby_id: int, _permissions: int, response: int) -> void: +#func _on_lobby_invite(): +# pass + + +func _on_lobby_joined(this_lobby_id: int, _permissions: int, _locked: bool, response: int) -> void: if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS: lobby_id = this_lobby_id get_lobby_members() @@ -137,9 +138,13 @@ func _on_lobby_message(): func _on_persona_change(this_steam_id: int, _flags: int) -> void: - if lobby_id > 0: - print("User (%s) had information change, updating lobby list." % str(this_steam_id)) - get_lobby_members() + if lobby_id > 0 and lobby_members: + for member in lobby_members: + if member["steam_id"] == this_steam_id: + var user: String = str(this_steam_id) + ":" + Steam.getFriendPersonaName(this_steam_id) + print("User (%s) had information change, updating lobby list." % user) + get_lobby_members() + break func _on_p2p_session_request(remote_id: int): @@ -202,7 +207,8 @@ func leave_lobby(): Steam.closeP2PSessionWithUser(this_member["steam_id"]) lobby_members.clear() - + print("Left lobby.") + func get_lobby_members(): lobby_members.clear() @@ -280,9 +286,6 @@ func read_p2p_packet() -> void: func request_player_avatar(user_id: int, size: int = 128) -> void: - if avatar_texture_cache.has(user_id): - return - var avatar_texture: ImageTexture = null Steam.getPlayerAvatar(Steam.AVATAR_LARGE, user_id) print("Attempting to get avatar for " + Steam.getFriendPersonaName(user_id) + ".....") @@ -298,15 +301,19 @@ func request_player_avatar(user_id: int, size: int = 128) -> void: avatar_texture_cache[user_id] = avatar_texture ) - # Wait for the avatar to load asynchronously - await get_tree().process_frames(2) - if avatar_texture == null: - printerr("Could not load image for user: " + Steam.getFriendPersonaName(user_id)) + while not avatar_texture_cache.has(user_id): + await get_tree().process_frame func get_player_avatar(user_id: int) -> ImageTexture: if avatar_texture_cache.has(user_id): return avatar_texture_cache[user_id] else: - return await request_player_avatar(user_id) + await request_player_avatar(user_id) + return avatar_texture_cache[user_id] + + + + + diff --git a/assets/core/networking/scripts/lobby.gd b/assets/core/networking/scripts/lobby.gd index 2ae2682..5ad91bf 100644 --- a/assets/core/networking/scripts/lobby.gd +++ b/assets/core/networking/scripts/lobby.gd @@ -3,10 +3,11 @@ extends Control @export var host_button: Button @export var join_button: Button @export var leave_button: Button -@export var lobby_id: LineEdit +@export var lobby_id_line_edit: LineEdit @export var user_list_box: VBoxContainer @export var user_box_prefab: PackedScene +var added_users = [] func _ready() -> void: host_button.pressed.connect(_on_host) @@ -17,46 +18,60 @@ func _ready() -> void: NetworkManager.lobby_joined.connect(_on_lobby_joined) NetworkManager.user_joined_lobby.connect(_on_user_joined_lobby) NetworkManager.user_left_lobby.connect(_on_user_left_lobby) - + GameConsole.register_command(Command.new("update", update, [], "Updates the lobby UI")) + func _on_host(): NetworkManager.host_lobby() host_button.disabled = true join_button.disabled = true leave_button.disabled = false - lobby_id.disabled = true - lobby_id.text = str(NetworkManager.lobby_id) - + lobby_id_line_edit.editable = false + func _on_join(): - NetworkManager.join_lobby(int(lobby_id.text)) + NetworkManager.join_lobby(int(lobby_id_line_edit.text)) host_button.disabled = true join_button.disabled = true leave_button.disabled = false - lobby_id.disabled = true - + lobby_id_line_edit.editable = false func _on_leave(): NetworkManager.leave_lobby() - - -func _on_lobby_created(): + added_users.clear() + for child in user_list_box.get_children(): + child.queue_free() + +func _on_lobby_created(lobby_id: int): print("Lobby created") + lobby_id_line_edit.text = str(NetworkManager.lobby_id) - -func _on_lobby_joined(): + +func _on_lobby_joined(lobby_id: int): print("Lobby joined") - - -func _on_user_joined_lobby(user_id:int): - var user_box = user_box_prefab.instance() - user_box.get_node("Username").text = str(user_id) - user_list_box.add_child(user_box) - user_box.get_node("PFP").texture = await NetworkManager.get_player_avatar(user_id) - - -func _on_user_left_lobby(user_id:int): + +func _on_user_joined_lobby(user_id: int): + if user_id in added_users: + return # User already added, skip + + added_users.append(user_id) + update() + +func _on_user_left_lobby(user_id: int): for child in user_list_box.get_children(): if child.get_node("Username").text == str(user_id): user_list_box.remove_child(child) break + + +func update() -> void: + for child in user_list_box.get_children(): + child.queue_free() + + for user_id in added_users: + var user_box = user_box_prefab.instantiate() + user_box.get_node("Username").text = str(Steam.getFriendPersonaName(user_id)) + user_list_box.add_child(user_box) + + var avatar_texture = await NetworkManager.get_player_avatar(user_id) + user_box.get_node("PFP").texture = avatar_texture