Networking and menu cleanup, added nosteam window flag

This commit is contained in:
2026-05-22 23:37:12 -05:00
parent b7defbdbfc
commit 29de79725c
4 changed files with 88 additions and 94 deletions

View File

@@ -1,75 +1,47 @@
extends CanvasLayer extends CanvasLayer
@onready var use_steam_check: CheckButton = %UseSteamCheck
@onready var ip_edit: LineEdit = %IPEdit @onready var quit_button: Button = %QuitButton
@onready var join_ip_button: Button = %JoinIPButton
@onready var steam_host_button: Button = %SteamHostButton @onready var steam_host_button: Button = %SteamHostButton
@onready var steam_lobby_id_edit: LineEdit = %SteamLobbyIDEdit @onready var steam_lobby_id_edit: LineEdit = %SteamLobbyIDEdit
@onready var join_steam_button: Button = %JoinSteamButton @onready var join_steam_button: Button = %JoinSteamButton
@onready var quit_button: Button = %QuitButton
@onready var ip_host_button: Button = %IPHostButton
@onready var steam_controls: VBoxContainer = %SteamControls @onready var steam_controls: VBoxContainer = %SteamControls
@onready var e_net_controls: VBoxContainer = %ENetControls
@onready var steam_avatar: TextureRect = %SteamAvatar @onready var steam_avatar: TextureRect = %SteamAvatar
@onready var steam_username_label: Label = %SteamUsernameLabel @onready var steam_username_label: Label = %SteamUsernameLabel
@onready var ip_host_button: Button = %IPHostButton
@onready var e_net_controls: VBoxContainer = %ENetControls
@onready var username_input: LineEdit = %UsernameInput @onready var username_input: LineEdit = %UsernameInput
@onready var ip_avatar_image: TextureButton = %IPAvatarImage @onready var ip_avatar_image: TextureButton = %IPAvatarImage
@onready var ip_edit: LineEdit = %IPEdit
@onready var join_ip_button: Button = %JoinIPButton
const TEST_LEVEL = preload("uid://tnw1q8a7ndio") const TEST_LEVEL = preload("uid://tnw1q8a7ndio")
const PLAYER = preload("uid://cq6ovfsdvnt40")
func _ready() -> void: func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
check_command_line()
quit_button.pressed.connect(func(): get_tree().quit())
#if OS.has_feature("server"): if OS.has_feature("nosteam"):
#add_world() steam_controls.hide()
#NetworkManager.start_server() e_net_controls.show()
#hide()
use_steam_check.toggled.connect(_on_use_steam_toggled)
join_ip_button.pressed.connect(_on_ip_join_pressed) join_ip_button.pressed.connect(_on_ip_join_pressed)
quit_button.pressed.connect(func(): get_tree().quit())
ip_host_button.pressed.connect(_on_host_ip_pressed) ip_host_button.pressed.connect(_on_host_ip_pressed)
username_input.text_changed.connect(_on_username_input_text_changed) username_input.text_changed.connect(_on_username_input_text_changed)
ip_avatar_image.pressed.connect(_on_ip_avatar_clicked) ip_avatar_image.pressed.connect(_on_ip_avatar_clicked)
return
join_steam_button.pressed.connect(_on_join_steam_pressed) join_steam_button.pressed.connect(_on_join_steam_pressed)
steam_host_button.pressed.connect(_on_host_steam_pressed) steam_host_button.pressed.connect(_on_host_steam_pressed)
steam_lobby_id_edit.text_changed.connect(_on_lobby_text_changed) steam_lobby_id_edit.text_changed.connect(_on_lobby_text_changed)
Steam.join_requested.connect(_on_lobby_join_requested) Steam.join_requested.connect(_on_lobby_join_requested)
check_command_line()
func _on_use_steam_toggled(toggled_on: bool):
if toggled_on:
if !Steamworks.is_initalized:
push_error("Steam not initalized, reverting to IP")
steam_controls.hide()
use_steam_check.button_pressed = false
else:
steam_controls.show()
e_net_controls.hide()
steam_username_label.text = Steamworks.steam_username steam_username_label.text = Steamworks.steam_username
steam_avatar.texture = Steamworks.steam_avatar steam_avatar.texture = await Steamworks.get_player_avatar(Steamworks.steam_id)
else:
e_net_controls.show()
steam_controls.hide()
func _on_ip_join_pressed():
var avatar: ImageTexture = ImageTexture.create_from_image(ip_avatar_image.texture_normal.get_image())
NetworkManager.join_server(ip_edit.text, username_input.text, avatar)
add_world()
hide()
func _on_host_ip_pressed():
var avatar: ImageTexture = ImageTexture.create_from_image(ip_avatar_image.texture_normal.get_image())
NetworkManager.start_server(username_input.text, avatar)
add_world()
hide()
func _on_host_steam_pressed(): func _on_host_steam_pressed():
@@ -113,6 +85,22 @@ func check_command_line() -> void:
hide() hide()
#region Non steam
func _on_ip_join_pressed():
var avatar: ImageTexture = ImageTexture.create_from_image(ip_avatar_image.texture_normal.get_image())
NetworkManager.join_server(ip_edit.text, username_input.text, avatar)
add_world()
hide()
func _on_host_ip_pressed():
var avatar: ImageTexture = ImageTexture.create_from_image(ip_avatar_image.texture_normal.get_image())
NetworkManager.start_server(username_input.text, avatar)
add_world()
hide()
func _on_username_input_text_changed(new_text: String) -> void: func _on_username_input_text_changed(new_text: String) -> void:
if new_text == "": if new_text == "":
ip_host_button.hide() ip_host_button.hide()
@@ -149,3 +137,4 @@ func _on_ip_avatar_clicked():
add_child(file_dialog) add_child(file_dialog)
file_dialog.popup_centered() file_dialog.popup_centered()
#endregion

