diff --git a/godot/scenes/player/menu_player.tscn b/godot/scenes/player/menu_player.tscn index c875952..84d7532 100644 --- a/godot/scenes/player/menu_player.tscn +++ b/godot/scenes/player/menu_player.tscn @@ -4,8 +4,9 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] -[node name="menu_player" type="MenuPlayer" unique_id=724765640 node_paths=PackedStringArray("mesh")] +[node name="menu_player" type="MenuPlayer" unique_id=724765640 node_paths=PackedStringArray("mesh", "name_label")] mesh = NodePath("soldier_m") +name_label = NodePath("name_label") [node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_pgypt")] transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) @@ -13,3 +14,9 @@ transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) [node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1493078812] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.995473, 0) shape = SubResource("CapsuleShape3D_1cgct") + +[node name="name_label" type="Label3D" parent="." unique_id=70007439] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.2580144, 0) +pixel_size = 0.003 +billboard = 1 +font_size = 64 diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index eaf2cb3..f31c457 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -609,9 +609,10 @@ impl Game { }); if emit { self.run_deferred(move |s| { - s.signals().on_player_team_changed().emit(player_id, team) + s.signals().on_player_team_changed().emit(player_id, team); }); } + self.run_deferred(|s| s.signals().on_players_updated().emit()); } } @@ -619,6 +620,7 @@ impl Game { if let Some(player) = self.find_player_mut(player_id) { player.data.team = team; self.run_deferred(move |s| s.signals().on_player_team_changed().emit(player_id, team)); + self.run_deferred(move |s| s.signals().on_players_updated().emit()); } } diff --git a/rust/src/lobby_world.rs b/rust/src/lobby_world.rs index 1020fb8..b45198d 100644 --- a/rust/src/lobby_world.rs +++ b/rust/src/lobby_world.rs @@ -20,9 +20,7 @@ pub struct LobbyWorld { #[godot_api] impl INode3D for LobbyWorld { fn ready(&mut self) { - if let Some(game) = Game::singleton() - && let Some(scene) = self.menu_player_scene.clone() - { + if let Some(game) = Game::singleton() { for player in &game.bind().players { self.spawn_player(player.id()); } @@ -33,6 +31,9 @@ impl INode3D for LobbyWorld { game.signals() .on_player_disconnected() .connect_other(self, Self::on_player_disconnected); + game.signals() + .on_players_updated() + .connect_other(self, Self::update_players); } } } @@ -56,12 +57,21 @@ impl LobbyWorld { let rotation = s.rng.randf_range(PI / 4., PI / 2.); let mut menu_player = scene.instantiate_as::(); + menu_player.bind_mut().player_id = Some(player_id); s.menu_players.insert(player_id, menu_player.clone()); s.base_mut().add_child(&menu_player); + menu_player.bind_mut().update(); + menu_player.set_position(Vector3::new(x, 0., z)); menu_player.set_rotation(Vector3::UP * rotation); } }); } + + fn update_players(&mut self) { + for (_, player) in &mut self.menu_players { + player.bind_mut().update(); + } + } } diff --git a/rust/src/ui/menu_player.rs b/rust/src/ui/menu_player.rs index 3616b0a..89beac0 100644 --- a/rust/src/ui/menu_player.rs +++ b/rust/src/ui/menu_player.rs @@ -1,15 +1,19 @@ use godot::{ - classes::{CharacterBody3D, ICharacterBody3D}, + classes::{CharacterBody3D, ICharacterBody3D, Label3D}, prelude::*, }; -use crate::player::soldier_mesh::SoldierMesh; +use crate::{game_manager::Game, player::soldier_mesh::SoldierMesh}; #[derive(GodotClass)] #[class(base=CharacterBody3D, init)] pub struct MenuPlayer { #[export] mesh: Option>, + #[export] + name_label: Option>, + + pub player_id: Option, base: Base, } @@ -26,3 +30,21 @@ impl ICharacterBody3D for MenuPlayer { self.base_mut().move_and_slide(); } } + +impl MenuPlayer { + pub fn update(&mut self) { + if let Some(player_id) = self.player_id + && let Some(game) = Game::singleton() + && let Some(player) = game.bind().find_player(player_id) + && let Some(team) = game.bind().get_team(player.data.team) + { + if let Some(name_label) = &mut self.name_label { + name_label.set_text(&player.data.name); + name_label.set_modulate(team.bind().color); + } + if let Some(mesh) = &mut self.mesh { + mesh.bind_mut().set_color(team.bind().color); + } + } + } +}