From 35c52092573a36828998b3796e28778d37b31669 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 29 Jul 2026 01:40:24 +0300 Subject: [PATCH] Add simple menu player to lobby --- godot/scenes/lobby.tscn | 58 +++++++++------- godot/scenes/main.tscn | 2 +- .../scenes/{misc => player}/menu_player.tscn | 0 rust/src/lib.rs | 1 + rust/src/lobby_world.rs | 67 +++++++++++++++++++ 5 files changed, 102 insertions(+), 26 deletions(-) rename godot/scenes/{misc => player}/menu_player.tscn (100%) create mode 100644 rust/src/lobby_world.rs diff --git a/godot/scenes/lobby.tscn b/godot/scenes/lobby.tscn index 801f25b..900f1d4 100644 --- a/godot/scenes/lobby.tscn +++ b/godot/scenes/lobby.tscn @@ -2,6 +2,7 @@ [ext_resource type="PackedScene" uid="uid://ccd0wj2usx5os" path="res://scenes/ui/lobby_player_listing.tscn" id="1_o1atq"] [ext_resource type="PackedScene" uid="uid://ffh5txda3j1" path="res://scenes/ui/chat_box.tscn" id="2_5gu6x"] +[ext_resource type="PackedScene" uid="uid://bbmc2gmy7g8ag" path="res://scenes/player/menu_player.tscn" id="3_q60fs"] [sub_resource type="LabelSettings" id="LabelSettings_1cgct"] font_size = 32 @@ -9,7 +10,10 @@ font_size = 32 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jbm04"] bg_color = Color(0.30692267, 0.3069227, 0.30692264, 1) -[node name="lobby" type="LobbyPanel" unique_id=915192272 node_paths=PackedStringArray("players_list", "name_field", "ready_button", "map_selection", "options_panel", "options_grid")] +[node name="lobby_world" type="LobbyWorld" unique_id=129662054] +menu_player_scene = ExtResource("3_q60fs") + +[node name="lobby" type="LobbyPanel" parent="." unique_id=915192272 node_paths=PackedStringArray("players_list", "name_field", "ready_button", "map_selection", "options_panel", "options_grid")] players_list = NodePath("v_box_container/players_list") name_field = NodePath("v_box_container/h_box_container/text_edit") player_listing_prefab = ExtResource("1_o1atq") @@ -23,7 +27,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="label" type="Label" parent="." unique_id=1445541926] +[node name="label" type="Label" parent="lobby" unique_id=1445541926] layout_mode = 1 anchors_preset = 10 anchor_right = 1.0 @@ -34,37 +38,37 @@ text = "Lobby" label_settings = SubResource("LabelSettings_1cgct") horizontal_alignment = 1 -[node name="v_box_container" type="VBoxContainer" parent="." unique_id=336946640] +[node name="v_box_container" type="VBoxContainer" parent="lobby" unique_id=336946640] layout_mode = 0 offset_left = 85.0 offset_top = 111.0 offset_right = 290.0 offset_bottom = 165.0 -[node name="h_box_container" type="HBoxContainer" parent="v_box_container" unique_id=1789302658] +[node name="h_box_container" type="HBoxContainer" parent="lobby/v_box_container" unique_id=1789302658] layout_mode = 2 offset_transform_position = Vector2(100, 0) metadata/_edit_lock_ = true -[node name="label" type="Label" parent="v_box_container/h_box_container" unique_id=626633696] +[node name="label" type="Label" parent="lobby/v_box_container/h_box_container" unique_id=626633696] layout_mode = 2 text = "Name:" -[node name="text_edit" type="LineEdit" parent="v_box_container/h_box_container" unique_id=284528736] +[node name="text_edit" type="LineEdit" parent="lobby/v_box_container/h_box_container" unique_id=284528736] custom_minimum_size = Vector2(150, 0) layout_mode = 2 max_length = 20 -[node name="players_label" type="Label" parent="v_box_container" unique_id=1537542117] +[node name="players_label" type="Label" parent="lobby/v_box_container" unique_id=1537542117] layout_mode = 2 text = "Players:" metadata/_edit_lock_ = true -[node name="players_list" type="VBoxContainer" parent="v_box_container" unique_id=1834737379] +[node name="players_list" type="VBoxContainer" parent="lobby/v_box_container" unique_id=1834737379] layout_mode = 2 metadata/_edit_lock_ = true -[node name="v_box_container2" type="VBoxContainer" parent="." unique_id=653902328] +[node name="v_box_container2" type="VBoxContainer" parent="lobby" unique_id=653902328] layout_mode = 1 anchors_preset = 1 anchor_left = 1.0 @@ -75,11 +79,11 @@ offset_right = -727.0 offset_bottom = 169.0 grow_horizontal = 0 -[node name="option_button" type="OptionButton" parent="v_box_container2" unique_id=426342653] +[node name="option_button" type="OptionButton" parent="lobby/v_box_container2" unique_id=426342653] layout_mode = 2 metadata/_edit_lock_ = true -[node name="options_panel" type="Panel" parent="." unique_id=1194589850] +[node name="options_panel" type="Panel" parent="lobby" unique_id=1194589850] visible = false layout_mode = 1 anchors_preset = 8 @@ -95,7 +99,7 @@ grow_horizontal = 2 grow_vertical = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_jbm04") -[node name="options_close" type="Button" parent="options_panel" unique_id=2115857774] +[node name="options_close" type="Button" parent="lobby/options_panel" unique_id=2115857774] layout_mode = 1 anchors_preset = 1 anchor_left = 1.0 @@ -105,25 +109,25 @@ offset_bottom = 31.0 grow_horizontal = 0 text = "X" -[node name="h_box_container" type="VBoxContainer" parent="options_panel" unique_id=1163233032] +[node name="h_box_container" type="VBoxContainer" parent="lobby/options_panel" unique_id=1163233032] layout_mode = 0 offset_left = 0.5 offset_top = 3.5 offset_right = 115.5 offset_bottom = 43.5 -[node name="label" type="Label" parent="options_panel/h_box_container" unique_id=1002581329] +[node name="label" type="Label" parent="lobby/options_panel/h_box_container" unique_id=1002581329] layout_mode = 2 text = "Game Options" -[node name="v_box_container" type="HBoxContainer" parent="options_panel/h_box_container" unique_id=1445409921] +[node name="v_box_container" type="HBoxContainer" parent="lobby/options_panel/h_box_container" unique_id=1445409921] layout_mode = 2 -[node name="options_grid" type="GridContainer" parent="options_panel/h_box_container" unique_id=504671462] +[node name="options_grid" type="GridContainer" parent="lobby/options_panel/h_box_container" unique_id=504671462] layout_mode = 2 columns = 2 -[node name="chat_box" parent="." unique_id=1125601400 instance=ExtResource("2_5gu6x")] +[node name="chat_box" parent="lobby" unique_id=1125601400 instance=ExtResource("2_5gu6x")] custom_minimum_size = Vector2(400, 300) custom_maximum_size = Vector2(400, 300) layout_mode = 1 @@ -139,34 +143,38 @@ offset_bottom = -52.0 grow_horizontal = 0 grow_vertical = 0 -[node name="v_box_container3" type="VBoxContainer" parent="." unique_id=1320505732] +[node name="v_box_container3" type="VBoxContainer" parent="lobby" unique_id=1320505732] layout_mode = 0 offset_left = 87.0 offset_top = 538.0 offset_right = 198.0 offset_bottom = 604.0 -[node name="ready_button" type="Button" parent="v_box_container3" unique_id=311553419] +[node name="ready_button" type="Button" parent="lobby/v_box_container3" unique_id=311553419] custom_minimum_size = Vector2(100, 0) custom_maximum_size = Vector2(100, -1) layout_mode = 2 text = "Not Ready" metadata/_edit_lock_ = true -[node name="h_box_container" type="HBoxContainer" parent="v_box_container3" unique_id=1165099293] +[node name="h_box_container" type="HBoxContainer" parent="lobby/v_box_container3" unique_id=1165099293] layout_mode = 2 metadata/_edit_lock_ = true -[node name="exit_button" type="Button" parent="v_box_container3/h_box_container" unique_id=267703633] +[node name="exit_button" type="Button" parent="lobby/v_box_container3/h_box_container" unique_id=267703633] layout_mode = 2 text = "Exit" metadata/_edit_lock_ = true -[node name="options_button" type="Button" parent="v_box_container3/h_box_container" unique_id=2109111628] +[node name="options_button" type="Button" parent="lobby/v_box_container3/h_box_container" unique_id=2109111628] layout_mode = 2 text = "Options" metadata/_edit_lock_ = true -[connection signal="pressed" from="options_panel/options_close" to="." method="close_options"] -[connection signal="pressed" from="v_box_container3/h_box_container/exit_button" to="." method="exit"] -[connection signal="pressed" from="v_box_container3/h_box_container/options_button" to="." method="open_options"] +[node name="camera_3d" type="Camera3D" parent="." unique_id=131019329] +transform = Transform3D(0.69531304, -0.068955034, 0.7153915, 3.1173069e-09, 0.99538684, 0.09594317, -0.718707, -0.06671053, 0.6921054, 3.165125, 2.0609732, 2.7751796) +current = true + +[connection signal="pressed" from="lobby/options_panel/options_close" to="lobby" method="close_options"] +[connection signal="pressed" from="lobby/v_box_container3/h_box_container/exit_button" to="lobby" method="exit"] +[connection signal="pressed" from="lobby/v_box_container3/h_box_container/options_button" to="lobby" method="open_options"] diff --git a/godot/scenes/main.tscn b/godot/scenes/main.tscn index f28f1be..9bddea7 100644 --- a/godot/scenes/main.tscn +++ b/godot/scenes/main.tscn @@ -1,6 +1,6 @@ [gd_scene format=4 uid="uid://lahirbqfppvw"] -[ext_resource type="PackedScene" uid="uid://bbmc2gmy7g8ag" path="res://scenes/misc/menu_player.tscn" id="1_o5qli"] +[ext_resource type="PackedScene" uid="uid://bbmc2gmy7g8ag" path="res://scenes/player/menu_player.tscn" id="1_o5qli"] [ext_resource type="PackedScene" uid="uid://dsxu0y8pjbw3k" path="res://scenes/ui/credits.tscn" id="1_sugp2"] [ext_resource type="PackedScene" uid="uid://n3u0jr4wiib1" path="res://scenes/ui/settings.tscn" id="2_0wfyh"] [ext_resource type="Script" uid="uid://cwu5cf7a0awcd" path="res://addons/func_godot/src/map/func_godot_map.gd" id="4_yc10j"] diff --git a/godot/scenes/misc/menu_player.tscn b/godot/scenes/player/menu_player.tscn similarity index 100% rename from godot/scenes/misc/menu_player.tscn rename to godot/scenes/player/menu_player.tscn diff --git a/rust/src/lib.rs b/rust/src/lib.rs index d2ed3f1..25c8e48 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -9,6 +9,7 @@ pub mod game_manager; pub mod game_settings; pub mod goal; pub mod killbox; +pub mod lobby_world; pub mod map; pub mod map_resource; pub mod net; diff --git a/rust/src/lobby_world.rs b/rust/src/lobby_world.rs new file mode 100644 index 0000000..1020fb8 --- /dev/null +++ b/rust/src/lobby_world.rs @@ -0,0 +1,67 @@ +use std::{collections::HashMap, f32::consts::PI}; + +use godot::{classes::RandomNumberGenerator, prelude::*}; + +use crate::{game_manager::Game, ui::menu_player::MenuPlayer}; + +#[derive(GodotClass)] +#[class(base=Node3D, init)] +pub struct LobbyWorld { + #[export] + menu_player_scene: Option>, + + rng: Gd, + + menu_players: HashMap>, + + base: Base, +} + +#[godot_api] +impl INode3D for LobbyWorld { + fn ready(&mut self) { + if let Some(game) = Game::singleton() + && let Some(scene) = self.menu_player_scene.clone() + { + for player in &game.bind().players { + self.spawn_player(player.id()); + } + + game.signals() + .on_new_player() + .connect_other(self, Self::on_new_player); + game.signals() + .on_player_disconnected() + .connect_other(self, Self::on_player_disconnected); + } + } +} + +impl LobbyWorld { + fn on_new_player(&mut self, player_id: u16) { + self.spawn_player(player_id); + } + + fn on_player_disconnected(&mut self, player_id: u16) { + if let Some(mut player) = self.menu_players.remove(&player_id) { + player.queue_free(); + } + } + + fn spawn_player(&mut self, player_id: u16) { + self.run_deferred(move |s| { + if let Some(scene) = s.menu_player_scene.clone() { + let x = s.rng.randf_range(-2., 2.); + let z = s.rng.randf_range(-2., 2.); + let rotation = s.rng.randf_range(PI / 4., PI / 2.); + + let mut menu_player = scene.instantiate_as::(); + s.menu_players.insert(player_id, menu_player.clone()); + s.base_mut().add_child(&menu_player); + + menu_player.set_position(Vector3::new(x, 0., z)); + menu_player.set_rotation(Vector3::UP * rotation); + } + }); + } +}