51 lines
1.3 KiB
Rust
51 lines
1.3 KiB
Rust
use godot::{
|
|
classes::{CharacterBody3D, ICharacterBody3D, Label3D},
|
|
prelude::*,
|
|
};
|
|
|
|
use crate::{game::Game, player::soldier_mesh::SoldierMesh};
|
|
|
|
#[derive(GodotClass)]
|
|
#[class(base=CharacterBody3D, init)]
|
|
pub struct MenuPlayer {
|
|
#[export]
|
|
mesh: Option<Gd<SoldierMesh>>,
|
|
#[export]
|
|
name_label: Option<Gd<Label3D>>,
|
|
|
|
pub player_id: Option<u16>,
|
|
|
|
base: Base<CharacterBody3D>,
|
|
}
|
|
|
|
#[godot_api]
|
|
impl ICharacterBody3D for MenuPlayer {
|
|
fn ready(&mut self) {
|
|
if let Some(mesh) = &mut self.mesh {
|
|
mesh.bind_mut().spawn_raygun();
|
|
}
|
|
}
|
|
|
|
fn physics_process(&mut self, _: f64) {
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|