diff --git a/assets/core/networking/NetworkManager.gd b/assets/core/networking/NetworkManager.gd index 173ce64..2a3d764 100644 --- a/assets/core/networking/NetworkManager.gd +++ b/assets/core/networking/NetworkManager.gd @@ -12,6 +12,8 @@ var lobby_id: int = 0 var lobby_members: Array = [] var lobby_members_max: int = 4 +signal user_joined_lobby(steam_id: int, username: String) + func _ready() -> void: var init_result = Steam.steamInit(true, 480) if init_result["status"] <= 1: @@ -141,6 +143,7 @@ func read_p2p_packet() -> void: "handshake": GameConsole.print_line("Handshake from: " + read_data["username"]) get_lobby_members() + user_joined_lobby.emit(packet_sender, read_data["username"]) "chat": GameConsole.print_line(read_data["username"] + ": " + read_data["message"]) _: diff --git a/assets/core/networking/network_test_ui.gd b/assets/core/networking/network_test_ui.gd index b3f39f0..a69d4b9 100644 --- a/assets/core/networking/network_test_ui.gd +++ b/assets/core/networking/network_test_ui.gd @@ -5,26 +5,31 @@ extends Control @export var host_button: Button @export var join_button: Button @export var lobby_id: LineEdit -@export var pfp: TextureRect -@export var username: Label @export var hosted_lobby_id: Label +@export var user_box1: HBoxContainer +@export var user_box2: HBoxContainer +@export var user_box3: HBoxContainer +@export var user_box4: HBoxContainer + # Called when the node enters the scene tree for the first time. func _ready() -> void: host_button.button_down.connect(_on_host_button_pressed) join_button.button_down.connect(_on_join_button_pressed) + network_manager.user_joined_lobby.connect(_on_user_joined_lobby) - username.text = network_manager.username + + user_box1.get_node("Username").text = network_manager.username if network_manager.avatar_texture == null: GameConsole.log_error("Avatar texture is null!") get_tree().create_timer(0.005).timeout.connect( func(): - pfp.texture = network_manager.avatar_texture + user_box1.get_node("PFP").texture = network_manager.avatar_texture ) else: - pfp.texture = network_manager.avatar_texture + user_box1.get_node("PFP").texture = network_manager.avatar_texture func _on_host_button_pressed() -> void: @@ -39,3 +44,38 @@ func _on_host_button_pressed() -> void: func _on_join_button_pressed() -> void: network_manager.join_lobby(int(lobby_id.text)) + + +func _on_user_joined_lobby(user_id: int, username: String) -> void: + if network_manager.lobby_members[1] == null: + user_box2.get_node("Username").text = username + user_box2.get_node("PFP").texture = load_avatar(user_id) + user_box2.visible = true + elif network_manager.lobby_members[2] == null: + user_box3.get_node("Username").text = username + user_box3.get_node("PFP").texture = load_avatar(user_id) + user_box3.visible = true + elif network_manager.lobby_members[3] == null: + user_box4.get_node("Username").text = username + user_box4.get_node("PFP").texture = load_avatar(user_id) + user_box4.visible = true + else: + GameConsole.log_error("Lobby is full!") + + +func load_avatar(user_id: int) -> ImageTexture: + Steam.getPlayerAvatar(user_id) + + Steam.avatar_loaded.connect( + func(_user_id: int, avatar_size: int, avatar_buffer: PackedByteArray) -> void: + var avatar_image: Image = Image.create_from_data(avatar_size, avatar_size, false, Image.FORMAT_RGBA8, avatar_buffer) + if avatar_size > 128: + avatar_image.resize(128, 128, Image.INTERPOLATE_LANCZOS) + + if avatar_image != null: + return ImageTexture.create_from_image(avatar_image) + else: + GameConsole.log_error("Failed to create avatar image!") + ) + return null + diff --git a/assets/core/networking/test-lobby.tscn b/assets/core/networking/test-lobby.tscn index c2212a0..51e0fa4 100644 --- a/assets/core/networking/test-lobby.tscn +++ b/assets/core/networking/test-lobby.tscn @@ -8,7 +8,7 @@ [node name="NetworkManager" parent="." instance=ExtResource("1_i1w5w")] -[node name="UiRoot" type="Control" parent="." node_paths=PackedStringArray("network_manager", "host_button", "join_button", "lobby_id", "pfp", "username", "hosted_lobby_id")] +[node name="UiRoot" type="Control" parent="." node_paths=PackedStringArray("network_manager", "host_button", "join_button", "lobby_id", "hosted_lobby_id", "user_box1", "user_box2", "user_box3", "user_box4")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -20,9 +20,11 @@ network_manager = NodePath("../NetworkManager") host_button = NodePath("Panel/HBoxContainer/VBoxContainer/Host") join_button = NodePath("Panel/HBoxContainer/VBoxContainer/Join") lobby_id = NodePath("Panel/HBoxContainer/VBoxContainer/LobbyID") -pfp = NodePath("Panel/HBoxContainer/VBoxContainer2/HBoxContainer/PFP") -username = NodePath("Panel/HBoxContainer/VBoxContainer2/HBoxContainer/Username") hosted_lobby_id = NodePath("Panel/HBoxContainer/VBoxContainer/HostedLobbyID") +user_box1 = NodePath("Panel/HBoxContainer/VBoxContainer2/UserBox1") +user_box2 = NodePath("Panel/HBoxContainer/VBoxContainer2/UserBox2") +user_box3 = NodePath("Panel/HBoxContainer/VBoxContainer2/UserBox3") +user_box4 = NodePath("Panel/HBoxContainer/VBoxContainer2/UserBox4") [node name="Panel" type="Panel" parent="UiRoot"] layout_mode = 1 @@ -65,17 +67,62 @@ text = "Lobby hosted: " layout_mode = 2 size_flags_horizontal = 3 -[node name="HBoxContainer" type="HBoxContainer" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2"] +[node name="UserBox1" type="HBoxContainer" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2"] layout_mode = 2 -[node name="PFP" type="TextureRect" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/HBoxContainer"] +[node name="PFP" type="TextureRect" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox1"] custom_minimum_size = Vector2(128, 128) layout_mode = 2 size_flags_horizontal = 4 texture = ExtResource("3_co2ix") expand_mode = 1 -[node name="Username" type="Label" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/HBoxContainer"] +[node name="Username" type="Label" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox1"] layout_mode = 2 size_flags_horizontal = 8 -text = "username" +text = "Hagrid 1" + +[node name="UserBox2" type="HBoxContainer" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="PFP" type="TextureRect" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox2"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 4 +texture = ExtResource("3_co2ix") +expand_mode = 1 + +[node name="Username" type="Label" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox2"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "Hagrid 2" + +[node name="UserBox3" type="HBoxContainer" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="PFP" type="TextureRect" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox3"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 4 +texture = ExtResource("3_co2ix") +expand_mode = 1 + +[node name="Username" type="Label" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox3"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "Hagrid 3" + +[node name="UserBox4" type="HBoxContainer" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="PFP" type="TextureRect" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox4"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 4 +texture = ExtResource("3_co2ix") +expand_mode = 1 + +[node name="Username" type="Label" parent="UiRoot/Panel/HBoxContainer/VBoxContainer2/UserBox4"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "Hagrid 4"