From 63209ccc1e06c3e9941f05a6ce654e698bef89f7 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sun, 7 Dec 2025 18:13:21 +0500 Subject: [PATCH] Late connection --- project.godot | 3 +- scenes/game.tscn | 19 ++++++++ scenes/main_menu.tscn | 4 +- scripts/gui/hud/player_round_display.gd | 1 + scripts/gui/lobby/lobby_buttons.gd | 8 ---- scripts/gui/main_menu_gui.gd | 5 ++- scripts/multiplayer/lobby.gd | 10 ++--- scripts/multiplayer/session.gd | 43 +++++++++++++++++-- .../multiplayer/spawn_system/team_spawner.gd | 3 ++ 9 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 scenes/game.tscn diff --git a/project.godot b/project.godot index 62e91e6..9d10f0e 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Chelimbalo" -run/main_scene="uid://cbtp4rvg66ba1" +run/main_scene="uid://dstie24qkbc86" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" @@ -22,7 +22,6 @@ Lobby="*res://scripts/multiplayer/lobby.gd" Session="*res://scripts/multiplayer/session.gd" ClientSettings="*res://scripts/client_settings.gd" Registry="*res://scripts/registry.gd" -ClientSettingsMenu="res://scenes/gui/client_settings.tscn" [display] diff --git a/scenes/game.tscn b/scenes/game.tscn new file mode 100644 index 0000000..375d4b7 --- /dev/null +++ b/scenes/game.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 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"] + +[node name="Game" type="Node"] + +[node name="ClientSettingsMenu" parent="." instance=ExtResource("1_yqjtg")] + +[node name="MainMenu" parent="." instance=ExtResource("2_lnu2h")] +unique_name_in_owner = true + +[node name="LevelContainer" type="Node" parent="."] +unique_name_in_owner = true + +[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="LevelContainer"] +_spawnable_scenes = PackedStringArray("uid://cqrh2cc7m2i7f", "uid://cc2v2f2ppu68w") +spawn_path = NodePath("..") +spawn_limit = 1 diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn index a229a05..476557a 100644 --- a/scenes/main_menu.tscn +++ b/scenes/main_menu.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=3 format=3 uid="uid://cbtp4rvg66ba1"] +[gd_scene load_steps=2 format=3 uid="uid://cbtp4rvg66ba1"] [ext_resource type="Script" uid="uid://bsyuos803g7qf" path="res://scripts/gui/main_menu_gui.gd" id="1_l6cm7"] -[ext_resource type="Script" uid="uid://2uyxkfmbbims" path="res://scripts/gui/lobby/lobby_buttons.gd" id="3_bqqt6"] [node name="MainMenu" type="CenterContainer"] anchors_preset = 15 @@ -77,7 +76,6 @@ horizontal_alignment = 1 [node name="Buttons" type="HBoxContainer" parent="Lobby/VBoxContainer"] layout_mode = 2 alignment = 1 -script = ExtResource("3_bqqt6") [node name="LeaveButton" type="Button" parent="Lobby/VBoxContainer/Buttons"] unique_name_in_owner = true diff --git a/scripts/gui/hud/player_round_display.gd b/scripts/gui/hud/player_round_display.gd index ecc7afd..6b578a2 100644 --- a/scripts/gui/hud/player_round_display.gd +++ b/scripts/gui/hud/player_round_display.gd @@ -5,6 +5,7 @@ extends Label # Called when the node enters the scene tree for the first time. func _ready() -> void: Session.round_started.connect(update) + Session.session_started.connect(update) func update(): if our_side: diff --git a/scripts/gui/lobby/lobby_buttons.gd b/scripts/gui/lobby/lobby_buttons.gd index e18eaf7..57fc58a 100644 --- a/scripts/gui/lobby/lobby_buttons.gd +++ b/scripts/gui/lobby/lobby_buttons.gd @@ -3,13 +3,5 @@ extends Node func _ready() -> void: Lobby.lobby_joined.connect(on_lobby_joined) -func _on_leave_button_pressed() -> void: - Lobby.leave() - $"../..".hide() - $"../../../MainMenu".show() - -func _on_start_button_pressed() -> void: - Lobby.start_game.rpc() - func on_lobby_joined() -> void: $StartButton.hide() diff --git a/scripts/gui/main_menu_gui.gd b/scripts/gui/main_menu_gui.gd index 7bca66e..ca4ddac 100644 --- a/scripts/gui/main_menu_gui.gd +++ b/scripts/gui/main_menu_gui.gd @@ -1,8 +1,9 @@ -extends Node +extends Control func _ready() -> void: Lobby.lobby_joined.connect(hide_host_buttons) + Session.session_started.connect(hide) Lobby.lobby_created.connect(show_host_buttons) Lobby.lobby_closed.connect(cleanup_lobby) Lobby.update_teams_state.connect(on_player_switched_team) @@ -20,7 +21,7 @@ func cleanup_lobby() -> void: func _on_start_button_pressed() -> void: - Lobby.start_game.rpc() + Lobby.start_game() func hide_host_buttons() -> void: %StartButton.hide() diff --git a/scripts/multiplayer/lobby.gd b/scripts/multiplayer/lobby.gd index d90dbda..a240d78 100644 --- a/scripts/multiplayer/lobby.gd +++ b/scripts/multiplayer/lobby.gd @@ -145,12 +145,12 @@ func server_team_switch(id: int, team: int) -> void: defence_team.erase(id) specators_team.append(id) -@rpc("authority","call_local","reliable") func start_game() -> void: - get_tree().change_scene_to_file("res://levels/prototype_scene.tscn") - if multiplayer.is_server(): - await get_tree().scene_changed - Session.start_session() + if not multiplayer.is_server(): + return + get_tree().current_scene.get_node("%MainMenu").visible = false + get_tree().current_scene.get_node("%LevelContainer").add_child(preload("res://levels/prototype_scene.tscn").instantiate()) + Session.start_session() func get_team() -> Session.TEAMS: var id = multiplayer.get_unique_id() diff --git a/scripts/multiplayer/session.gd b/scripts/multiplayer/session.gd index ac95fbd..4830b37 100644 --- a/scripts/multiplayer/session.gd +++ b/scripts/multiplayer/session.gd @@ -19,7 +19,10 @@ enum ROUND_STATES { const ATTACK_LAYER: int = 0b10000 const DEFENCE_LAYER: int = 0b100000 +signal session_started +signal session_ended signal round_started +signal late_player_connected(id: int) signal round_state_changed(state: int) signal player_stopped_interacting(id: int) @@ -41,7 +44,7 @@ var round_timer: Timer var buy_timer: Timer var round_state: ROUND_STATES -var session_started: bool = false +var session_started_flag: bool = false var reference_round_time: float @@ -67,6 +70,38 @@ func _ready() -> void: add_child(bomb_timer) add_child(round_timer) add_child(buy_timer) + + multiplayer.peer_connected.connect(sync_session_server) + +func sync_session_server(id: int): + if multiplayer.is_server() == false or session_started_flag == false: + return + + var data: PackedByteArray + data.resize(6) + data.encode_u8(0,current_round) + data.encode_u8(1,attacker_score) + data.encode_u8(2,defender_score) + data.encode_u8(3,attackers_alive) + data.encode_u8(4,defenders_alive) + data.encode_u8(5,round_state) + + sync_session_client.rpc_id(id,data) + late_player_connected.emit(id) + +@rpc("authority","call_remote","reliable") +func sync_session_client(data: PackedByteArray): + if not is_server_request(): + return + + current_round = data.decode_u8(0) + attacker_score = data.decode_u8(1) + defender_score = data.decode_u8(2) + attackers_alive = data.decode_u8(3) + defenders_alive = data.decode_u8(4) + round_state = data.decode_u8(5) as ROUND_STATES + session_started.emit() + func _process(_delta: float) -> void: if multiplayer.is_server() == false or not session_started: @@ -96,7 +131,8 @@ func start_session() -> void: current_round = 0 attacker_score = 0 defender_score = 0 - session_started = true + session_started_flag = true + session_started.emit() start_round() @@ -111,8 +147,9 @@ func end_session() -> void: round_timer.stop() buy_timer.stop() object_containers.clear() + session_ended.emit() - session_started = false + session_started_flag = false @rpc("authority","call_remote","reliable") func start_round() -> void: diff --git a/scripts/multiplayer/spawn_system/team_spawner.gd b/scripts/multiplayer/spawn_system/team_spawner.gd index 80bb81e..93c177a 100644 --- a/scripts/multiplayer/spawn_system/team_spawner.gd +++ b/scripts/multiplayer/spawn_system/team_spawner.gd @@ -8,6 +8,9 @@ func _ready() -> void: queue_free() return Session.round_started.connect(spawn) + if team == Session.TEAMS.SPECTATE: + Session.late_player_connected.connect(spawn_spectator) + func _exit_tree() -> void: if not multiplayer.is_server():