View File

@@ -51,19 +51,12 @@ layout_mode = 2
size_flags_horizontal = 6 size_flags_horizontal = 6
text = "Multiplayer Template Game" text = "Multiplayer Template Game"
[node name="UseSteamCheck" type="CheckButton" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=2050719522]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
text = "Use Steam"
[node name="HBoxContainer" type="HBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer" unique_id=1028494634] [node name="HBoxContainer" type="HBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer" unique_id=1028494634]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
[node name="SteamControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=614477215] [node name="SteamControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=614477215]
unique_name_in_owner = true unique_name_in_owner = true
visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 4 size_flags_vertical = 4
@@ -112,6 +105,7 @@ text = "Host"
[node name="ENetControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1909532057] [node name="ENetControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1909532057]
unique_name_in_owner = true unique_name_in_owner = true
visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 4 size_flags_vertical = 4

View File

@@ -34,17 +34,8 @@ func _connect_multiplayer_signals(is_server: bool):
multiplayer.connected_to_server.connect(_on_connected_to_server) multiplayer.connected_to_server.connect(_on_connected_to_server)
func start_server(username: String, avatar: ImageTexture):
is_steam_lobby = false
ip_username = username
ip_avatar = avatar
enet_peer.create_server(port)
multiplayer.multiplayer_peer = enet_peer
_connect_multiplayer_signals(true)
add_player(1)
func start_steam_lobby(): func start_steam_lobby():
create_loading_screen("Creating lobby...")
Steam.lobby_created.connect(_on_steam_lobby_created) Steam.lobby_created.connect(_on_steam_lobby_created)
Steam.createLobby(Steam.LOBBY_TYPE_PUBLIC, 10) Steam.createLobby(Steam.LOBBY_TYPE_PUBLIC, 10)
is_host_steam = true is_host_steam = true
@@ -63,18 +54,7 @@ func _on_steam_lobby_created(result: int, lobby_id: int) -> void:
is_steam_lobby = true is_steam_lobby = true
add_player(1) add_player(1)
print("Lobby created. ID: " + str(lobby_id)) print("Lobby created. ID: " + str(lobby_id))
print("Steam ID for host: " + str(steam_peer.get_steam_id_for_peer_id(1))) loading_screen.queue_free()
print("Steam ID for host (from autoload): " + str(Steamworks.steam_id))
func join_server(ip: String, username: String, avatar: ImageTexture):
is_steam_lobby = false
ip_username = username
ip_avatar = avatar
enet_peer.create_client(ip, port)
multiplayer.multiplayer_peer = enet_peer
_connect_multiplayer_signals(false)
create_loading_screen()
func join_steam_lobby(lobby_id: int): func join_steam_lobby(lobby_id: int):
@@ -118,12 +98,6 @@ func set_player_details_steam(peer_id: int, steam_id: int):
await player_list[peer_id].set_player_info_steam(steam_id) await player_list[peer_id].set_player_info_steam(steam_id)
@rpc("any_peer", "call_local")
func set_player_details_ip(peer_id: int, username: String, avatar_bytes: PackedByteArray):
if player_list.has(peer_id):
await player_list[peer_id].set_player_info_ip(username, avatar_bytes)
func add_player(peer_id: int): func add_player(peer_id: int):
var new_player: Player = PLAYER.instantiate() var new_player: Player = PLAYER.instantiate()
new_player.name = str(peer_id) new_player.name = str(peer_id)
@@ -173,3 +147,32 @@ func _cleanup_steam_signals():
Steam.lobby_created.disconnect(_on_steam_lobby_created) Steam.lobby_created.disconnect(_on_steam_lobby_created)
if Steam.lobby_joined.is_connected(_on_join_steam_lobby): if Steam.lobby_joined.is_connected(_on_join_steam_lobby):
Steam.lobby_joined.disconnect(_on_join_steam_lobby) Steam.lobby_joined.disconnect(_on_join_steam_lobby)
#region Non-steam
func start_server(username: String, avatar: ImageTexture):
is_steam_lobby = false
ip_username = username
ip_avatar = avatar
enet_peer.create_server(port)
multiplayer.multiplayer_peer = enet_peer
_connect_multiplayer_signals(true)
add_player(1)
func join_server(ip: String, username: String, avatar: ImageTexture):
is_steam_lobby = false
ip_username = username
ip_avatar = avatar
enet_peer.create_client(ip, port)
multiplayer.multiplayer_peer = enet_peer
_connect_multiplayer_signals(false)
create_loading_screen()
@rpc("any_peer", "call_local")
func set_player_details_ip(peer_id: int, username: String, avatar_bytes: PackedByteArray):
if player_list.has(peer_id):
await player_list[peer_id].set_player_info_ip(username, avatar_bytes)
#endregion

