Update players properly on lobby
This commit is contained in:
parent
5e7de8d936
commit
2b00253924
@ -4,8 +4,9 @@
|
|||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
|
[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")
|
mesh = NodePath("soldier_m")
|
||||||
|
name_label = NodePath("name_label")
|
||||||
|
|
||||||
[node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_pgypt")]
|
[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)
|
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]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.995473, 0)
|
||||||
shape = SubResource("CapsuleShape3D_1cgct")
|
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
|
||||||
|
|||||||
@ -609,9 +609,10 @@ impl Game {
|
|||||||
});
|
});
|
||||||
if emit {
|
if emit {
|
||||||
self.run_deferred(move |s| {
|
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) {
|
if let Some(player) = self.find_player_mut(player_id) {
|
||||||
player.data.team = team;
|
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_player_team_changed().emit(player_id, team));
|
||||||
|
self.run_deferred(move |s| s.signals().on_players_updated().emit());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,9 +20,7 @@ pub struct LobbyWorld {
|
|||||||
#[godot_api]
|
#[godot_api]
|
||||||
impl INode3D for LobbyWorld {
|
impl INode3D for LobbyWorld {
|
||||||
fn ready(&mut self) {
|
fn ready(&mut self) {
|
||||||
if let Some(game) = Game::singleton()
|
if let Some(game) = Game::singleton() {
|
||||||
&& let Some(scene) = self.menu_player_scene.clone()
|
|
||||||
{
|
|
||||||
for player in &game.bind().players {
|
for player in &game.bind().players {
|
||||||
self.spawn_player(player.id());
|
self.spawn_player(player.id());
|
||||||
}
|
}
|
||||||
@ -33,6 +31,9 @@ impl INode3D for LobbyWorld {
|
|||||||
game.signals()
|
game.signals()
|
||||||
.on_player_disconnected()
|
.on_player_disconnected()
|
||||||
.connect_other(self, Self::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 rotation = s.rng.randf_range(PI / 4., PI / 2.);
|
||||||
|
|
||||||
let mut menu_player = scene.instantiate_as::<MenuPlayer>();
|
let mut menu_player = scene.instantiate_as::<MenuPlayer>();
|
||||||
|
menu_player.bind_mut().player_id = Some(player_id);
|
||||||
s.menu_players.insert(player_id, menu_player.clone());
|
s.menu_players.insert(player_id, menu_player.clone());
|
||||||
s.base_mut().add_child(&menu_player);
|
s.base_mut().add_child(&menu_player);
|
||||||
|
|
||||||
|
menu_player.bind_mut().update();
|
||||||
|
|
||||||
menu_player.set_position(Vector3::new(x, 0., z));
|
menu_player.set_position(Vector3::new(x, 0., z));
|
||||||
menu_player.set_rotation(Vector3::UP * rotation);
|
menu_player.set_rotation(Vector3::UP * rotation);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_players(&mut self) {
|
||||||
|
for (_, player) in &mut self.menu_players {
|
||||||
|
player.bind_mut().update();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +1,19 @@
|
|||||||
use godot::{
|
use godot::{
|
||||||
classes::{CharacterBody3D, ICharacterBody3D},
|
classes::{CharacterBody3D, ICharacterBody3D, Label3D},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::player::soldier_mesh::SoldierMesh;
|
use crate::{game_manager::Game, player::soldier_mesh::SoldierMesh};
|
||||||
|
|
||||||
#[derive(GodotClass)]
|
#[derive(GodotClass)]
|
||||||
#[class(base=CharacterBody3D, init)]
|
#[class(base=CharacterBody3D, init)]
|
||||||
pub struct MenuPlayer {
|
pub struct MenuPlayer {
|
||||||
#[export]
|
#[export]
|
||||||
mesh: Option<Gd<SoldierMesh>>,
|
mesh: Option<Gd<SoldierMesh>>,
|
||||||
|
#[export]
|
||||||
|
name_label: Option<Gd<Label3D>>,
|
||||||
|
|
||||||
|
pub player_id: Option<u16>,
|
||||||
|
|
||||||
base: Base<CharacterBody3D>,
|
base: Base<CharacterBody3D>,
|
||||||
}
|
}
|
||||||
@ -26,3 +30,21 @@ impl ICharacterBody3D for MenuPlayer {
|
|||||||
self.base_mut().move_and_slide();
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user