Many changes to loading avatars and populating user list

This commit is contained in:
Chris Bell 2024-12-13 11:52:59 -06:00
parent fc8bb540db
commit 101c08c03f
3 changed files with 68 additions and 46 deletions

View File

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://assets/core/networking/scripts/lobby.gd" id="1_o4fbq"] [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"] [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 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@ -14,7 +14,7 @@ script = ExtResource("1_o4fbq")
host_button = NodePath("Panel/HBoxContainer/Buttons/Host") host_button = NodePath("Panel/HBoxContainer/Buttons/Host")
join_button = NodePath("Panel/HBoxContainer/Buttons/HBoxContainer/Join") join_button = NodePath("Panel/HBoxContainer/Buttons/HBoxContainer/Join")
leave_button = NodePath("Panel/HBoxContainer/Buttons/Leave") 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_list_box = NodePath("Panel/HBoxContainer/PlayerList")
user_box_prefab = ExtResource("2_dpthk") user_box_prefab = ExtResource("2_dpthk")

View File

@ -18,6 +18,7 @@ signal lobby_created(lobby_id: int)
signal lobby_joined(lobby_id: int) signal lobby_joined(lobby_id: int)
signal user_joined_lobby(user_id: int) signal user_joined_lobby(user_id: int)
signal user_left_lobby(user_id: int) signal user_left_lobby(user_id: int)
signal avatar_loaded(user_id: int, avatar_texture: ImageTexture)
func _ready() -> void: func _ready() -> void:
@ -48,8 +49,8 @@ func _init_steam() -> void:
Steam.join_requested.connect(_on_lobby_join_requested) Steam.join_requested.connect(_on_lobby_join_requested)
Steam.lobby_chat_update.connect(_on_lobby_chat_update) Steam.lobby_chat_update.connect(_on_lobby_chat_update)
Steam.lobby_created.connect(_on_lobby_created) Steam.lobby_created.connect(_on_lobby_created)
Steam.lobby_data_update.connect(_on_lobby_data_update) #Steam.lobby_data_update.connect(_on_lobby_data_update)
Steam.lobby_invite.connect(_on_lobby_invite) #Steam.lobby_invite.connect(_on_lobby_invite)
Steam.lobby_joined.connect(_on_lobby_joined) Steam.lobby_joined.connect(_on_lobby_joined)
Steam.lobby_match_list.connect(_on_lobby_match_list) Steam.lobby_match_list.connect(_on_lobby_match_list)
Steam.lobby_message.connect(_on_lobby_message) 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) var set_relay: bool = Steam.allowP2PPacketRelay(true)
func _on_lobby_data_update(): #func _on_lobby_data_update():
pass # pass
func _on_lobby_invite(): #func _on_lobby_invite():
pass # pass
func _on_lobby_joined(this_lobby_id: int, _permissions: int, response: int) -> void: func _on_lobby_joined(this_lobby_id: int, _permissions: int, _locked: bool, response: int) -> void:
if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS: if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
lobby_id = this_lobby_id lobby_id = this_lobby_id
get_lobby_members() get_lobby_members()
@ -137,9 +138,13 @@ func _on_lobby_message():
func _on_persona_change(this_steam_id: int, _flags: int) -> void: func _on_persona_change(this_steam_id: int, _flags: int) -> void:
if lobby_id > 0: if lobby_id > 0 and lobby_members:
print("User (%s) had information change, updating lobby list." % str(this_steam_id)) for member in lobby_members:
get_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): func _on_p2p_session_request(remote_id: int):
@ -202,7 +207,8 @@ func leave_lobby():
Steam.closeP2PSessionWithUser(this_member["steam_id"]) Steam.closeP2PSessionWithUser(this_member["steam_id"])
lobby_members.clear() lobby_members.clear()
print("Left lobby.")
func get_lobby_members(): func get_lobby_members():
lobby_members.clear() lobby_members.clear()
@ -280,9 +286,6 @@ func read_p2p_packet() -> void:
func request_player_avatar(user_id: int, size: int = 128) -> 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 var avatar_texture: ImageTexture = null
Steam.getPlayerAvatar(Steam.AVATAR_LARGE, user_id) Steam.getPlayerAvatar(Steam.AVATAR_LARGE, user_id)
print("Attempting to get avatar for " + Steam.getFriendPersonaName(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 avatar_texture_cache[user_id] = avatar_texture
) )
# Wait for the avatar to load asynchronously
await get_tree().process_frames(2)
if avatar_texture == null: while not avatar_texture_cache.has(user_id):
printerr("Could not load image for user: " + Steam.getFriendPersonaName(user_id)) await get_tree().process_frame
func get_player_avatar(user_id: int) -> ImageTexture: func get_player_avatar(user_id: int) -> ImageTexture:
if avatar_texture_cache.has(user_id): if avatar_texture_cache.has(user_id):
return avatar_texture_cache[user_id] return avatar_texture_cache[user_id]
else: else:
return await request_player_avatar(user_id) await request_player_avatar(user_id)
return avatar_texture_cache[user_id]