View File

@@ -1,30 +1,38 @@
extends Node extends Node
var use_steam := true
var is_initalized: bool = false var is_initalized: bool = false
var steam_id: int = 0
var steam_id: int var steam_username: String = "None"
var steam_username: String
var steam_avatar: ImageTexture var steam_avatar: ImageTexture
var tmp_avatar_image_texture: ImageTexture var tmp_avatar_image_texture: ImageTexture
func _ready() -> void: func _ready() -> void:
if is_initalized: return if is_initalized: return
if OS.has_feature("nosteam"):
print("[Steamworks] Window has flag 'nosteam', skipping steam initalization")
use_steam = false
return
var response := Steam.steamInitEx() var response := Steam.steamInitEx()
if response["status"] != 0: if response["status"] != 0:
push_warning("Steam failed to initalize: " + str(response)) push_error("Steam failed to initalize: " + str(response))
print("Steam failed to initalize. Error code: " + str(response))
await get_tree().create_timer(1).timeout
get_tree().quit()
return return
print("Steam initalized successfully")
is_initalized = true
steam_id = Steam.getSteamID() steam_id = Steam.getSteamID()
steam_username = Steam.getPersonaName() steam_username = Steam.getPersonaName()
steam_avatar = await get_player_avatar(steam_id) steam_avatar = await get_player_avatar(steam_id)
print("Steam initalized successfully")
is_initalized = true
func get_player_avatar(steam_id: int) -> ImageTexture: func get_player_avatar(steam_id: int) -> ImageTexture:
if !is_initalized or !use_steam: return
Steam.getPlayerAvatar(Steam.AVATAR_LARGE, steam_id) Steam.getPlayerAvatar(Steam.AVATAR_LARGE, steam_id)
var result = await Steam.avatar_loaded # returns (avatar_id, width, avatar_data) var result = await Steam.avatar_loaded # returns (avatar_id, width, avatar_data)