diff --git a/3d_mp_base/scenes/ui/main_menu.gd b/3d_mp_base/scenes/ui/main_menu.gd index ca86d27..71018f2 100644 --- a/3d_mp_base/scenes/ui/main_menu.gd +++ b/3d_mp_base/scenes/ui/main_menu.gd @@ -1,75 +1,47 @@ extends CanvasLayer -@onready var use_steam_check: CheckButton = %UseSteamCheck -@onready var ip_edit: LineEdit = %IPEdit -@onready var join_ip_button: Button = %JoinIPButton + +@onready var quit_button: Button = %QuitButton @onready var steam_host_button: Button = %SteamHostButton @onready var steam_lobby_id_edit: LineEdit = %SteamLobbyIDEdit @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 e_net_controls: VBoxContainer = %ENetControls @onready var steam_avatar: TextureRect = %SteamAvatar @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 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 PLAYER = preload("uid://cq6ovfsdvnt40") + func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - - #if OS.has_feature("server"): - #add_world() - #NetworkManager.start_server() - #hide() - - use_steam_check.toggled.connect(_on_use_steam_toggled) - - join_ip_button.pressed.connect(_on_ip_join_pressed) + check_command_line() quit_button.pressed.connect(func(): get_tree().quit()) - ip_host_button.pressed.connect(_on_host_ip_pressed) - username_input.text_changed.connect(_on_username_input_text_changed) - ip_avatar_image.pressed.connect(_on_ip_avatar_clicked) + + if OS.has_feature("nosteam"): + steam_controls.hide() + e_net_controls.show() + + join_ip_button.pressed.connect(_on_ip_join_pressed) + ip_host_button.pressed.connect(_on_host_ip_pressed) + username_input.text_changed.connect(_on_username_input_text_changed) + ip_avatar_image.pressed.connect(_on_ip_avatar_clicked) + return join_steam_button.pressed.connect(_on_join_steam_pressed) steam_host_button.pressed.connect(_on_host_steam_pressed) steam_lobby_id_edit.text_changed.connect(_on_lobby_text_changed) - 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_avatar.texture = Steamworks.steam_avatar - 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() + + steam_username_label.text = Steamworks.steam_username + steam_avatar.texture = await Steamworks.get_player_avatar(Steamworks.steam_id) func _on_host_steam_pressed(): @@ -113,6 +85,22 @@ func check_command_line() -> void: 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: if new_text == "": ip_host_button.hide() @@ -149,3 +137,4 @@ func _on_ip_avatar_clicked(): add_child(file_dialog) file_dialog.popup_centered() +#endregion diff --git a/3d_mp_base/scenes/ui/main_menu.tscn b/3d_mp_base/scenes/ui/main_menu.tscn index 1a674b9..0c0b87d 100644 --- a/3d_mp_base/scenes/ui/main_menu.tscn +++ b/3d_mp_base/scenes/ui/main_menu.tscn @@ -51,19 +51,12 @@ layout_mode = 2 size_flags_horizontal = 6 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] layout_mode = 2 size_flags_vertical = 3 [node name="SteamControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=614477215] unique_name_in_owner = true -visible = false layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 4 @@ -112,6 +105,7 @@ text = "Host" [node name="ENetControls" type="VBoxContainer" parent="Control/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1909532057] unique_name_in_owner = true +visible = false layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 4 diff --git a/3d_mp_base/scripts/NetworkManager.gd b/3d_mp_base/scripts/NetworkManager.gd index 58dba8d..d76b02b 100644 --- a/3d_mp_base/scripts/NetworkManager.gd +++ b/3d_mp_base/scripts/NetworkManager.gd @@ -34,17 +34,8 @@ func _connect_multiplayer_signals(is_server: bool): 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(): + create_loading_screen("Creating lobby...") Steam.lobby_created.connect(_on_steam_lobby_created) Steam.createLobby(Steam.LOBBY_TYPE_PUBLIC, 10) is_host_steam = true @@ -63,18 +54,7 @@ func _on_steam_lobby_created(result: int, lobby_id: int) -> void: is_steam_lobby = true add_player(1) print("Lobby created. ID: " + str(lobby_id)) - print("Steam ID for host: " + str(steam_peer.get_steam_id_for_peer_id(1))) - 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() + loading_screen.queue_free() 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) -@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): var new_player: Player = PLAYER.instantiate() new_player.name = str(peer_id) @@ -173,3 +147,32 @@ func _cleanup_steam_signals(): Steam.lobby_created.disconnect(_on_steam_lobby_created) if Steam.lobby_joined.is_connected(_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 diff --git a/3d_mp_base/scripts/Steamworks.gd b/3d_mp_base/scripts/Steamworks.gd index 013320e..1d40767 100644 --- a/3d_mp_base/scripts/Steamworks.gd +++ b/3d_mp_base/scripts/Steamworks.gd @@ -1,30 +1,38 @@ extends Node +var use_steam := true var is_initalized: bool = false - -var steam_id: int -var steam_username: String +var steam_id: int = 0 +var steam_username: String = "None" var steam_avatar: ImageTexture - var tmp_avatar_image_texture: ImageTexture + func _ready() -> void: 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() 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 + print("Steam initalized successfully") + is_initalized = true + steam_id = Steam.getSteamID() steam_username = Steam.getPersonaName() steam_avatar = await get_player_avatar(steam_id) - - print("Steam initalized successfully") - is_initalized = true func get_player_avatar(steam_id: int) -> ImageTexture: + if !is_initalized or !use_steam: return Steam.getPlayerAvatar(Steam.AVATAR_LARGE, steam_id) var result = await Steam.avatar_loaded # returns (avatar_id, width, avatar_data)