From 4dce5bd4ca7eb655afb16be7511c5454cc124367 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 8 Dec 2025 14:58:25 +0500 Subject: [PATCH] Session quitting --- scenes/game.tscn | 4 +++- scenes/gui/client_settings.tscn | 7 ++++++- scripts/gui/client_settings_menu.gd | 9 +++++++++ scripts/gui/main_menu_gui.gd | 10 ++++++++++ scripts/multiplayer/level_container.gd | 10 ++++++++++ scripts/multiplayer/level_container.gd.uid | 1 + scripts/multiplayer/session.gd | 9 +++++++++ 7 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 scripts/multiplayer/level_container.gd create mode 100644 scripts/multiplayer/level_container.gd.uid diff --git a/scenes/game.tscn b/scenes/game.tscn index 375d4b7..011867b 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://dstie24qkbc86"] +[gd_scene load_steps=4 format=3 uid="uid://dstie24qkbc86"] [ext_resource type="PackedScene" uid="uid://bv6ptrditssow" path="res://scenes/gui/client_settings.tscn" id="1_yqjtg"] [ext_resource type="PackedScene" uid="uid://cbtp4rvg66ba1" path="res://scenes/main_menu.tscn" id="2_lnu2h"] +[ext_resource type="Script" uid="uid://dj4mlrime72hx" path="res://scripts/multiplayer/level_container.gd" id="3_lnu2h"] [node name="Game" type="Node"] @@ -12,6 +13,7 @@ unique_name_in_owner = true [node name="LevelContainer" type="Node" parent="."] unique_name_in_owner = true +script = ExtResource("3_lnu2h") [node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="LevelContainer"] _spawnable_scenes = PackedStringArray("uid://cqrh2cc7m2i7f", "uid://cc2v2f2ppu68w") diff --git a/scenes/gui/client_settings.tscn b/scenes/gui/client_settings.tscn index 241c791..0696618 100644 --- a/scenes/gui/client_settings.tscn +++ b/scenes/gui/client_settings.tscn @@ -14,7 +14,6 @@ grow_vertical = 2 mouse_filter = 2 [node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] -visible = false layout_mode = 2 script = ExtResource("1_xqyus") @@ -63,8 +62,14 @@ max_value = 1.0 step = 0.01 value = 1.0 +[node name="LeaveButton" type="Button" parent="CenterContainer/PanelContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Покинуть сессию" + [connection signal="pressed" from="CenterContainer/PanelContainer/VBoxContainer/FullscreenButton" to="CenterContainer/PanelContainer" method="_on_fullscreen_button_pressed"] [connection signal="toggled" from="CenterContainer/PanelContainer/VBoxContainer/FullscreenButton" to="CenterContainer/PanelContainer" method="_on_fullscreen_button_toggled"] [connection signal="value_changed" from="CenterContainer/PanelContainer/VBoxContainer/Sensitivity/SensitivitySlider" to="CenterContainer/PanelContainer" method="_on_sensitivity_slider_value_changed"] [connection signal="value_changed" from="CenterContainer/PanelContainer/VBoxContainer/Sensitivity/SensitivityBox" to="CenterContainer/PanelContainer" method="_on_sensitivity_box_value_changed"] [connection signal="value_changed" from="CenterContainer/PanelContainer/VBoxContainer/GameplayMainAudio/GameplayMainSlider" to="CenterContainer/PanelContainer" method="_on_gameplay_main_slider_value_changed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/VBoxContainer/LeaveButton" to="CenterContainer/PanelContainer" method="_on_leave_button_pressed"] diff --git a/scripts/gui/client_settings_menu.gd b/scripts/gui/client_settings_menu.gd index 33751ec..ec537f1 100644 --- a/scripts/gui/client_settings_menu.gd +++ b/scripts/gui/client_settings_menu.gd @@ -2,6 +2,11 @@ extends Control var cached_mouse_state: Input.MouseMode +func _ready() -> void: + hide() + Session.session_started.connect(%LeaveButton.show) + Session.session_ended.connect(%LeaveButton.hide) + func _input(event: InputEvent) -> void: if event.is_action_pressed("menu_settings"): visible = not visible @@ -25,3 +30,7 @@ func _on_sensitivity_slider_value_changed(value: float) -> void: func _on_sensitivity_box_value_changed(value: float) -> void: $VBoxContainer/Sensitivity/HSlider.set_value_no_signal(value) ClientSettings.SENSITIVITY = value + + +func _on_leave_button_pressed() -> void: + Session.quit_session() diff --git a/scripts/gui/main_menu_gui.gd b/scripts/gui/main_menu_gui.gd index ba6f8a8..d7a366e 100644 --- a/scripts/gui/main_menu_gui.gd +++ b/scripts/gui/main_menu_gui.gd @@ -7,6 +7,7 @@ func _ready() -> void: Lobby.lobby_created.connect(show_host_buttons) Lobby.lobby_closed.connect(cleanup_lobby) Lobby.update_teams_state.connect(on_player_switched_team) + Session.session_ended.connect(on_session_ended) $Lobby.hide() $MainMenu.show() @@ -98,3 +99,12 @@ func _on_join_defence_button_pressed() -> void: func _on_join_spectators_button_pressed() -> void: Lobby.switch_team(Session.TEAMS.SPECTATE) + +func on_session_ended() -> void: + show() + if Lobby.in_lobby: + $MainMenu.hide() + $Lobby.show() + else: + $MainMenu.show() + $Lobby.hide() diff --git a/scripts/multiplayer/level_container.gd b/scripts/multiplayer/level_container.gd new file mode 100644 index 0000000..03bfe69 --- /dev/null +++ b/scripts/multiplayer/level_container.gd @@ -0,0 +1,10 @@ +extends Node + +func _ready() -> void: + Session.session_ended.connect(destroy_level) + +func destroy_level() -> void: + for child in get_children(): + if child is MultiplayerSpawner: + continue + child.queue_free() diff --git a/scripts/multiplayer/level_container.gd.uid b/scripts/multiplayer/level_container.gd.uid new file mode 100644 index 0000000..39a528f --- /dev/null +++ b/scripts/multiplayer/level_container.gd.uid @@ -0,0 +1 @@ +uid://dj4mlrime72hx diff --git a/scripts/multiplayer/session.gd b/scripts/multiplayer/session.gd index 0844b70..532d15b 100644 --- a/scripts/multiplayer/session.gd +++ b/scripts/multiplayer/session.gd @@ -155,6 +155,15 @@ func end_session() -> void: session_started_flag = false +func quit_session() -> void: + if multiplayer.is_server(): + end_session() + else: + session_ended.emit() + session_started_flag = false + Lobby.leave() + + @rpc("authority","call_remote","reliable") func start_round() -> void: if not is_server_request():