diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index bdd487253a..dde053f24c 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -48,7 +48,7 @@ const MANA_COLOR: Color = Color::Rgba(0.42, 0.41, 0.66, 1.0); widget_ids! { struct Ids { // Character Names - name_tags[], + ingame_elements[], // Test temp, @@ -271,29 +271,42 @@ impl Hud { return events; } - // Nametags - let ecs = client.state().ecs(); + // Nametags and healthbars { - let actor_read_storage = ecs.read_storage::(); - let pos_read_storage = ecs.read_storage::(); - let num = (&actor_read_storage, &pos_read_storage).join().count(); - self.ids - .name_tags - .resize(num, &mut ui_widgets.widget_id_generator()); - for (i, (name, pos)) in (&actor_read_storage, &pos_read_storage) + let ecs = client.state().ecs(); + let actor = ecs.read_storage::(); + let pos = ecs.read_storage::(); + let stats = ecs.read_storage::(); + let mut id_walker = self.ids.ingame_elements.walk(); + for (pos, name) in (&pos, &actor) .join() - .map(|(actor, pos)| match actor { - comp::Actor::Character { name, .. } => (name, pos.0), + .filter_map(|(pos, actor)| match actor { + comp::Actor::Character { name, .. } => Some((pos.0, name)), + _ => None, }) - .enumerate() { + let id = id_walker.next(&mut self.ids.ingame_elements, &mut ui_widgets.widget_id_generator()); Text::new(&name) .font_size(20) .color(Color::Rgba(1.0, 1.0, 1.0, 1.0)) .x_y(0.0, 0.0) .position_ingame(pos + Vec3::new(0.0, 0.0, 3.0)) .resolution(100.0) - .set(self.ids.name_tags[i], ui_widgets); + .set(id, ui_widgets); + } + for (pos, hp) in (&pos, &stats).join().map(|(pos, stats)| (pos.0, stats.hp)) { + let id = id_walker.next(&mut self.ids.ingame_elements, &mut ui_widgets.widget_id_generator()); + ( + // Healh Bar + Rectangle::fill_with([120.0, 12.0], color::BLACK) + .x_y(0.0, -25.0), + // Filling + Rectangle::fill_with([114.0 * (hp.current as f64 / hp.maximum as f64), 6.0], HP_COLOR) + .x_y(0.0, -25.0), + ) + .position_ingame(pos + Vec3::new(0.0, 0.0, 3.0)) + .resolution(100.0) + .set(id, ui_widgets); } } // test diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 3c8c38d56b..db4a64d3b0 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -314,7 +314,7 @@ impl Renderer { memory::Typed, }; type WinSurfaceData = <::Surface as SurfaceTyped>::DataType; - let mut download = self + let download = self .factory .create_download_buffer::(width as usize * height as usize) .map_err(|err| RenderError::BufferCreationError(err))?; diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 3e6eeae16d..d095dfffcc 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -173,7 +173,7 @@ impl PlayState for SessionState { // Maintain the scene. self.scene.maintain( global_state.window.renderer_mut(), - &self.client.borrow_mut(), + &self.client.borrow(), ); // extract HUD events ensuring the client borrow gets dropped diff --git a/voxygen/src/ui/widgets/ingame.rs b/voxygen/src/ui/widgets/ingame.rs index ede764a4cc..4f6cd8eee3 100644 --- a/voxygen/src/ui/widgets/ingame.rs +++ b/voxygen/src/ui/widgets/ingame.rs @@ -223,7 +223,7 @@ impl Widget for Ingame { type Style = Style; type Event = W::Event; - fn init_state(&self, mut id_gen: widget::id::Generator) -> Self::State { + fn init_state(&self, id_gen: widget::id::Generator) -> Self::State { State { ids: W::init_ids(id_gen), parameters: self.parameters, diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 90e7d1aeb4..c9f6f9b9b2 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -219,7 +219,7 @@ impl Window { std::thread::spawn(move || { use std::{path::PathBuf, time::SystemTime}; // Check if folder exists and create it if it does not - let mut path = std::path::PathBuf::from("./screenshots"); + let mut path = PathBuf::from("./screenshots"); if !path.exists() { if let Err(err) = std::fs::create_dir(&path) { log::error!("Coudn't create folder for screenshot: {:?}", err);