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>, #[export] name_label: Option>, pub player_id: Option, base: Base, } #[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); } } } }