View File

@ -3,10 +3,11 @@ extends Control
@export var host_button: Button @export var host_button: Button
@export var join_button: Button @export var join_button: Button
@export var leave_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_list_box: VBoxContainer
@export var user_box_prefab: PackedScene @export var user_box_prefab: PackedScene
var added_users = []
func _ready() -> void: func _ready() -> void:
host_button.pressed.connect(_on_host) host_button.pressed.connect(_on_host)
@ -17,46 +18,60 @@ func _ready() -> void:
NetworkManager.lobby_joined.connect(_on_lobby_joined) NetworkManager.lobby_joined.connect(_on_lobby_joined)
NetworkManager.user_joined_lobby.connect(_on_user_joined_lobby) NetworkManager.user_joined_lobby.connect(_on_user_joined_lobby)
NetworkManager.user_left_lobby.connect(_on_user_left_lobby) NetworkManager.user_left_lobby.connect(_on_user_left_lobby)
GameConsole.register_command(Command.new("update", update, [], "Updates the lobby UI"))
func _on_host(): func _on_host():
NetworkManager.host_lobby() NetworkManager.host_lobby()
host_button.disabled = true host_button.disabled = true
join_button.disabled = true join_button.disabled = true
leave_button.disabled = false leave_button.disabled = false
lobby_id.disabled = true lobby_id_line_edit.editable = false
lobby_id.text = str(NetworkManager.lobby_id)
func _on_join(): func _on_join():
NetworkManager.join_lobby(int(lobby_id.text)) NetworkManager.join_lobby(int(lobby_id_line_edit.text))
host_button.disabled = true host_button.disabled = true
join_button.disabled = true join_button.disabled = true
leave_button.disabled = false leave_button.disabled = false
lobby_id.disabled = true lobby_id_line_edit.editable = false
func _on_leave(): func _on_leave():
NetworkManager.leave_lobby() NetworkManager.leave_lobby()
added_users.clear()
for child in user_list_box.get_children():
func _on_lobby_created(): child.queue_free()
func _on_lobby_created(lobby_id: int):
print("Lobby created") 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") print("Lobby joined")
func _on_user_joined_lobby(user_id: int):
func _on_user_joined_lobby(user_id:int): if user_id in added_users:
var user_box = user_box_prefab.instance() return # User already added, skip
user_box.get_node("Username").text = str(user_id)
user_list_box.add_child(user_box) added_users.append(user_id)
user_box.get_node("PFP").texture = await NetworkManager.get_player_avatar(user_id) update()
func _on_user_left_lobby(user_id: int):
func _on_user_left_lobby(user_id:int):
for child in user_list_box.get_children(): for child in user_list_box.get_children():
if child.get_node("Username").text == str(user_id): if child.get_node("Username").text == str(user_id):
user_list_box.remove_child(child) user_list_box.remove_child(child)
break 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